diff options
618 files changed, 10047 insertions, 4250 deletions
diff --git a/apct-tests/perftests/core/Android.bp b/apct-tests/perftests/core/Android.bp index 65bc8ccd12f8..1e299cdf8002 100644 --- a/apct-tests/perftests/core/Android.bp +++ b/apct-tests/perftests/core/Android.bp @@ -52,7 +52,7 @@ android_test { "guava", ], - libs: ["android.test.base"], + libs: ["android.test.base.stubs.system"], java_resources: [":GoogleFontDancingScript"], diff --git a/apct-tests/perftests/healthconnect/Android.bp b/apct-tests/perftests/healthconnect/Android.bp index c38a24ee05d2..072010e90fae 100644 --- a/apct-tests/perftests/healthconnect/Android.bp +++ b/apct-tests/perftests/healthconnect/Android.bp @@ -37,7 +37,7 @@ android_test { "collector-device-lib-platform", ], - libs: ["android.test.base"], + libs: ["android.test.base.stubs.system"], platform_apis: true, test_suites: ["device-tests"], data: [":perfetto_artifacts"], diff --git a/apct-tests/perftests/packagemanager/Android.bp b/apct-tests/perftests/packagemanager/Android.bp index 02fc12cde04b..b2626911ea1e 100644 --- a/apct-tests/perftests/packagemanager/Android.bp +++ b/apct-tests/perftests/packagemanager/Android.bp @@ -28,7 +28,7 @@ android_test { "services.core", ], - libs: ["android.test.base"], + libs: ["android.test.base.stubs.system"], platform_apis: true, diff --git a/apct-tests/perftests/permission/Android.bp b/apct-tests/perftests/permission/Android.bp index bc8e7696440a..f4c7fbbf6593 100644 --- a/apct-tests/perftests/permission/Android.bp +++ b/apct-tests/perftests/permission/Android.bp @@ -43,7 +43,7 @@ android_test { "cts-install-lib-java", ], - libs: ["android.test.base"], + libs: ["android.test.base.stubs.system"], platform_apis: true, diff --git a/apct-tests/perftests/settingsprovider/Android.bp b/apct-tests/perftests/settingsprovider/Android.bp index e4aa14cd8a77..382803900507 100644 --- a/apct-tests/perftests/settingsprovider/Android.bp +++ b/apct-tests/perftests/settingsprovider/Android.bp @@ -28,7 +28,7 @@ android_test { "services.core", ], - libs: ["android.test.base"], + libs: ["android.test.base.stubs.system"], platform_apis: true, diff --git a/apex/jobscheduler/service/java/com/android/server/job/TEST_MAPPING b/apex/jobscheduler/service/java/com/android/server/job/TEST_MAPPING index 16c2fd4b73c3..a0bf78f28127 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/TEST_MAPPING +++ b/apex/jobscheduler/service/java/com/android/server/job/TEST_MAPPING @@ -25,10 +25,7 @@ ] }, { - "name": "FrameworksServicesTests", - "options": [ - {"include-filter": "com.android.server.job"} - ] + "name": "FrameworksServicesTests_com_android_server_job" }, { "name": "CtsHostsideNetworkPolicyTests", diff --git a/apex/jobscheduler/service/java/com/android/server/usage/TEST_MAPPING b/apex/jobscheduler/service/java/com/android/server/usage/TEST_MAPPING index dd0d1b6285de..f56c14da8f23 100644 --- a/apex/jobscheduler/service/java/com/android/server/usage/TEST_MAPPING +++ b/apex/jobscheduler/service/java/com/android/server/usage/TEST_MAPPING @@ -21,10 +21,7 @@ "name": "CtsUsageStatsTestCases" }, { - "name": "FrameworksServicesTests", - "options": [ - {"include-filter": "com.android.server.usage"} - ] + "name": "FrameworksServicesTests_com_android_server_usage" } ] } diff --git a/cmds/uiautomator/library/Android.bp b/cmds/uiautomator/library/Android.bp index cd1fb9a0f047..966bf13adfe4 100644 --- a/cmds/uiautomator/library/Android.bp +++ b/cmds/uiautomator/library/Android.bp @@ -71,7 +71,7 @@ java_library_static { ":uiautomator-stubs", ], libs: [ - "android.test.runner", + "android.test.runner.stubs.system", "junit", ], java_version: "1.8", @@ -84,8 +84,8 @@ java_library_static { "testrunner-src/**/*.java", ], libs: [ - "android.test.runner", - "android.test.base", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", ], static_libs: [ "junit", diff --git a/core/api/current.txt b/core/api/current.txt index 1865e8c55d80..5cdc57a0dc2a 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -34266,9 +34266,14 @@ package android.os { method public final int areAllEffectsSupported(@NonNull int...); method public final boolean areAllPrimitivesSupported(@NonNull int...); method @NonNull public int[] areEffectsSupported(@NonNull int...); + method @FlaggedApi("android.os.vibrator.normalized_pwle_effects") public boolean areEnvelopeEffectsSupported(); method @NonNull public boolean[] arePrimitivesSupported(@NonNull int...); method @RequiresPermission(android.Manifest.permission.VIBRATE) public abstract void cancel(); method public int getId(); + method @FlaggedApi("android.os.vibrator.normalized_pwle_effects") public int getMaxEnvelopeEffectControlPointDurationMillis(); + method @FlaggedApi("android.os.vibrator.normalized_pwle_effects") public int getMaxEnvelopeEffectDurationMillis(); + method @FlaggedApi("android.os.vibrator.normalized_pwle_effects") public int getMaxEnvelopeEffectSize(); + method @FlaggedApi("android.os.vibrator.normalized_pwle_effects") public int getMinEnvelopeEffectControlPointDurationMillis(); method @NonNull public int[] getPrimitiveDurations(@NonNull int...); method public float getQFactor(); method public float getResonantFrequency(); @@ -36925,6 +36930,19 @@ package android.provider { field public static final String CONTENT_DIRECTORY = "data"; } + @FlaggedApi("android.provider.new_default_account_api_enabled") public static final class ContactsContract.RawContacts.DefaultAccountAndState { + ctor public ContactsContract.RawContacts.DefaultAccountAndState(int, @Nullable android.accounts.Account); + method @Nullable public android.accounts.Account getCloudAccount(); + method public int getState(); + method @NonNull public static android.provider.ContactsContract.RawContacts.DefaultAccountAndState ofCloud(@NonNull android.accounts.Account); + method @NonNull public static android.provider.ContactsContract.RawContacts.DefaultAccountAndState ofLocal(); + method @NonNull public static android.provider.ContactsContract.RawContacts.DefaultAccountAndState ofNotSet(); + field public static final int DEFAULT_ACCOUNT_STATE_CLOUD = 3; // 0x3 + field public static final int DEFAULT_ACCOUNT_STATE_INVALID = 0; // 0x0 + field public static final int DEFAULT_ACCOUNT_STATE_LOCAL = 2; // 0x2 + field public static final int DEFAULT_ACCOUNT_STATE_NOT_SET = 1; // 0x1 + } + public static final class ContactsContract.RawContacts.DisplayPhoto { field public static final String CONTENT_DIRECTORY = "display_photo"; } diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 4fc70769a3b1..caf699280e08 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -2321,7 +2321,7 @@ package android.os { } public final class BugreportParams { - field @FlaggedApi("android.os.bugreport_mode_max_value") public static final int BUGREPORT_MODE_MAX_VALUE = 7; // 0x7 + field public static final int BUGREPORT_MODE_MAX_VALUE = 7; // 0x7 } public class Build { diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 7a33ab748597..7a36fbb55dc4 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -1593,17 +1593,6 @@ public class Notification implements Parcelable */ @FlaggedApi(Flags.FLAG_API_RICH_ONGOING) public static final String EXTRA_ENROUTE_LARGE_ICON_SUBTEXT = "android.enrouteLargeIconSubText"; - - /** - * {@link #extras} key: {@link Icon} of an image used as a thumb icon on - * {@link Notification} progress bar for {@link EnRouteStyle} notifications. - * This extra is an {@code Icon}. - * @hide - */ - @FlaggedApi(Flags.FLAG_API_RICH_ONGOING) - public static final String EXTRA_ENROUTE_PROGRESS_THUMB_ICON = - "android.enrouteProgressThumbIcon"; - /** * {@link #extras} key: whether the notification should be colorized as * supplied to {@link Builder#setColorized(boolean)}. @@ -3063,8 +3052,6 @@ public class Notification implements Parcelable if (Flags.apiRichOngoing()) { visitIconUri(visitor, extras.getParcelable(EXTRA_ENROUTE_OVERLAY_ICON, Icon.class)); - visitIconUri(visitor, extras.getParcelable(EXTRA_ENROUTE_PROGRESS_THUMB_ICON, - Icon.class)); } if (mBubbleMetadata != null) { @@ -11028,9 +11015,6 @@ public class Notification implements Parcelable @Nullable private CharSequence mLargeIconSubText = null; - @Nullable - private Icon mProgressThumbIcon = null; - public EnRouteStyle() { } @@ -11074,25 +11058,6 @@ public class Notification implements Parcelable return this; } - /** - * Returns the progress thumb icon. - * @see EnRouteStyle#setProgressThumbIcon - */ - @Nullable - public Icon getProgressThumbIcon() { - return mProgressThumbIcon; - } - - /** - * Optional icon to be used as a progress thumb. - */ - @NonNull - public EnRouteStyle setProgressThumbIcon(@Nullable Icon progressThumbIcon) { - mProgressThumbIcon = progressThumbIcon; - return this; - } - - /** * @hide */ @@ -11104,8 +11069,7 @@ public class Notification implements Parcelable final EnRouteStyle enRouteStyle = (EnRouteStyle) other; return !Objects.equals(mOverlayIcon, enRouteStyle.mOverlayIcon) - || !Objects.equals(mLargeIconSubText, enRouteStyle.mLargeIconSubText) - || !Objects.equals(mProgressThumbIcon, enRouteStyle.mProgressThumbIcon); + || !Objects.equals(mLargeIconSubText, enRouteStyle.mLargeIconSubText); } /** @@ -11116,7 +11080,6 @@ public class Notification implements Parcelable super.addExtras(extras); extras.putParcelable(EXTRA_ENROUTE_OVERLAY_ICON, mOverlayIcon); extras.putCharSequence(EXTRA_ENROUTE_LARGE_ICON_SUBTEXT, mLargeIconSubText); - extras.putParcelable(EXTRA_ENROUTE_PROGRESS_THUMB_ICON, mProgressThumbIcon); } /** @@ -11127,8 +11090,6 @@ public class Notification implements Parcelable super.restoreFromExtras(extras); mOverlayIcon = extras.getParcelable(EXTRA_ENROUTE_OVERLAY_ICON, Icon.class); mLargeIconSubText = extras.getCharSequence(EXTRA_ENROUTE_LARGE_ICON_SUBTEXT); - mProgressThumbIcon = - extras.getParcelable(EXTRA_ENROUTE_PROGRESS_THUMB_ICON, Icon.class); } /** @@ -11140,10 +11101,6 @@ public class Notification implements Parcelable if (mOverlayIcon != null) { mOverlayIcon.convertToAshmem(); } - - if (mProgressThumbIcon != null) { - mProgressThumbIcon.convertToAshmem(); - } } /** diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java index e44e7768724e..5147f12018cf 100644 --- a/core/java/android/app/SystemServiceRegistry.java +++ b/core/java/android/app/SystemServiceRegistry.java @@ -104,6 +104,7 @@ import android.debug.IAdbManager; import android.devicelock.DeviceLockFrameworkInitializer; import android.graphics.fonts.FontManager; import android.hardware.ConsumerIrManager; +import android.hardware.ISensorPrivacyManager; import android.hardware.ISerialManager; import android.hardware.SensorManager; import android.hardware.SensorPrivacyManager; @@ -707,8 +708,12 @@ public final class SystemServiceRegistry { registerService(Context.SENSOR_PRIVACY_SERVICE, SensorPrivacyManager.class, new CachedServiceFetcher<SensorPrivacyManager>() { @Override - public SensorPrivacyManager createService(ContextImpl ctx) { - return SensorPrivacyManager.getInstance(ctx); + public SensorPrivacyManager createService(ContextImpl ctx) + throws ServiceNotFoundException { + IBinder b = ServiceManager.getServiceOrThrow( + Context.SENSOR_PRIVACY_SERVICE); + return SensorPrivacyManager.getInstance( + ctx, ISensorPrivacyManager.Stub.asInterface(b)); }}); registerService(Context.STATUS_BAR_SERVICE, StatusBarManager.class, diff --git a/core/java/android/app/appfunctions/AppFunctionStaticMetadataHelper.java b/core/java/android/app/appfunctions/AppFunctionStaticMetadataHelper.java index 085e0a47d356..a23f842e6eeb 100644 --- a/core/java/android/app/appfunctions/AppFunctionStaticMetadataHelper.java +++ b/core/java/android/app/appfunctions/AppFunctionStaticMetadataHelper.java @@ -37,6 +37,8 @@ import java.util.Objects; public class AppFunctionStaticMetadataHelper { public static final String STATIC_SCHEMA_TYPE = "AppFunctionStaticMetadata"; public static final String STATIC_PROPERTY_ENABLED_BY_DEFAULT = "enabledByDefault"; + public static final String STATIC_PROPERTY_RESTRICT_CALLERS_WITH_EXECUTE_APP_FUNCTIONS = + "restrictCallersWithExecuteAppFunctions"; public static final String APP_FUNCTION_STATIC_NAMESPACE = "app_functions"; public static final String PROPERTY_FUNCTION_ID = "functionId"; diff --git a/core/java/android/content/UriRelativeFilterGroup.java b/core/java/android/content/UriRelativeFilterGroup.java index 0e49b4fe427a..07aeb26216b1 100644 --- a/core/java/android/content/UriRelativeFilterGroup.java +++ b/core/java/android/content/UriRelativeFilterGroup.java @@ -63,6 +63,7 @@ import java.util.Objects; */ @FlaggedApi(Flags.FLAG_RELATIVE_REFERENCE_INTENT_FILTERS) public final class UriRelativeFilterGroup { + private static final String TAG = "UriRelativeFilterGroup"; private static final String ALLOW_STR = "allow"; private static final String URI_RELATIVE_FILTER_GROUP_STR = "uriRelativeFilterGroup"; @@ -233,9 +234,16 @@ public final class UriRelativeFilterGroup { final int n = mUriRelativeFilters.size(); if (n > 0) { dest.writeInt(n); + int i = 0; Iterator<UriRelativeFilter> it = mUriRelativeFilters.iterator(); while (it.hasNext()) { it.next().writeToParcel(dest, flags); + i++; + } + if (i != n) { + Log.e(TAG, "UriRelativeFilters was unexpectedly" + + " modified while writing to parcel. Expected " + + n + " but found " + i + " filters", new Exception()); } } else { dest.writeInt(0); diff --git a/core/java/android/database/sqlite/SQLiteClosable.java b/core/java/android/database/sqlite/SQLiteClosable.java index 8eb512a2cbc6..806c386bf9a7 100644 --- a/core/java/android/database/sqlite/SQLiteClosable.java +++ b/core/java/android/database/sqlite/SQLiteClosable.java @@ -31,6 +31,20 @@ public abstract class SQLiteClosable implements Closeable { private int mReferenceCount = 1; /** + * True if the instance should record when it was closed. Tracking closure can be expensive, + * so it is best reserved for subclasses that have long lifetimes. + * @hide + */ + protected boolean mTrackClosure = false; + + /** + * The caller that finally released this instance. If this is not null, it is supplied as the + * cause to the IllegalStateException that is thrown when the object is reopened. Subclasses + * are responsible for populating this field, if they wish to use it. + */ + private Throwable mClosedBy = null; + + /** * Called when the last reference to the object was released by * a call to {@link #releaseReference()} or {@link #close()}. */ @@ -57,7 +71,7 @@ public abstract class SQLiteClosable implements Closeable { synchronized(this) { if (mReferenceCount <= 0) { throw new IllegalStateException( - "attempt to re-open an already-closed object: " + this); + "attempt to re-open an already-closed object: " + this, mClosedBy); } mReferenceCount++; } @@ -108,5 +122,11 @@ public abstract class SQLiteClosable implements Closeable { */ public void close() { releaseReference(); + synchronized (this) { + if (mTrackClosure && (mClosedBy == null)) { + String name = getClass().getName(); + mClosedBy = new Exception("closed by " + name + ".close()").fillInStackTrace(); + } + } } } diff --git a/core/java/android/database/sqlite/SQLiteConnectionPool.java b/core/java/android/database/sqlite/SQLiteConnectionPool.java index 15d7d6675c8e..505905f5aa16 100644 --- a/core/java/android/database/sqlite/SQLiteConnectionPool.java +++ b/core/java/android/database/sqlite/SQLiteConnectionPool.java @@ -96,6 +96,10 @@ public final class SQLiteConnectionPool implements Closeable { private boolean mIsOpen; private int mNextConnectionId; + // Record the caller that explicitly closed the database. + @GuardedBy("mLock") + private Throwable mClosedBy; + private ConnectionWaiter mConnectionWaiterPool; private ConnectionWaiter mConnectionWaiterQueue; @@ -265,6 +269,7 @@ public final class SQLiteConnectionPool implements Closeable { throwIfClosedLocked(); mIsOpen = false; + mClosedBy = new Exception("SQLiteConnectionPool.close()").fillInStackTrace(); closeAvailableConnectionsAndLogExceptionsLocked(); @@ -1101,7 +1106,7 @@ public final class SQLiteConnectionPool implements Closeable { private void throwIfClosedLocked() { if (!mIsOpen) { throw new IllegalStateException("Cannot perform this operation " - + "because the connection pool has been closed."); + + "because the connection pool has been closed.", mClosedBy); } } diff --git a/core/java/android/database/sqlite/SQLiteDatabase.java b/core/java/android/database/sqlite/SQLiteDatabase.java index 60fd0ce59209..8bff624451e7 100644 --- a/core/java/android/database/sqlite/SQLiteDatabase.java +++ b/core/java/android/database/sqlite/SQLiteDatabase.java @@ -488,6 +488,7 @@ public final class SQLiteDatabase extends SQLiteClosable { @Nullable CursorFactory cursorFactory, @Nullable DatabaseErrorHandler errorHandler, int lookasideSlotSize, int lookasideSlotCount, long idleConnectionTimeoutMs, @Nullable String journalMode, @Nullable String syncMode) { + mTrackClosure = true; mCursorFactory = cursorFactory; mErrorHandler = errorHandler != null ? errorHandler : new DefaultDatabaseErrorHandler(); mConfigurationLocked = new SQLiteDatabaseConfiguration(path, openFlags); diff --git a/core/java/android/hardware/SensorPrivacyManager.java b/core/java/android/hardware/SensorPrivacyManager.java index 4cdaaddd05bf..a4c0e87c965b 100644 --- a/core/java/android/hardware/SensorPrivacyManager.java +++ b/core/java/android/hardware/SensorPrivacyManager.java @@ -797,7 +797,7 @@ public final class SensorPrivacyManager { public void setSensorPrivacy(@Sensors.Sensor int sensor, boolean enable) { setSensorPrivacy(resolveSourceFromCurrentContext(), sensor, enable, - UserHandle.USER_CURRENT); + mContext.getUserId()); } private @Sources.Source int resolveSourceFromCurrentContext() { @@ -837,6 +837,8 @@ public final class SensorPrivacyManager { @RequiresPermission(Manifest.permission.MANAGE_SENSOR_PRIVACY) public void setSensorPrivacy(@Sources.Source int source, @Sensors.Sensor int sensor, boolean enable) { + // TODO(b/348510106): Replace USER_CURRENT with Context user and fix any tests that may be + // affected. setSensorPrivacy(source, sensor, enable, UserHandle.USER_CURRENT); } @@ -894,7 +896,7 @@ public final class SensorPrivacyManager { @RequiresPermission(Manifest.permission.MANAGE_SENSOR_PRIVACY) public void setSensorPrivacyForProfileGroup(@Sources.Source int source, @Sensors.Sensor int sensor, boolean enable) { - setSensorPrivacyForProfileGroup(source , sensor, enable, UserHandle.USER_CURRENT); + setSensorPrivacyForProfileGroup(source , sensor, enable, mContext.getUserId()); } /** @@ -950,7 +952,7 @@ public final class SensorPrivacyManager { @RequiresPermission(Manifest.permission.MANAGE_SENSOR_PRIVACY) public void suppressSensorPrivacyReminders(int sensor, boolean suppress) { - suppressSensorPrivacyReminders(sensor, suppress, UserHandle.USER_CURRENT); + suppressSensorPrivacyReminders(sensor, suppress, mContext.getUserId()); } /** diff --git a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java index c7dba6c83895..84072585d7f0 100644 --- a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java +++ b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java @@ -364,16 +364,11 @@ public class CameraDeviceImpl extends CameraDevice throw new IllegalArgumentException("Null argument given"); } mCameraId = cameraId; - if (Flags.singleThreadExecutor()) { - mDeviceCallback = new ClientStateCallback(executor, callback); - if (Flags.singleThreadExecutorNaming()) { - mDeviceExecutor = Executors.newSingleThreadExecutor(sThreadFactory); - } else { - mDeviceExecutor = Executors.newSingleThreadExecutor(); - } + mDeviceCallback = new ClientStateCallback(executor, callback); + if (Flags.singleThreadExecutorNaming()) { + mDeviceExecutor = Executors.newSingleThreadExecutor(sThreadFactory); } else { - mDeviceCallback = callback; - mDeviceExecutor = executor; + mDeviceExecutor = Executors.newSingleThreadExecutor(); } mCharacteristics = characteristics; mCameraManager = manager; diff --git a/core/java/android/os/BugreportParams.java b/core/java/android/os/BugreportParams.java index f7b417337911..93a8ed96b675 100644 --- a/core/java/android/os/BugreportParams.java +++ b/core/java/android/os/BugreportParams.java @@ -134,7 +134,6 @@ public final class BugreportParams { * The maximum value of supported bugreport mode. * @hide */ - @FlaggedApi(android.os.Flags.FLAG_BUGREPORT_MODE_MAX_VALUE) @TestApi public static final int BUGREPORT_MODE_MAX_VALUE = BUGREPORT_MODE_ONBOARDING; diff --git a/core/java/android/os/IHintManager.aidl b/core/java/android/os/IHintManager.aidl index 360b2ac4f3ca..73cdd5682f31 100644 --- a/core/java/android/os/IHintManager.aidl +++ b/core/java/android/os/IHintManager.aidl @@ -33,7 +33,7 @@ interface IHintManager { * if creation is supported but fails. */ IHintSession createHintSessionWithConfig(in IBinder token, in int[] threadIds, - in long durationNanos, in SessionTag tag, out @nullable SessionConfig config); + in long durationNanos, in SessionTag tag, out SessionConfig config); /** * Get preferred rate limit in nanoseconds. @@ -48,6 +48,6 @@ interface IHintManager { * * Throws IllegalStateException if FMQ channel creation fails. */ - ChannelConfig getSessionChannel(in IBinder token); + @nullable ChannelConfig getSessionChannel(in IBinder token); oneway void closeSessionChannel(); } diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java index 3b2041b0d50a..346ee7ca4f87 100644 --- a/core/java/android/os/Process.java +++ b/core/java/android/os/Process.java @@ -589,6 +589,12 @@ public class Process { **/ public static final int THREAD_GROUP_RESTRICTED = 7; + /** + * Thread group for foreground apps in multi-window mode + * @hide + **/ + public static final int THREAD_GROUP_FOREGROUND_WINDOW = 8; + /** @hide */ public static final int SIGNAL_DEFAULT = 0; public static final int SIGNAL_QUIT = 3; diff --git a/core/java/android/os/Vibrator.java b/core/java/android/os/Vibrator.java index 36233b7be2bb..84325b7c2874 100644 --- a/core/java/android/os/Vibrator.java +++ b/core/java/android/os/Vibrator.java @@ -17,6 +17,7 @@ package android.os; import android.annotation.CallbackExecutor; +import android.annotation.FlaggedApi; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; @@ -30,6 +31,7 @@ import android.content.Context; import android.content.res.Resources; import android.hardware.vibrator.IVibrator; import android.media.AudioAttributes; +import android.os.vibrator.Flags; import android.os.vibrator.VibrationConfig; import android.os.vibrator.VibratorFrequencyProfile; import android.util.Log; @@ -313,6 +315,86 @@ public abstract class Vibrator { } /** + * Checks whether the vibrator supports the creation of envelope effects. + * + * Envelope effects are defined by a series of frequency-amplitude pairs with specified + * transition times, allowing the creation of more complex vibration patterns. + * + * @return True if the hardware supports creating envelope effects, false otherwise. + */ + @FlaggedApi(Flags.FLAG_NORMALIZED_PWLE_EFFECTS) + public boolean areEnvelopeEffectsSupported() { + return getInfo().areEnvelopeEffectsSupported(); + } + + /** + * Retrieves the maximum duration supported for an envelope effect, in milliseconds. + * + * <p>If the device supports envelope effects (check {@link #areEnvelopeEffectsSupported}), + * this value will be positive. Devices with envelope effects capabilities guarantees a + * maximum duration equivalent to the product of {@link #getMaxEnvelopeEffectSize()} and + * {@link #getMaxEnvelopeEffectControlPointDurationMillis()}. If the device does not support + * envelope effects, this method will return 0. + * + * @return The maximum duration (in milliseconds) allowed for an envelope effect, or 0 if + * envelope effects are not supported. + */ + @FlaggedApi(Flags.FLAG_NORMALIZED_PWLE_EFFECTS) + public int getMaxEnvelopeEffectDurationMillis() { + return getInfo().getMaxEnvelopeEffectDurationMillis(); + } + + /** + * Retrieves the maximum number of control points supported for an envelope effect. + * + * <p>If the device supports envelope effects (check {@link #areEnvelopeEffectsSupported}), + * this value will be positive. Devices with envelope effects capabilities guarantee support + * for a minimum of 16 control points. If the device does not support envelope effects, + * this method will return 0. + * + * @return the maximum number of control points allowed for an envelope effect, or 0 if + * envelope effects are not supported. + */ + @FlaggedApi(Flags.FLAG_NORMALIZED_PWLE_EFFECTS) + public int getMaxEnvelopeEffectSize() { + return getInfo().getMaxEnvelopeEffectSize(); + } + + /** + * Retrieves the minimum duration supported between two control points within an envelope + * effect, in milliseconds. + * + * <p>If the device supports envelope effects (check {@link #areEnvelopeEffectsSupported}), + * this value will be positive. Devices with envelope effects capabilities guarantee + * support for durations down to at least 20 milliseconds. If the device does + * not support envelope effects, this method will return 0. + * + * @return the minimum allowed duration between two control points in an envelope effect, + * or 0 if envelope effects are not supported. + */ + @FlaggedApi(Flags.FLAG_NORMALIZED_PWLE_EFFECTS) + public int getMinEnvelopeEffectControlPointDurationMillis() { + return getInfo().getMinEnvelopeEffectControlPointDurationMillis(); + } + + /** + * Retrieves the maximum duration supported between two control points within an envelope + * effect, in milliseconds. + * + * <p>If the device supports envelope effects (check {@link #areEnvelopeEffectsSupported}), + * this value will be positive. Devices with envelope effects capabilities guarantee support + * for durations up to at least 1 second. If the device does not support envelope effects, + * this method will return 0. + * + * @return the maximum allowed duration between two control points in an envelope effect, + * or 0 if envelope effects are not supported. + */ + @FlaggedApi(Flags.FLAG_NORMALIZED_PWLE_EFFECTS) + public int getMaxEnvelopeEffectControlPointDurationMillis() { + return getInfo().getMaxEnvelopeEffectControlPointDurationMillis(); + } + + /** * Configure an always-on haptics effect. * * @param alwaysOnId The board-specific always-on ID to configure. diff --git a/core/java/android/os/VibratorInfo.java b/core/java/android/os/VibratorInfo.java index 4f8c24d1f905..5378295e3720 100644 --- a/core/java/android/os/VibratorInfo.java +++ b/core/java/android/os/VibratorInfo.java @@ -60,6 +60,9 @@ public class VibratorInfo implements Parcelable { private final int mPwleSizeMax; private final float mQFactor; private final FrequencyProfile mFrequencyProfile; + private final int mMaxEnvelopeEffectSize; + private final int mMinEnvelopeEffectControlPointDurationMillis; + private final int mMaxEnvelopeEffectControlPointDurationMillis; VibratorInfo(Parcel in) { mId = in.readInt(); @@ -73,6 +76,9 @@ public class VibratorInfo implements Parcelable { mPwleSizeMax = in.readInt(); mQFactor = in.readFloat(); mFrequencyProfile = FrequencyProfile.CREATOR.createFromParcel(in); + mMaxEnvelopeEffectSize = in.readInt(); + mMinEnvelopeEffectControlPointDurationMillis = in.readInt(); + mMaxEnvelopeEffectControlPointDurationMillis = in.readInt(); } public VibratorInfo(int id, @NonNull VibratorInfo baseVibratorInfo) { @@ -80,7 +86,10 @@ public class VibratorInfo implements Parcelable { baseVibratorInfo.mSupportedBraking, baseVibratorInfo.mSupportedPrimitives, baseVibratorInfo.mPrimitiveDelayMax, baseVibratorInfo.mCompositionSizeMax, baseVibratorInfo.mPwlePrimitiveDurationMax, baseVibratorInfo.mPwleSizeMax, - baseVibratorInfo.mQFactor, baseVibratorInfo.mFrequencyProfile); + baseVibratorInfo.mQFactor, baseVibratorInfo.mFrequencyProfile, + baseVibratorInfo.mMaxEnvelopeEffectSize, + baseVibratorInfo.mMinEnvelopeEffectControlPointDurationMillis, + baseVibratorInfo.mMaxEnvelopeEffectControlPointDurationMillis); } /** @@ -111,7 +120,9 @@ public class VibratorInfo implements Parcelable { @Nullable SparseBooleanArray supportedBraking, @NonNull SparseIntArray supportedPrimitives, int primitiveDelayMax, int compositionSizeMax, int pwlePrimitiveDurationMax, int pwleSizeMax, - float qFactor, @NonNull FrequencyProfile frequencyProfile) { + float qFactor, @NonNull FrequencyProfile frequencyProfile, + int maxEnvelopeEffectSize, int minEnvelopeEffectControlPointDurationMillis, + int maxEnvelopeEffectControlPointDurationMillis) { Preconditions.checkNotNull(supportedPrimitives); Preconditions.checkNotNull(frequencyProfile); mId = id; @@ -125,6 +136,11 @@ public class VibratorInfo implements Parcelable { mPwleSizeMax = pwleSizeMax; mQFactor = qFactor; mFrequencyProfile = frequencyProfile; + mMaxEnvelopeEffectSize = maxEnvelopeEffectSize; + mMinEnvelopeEffectControlPointDurationMillis = + minEnvelopeEffectControlPointDurationMillis; + mMaxEnvelopeEffectControlPointDurationMillis = + maxEnvelopeEffectControlPointDurationMillis; } @Override @@ -140,6 +156,9 @@ public class VibratorInfo implements Parcelable { dest.writeInt(mPwleSizeMax); dest.writeFloat(mQFactor); mFrequencyProfile.writeToParcel(dest, flags); + dest.writeInt(mMaxEnvelopeEffectSize); + dest.writeInt(mMinEnvelopeEffectControlPointDurationMillis); + dest.writeInt(mMaxEnvelopeEffectControlPointDurationMillis); } @Override @@ -186,7 +205,12 @@ public class VibratorInfo implements Parcelable { && Objects.equals(mSupportedEffects, that.mSupportedEffects) && Objects.equals(mSupportedBraking, that.mSupportedBraking) && Objects.equals(mQFactor, that.mQFactor) - && Objects.equals(mFrequencyProfile, that.mFrequencyProfile); + && Objects.equals(mFrequencyProfile, that.mFrequencyProfile) + && mMaxEnvelopeEffectSize == that.mMaxEnvelopeEffectSize + && mMinEnvelopeEffectControlPointDurationMillis + == that.mMinEnvelopeEffectControlPointDurationMillis + && mMaxEnvelopeEffectControlPointDurationMillis + == that.mMaxEnvelopeEffectControlPointDurationMillis; } @Override @@ -215,6 +239,11 @@ public class VibratorInfo implements Parcelable { + ", mPwleSizeMax=" + mPwleSizeMax + ", mQFactor=" + mQFactor + ", mFrequencyProfile=" + mFrequencyProfile + + ", mMaxEnvelopeEffectSize=" + mMaxEnvelopeEffectSize + + ", mMinEnvelopeEffectControlPointDurationMillis=" + + mMinEnvelopeEffectControlPointDurationMillis + + ", mMaxEnvelopeEffectControlPointDurationMillis=" + + mMaxEnvelopeEffectControlPointDurationMillis + '}'; } @@ -234,6 +263,11 @@ public class VibratorInfo implements Parcelable { pw.println("pwleSizeMax = " + mPwleSizeMax); pw.println("q-factor = " + mQFactor); pw.println("frequencyProfile = " + mFrequencyProfile); + pw.println("mMaxEnvelopeEffectSize = " + mMaxEnvelopeEffectSize); + pw.println("mMinEnvelopeEffectControlPointDurationMillis = " + + mMinEnvelopeEffectControlPointDurationMillis); + pw.println("mMaxEnvelopeEffectControlPointDurationMillis = " + + mMaxEnvelopeEffectControlPointDurationMillis); pw.decreaseIndent(); } @@ -414,6 +448,58 @@ public class VibratorInfo implements Parcelable { } /** + * Check whether the vibrator supports the creation of envelope effects. + * + * <p>See {@link Vibrator#areEnvelopeEffectsSupported()} for more information on envelope + * effects. + * + * @return True if the hardware supports creating envelope effects, false otherwise. + */ + public boolean areEnvelopeEffectsSupported() { + return hasCapability(IVibrator.CAP_COMPOSE_PWLE_EFFECTS_V2); + } + + /** + * Calculates the maximum allowed duration for an envelope effect, measured in milliseconds. + * + * @return The maximum duration (in milliseconds) that an envelope effect can have. + */ + public int getMaxEnvelopeEffectDurationMillis() { + return mMaxEnvelopeEffectSize * mMaxEnvelopeEffectControlPointDurationMillis; + } + + /** + * Gets the maximum number of control points supported for envelope effects on this device. + * + * @return The maximum number of control points that can be used to define an envelope effect. + */ + public int getMaxEnvelopeEffectSize() { + return mMaxEnvelopeEffectSize; + } + + /** + * Gets the minimum allowed duration for any individual segment within an envelope effect, + * measured in milliseconds. + * + * @return The minimum duration (in milliseconds) that a segment within an envelope effect + * can have. + */ + public int getMinEnvelopeEffectControlPointDurationMillis() { + return mMinEnvelopeEffectControlPointDurationMillis; + } + + /** + * Gets the maximum allowed duration for any individual segment within an envelope effect, + * measured in milliseconds. + * + * @return The maximum duration (in milliseconds) that a segment within an envelope effect + * can have. + */ + public int getMaxEnvelopeEffectControlPointDurationMillis() { + return mMaxEnvelopeEffectControlPointDurationMillis; + } + + /** * Check against this vibrator capabilities. * * @param capability one of IVibrator.CAP_* @@ -489,6 +575,9 @@ public class VibratorInfo implements Parcelable { if (hasCapability(IVibrator.CAP_EXTERNAL_AMPLITUDE_CONTROL)) { names.add("EXTERNAL_AMPLITUDE_CONTROL"); } + if (hasCapability(IVibrator.CAP_COMPOSE_PWLE_EFFECTS_V2)) { + names.add("CAP_COMPOSE_PWLE_EFFECTS_V2"); + } return names.toArray(new String[names.size()]); } @@ -745,6 +834,9 @@ public class VibratorInfo implements Parcelable { private float mQFactor = Float.NaN; private FrequencyProfile mFrequencyProfile = new FrequencyProfile(Float.NaN, Float.NaN, Float.NaN, null); + private int mMaxEnvelopeEffectSize; + private int mMinEnvelopeEffectControlPointDurationMillis; + private int mMaxEnvelopeEffectControlPointDurationMillis; /** A builder class for a {@link VibratorInfo}. */ public Builder(int id) { @@ -821,12 +913,46 @@ public class VibratorInfo implements Parcelable { return this; } + /** + * Configure the maximum number of control points supported for envelope effects on this + * device. + */ + @NonNull + public Builder setMaxEnvelopeEffectSize(int maxEnvelopeEffectSize) { + mMaxEnvelopeEffectSize = maxEnvelopeEffectSize; + return this; + } + + /** + * Configure the minimum supported duration for any individual segment within an + * envelope effect in milliseconds. + */ + @NonNull + public Builder setMinEnvelopeEffectControlPointDurationMillis( + int minEnvelopeEffectControlPointDuration) { + mMinEnvelopeEffectControlPointDurationMillis = minEnvelopeEffectControlPointDuration; + return this; + } + + /** + * Configure the maximum supported duration for any individual segment within an + * envelope effect in milliseconds. + */ + @NonNull + public Builder setMaxEnvelopeEffectControlPointDurationMillis( + int maxEnvelopeEffectControlPointDuration) { + mMaxEnvelopeEffectControlPointDurationMillis = maxEnvelopeEffectControlPointDuration; + return this; + } + /** Build the configured {@link VibratorInfo}. */ @NonNull public VibratorInfo build() { return new VibratorInfo(mId, mCapabilities, mSupportedEffects, mSupportedBraking, mSupportedPrimitives, mPrimitiveDelayMax, mCompositionSizeMax, - mPwlePrimitiveDurationMax, mPwleSizeMax, mQFactor, mFrequencyProfile); + mPwlePrimitiveDurationMax, mPwleSizeMax, mQFactor, mFrequencyProfile, + mMaxEnvelopeEffectSize, mMinEnvelopeEffectControlPointDurationMillis, + mMaxEnvelopeEffectControlPointDurationMillis); } /** diff --git a/core/java/android/os/flags.aconfig b/core/java/android/os/flags.aconfig index f026997bcc57..39bd15c968d7 100644 --- a/core/java/android/os/flags.aconfig +++ b/core/java/android/os/flags.aconfig @@ -52,14 +52,6 @@ flag { } flag { - name: "bugreport_mode_max_value" - is_exported: true - namespace: "telephony" - description: "Introduce a constant as maximum value of bugreport mode." - bug: "305067125" -} - -flag { name: "adpf_prefer_power_efficiency" is_exported: true namespace: "game" @@ -115,14 +107,6 @@ flag { } flag { - name: "adpf_fmq_eager_send" - namespace: "game" - description: "Guards the use of an eager-sending optimization in FMQ for low-latency messages" - is_fixed_read_only: true - bug: "315894228" -} - -flag { name: "adpf_hwui_gpu" namespace: "game" description: "Guards use of the FMQ channel for ADPF" diff --git a/core/java/android/os/vibrator/MultiVibratorInfo.java b/core/java/android/os/vibrator/MultiVibratorInfo.java index 5f3273129213..9c2b9782ffb3 100644 --- a/core/java/android/os/vibrator/MultiVibratorInfo.java +++ b/core/java/android/os/vibrator/MultiVibratorInfo.java @@ -59,7 +59,13 @@ public final class MultiVibratorInfo extends VibratorInfo { integerLimitIntersection(vibrators, VibratorInfo::getPwlePrimitiveDurationMax), integerLimitIntersection(vibrators, VibratorInfo::getPwleSizeMax), floatPropertyIntersection(vibrators, VibratorInfo::getQFactor), - mergedProfile); + mergedProfile, + integerLimitIntersection(vibrators, + VibratorInfo::getMaxEnvelopeEffectSize), + integerLimitIntersection(vibrators, + VibratorInfo::getMinEnvelopeEffectControlPointDurationMillis), + integerLimitIntersection(vibrators, + VibratorInfo::getMaxEnvelopeEffectControlPointDurationMillis)); } private static int capabilitiesIntersection(VibratorInfo[] infos, diff --git a/core/java/android/os/vibrator/VibrationConfig.java b/core/java/android/os/vibrator/VibrationConfig.java index bc6c5706f6fd..e6e5a27bd731 100644 --- a/core/java/android/os/vibrator/VibrationConfig.java +++ b/core/java/android/os/vibrator/VibrationConfig.java @@ -30,17 +30,13 @@ import static android.os.VibrationAttributes.USAGE_UNKNOWN; import android.annotation.Nullable; import android.content.res.Resources; -import android.os.SystemProperties; import android.os.VibrationAttributes; import android.os.Vibrator; import android.os.Vibrator.VibrationIntensity; import android.util.IndentingPrintWriter; -import com.android.internal.annotations.VisibleForTesting; - import java.io.PrintWriter; import java.util.Arrays; -import java.util.function.Function; /** * List of device-specific internal vibration configuration loaded from platform config.xml. @@ -54,37 +50,6 @@ import java.util.function.Function; public class VibrationConfig { /** - * The default gain to be applied between vibration scale levels. - * - * <p>Scale levels are defined as the difference between the user vibration intensity setting - * and the device default config for each usage. The intensity values are defined as one of - * Vibrator.VIBRATION_INTENSITY_*. - * - * <p>A user setting HIGH set on a device with default value LOW will cause the vibration - * intensity to be scaled up 2 levels, i.e. scale with a factor of gain^2. A system with 3 - * intensities LOW, MEDIUM and HIGH has the following 5 scale levels: - * - * <ol> - * <li>VERY_HIGH: user(HIGH) - device(LOW) - * <li>HIGH: user(HIGH) - device(MEDIUM) / user(MEDIUM) - device(LOW) - * <li>NONE: user == device - * <li>LOW: user(MEDIUM) - device(HIGH) / user(LOW) - device(MEDIUM) - * <li>VERY_LOW: user(LOW) - device(HIGH) - * </ol> - * - * <p>A device will only ever apply 3 out of these 5 levels based on the default intensity - * config set for each usage (e.g. config_default[Alarm|Ring|Notification]VibrationIntensity). - * - * <p>This value must be greater than 1. The {@link #DEFAULT_SCALE_LEVEL_GAIN} will be used if - * this property is undefined or invalid. - * - * @hide - */ - @VisibleForTesting - static final String SCALE_LEVEL_GAIN_SYSTEM_PROPERTY = - "vendor.vibrator.scale.level.gain"; - - /** * Hardcoded default scale level gain to be applied between each scale level to define their * scale factor value. * @@ -104,7 +69,7 @@ public class VibrationConfig { private final int mRampDownDurationMs; private final int mRequestVibrationParamsTimeoutMs; private final int[] mRequestVibrationParamsForUsages; - private final float mDefaultVibrationScaleLevelGain; + private final boolean mIgnoreVibrationsOnWirelessCharger; @VibrationIntensity @@ -124,18 +89,8 @@ public class VibrationConfig { /** @hide */ public VibrationConfig(@Nullable Resources resources) { - this(resources, SystemProperties::get); - } - - /** @hide */ - @VisibleForTesting - public VibrationConfig(@Nullable Resources resources, - Function<String, String> systemPropertiesGetter) { - mDefaultVibrationAmplitude = loadInteger(resources, - com.android.internal.R.integer.config_defaultVibrationAmplitude, - DEFAULT_AMPLITUDE); - mDefaultVibrationScaleLevelGain = loadFloat(systemPropertiesGetter, - SCALE_LEVEL_GAIN_SYSTEM_PROPERTY, DEFAULT_SCALE_LEVEL_GAIN); + mDefaultVibrationAmplitude = resources.getInteger( + com.android.internal.R.integer.config_defaultVibrationAmplitude); mHapticChannelMaxVibrationAmplitude = loadFloat(resources, com.android.internal.R.dimen.config_hapticChannelMaxVibrationAmplitude); mRampDownDurationMs = loadInteger(resources, @@ -180,15 +135,6 @@ public class VibrationConfig { return res != null ? res.getFloat(resId) : 0f; } - private static float loadFloat(Function<String, String> systemPropertiesGetter, - String propertyKey, float defaultValue) { - try { - return Float.parseFloat(systemPropertiesGetter.apply(propertyKey)); - } catch (Exception e) { - return defaultValue; - } - } - private static int loadInteger(@Nullable Resources res, int resId, int defaultValue) { return res != null ? res.getInteger(resId) : defaultValue; } @@ -230,10 +176,8 @@ public class VibrationConfig { * for each level. */ public float getDefaultVibrationScaleLevelGain() { - if (mDefaultVibrationScaleLevelGain <= 1) { - return DEFAULT_SCALE_LEVEL_GAIN; - } - return mDefaultVibrationScaleLevelGain; + // TODO(b/356407380): add device config for this + return DEFAULT_SCALE_LEVEL_GAIN; } /** @@ -326,7 +270,6 @@ public class VibrationConfig { return "VibrationConfig{" + "mIgnoreVibrationsOnWirelessCharger=" + mIgnoreVibrationsOnWirelessCharger + ", mDefaultVibrationAmplitude=" + mDefaultVibrationAmplitude - + ", mDefaultVibrationScaleLevelGain=" + mDefaultVibrationScaleLevelGain + ", mHapticChannelMaxVibrationAmplitude=" + mHapticChannelMaxVibrationAmplitude + ", mRampStepDurationMs=" + mRampStepDurationMs + ", mRampDownDurationMs=" + mRampDownDurationMs @@ -353,7 +296,6 @@ public class VibrationConfig { pw.increaseIndent(); pw.println("ignoreVibrationsOnWirelessCharger = " + mIgnoreVibrationsOnWirelessCharger); pw.println("defaultVibrationAmplitude = " + mDefaultVibrationAmplitude); - pw.println("defaultVibrationScaleLevelGain = " + mDefaultVibrationScaleLevelGain); pw.println("hapticChannelMaxAmplitude = " + mHapticChannelMaxVibrationAmplitude); pw.println("rampStepDurationMs = " + mRampStepDurationMs); pw.println("rampDownDurationMs = " + mRampDownDurationMs); diff --git a/core/java/android/permission/flags.aconfig b/core/java/android/permission/flags.aconfig index 6c486dbfd7a2..991611a1af10 100644 --- a/core/java/android/permission/flags.aconfig +++ b/core/java/android/permission/flags.aconfig @@ -249,3 +249,11 @@ flag { description: "This flag is used to enabled the Wallet Role s icon fetching from manifest property" bug: "349942654" } + +flag { + name: "replace_body_sensors_permission_enabled" + is_exported: true + namespace: "android_health_services" + description: "This flag is used to enable replacing permission BODY_SENSORS(and BODY_SENSORS_BACKGROUND) with granular health permission READ_HEART_RATE(and READ_HEALTH_DATA_IN_BACKGROUND)" + bug: "364638912" +} diff --git a/core/java/android/provider/ContactsContract.java b/core/java/android/provider/ContactsContract.java index 7d00b80488a9..f6eb4b52984d 100644 --- a/core/java/android/provider/ContactsContract.java +++ b/core/java/android/provider/ContactsContract.java @@ -17,6 +17,8 @@ package android.provider; import android.accounts.Account; +import android.annotation.FlaggedApi; +import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; @@ -65,6 +67,8 @@ import com.google.android.collect.Sets; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -3015,6 +3019,173 @@ public final class ContactsContract { } /** + * Represents the state of the default account, and the actual {@link Account} if it's + * a cloud account. + * If the default account is set to {@link #DEFAULT_ACCOUNT_STATE_LOCAL} or + * {@link #DEFAULT_ACCOUNT_STATE_CLOUD}, new raw contacts requested for insertion + * without a + * specified {@link Account} will be saved in the default account. + * The default account can have one of the following four states: + * <ul> + * <li> {@link #DEFAULT_ACCOUNT_STATE_INVALID}: An invalid state that should not + * occur on the device. </li> + * <li> {@link #DEFAULT_ACCOUNT_STATE_NOT_SET}: The default account has not + * been set by the user. </li> + * <li> {@link #DEFAULT_ACCOUNT_STATE_LOCAL}: The default account is set to + * the local device storage. New raw contacts requested for insertion without a + * specified + * {@link Account} will be saved in a null or custom local account. </li> + * <li> {@link #DEFAULT_ACCOUNT_STATE_CLOUD}: The default account is set to a + * cloud-synced account. New raw contacts requested for insertion without a specified + * {@link Account} will be saved in {@link mCloudAccount}. </li> + * </ul> + */ + @FlaggedApi(Flags.FLAG_NEW_DEFAULT_ACCOUNT_API_ENABLED) + public static final class DefaultAccountAndState { + // The state of the default account. + /** A state that is invalid. */ + public static final int DEFAULT_ACCOUNT_STATE_INVALID = 0; + + /** A state indicating that default account is not set. */ + public static final int DEFAULT_ACCOUNT_STATE_NOT_SET = 1; + + /** A state indicating that default account is set to local device storage. */ + public static final int DEFAULT_ACCOUNT_STATE_LOCAL = 2; + + /** + * A state indicating that the default account is set as an account that is synced + * to the cloud. + */ + public static final int DEFAULT_ACCOUNT_STATE_CLOUD = 3; + + /** + * The state of the default account. One of + * {@link #DEFAULT_ACCOUNT_STATE_NOT_SET}, + * {@link #DEFAULT_ACCOUNT_STATE_LOCAL} or + * {@link #DEFAULT_ACCOUNT_STATE_CLOUD}. + */ + @DefaultAccountState + private final int mState; + + /** + * The account of the default account, when {@link mState} is { + * + * @link #STATE_SET_TO_CLOUD}, or null otherwise. + */ + private final Account mCloudAccount; + + /** + * Constructs a new `DefaultAccountAndState` instance with the specified state and + * cloud + * account. + * + * @param state The state of the default account. + * @param cloudAccount The cloud account associated with the default account, + * or null if the state is not + * {@link #DEFAULT_ACCOUNT_STATE_CLOUD}. + */ + public DefaultAccountAndState(@DefaultAccountState int state, + @Nullable Account cloudAccount) { + if (state == DEFAULT_ACCOUNT_STATE_INVALID) { + throw new IllegalArgumentException("Invalid default account state."); + } + if ((state == DEFAULT_ACCOUNT_STATE_CLOUD) != (cloudAccount != null)) { + throw new IllegalArgumentException( + "Default account can be set to cloud if and only if the cloud " + + "account is provided."); + } + this.mState = state; + this.mCloudAccount = + (mState == DEFAULT_ACCOUNT_STATE_CLOUD) ? cloudAccount : null; + } + + /** + * Creates a `DefaultAccountAndState` instance representing a default account + * that is set to the cloud and associated with the specified cloud account. + * + * @param cloudAccount The non-null cloud account associated with the default + * contacts + * account. + * @return A new `DefaultAccountAndState` instance with state + * {@link #DEFAULT_ACCOUNT_STATE_CLOUD}. + */ + public static @NonNull DefaultAccountAndState ofCloud( + @NonNull Account cloudAccount) { + return new DefaultAccountAndState(DEFAULT_ACCOUNT_STATE_CLOUD, cloudAccount); + } + + /** + * Creates a `DefaultAccountAndState` instance representing a default account + * that is set to the local device storage. + * + * @return A new `DefaultAccountAndState` instance with state + * {@link #DEFAULT_ACCOUNT_STATE_LOCAL}. + */ + public static @NonNull DefaultAccountAndState ofLocal() { + return new DefaultAccountAndState(DEFAULT_ACCOUNT_STATE_LOCAL, null); + } + + /** + * Creates a `DefaultAccountAndState` instance representing a default account + * that is not set. + * + * @return A new `DefaultAccountAndState` instance with state + * {@link #DEFAULT_ACCOUNT_STATE_NOT_SET}. + */ + public static @NonNull DefaultAccountAndState ofNotSet() { + return new DefaultAccountAndState(DEFAULT_ACCOUNT_STATE_NOT_SET, null); + } + + /** + * @return the state of the default account. + */ + @DefaultAccountState + public int getState() { + return mState; + } + + /** + * @return the cloud account associated with the default account, or null if the + * state is not {@link #DEFAULT_ACCOUNT_STATE_CLOUD}. + */ + public @Nullable Account getCloudAccount() { + return mCloudAccount; + } + + @Override + public int hashCode() { + return Objects.hash(mState, mCloudAccount); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (!(obj instanceof DefaultAccountAndState that)) { + return false; + } + + return mState == that.mState && Objects.equals(mCloudAccount, + that.mCloudAccount); + } + + /** + * Annotation for all default account states. + * + * @hide + */ + @Retention(RetentionPolicy.SOURCE) + @IntDef( + prefix = {"DEFAULT_ACCOUNT_STATE_"}, + value = {DEFAULT_ACCOUNT_STATE_INVALID, + DEFAULT_ACCOUNT_STATE_NOT_SET, + DEFAULT_ACCOUNT_STATE_LOCAL, DEFAULT_ACCOUNT_STATE_CLOUD}) + public @interface DefaultAccountState { + } + } + + /** * A sub-directory of a single raw contact that contains all of its * {@link ContactsContract.Data} rows. To access this directory * append {@link Data#CONTENT_DIRECTORY} to the raw contact URI. @@ -8326,7 +8497,6 @@ public final class ContactsContract { public static final String RAW_CONTACT_ID2 = "raw_contact_id2"; } - /** * Class containing utility methods around determine what accounts in the ContactsProvider are * related to the SIM cards in the device. @@ -8840,6 +9010,30 @@ public final class ContactsContract { public static final String KEY_DEFAULT_ACCOUNT = "key_default_account"; /** + * Key in the Bundle for the default account state. + * + * @hide + */ + public static final String KEY_DEFAULT_ACCOUNT_STATE = + "key_default_contacts_account_state"; + + /** + * The method to invoke in order to set the default account. + * + * @hide + */ + public static final String SET_DEFAULT_ACCOUNT_FOR_NEW_CONTACTS_METHOD = + "setDefaultAccountForNewContacts"; + + /** + * The method to invoke in order to query the default account. + * + * @hide + */ + public static final String QUERY_DEFAULT_ACCOUNT_FOR_NEW_CONTACTS_METHOD = + "queryDefaultAccountForNewContacts"; + + /** * Get the account that is set as the default account for new contacts, which should be * initially selected when creating a new contact on contact management apps. * If the setting has not been set by any app, it will return null. Once the setting diff --git a/core/java/android/provider/flags.aconfig b/core/java/android/provider/flags.aconfig index 53d0c62ec2c5..5c0f8737ca27 100644 --- a/core/java/android/provider/flags.aconfig +++ b/core/java/android/provider/flags.aconfig @@ -43,3 +43,12 @@ flag { purpose: PURPOSE_FEATURE } } + +# OWNER = liefuliu +flag { + name: "new_default_account_api_enabled" + is_exported: true + namespace: "contacts" + description: "Enable the new ContactsContract Default Account APIs." + bug: "359957527" +} diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java index a395c1a05744..89ea85200cd6 100644 --- a/core/java/android/widget/RemoteViews.java +++ b/core/java/android/widget/RemoteViews.java @@ -153,6 +153,7 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; import java.util.concurrent.TimeUnit; import java.util.function.Consumer; +import java.util.function.Function; import java.util.function.Predicate; /** @@ -712,6 +713,24 @@ public class RemoteViews implements Parcelable, Filter { } public abstract void writeToParcel(Parcel dest, int flags); + + /** + * Override to return true if this Action can be serialized to Protobuf, and implement + * writeToProto / createFromProto. + * + * If this returns false, then the action will be omitted from RemoteViews previews created + * with createPreviewFromProto / writePreviewToProto. + * + * Because Parcelables should not be serialized to disk, any action that contains an Intent, + * PendingIntent, or Bundle should return false here. + */ + public boolean canWriteToProto() { + return false; + } + + public void writeToProto(ProtoOutputStream out, Context context, Resources appResources) { + throw new UnsupportedOperationException(); + } } /** @@ -1506,6 +1525,7 @@ public class RemoteViews implements Parcelable, Filter { switch (in.getFieldNumber()) { case (int) RemoteViewsProto.RemoteCollectionCache.ENTRIES: final LongSparseArray<Object> entry = new LongSparseArray<>(); + final long entryToken = in.start( RemoteViewsProto.RemoteCollectionCache.ENTRIES); while (in.nextField() != NO_MORE_FIELDS) { @@ -1533,10 +1553,12 @@ public class RemoteViews implements Parcelable, Filter { } } in.end(entryToken); + checkContainsKeys(entry, new long[]{RemoteViewsProto.RemoteCollectionCache.Entry.ID, RemoteViewsProto.RemoteCollectionCache.Entry.URI, RemoteViewsProto.RemoteCollectionCache.Entry.ITEMS}); + entries.add(entry); break; default: @@ -2247,6 +2269,62 @@ public class RemoteViews implements Parcelable, Filter { public int getActionTag() { return BITMAP_REFLECTION_ACTION_TAG; } + + @Override + public boolean canWriteToProto() { + return true; + } + + @Override + public void writeToProto(ProtoOutputStream out, Context context, Resources appResources) { + final long token = out.start(RemoteViewsProto.Action.BITMAP_REFLECTION_ACTION); + out.write(RemoteViewsProto.BitmapReflectionAction.VIEW_ID, + appResources.getResourceName(mViewId)); + out.write(RemoteViewsProto.BitmapReflectionAction.METHOD_NAME, mMethodName); + out.write(RemoteViewsProto.BitmapReflectionAction.BITMAP_ID, mBitmapId); + out.end(token); + } + } + + private PendingResources<Action> createFromBitmapReflectionActionFromProto(ProtoInputStream in) + throws Exception { + final LongSparseArray<Object> values = new LongSparseArray<>(); + + final long token = in.start(RemoteViewsProto.Action.BITMAP_REFLECTION_ACTION); + while (in.nextField() != NO_MORE_FIELDS) { + switch (in.getFieldNumber()) { + case (int) RemoteViewsProto.BitmapReflectionAction.VIEW_ID: + values.put(RemoteViewsProto.BitmapReflectionAction.VIEW_ID, + in.readString(RemoteViewsProto.BitmapReflectionAction.VIEW_ID)); + break; + case (int) RemoteViewsProto.BitmapReflectionAction.METHOD_NAME: + values.put(RemoteViewsProto.BitmapReflectionAction.METHOD_NAME, + in.readString(RemoteViewsProto.BitmapReflectionAction.METHOD_NAME)); + break; + case (int) RemoteViewsProto.BitmapReflectionAction.BITMAP_ID: + values.put(RemoteViewsProto.BitmapReflectionAction.BITMAP_ID, + in.readInt(RemoteViewsProto.BitmapReflectionAction.BITMAP_ID)); + break; + default: + Log.w(LOG_TAG, "Unhandled field while reading RemoteViews proto!\n" + + ProtoUtils.currentFieldToString(in)); + } + } + in.end(token); + + checkContainsKeys(values, new long[]{RemoteViewsProto.BitmapReflectionAction.VIEW_ID, + RemoteViewsProto.BitmapReflectionAction.METHOD_NAME}); + + return (context, resources, rootData, depth) -> { + int viewId = getAsIdentifier(resources, values, + RemoteViewsProto.BitmapReflectionAction.VIEW_ID); + return new BitmapReflectionAction(viewId, + (String) values.get(RemoteViewsProto.BitmapReflectionAction.METHOD_NAME), + rootData.mBitmapCache.getBitmapForId( + (int) values.get(RemoteViewsProto.BitmapReflectionAction.BITMAP_ID, + 0))); + }; + } /** @@ -2560,6 +2638,268 @@ public class RemoteViews implements Parcelable, Filter { public int getActionTag() { return REFLECTION_ACTION_TAG; } + + @Override + public boolean canWriteToProto() { + return true; + } + + @Override + public void writeToProto(ProtoOutputStream out, Context context, Resources appResources) { + final long token = out.start(RemoteViewsProto.Action.REFLECTION_ACTION); + out.write(RemoteViewsProto.ReflectionAction.VIEW_ID, + appResources.getResourceName(mViewId)); + out.write(RemoteViewsProto.ReflectionAction.METHOD_NAME, mMethodName); + out.write(RemoteViewsProto.ReflectionAction.PARAMETER_TYPE, mType); + if (this.mValue != null) { + switch (this.mType) { + case BOOLEAN: + // ProtoOutputStream will omit this write if the value is false + out.write(RemoteViewsProto.ReflectionAction.BOOLEAN_VALUE, + (boolean) this.mValue); + break; + case BYTE: + out.write(RemoteViewsProto.ReflectionAction.BYTE_VALUE, + new byte[]{(byte) this.mValue}); + break; + case SHORT: + out.write(RemoteViewsProto.ReflectionAction.SHORT_VALUE, + (short) this.mValue); + break; + case INT: + out.write(RemoteViewsProto.ReflectionAction.INT_VALUE, (int) this.mValue); + break; + case LONG: + out.write(RemoteViewsProto.ReflectionAction.LONG_VALUE, (long) this.mValue); + break; + case FLOAT: + out.write(RemoteViewsProto.ReflectionAction.FLOAT_VALUE, + (float) this.mValue); + break; + case DOUBLE: + out.write(RemoteViewsProto.ReflectionAction.DOUBLE_VALUE, + (double) this.mValue); + break; + case CHAR: + out.write(RemoteViewsProto.ReflectionAction.CHAR_VALUE, + (Character) this.mValue); + break; + case STRING: + out.write(RemoteViewsProto.ReflectionAction.STRING_VALUE, + (String) this.mValue); + break; + case CHAR_SEQUENCE: + long csToken = out.start( + RemoteViewsProto.ReflectionAction.CHAR_SEQUENCE_VALUE); + RemoteViewsSerializers.writeCharSequenceToProto(out, + (CharSequence) this.mValue); + out.end(csToken); + break; + case URI: + out.write(RemoteViewsProto.ReflectionAction.URI_VALUE, + ((Uri) this.mValue).toString()); + break; + case BITMAP: + final ByteArrayOutputStream bytes = new ByteArrayOutputStream(); + ((Bitmap) this.mValue).compress(Bitmap.CompressFormat.WEBP_LOSSLESS, 100, + bytes); + out.write(RemoteViewsProto.ReflectionAction.BITMAP_VALUE, + bytes.toByteArray()); + break; + case BLEND_MODE: + out.write(RemoteViewsProto.ReflectionAction.BLEND_MODE_VALUE, + BlendMode.toValue((BlendMode) this.mValue)); + break; + case COLOR_STATE_LIST: + writeColorStateListToProto(out, (ColorStateList) this.mValue, + RemoteViewsProto.ReflectionAction.COLOR_STATE_LIST_VALUE); + break; + case ICON: + writeIconToProto(out, appResources, (Icon) this.mValue, + RemoteViewsProto.ReflectionAction.ICON_VALUE); + break; + case BUNDLE: + case INTENT: + default: + break; + } + } + out.end(token); + } + + public static PendingResources<Action> createFromProto(ProtoInputStream in) + throws Exception { + final LongSparseArray<Object> values = new LongSparseArray<>(); + + final long token = in.start(RemoteViewsProto.Action.REFLECTION_ACTION); + while (in.nextField() != NO_MORE_FIELDS) { + switch (in.getFieldNumber()) { + case (int) RemoteViewsProto.ReflectionAction.VIEW_ID: + values.put(RemoteViewsProto.ReflectionAction.VIEW_ID, + in.readString(RemoteViewsProto.ReflectionAction.VIEW_ID)); + break; + case (int) RemoteViewsProto.ReflectionAction.METHOD_NAME: + values.put(RemoteViewsProto.ReflectionAction.METHOD_NAME, + in.readString(RemoteViewsProto.ReflectionAction.METHOD_NAME)); + break; + case (int) RemoteViewsProto.ReflectionAction.PARAMETER_TYPE: + values.put(RemoteViewsProto.ReflectionAction.PARAMETER_TYPE, + in.readInt(RemoteViewsProto.ReflectionAction.PARAMETER_TYPE)); + break; + case (int) RemoteViewsProto.ReflectionAction.BOOLEAN_VALUE: + values.put(RemoteViewsProto.ReflectionAction.BOOLEAN_VALUE, + in.readBoolean(RemoteViewsProto.ReflectionAction.BOOLEAN_VALUE)); + break; + case (int) RemoteViewsProto.ReflectionAction.BYTE_VALUE: + values.put(RemoteViewsProto.ReflectionAction.BYTE_VALUE, + in.readBytes(RemoteViewsProto.ReflectionAction.BYTE_VALUE)); + break; + case (int) RemoteViewsProto.ReflectionAction.SHORT_VALUE: + values.put(RemoteViewsProto.ReflectionAction.SHORT_VALUE, + (short) in.readInt(RemoteViewsProto.ReflectionAction.SHORT_VALUE)); + break; + case (int) RemoteViewsProto.ReflectionAction.INT_VALUE: + values.put(RemoteViewsProto.ReflectionAction.INT_VALUE, + in.readInt(RemoteViewsProto.ReflectionAction.INT_VALUE)); + break; + case (int) RemoteViewsProto.ReflectionAction.LONG_VALUE: + values.put(RemoteViewsProto.ReflectionAction.LONG_VALUE, + in.readLong(RemoteViewsProto.ReflectionAction.LONG_VALUE)); + break; + case (int) RemoteViewsProto.ReflectionAction.FLOAT_VALUE: + values.put(RemoteViewsProto.ReflectionAction.FLOAT_VALUE, + in.readFloat(RemoteViewsProto.ReflectionAction.FLOAT_VALUE)); + break; + case (int) RemoteViewsProto.ReflectionAction.DOUBLE_VALUE: + values.put(RemoteViewsProto.ReflectionAction.DOUBLE_VALUE, + in.readDouble(RemoteViewsProto.ReflectionAction.DOUBLE_VALUE)); + break; + case (int) RemoteViewsProto.ReflectionAction.CHAR_VALUE: + values.put(RemoteViewsProto.ReflectionAction.CHAR_VALUE, + (char) in.readInt(RemoteViewsProto.ReflectionAction.CHAR_VALUE)); + break; + case (int) RemoteViewsProto.ReflectionAction.STRING_VALUE: + values.put(RemoteViewsProto.ReflectionAction.STRING_VALUE, + in.readString(RemoteViewsProto.ReflectionAction.STRING_VALUE)); + break; + case (int) RemoteViewsProto.ReflectionAction.CHAR_SEQUENCE_VALUE: + values.put(RemoteViewsProto.ReflectionAction.CHAR_SEQUENCE_VALUE, + createCharSequenceFromProto(in, + RemoteViewsProto.ReflectionAction.CHAR_SEQUENCE_VALUE)); + break; + case (int) RemoteViewsProto.ReflectionAction.URI_VALUE: + values.put(RemoteViewsProto.ReflectionAction.URI_VALUE, + in.readString(RemoteViewsProto.ReflectionAction.URI_VALUE)); + break; + case (int) RemoteViewsProto.ReflectionAction.BITMAP_VALUE: + byte[] bitmapData = in.readBytes( + RemoteViewsProto.ReflectionAction.BITMAP_VALUE); + values.put(RemoteViewsProto.ReflectionAction.BITMAP_VALUE, + BitmapFactory.decodeByteArray(bitmapData, 0, bitmapData.length)); + break; + case (int) RemoteViewsProto.ReflectionAction.COLOR_STATE_LIST_VALUE: + values.put(RemoteViewsProto.ReflectionAction.COLOR_STATE_LIST_VALUE, + createColorStateListFromProto(in, + RemoteViewsProto.ReflectionAction.COLOR_STATE_LIST_VALUE)); + break; + case (int) RemoteViewsProto.ReflectionAction.ICON_VALUE: + values.put(RemoteViewsProto.ReflectionAction.ICON_VALUE, + createIconFromProto(in, + RemoteViewsProto.ReflectionAction.ICON_VALUE)); + break; + case (int) RemoteViewsProto.ReflectionAction.BLEND_MODE_VALUE: + values.put(RemoteViewsProto.ReflectionAction.BLEND_MODE_VALUE, + BlendMode.fromValue(in.readInt( + RemoteViewsProto.ReflectionAction.BLEND_MODE_VALUE))); + break; + default: + Log.w(LOG_TAG, "Unhandled field while reading RemoteViews proto!\n" + + ProtoUtils.currentFieldToString(in)); + } + } + in.end(token); + + checkContainsKeys(values, new long[]{RemoteViewsProto.ReflectionAction.VIEW_ID, + RemoteViewsProto.ReflectionAction.METHOD_NAME, + RemoteViewsProto.ReflectionAction.PARAMETER_TYPE}); + + return (context, resources, rootData, depth) -> { + int viewId = getAsIdentifier(resources, values, + RemoteViewsProto.ReflectionAction.VIEW_ID); + Object value = null; + int parameterType = (int) values.get( + RemoteViewsProto.ReflectionAction.PARAMETER_TYPE); + switch (parameterType) { + case BOOLEAN: + value = (boolean) values.get( + RemoteViewsProto.ReflectionAction.BOOLEAN_VALUE, false); + break; + case BYTE: + byte[] bytes = (byte[]) values.get( + RemoteViewsProto.ReflectionAction.BYTE_VALUE); + if (bytes != null && bytes.length > 0) { + value = bytes[0]; + } + break; + case SHORT: + value = (short) values.get(RemoteViewsProto.ReflectionAction.SHORT_VALUE, + 0); + break; + case INT: + value = (int) values.get(RemoteViewsProto.ReflectionAction.INT_VALUE, 0); + break; + case LONG: + value = (long) values.get(RemoteViewsProto.ReflectionAction.LONG_VALUE, 0); + break; + case FLOAT: + value = (float) values.get(RemoteViewsProto.ReflectionAction.FLOAT_VALUE, + 0); + break; + case DOUBLE: + value = (double) values.get(RemoteViewsProto.ReflectionAction.DOUBLE_VALUE, + 0); + break; + case CHAR: + value = (char) values.get(RemoteViewsProto.ReflectionAction.CHAR_VALUE, 0); + break; + case STRING: + value = (String) values.get(RemoteViewsProto.ReflectionAction.STRING_VALUE); + break; + case CHAR_SEQUENCE: + value = (CharSequence) values.get( + RemoteViewsProto.ReflectionAction.CHAR_SEQUENCE_VALUE); + break; + case URI: + value = Uri.parse( + (String) values.get(RemoteViewsProto.ReflectionAction.URI_VALUE)); + break; + case BITMAP: + value = (Bitmap) values.get(RemoteViewsProto.ReflectionAction.BITMAP_VALUE); + break; + case BLEND_MODE: + value = (BlendMode) values.get( + RemoteViewsProto.ReflectionAction.BLEND_MODE_VALUE); + break; + case COLOR_STATE_LIST: + value = (ColorStateList) values.get( + RemoteViewsProto.ReflectionAction.COLOR_STATE_LIST_VALUE); + break; + case ICON: + value = ((PendingResources<Icon>) values.get( + RemoteViewsProto.ReflectionAction.ICON_VALUE)).create(context, + resources, rootData, depth); + break; + case BUNDLE: + case INTENT: + default: + // omit the action for unsupported parameter types + return null; + } + return new ReflectionAction(viewId, + (String) values.get(RemoteViewsProto.ReflectionAction.METHOD_NAME), + parameterType, value); + }; + } } private static final class ResourceReflectionAction extends BaseReflectionAction { @@ -2740,7 +3080,87 @@ public class RemoteViews implements Parcelable, Filter { public int getActionTag() { return ATTRIBUTE_REFLECTION_ACTION_TAG; } + + @Override + public boolean canWriteToProto() { + return true; + } + + @Override + public void writeToProto(ProtoOutputStream out, Context context, Resources appResources) { + final long token = out.start(RemoteViewsProto.Action.ATTRIBUTE_REFLECTION_ACTION); + out.write(RemoteViewsProto.AttributeReflectionAction.VIEW_ID, + appResources.getResourceName(mViewId)); + out.write(RemoteViewsProto.AttributeReflectionAction.METHOD_NAME, mMethodName); + out.write(RemoteViewsProto.AttributeReflectionAction.PARAMETER_TYPE, mType); + out.write(RemoteViewsProto.AttributeReflectionAction.RESOURCE_TYPE, mResourceType); + if (mAttrId != 0) { + out.write(RemoteViewsProto.AttributeReflectionAction.ATTRIBUTE_ID, + appResources.getResourceName(mAttrId)); + } + out.end(token); + } + + public static PendingResources<Action> createFromProto(ProtoInputStream in) + throws Exception { + final LongSparseArray<Object> values = new LongSparseArray<>(); + + final long token = in.start(RemoteViewsProto.Action.ATTRIBUTE_REFLECTION_ACTION); + while (in.nextField() != NO_MORE_FIELDS) { + switch (in.getFieldNumber()) { + case (int) RemoteViewsProto.AttributeReflectionAction.VIEW_ID: { + values.put(RemoteViewsProto.AttributeReflectionAction.VIEW_ID, + in.readString(RemoteViewsProto.AttributeReflectionAction.VIEW_ID)); + break; + } + case (int) RemoteViewsProto.AttributeReflectionAction.METHOD_NAME: + values.put(RemoteViewsProto.AttributeReflectionAction.METHOD_NAME, + in.readString( + RemoteViewsProto.AttributeReflectionAction.METHOD_NAME)); + break; + case (int) RemoteViewsProto.AttributeReflectionAction.ATTRIBUTE_ID: + values.put(RemoteViewsProto.AttributeReflectionAction.ATTRIBUTE_ID, + in.readString( + RemoteViewsProto.AttributeReflectionAction.ATTRIBUTE_ID)); + break; + case (int) RemoteViewsProto.AttributeReflectionAction.PARAMETER_TYPE: + values.put(RemoteViewsProto.AttributeReflectionAction.PARAMETER_TYPE, + in.readInt( + RemoteViewsProto.AttributeReflectionAction.PARAMETER_TYPE)); + break; + case (int) RemoteViewsProto.AttributeReflectionAction.RESOURCE_TYPE: + values.put(RemoteViewsProto.AttributeReflectionAction.RESOURCE_TYPE, + in.readInt( + RemoteViewsProto.AttributeReflectionAction.RESOURCE_TYPE)); + break; + default: + Log.w(LOG_TAG, "Unhandled field while reading RemoteViews proto!\n" + + ProtoUtils.currentFieldToString(in)); + } + } + in.end(token); + + checkContainsKeys(values, new long[]{RemoteViewsProto.AttributeReflectionAction.VIEW_ID, + RemoteViewsProto.AttributeReflectionAction.METHOD_NAME, + RemoteViewsProto.AttributeReflectionAction.PARAMETER_TYPE, + RemoteViewsProto.AttributeReflectionAction.RESOURCE_TYPE}); + + return (context, resources, rootData, depth) -> { + int viewId = getAsIdentifier(resources, values, + RemoteViewsProto.AttributeReflectionAction.VIEW_ID); + int attributeId = (values.indexOfKey( + RemoteViewsProto.AttributeReflectionAction.ATTRIBUTE_ID) >= 0) + ? getAsIdentifier(resources, values, + RemoteViewsProto.AttributeReflectionAction.ATTRIBUTE_ID) : 0; + return new AttributeReflectionAction(viewId, + (String) values.get(RemoteViewsProto.AttributeReflectionAction.METHOD_NAME), + (int) values.get(RemoteViewsProto.AttributeReflectionAction.PARAMETER_TYPE), + (int) values.get(RemoteViewsProto.AttributeReflectionAction.RESOURCE_TYPE), + attributeId); + }; + } } + private static final class ComplexUnitDimensionReflectionAction extends BaseReflectionAction { private final float mValue; @ComplexDimensionUnit @@ -2794,6 +3214,101 @@ public class RemoteViews implements Parcelable, Filter { public int getActionTag() { return COMPLEX_UNIT_DIMENSION_REFLECTION_ACTION_TAG; } + + @Override + public boolean canWriteToProto() { + return true; + } + + @Override + public void writeToProto(ProtoOutputStream out, Context context, Resources appResources) { + final long token = out.start( + RemoteViewsProto.Action.COMPLEX_UNIT_DIMENSION_REFLECTION_ACTION); + out.write(RemoteViewsProto.ComplexUnitDimensionReflectionAction.VIEW_ID, + appResources.getResourceName(mViewId)); + out.write(RemoteViewsProto.ComplexUnitDimensionReflectionAction.METHOD_NAME, + mMethodName); + out.write(RemoteViewsProto.ComplexUnitDimensionReflectionAction.PARAMETER_TYPE, mType); + out.write(RemoteViewsProto.ComplexUnitDimensionReflectionAction.DIMENSION_VALUE, + mValue); + out.write(RemoteViewsProto.ComplexUnitDimensionReflectionAction.UNIT, mUnit); + out.end(token); + } + + public static PendingResources<Action> createFromProto(ProtoInputStream in) + throws Exception { + final LongSparseArray<Object> values = new LongSparseArray<>(); + + final long token = in.start( + RemoteViewsProto.Action.COMPLEX_UNIT_DIMENSION_REFLECTION_ACTION); + while (in.nextField() != NO_MORE_FIELDS) { + switch (in.getFieldNumber()) { + case (int) RemoteViewsProto.ComplexUnitDimensionReflectionAction.VIEW_ID: + values.put(RemoteViewsProto.ComplexUnitDimensionReflectionAction.VIEW_ID, + in.readString( + RemoteViewsProto + .ComplexUnitDimensionReflectionAction.VIEW_ID)); + break; + case (int) RemoteViewsProto.ComplexUnitDimensionReflectionAction.METHOD_NAME: + values.put( + RemoteViewsProto.ComplexUnitDimensionReflectionAction.METHOD_NAME, + in.readString( + RemoteViewsProto + .ComplexUnitDimensionReflectionAction.METHOD_NAME)); + break; + case (int) RemoteViewsProto.ComplexUnitDimensionReflectionAction.PARAMETER_TYPE: + values.put( + RemoteViewsProto + .ComplexUnitDimensionReflectionAction.PARAMETER_TYPE, + in.readInt( + RemoteViewsProto + .ComplexUnitDimensionReflectionAction + .PARAMETER_TYPE)); + break; + case (int) RemoteViewsProto + .ComplexUnitDimensionReflectionAction.DIMENSION_VALUE: + values.put( + RemoteViewsProto + .ComplexUnitDimensionReflectionAction.DIMENSION_VALUE, + in.readFloat( + RemoteViewsProto + .ComplexUnitDimensionReflectionAction + .DIMENSION_VALUE)); + break; + case (int) RemoteViewsProto.ComplexUnitDimensionReflectionAction.UNIT: + values.put(RemoteViewsProto.ComplexUnitDimensionReflectionAction.UNIT, + in.readInt( + RemoteViewsProto + .ComplexUnitDimensionReflectionAction.UNIT)); + break; + default: + Log.w(LOG_TAG, "Unhandled field while reading RemoteViews proto!\n" + + ProtoUtils.currentFieldToString(in)); + } + } + in.end(token); + + checkContainsKeys(values, + new long[]{RemoteViewsProto.ComplexUnitDimensionReflectionAction.VIEW_ID, + RemoteViewsProto.ComplexUnitDimensionReflectionAction.METHOD_NAME, + RemoteViewsProto.ComplexUnitDimensionReflectionAction.PARAMETER_TYPE}); + + return (context, resources, rootData, depth) -> { + int viewId = getAsIdentifier(resources, values, + RemoteViewsProto.ComplexUnitDimensionReflectionAction.VIEW_ID); + return new ComplexUnitDimensionReflectionAction(viewId, (String) values.get( + RemoteViewsProto.ComplexUnitDimensionReflectionAction.METHOD_NAME), + (int) values.get( + RemoteViewsProto + .ComplexUnitDimensionReflectionAction.PARAMETER_TYPE), + (float) values.get( + RemoteViewsProto + .ComplexUnitDimensionReflectionAction.DIMENSION_VALUE, + 0), + (int) values.get(RemoteViewsProto.ComplexUnitDimensionReflectionAction.UNIT, + 0)); + }; + } } private static final class NightModeReflectionAction extends BaseReflectionAction { @@ -2868,6 +3383,145 @@ public class RemoteViews implements Parcelable, Filter { visitIconUri((Icon) mLightValue, visitor); } } + + @Override + public boolean canWriteToProto() { + return true; + } + + @Override + public void writeToProto(ProtoOutputStream out, Context context, Resources appResources) { + final long token = out.start(RemoteViewsProto.Action.NIGHT_MODE_REFLECTION_ACTION); + out.write(RemoteViewsProto.NightModeReflectionAction.VIEW_ID, + appResources.getResourceName(mViewId)); + out.write(RemoteViewsProto.NightModeReflectionAction.METHOD_NAME, mMethodName); + out.write(RemoteViewsProto.NightModeReflectionAction.PARAMETER_TYPE, mType); + switch (this.mType) { + case ICON: + writeIconToProto(out, appResources, (Icon) mLightValue, + RemoteViewsProto.NightModeReflectionAction.LIGHT_ICON); + writeIconToProto(out, appResources, (Icon) mDarkValue, + RemoteViewsProto.NightModeReflectionAction.DARK_ICON); + break; + case COLOR_STATE_LIST: + writeColorStateListToProto(out, (ColorStateList) mLightValue, + RemoteViewsProto.NightModeReflectionAction.LIGHT_COLOR_STATE_LIST); + writeColorStateListToProto(out, (ColorStateList) mDarkValue, + RemoteViewsProto.NightModeReflectionAction.DARK_COLOR_STATE_LIST); + break; + case INT: + out.write(RemoteViewsProto.NightModeReflectionAction.LIGHT_INT, + (int) mLightValue); + out.write(RemoteViewsProto.NightModeReflectionAction.DARK_INT, + (int) mDarkValue); + break; + } + out.end(token); + } + + public static PendingResources<Action> createFromProto(ProtoInputStream in) + throws Exception { + final LongSparseArray<Object> values = new LongSparseArray<>(); + + final long token = in.start(RemoteViewsProto.Action.NIGHT_MODE_REFLECTION_ACTION); + while (in.nextField() != NO_MORE_FIELDS) { + switch (in.getFieldNumber()) { + case (int) RemoteViewsProto.NightModeReflectionAction.VIEW_ID: + values.put(RemoteViewsProto.NightModeReflectionAction.VIEW_ID, + in.readString(RemoteViewsProto.NightModeReflectionAction.VIEW_ID)); + break; + case (int) RemoteViewsProto.NightModeReflectionAction.METHOD_NAME: + values.put(RemoteViewsProto.NightModeReflectionAction.METHOD_NAME, + in.readString( + RemoteViewsProto.NightModeReflectionAction.METHOD_NAME)); + break; + case (int) RemoteViewsProto.NightModeReflectionAction.PARAMETER_TYPE: + values.put(RemoteViewsProto.NightModeReflectionAction.PARAMETER_TYPE, + in.readInt( + RemoteViewsProto.NightModeReflectionAction.PARAMETER_TYPE)); + break; + case (int) RemoteViewsProto.NightModeReflectionAction.LIGHT_ICON: + values.put(RemoteViewsProto.NightModeReflectionAction.LIGHT_ICON, + createIconFromProto(in, + RemoteViewsProto.NightModeReflectionAction.LIGHT_ICON)); + break; + case (int) RemoteViewsProto.NightModeReflectionAction.LIGHT_COLOR_STATE_LIST: + values.put( + RemoteViewsProto.NightModeReflectionAction.LIGHT_COLOR_STATE_LIST, + createColorStateListFromProto(in, + RemoteViewsProto + .NightModeReflectionAction.LIGHT_COLOR_STATE_LIST)); + break; + case (int) RemoteViewsProto.NightModeReflectionAction.LIGHT_INT: + values.put(RemoteViewsProto.NightModeReflectionAction.LIGHT_INT, + in.readInt(RemoteViewsProto.NightModeReflectionAction.LIGHT_INT)); + break; + case (int) RemoteViewsProto.NightModeReflectionAction.DARK_ICON: + values.put(RemoteViewsProto.NightModeReflectionAction.DARK_ICON, + createIconFromProto(in, + RemoteViewsProto.NightModeReflectionAction.DARK_ICON)); + break; + case (int) RemoteViewsProto.NightModeReflectionAction.DARK_COLOR_STATE_LIST: + values.put(RemoteViewsProto.NightModeReflectionAction.DARK_COLOR_STATE_LIST, + createColorStateListFromProto(in, + RemoteViewsProto + .NightModeReflectionAction.DARK_COLOR_STATE_LIST)); + break; + case (int) RemoteViewsProto.NightModeReflectionAction.DARK_INT: + values.put(RemoteViewsProto.NightModeReflectionAction.DARK_INT, + in.readInt(RemoteViewsProto.NightModeReflectionAction.DARK_INT)); + break; + default: + Log.w(LOG_TAG, "Unhandled field while reading RemoteViews proto!\n" + + ProtoUtils.currentFieldToString(in)); + } + } + in.end(token); + + checkContainsKeys(values, new long[]{RemoteViewsProto.NightModeReflectionAction.VIEW_ID, + RemoteViewsProto.NightModeReflectionAction.METHOD_NAME, + RemoteViewsProto.NightModeReflectionAction.PARAMETER_TYPE}); + + return (context, resources, rootData, depth) -> { + int viewId = getAsIdentifier(resources, values, + RemoteViewsProto.NightModeReflectionAction.VIEW_ID); + String methodName = (String) values.get( + RemoteViewsProto.NightModeReflectionAction.METHOD_NAME); + int parameterType = (int) values.get( + RemoteViewsProto.NightModeReflectionAction.PARAMETER_TYPE); + switch (parameterType) { + case ICON: + PendingResources<Icon> pendingLightIcon = + (PendingResources<Icon>) values.get( + RemoteViewsProto.NightModeReflectionAction.LIGHT_ICON); + PendingResources<Icon> pendingDarkIcon = + (PendingResources<Icon>) values.get( + RemoteViewsProto.NightModeReflectionAction.DARK_ICON); + Icon lightIcon = pendingLightIcon != null ? pendingLightIcon.create(context, + resources, rootData, depth) : null; + Icon darkIcon = pendingDarkIcon != null ? pendingDarkIcon.create(context, + resources, rootData, depth) : null; + return new NightModeReflectionAction(viewId, methodName, parameterType, + lightIcon, darkIcon); + case COLOR_STATE_LIST: + return new NightModeReflectionAction(viewId, methodName, parameterType, + (ColorStateList) values.get( + RemoteViewsProto + .NightModeReflectionAction.LIGHT_COLOR_STATE_LIST), + (ColorStateList) values.get( + RemoteViewsProto + .NightModeReflectionAction.DARK_COLOR_STATE_LIST)); + case INT: + return new NightModeReflectionAction(viewId, methodName, parameterType, + (int) values.get( + RemoteViewsProto.NightModeReflectionAction.LIGHT_INT, 0), + (int) values.get( + RemoteViewsProto.NightModeReflectionAction.DARK_INT, 0)); + default: + throw new RuntimeException("Unknown parameterType: " + parameterType); + } + }; + } } /** @@ -3353,6 +4007,46 @@ public class RemoteViews implements Parcelable, Filter { public int mergeBehavior() { return MERGE_APPEND; } + + @Override + public boolean canWriteToProto() { + return true; + } + + @Override + public void writeToProto(ProtoOutputStream out, Context context, Resources appResources) { + final long token = out.start(RemoteViewsProto.Action.REMOVE_FROM_PARENT_ACTION); + out.write(RemoteViewsProto.RemoveFromParentAction.VIEW_ID, + appResources.getResourceName(mViewId)); + out.end(token); + } + + public static PendingResources<Action> createFromProto(ProtoInputStream in) + throws Exception { + final LongSparseArray<Object> values = new LongSparseArray<>(); + + final long token = in.start(RemoteViewsProto.Action.REMOVE_FROM_PARENT_ACTION); + while (in.nextField() != NO_MORE_FIELDS) { + switch (in.getFieldNumber()) { + case (int) RemoteViewsProto.RemoveFromParentAction.VIEW_ID: + values.put(RemoteViewsProto.RemoveFromParentAction.VIEW_ID, + in.readString(RemoteViewsProto.RemoveFromParentAction.VIEW_ID)); + break; + default: + Log.w(LOG_TAG, "Unhandled field while reading RemoteViews proto!\n" + + ProtoUtils.currentFieldToString(in)); + } + } + in.end(token); + + checkContainsKeys(values, new long[]{RemoteViewsProto.RemoveFromParentAction.VIEW_ID}); + + return (context, resources, rootData, depth) -> { + int viewId = getAsIdentifier(resources, values, + RemoteViewsProto.RemoveFromParentAction.VIEW_ID); + return new RemoveFromParentAction(viewId); + }; + } } /** @@ -3768,6 +4462,64 @@ public class RemoteViews implements Parcelable, Filter { public String getUniqueKey() { return super.getUniqueKey() + mProperty; } + + @Override + public boolean canWriteToProto() { + return true; + } + + @Override + public void writeToProto(ProtoOutputStream out, Context context, Resources appResources) { + final long token = out.start(RemoteViewsProto.Action.LAYOUT_PARAM_ACTION); + out.write(RemoteViewsProto.LayoutParamAction.VIEW_ID, + appResources.getResourceName(mViewId)); + out.write(RemoteViewsProto.LayoutParamAction.PROPERTY, mProperty); + out.write(RemoteViewsProto.LayoutParamAction.LAYOUT_VALUE, mValue); + out.write(RemoteViewsProto.LayoutParamAction.VALUE_TYPE, mValueType); + out.end(token); + } + + public static PendingResources<Action> createFromProto(ProtoInputStream in) + throws Exception { + final LongSparseArray<Object> values = new LongSparseArray<>(); + + final long token = in.start(RemoteViewsProto.Action.LAYOUT_PARAM_ACTION); + while (in.nextField() != NO_MORE_FIELDS) { + switch (in.getFieldNumber()) { + case (int) RemoteViewsProto.LayoutParamAction.VIEW_ID: + values.put(RemoteViewsProto.LayoutParamAction.VIEW_ID, + in.readString(RemoteViewsProto.LayoutParamAction.VIEW_ID)); + break; + case (int) RemoteViewsProto.LayoutParamAction.PROPERTY: + values.put(RemoteViewsProto.LayoutParamAction.PROPERTY, + in.readInt(RemoteViewsProto.LayoutParamAction.PROPERTY)); + break; + case (int) RemoteViewsProto.LayoutParamAction.LAYOUT_VALUE: + values.put(RemoteViewsProto.LayoutParamAction.LAYOUT_VALUE, + in.readInt(RemoteViewsProto.LayoutParamAction.LAYOUT_VALUE)); + break; + case (int) RemoteViewsProto.LayoutParamAction.VALUE_TYPE: + values.put(RemoteViewsProto.LayoutParamAction.VALUE_TYPE, + in.readInt(RemoteViewsProto.LayoutParamAction.VALUE_TYPE)); + break; + default: + Log.w(LOG_TAG, "Unhandled field while reading RemoteViews proto!\n" + + ProtoUtils.currentFieldToString(in)); + } + } + in.end(token); + + checkContainsKeys(values, new long[]{RemoteViewsProto.LayoutParamAction.VIEW_ID}); + + return (context, resources, rootData, depth) -> { + int viewId = getAsIdentifier(resources, values, + RemoteViewsProto.LayoutParamAction.VIEW_ID); + return new LayoutParamAction(viewId, + (int) values.get(RemoteViewsProto.LayoutParamAction.PROPERTY, 0), + (int) values.get(RemoteViewsProto.LayoutParamAction.LAYOUT_VALUE, 0), + (int) values.get(RemoteViewsProto.LayoutParamAction.VALUE_TYPE, 0)); + }; + } } /** @@ -7668,6 +8420,7 @@ public class RemoteViews implements Parcelable, Filter { values.put(RemoteViewsProto.RemoteCollectionItems.IDS, new ArrayList<Long>()); values.put(RemoteViewsProto.RemoteCollectionItems.VIEWS, new ArrayList<PendingResources<RemoteViews>>()); + while (in.nextField() != NO_MORE_FIELDS) { switch (in.getFieldNumber()) { case (int) RemoteViewsProto.RemoteCollectionItems.IDS: @@ -7704,6 +8457,7 @@ public class RemoteViews implements Parcelable, Filter { checkContainsKeys(values, new long[]{RemoteViewsProto.RemoteCollectionItems.VIEW_TYPE_COUNT}); + return (context, resources, rootData, depth) -> { List<Long> idList = (List<Long>) values.get( RemoteViewsProto.RemoteCollectionItems.IDS); @@ -8149,6 +8903,16 @@ public class RemoteViews implements Parcelable, Filter { out.write(SizeFProto.HEIGHT, mIdealSize.getHeight()); out.end(token); } + + if (mActions != null) { + for (Action action : mActions) { + if (action.canWriteToProto()) { + final long token = out.start(RemoteViewsProto.ACTIONS); + action.writeToProto(out, context, appResources); + out.end(token); + } + } + } } else if (hasSizedRemoteViews()) { out.write(RemoteViewsProto.MODE, MODE_HAS_SIZED_REMOTEVIEWS); for (RemoteViews view : mSizedRemoteViews) { @@ -8192,6 +8956,7 @@ public class RemoteViews implements Parcelable, Filter { String mLayoutResName = null; String mLightBackgroundResName = null; String mViewResName = null; + final List<PendingResources<Action>> mActions = new ArrayList<>(); final List<PendingResources<RemoteViews>> mSizedRemoteViews = new ArrayList<>(); PendingResources<RemoteViews> mLandscapeViews = null; PendingResources<RemoteViews> mPortraitViews = null; @@ -8230,6 +8995,14 @@ public class RemoteViews implements Parcelable, Filter { case (int) RemoteViewsProto.PROVIDER_INSTANCE_ID: ref.mProviderInstanceId = in.readInt(RemoteViewsProto.PROVIDER_INSTANCE_ID); break; + case (int) RemoteViewsProto.ACTIONS: + final long actionsToken = in.start(RemoteViewsProto.ACTIONS); + final PendingResources<Action> action = createActionFromProto(ref.mRv, in); + if (action != null) { + ref.mActions.add(action); + } + in.end(actionsToken); + break; case (int) RemoteViewsProto.SIZED_REMOTEVIEWS: final long sizedToken = in.start(RemoteViewsProto.SIZED_REMOTEVIEWS); ref.mSizedRemoteViews.add(createFromProto(in)); @@ -8328,19 +9101,27 @@ public class RemoteViews implements Parcelable, Filter { } } if (ref.mPopulateRemoteCollectionCache != null) { - ref.mPopulateRemoteCollectionCache.create(context, resources, rootData, depth); + ref.mPopulateRemoteCollectionCache.create(appContext, appResources, rootData, + depth); } if (ref.mProviderInstanceId != -1) { rv.mProviderInstanceId = ref.mProviderInstanceId; } if (ref.mMode == MODE_NORMAL) { rv.setIdealSize(ref.mIdealSize); + for (PendingResources<Action> pendingAction : ref.mActions) { + Action action = pendingAction.create(appContext, appResources, rootData, depth); + if (action != null) { + rv.addAction(action); + } + } return rv; } else if (ref.mMode == MODE_HAS_SIZED_REMOTEVIEWS) { List<RemoteViews> sizedViews = new ArrayList<>(); for (RemoteViews.PendingResources<RemoteViews> pendingViews : ref.mSizedRemoteViews) { - RemoteViews views = pendingViews.create(context, resources, rootData, depth); + RemoteViews views = pendingViews.create(appContext, appResources, rootData, + depth); sizedViews.add(views); } rv.initializeSizedRemoteViews(sizedViews.iterator()); @@ -8349,8 +9130,8 @@ public class RemoteViews implements Parcelable, Filter { checkProtoResultNotNull(ref.mLandscapeViews, "Missing landscape views"); checkProtoResultNotNull(ref.mPortraitViews, "Missing portrait views"); RemoteViews parentRv = new RemoteViews( - ref.mLandscapeViews.create(context, resources, rootData, depth), - ref.mPortraitViews.create(context, resources, rootData, depth)); + ref.mLandscapeViews.create(appContext, appResources, rootData, depth), + ref.mPortraitViews.create(appContext, appResources, rootData, depth)); parentRv.initializeFrom(/* src= */ rv, /* hierarchyRoot= */ rv); return parentRv; } else { @@ -8370,6 +9151,35 @@ public class RemoteViews implements Parcelable, Filter { throws Exception; } + @Nullable + private static PendingResources<Action> createActionFromProto(RemoteViews rv, + ProtoInputStream in) throws Exception { + int actionFieldId = in.nextField(); + if (actionFieldId == NO_MORE_FIELDS) { + // action was omitted + return null; + } + switch (actionFieldId) { + case (int) RemoteViewsProto.Action.ATTRIBUTE_REFLECTION_ACTION: + return AttributeReflectionAction.createFromProto(in); + case (int) RemoteViewsProto.Action.BITMAP_REFLECTION_ACTION: + return rv.createFromBitmapReflectionActionFromProto(in); + case (int) RemoteViewsProto.Action.COMPLEX_UNIT_DIMENSION_REFLECTION_ACTION: + return ComplexUnitDimensionReflectionAction.createFromProto(in); + case (int) RemoteViewsProto.Action.LAYOUT_PARAM_ACTION: + return LayoutParamAction.createFromProto(in); + case (int) RemoteViewsProto.Action.NIGHT_MODE_REFLECTION_ACTION: + return NightModeReflectionAction.createFromProto(in); + case (int) RemoteViewsProto.Action.REFLECTION_ACTION: + return ReflectionAction.createFromProto(in); + case (int) RemoteViewsProto.Action.REMOVE_FROM_PARENT_ACTION: + return RemoveFromParentAction.createFromProto(in); + default: + throw new RuntimeException("Unhandled field while reading Action proto!\n" + + ProtoUtils.currentFieldToString(in)); + } + } + private static void checkValidResource(int id, String message, String resName) throws Exception { if (id == 0) throw new Exception(message + ": " + resName); @@ -8392,6 +9202,22 @@ public class RemoteViews implements Parcelable, Filter { } } + private static int getAsIdentifier(Resources resources, LongSparseArray<?> array, long fieldId) + throws Exception { + String resName = (String) array.get(fieldId); + int id = resources.getIdentifier(resName, /* defType= */ null, /* defPackage= */ null); + checkValidResource(id, "Invalid id", resName); + return id; + } + + private static int getAsIdentifier(Resources resources, SparseArray<?> array, int key) + throws Exception { + String resName = (String) array.get(key); + int id = resources.getIdentifier(resName, /* defType= */ null, /* defPackage= */ null); + checkValidResource(id, "Invalid id", resName); + return id; + } + private static SizeF createSizeFFromProto(ProtoInputStream in) throws Exception { float width = 0; float height = 0; @@ -8411,4 +9237,43 @@ public class RemoteViews implements Parcelable, Filter { return new SizeF(width, height); } + + private static void writeIconToProto(ProtoOutputStream out, Resources appResources, Icon icon, + long fieldId) { + long token = out.start(fieldId); + RemoteViewsSerializers.writeIconToProto(out, appResources, icon); + out.end(token); + } + + private static PendingResources<Icon> createIconFromProto(ProtoInputStream in, long fieldId) + throws Exception { + long token = in.start(fieldId); + Function<Resources, Icon> icon = RemoteViewsSerializers.createIconFromProto(in); + in.end(token); + return (context, resources, rootData, depth) -> icon.apply(resources); + } + + private static void writeColorStateListToProto(ProtoOutputStream out, + ColorStateList colorStateList, long fieldId) { + long token = out.start(fieldId); + colorStateList.writeToProto(out); + out.end(token); + } + + private static ColorStateList createColorStateListFromProto(ProtoInputStream in, long fieldId) + throws Exception { + long token = in.start(fieldId); + ColorStateList colorStateList = ColorStateList.createFromProto(in); + in.end(token); + return colorStateList; + } + + private static CharSequence createCharSequenceFromProto(ProtoInputStream in, long fieldId) + throws Exception { + long token = in.start(fieldId); + CharSequence cs = RemoteViewsSerializers.createCharSequenceFromProto(in); + in.end(token); + return cs; + } + } diff --git a/core/java/android/window/BackProgressAnimator.java b/core/java/android/window/BackProgressAnimator.java index 12d4ab8bc963..465e11a048f0 100644 --- a/core/java/android/window/BackProgressAnimator.java +++ b/core/java/android/window/BackProgressAnimator.java @@ -212,6 +212,17 @@ public class BackProgressAnimator implements DynamicAnimation.OnAnimationUpdateL mBackCancelledFinishRunnable = null; } + /** + * Removes the finishCallback passed into {@link #onBackCancelled} + */ + public void removeOnBackInvokedFinishCallback() { + if (mBackInvokedFlingAnim != null) { + mBackInvokedFlingAnim.removeUpdateListener(mOnBackInvokedFlingUpdateListener); + mBackInvokedFlingAnim.removeEndListener(mOnAnimationEndListener); + } + mBackInvokedFinishRunnable = null; + } + /** Returns true if the back animation is in progress. */ @VisibleForTesting(visibility = PACKAGE) public boolean isBackAnimationInProgress() { diff --git a/core/java/android/window/TransitionInfo.java b/core/java/android/window/TransitionInfo.java index 1083f64513b1..ec79f94a6dd3 100644 --- a/core/java/android/window/TransitionInfo.java +++ b/core/java/android/window/TransitionInfo.java @@ -1141,6 +1141,7 @@ public final class TransitionInfo implements Parcelable { // Customize activity transition animation private CustomActivityTransition mCustomActivityOpenTransition; private CustomActivityTransition mCustomActivityCloseTransition; + private int mUserId; private AnimationOptions(int type) { mType = type; @@ -1159,6 +1160,7 @@ public final class TransitionInfo implements Parcelable { mAnimations = in.readInt(); mCustomActivityOpenTransition = in.readTypedObject(CustomActivityTransition.CREATOR); mCustomActivityCloseTransition = in.readTypedObject(CustomActivityTransition.CREATOR); + mUserId = in.readInt(); } /** Make basic customized animation for a package */ @@ -1283,6 +1285,14 @@ public final class TransitionInfo implements Parcelable { return options; } + public void setUserId(int userId) { + mUserId = userId; + } + + public int getUserId() { + return mUserId; + } + public int getType() { return mType; } @@ -1349,6 +1359,7 @@ public final class TransitionInfo implements Parcelable { dest.writeInt(mAnimations); dest.writeTypedObject(mCustomActivityOpenTransition, flags); dest.writeTypedObject(mCustomActivityCloseTransition, flags); + dest.writeInt(mUserId); } @NonNull @@ -1406,6 +1417,7 @@ public final class TransitionInfo implements Parcelable { if (mExitResId != DEFAULT_ANIMATION_RESOURCES_ID) { sb.append(" exitResId=").append(mExitResId); } + sb.append(" mUserId=").append(mUserId); sb.append('}'); return sb.toString(); } diff --git a/core/java/android/window/WindowOnBackInvokedDispatcher.java b/core/java/android/window/WindowOnBackInvokedDispatcher.java index b6c0d7cb00ef..bb89a2499838 100644 --- a/core/java/android/window/WindowOnBackInvokedDispatcher.java +++ b/core/java/android/window/WindowOnBackInvokedDispatcher.java @@ -243,6 +243,8 @@ public class WindowOnBackInvokedDispatcher implements OnBackInvokedDispatcher { if (previousTopCallback == callback) { // We should call onBackCancelled() when an active callback is removed from // dispatcher. + mProgressAnimator.removeOnBackCancelledFinishCallback(); + mProgressAnimator.removeOnBackInvokedFinishCallback(); sendCancelledIfInProgress(callback); mHandler.post(mProgressAnimator::reset); setTopOnBackInvokedCallback(getTopCallback()); diff --git a/core/java/com/android/internal/policy/TransitionAnimation.java b/core/java/com/android/internal/policy/TransitionAnimation.java index 238e6f56153b..201f26760956 100644 --- a/core/java/com/android/internal/policy/TransitionAnimation.java +++ b/core/java/com/android/internal/policy/TransitionAnimation.java @@ -49,7 +49,7 @@ import android.hardware.HardwareBuffer; import android.media.Image; import android.media.ImageReader; import android.os.Handler; -import android.os.SystemProperties; +import android.os.UserHandle; import android.util.Slog; import android.view.InflateException; import android.view.SurfaceControl; @@ -187,23 +187,44 @@ public class TransitionAnimation { return createHiddenByKeyguardExit(mContext, mInterpolator, onWallpaper, toShade, subtle); } + /** Load keyguard unocclude animation for user. */ + @Nullable + public Animation loadKeyguardUnoccludeAnimation(int userId) { + return loadDefaultAnimationRes(com.android.internal.R.anim.wallpaper_open_exit, userId); + } + + /** Same as {@code loadKeyguardUnoccludeAnimation} for current user. */ @Nullable public Animation loadKeyguardUnoccludeAnimation() { - return loadDefaultAnimationRes(com.android.internal.R.anim.wallpaper_open_exit); + return loadKeyguardUnoccludeAnimation(UserHandle.USER_CURRENT); } + /** Load voice activity open animation for user. */ @Nullable - public Animation loadVoiceActivityOpenAnimation(boolean enter) { + public Animation loadVoiceActivityOpenAnimation(boolean enter, int userId) { return loadDefaultAnimationRes(enter ? com.android.internal.R.anim.voice_activity_open_enter - : com.android.internal.R.anim.voice_activity_open_exit); + : com.android.internal.R.anim.voice_activity_open_exit, userId); } + /** Same as {@code loadVoiceActivityOpenAnimation} for current user. */ @Nullable - public Animation loadVoiceActivityExitAnimation(boolean enter) { + public Animation loadVoiceActivityOpenAnimation(boolean enter) { + return loadVoiceActivityOpenAnimation(enter, UserHandle.USER_CURRENT); + } + + /** Load voice activity exit animation for user. */ + @Nullable + public Animation loadVoiceActivityExitAnimation(boolean enter, int userId) { return loadDefaultAnimationRes(enter ? com.android.internal.R.anim.voice_activity_close_enter - : com.android.internal.R.anim.voice_activity_close_exit); + : com.android.internal.R.anim.voice_activity_close_exit, userId); + } + + /** Same as {@code loadVoiceActivityExitAnimation} for current user. */ + @Nullable + public Animation loadVoiceActivityExitAnimation(boolean enter) { + return loadVoiceActivityExitAnimation(enter, UserHandle.USER_CURRENT); } @Nullable @@ -211,10 +232,17 @@ public class TransitionAnimation { return loadAnimationRes(packageName, resId); } + /** Load cross profile app enter animation for user. */ @Nullable - public Animation loadCrossProfileAppEnterAnimation() { + public Animation loadCrossProfileAppEnterAnimation(int userId) { return loadAnimationRes(DEFAULT_PACKAGE, - com.android.internal.R.anim.task_open_enter_cross_profile_apps); + com.android.internal.R.anim.task_open_enter_cross_profile_apps, userId); + } + + /** Same as {@code loadCrossProfileAppEnterAnimation} for current user. */ + @Nullable + public Animation loadCrossProfileAppEnterAnimation() { + return loadCrossProfileAppEnterAnimation(UserHandle.USER_CURRENT); } @Nullable @@ -230,11 +258,11 @@ public class TransitionAnimation { appRect.height(), 0, null); } - /** Load animation by resource Id from specific package. */ + /** Load animation by resource Id from specific package for user. */ @Nullable - public Animation loadAnimationRes(String packageName, int resId) { + public Animation loadAnimationRes(String packageName, int resId, int userId) { if (ResourceId.isValid(resId)) { - AttributeCache.Entry ent = getCachedAnimations(packageName, resId); + AttributeCache.Entry ent = getCachedAnimations(packageName, resId, userId); if (ent != null) { return loadAnimationSafely(ent.context, resId, mTag); } @@ -242,10 +270,22 @@ public class TransitionAnimation { return null; } - /** Load animation by resource Id from android package. */ + /** Same as {@code loadAnimationRes} for current user. */ + @Nullable + public Animation loadAnimationRes(String packageName, int resId) { + return loadAnimationRes(packageName, resId, UserHandle.USER_CURRENT); + } + + /** Load animation by resource Id from android package for user. */ + @Nullable + public Animation loadDefaultAnimationRes(int resId, int userId) { + return loadAnimationRes(DEFAULT_PACKAGE, resId, userId); + } + + /** Same as {@code loadDefaultAnimationRes} for current user. */ @Nullable public Animation loadDefaultAnimationRes(int resId) { - return loadAnimationRes(DEFAULT_PACKAGE, resId); + return loadAnimationRes(DEFAULT_PACKAGE, resId, UserHandle.USER_CURRENT); } /** Load animation by attribute Id from specific LayoutParams */ @@ -378,10 +418,10 @@ public class TransitionAnimation { } @Nullable - private AttributeCache.Entry getCachedAnimations(String packageName, int resId) { + private AttributeCache.Entry getCachedAnimations(String packageName, int resId, int userId) { if (mDebug) { - Slog.v(mTag, "Loading animations: package=" - + packageName + " resId=0x" + Integer.toHexString(resId)); + Slog.v(mTag, "Loading animations: package=" + packageName + " resId=0x" + + Integer.toHexString(resId) + " for user=" + userId); } if (packageName != null) { if ((resId & 0xFF000000) == 0x01000000) { @@ -392,11 +432,16 @@ public class TransitionAnimation { + packageName); } return AttributeCache.instance().get(packageName, resId, - com.android.internal.R.styleable.WindowAnimation); + com.android.internal.R.styleable.WindowAnimation, userId); } return null; } + @Nullable + private AttributeCache.Entry getCachedAnimations(String packageName, int resId) { + return getCachedAnimations(packageName, resId, UserHandle.USER_CURRENT); + } + /** Returns window animation style ID from {@link LayoutParams} or from system in some cases */ public int getAnimationStyleResId(@NonNull LayoutParams lp) { int resId = lp.windowAnimations; diff --git a/core/jni/android_util_Process.cpp b/core/jni/android_util_Process.cpp index e5ac0e1a8f6e..49191ee02ad6 100644 --- a/core/jni/android_util_Process.cpp +++ b/core/jni/android_util_Process.cpp @@ -404,6 +404,11 @@ static void get_cpuset_cores_for_policy(SchedPolicy policy, cpu_set_t *cpu_set) return; } break; + case SP_FOREGROUND_WINDOW: + if (!CgroupGetAttributePath("HighCapacityWICPUs", &filename)) { + return; + } + break; case SP_TOP_APP: if (!CgroupGetAttributePath("MaxCapacityCPUs", &filename)) { return; diff --git a/core/proto/android/widget/remoteviews.proto b/core/proto/android/widget/remoteviews.proto index 5892396bddc4..47c97b08666b 100644 --- a/core/proto/android/widget/remoteviews.proto +++ b/core/proto/android/widget/remoteviews.proto @@ -54,6 +54,7 @@ message RemoteViewsProto { optional bool has_draw_instructions = 13; repeated bytes bitmap_cache = 14; optional RemoteCollectionCache remote_collection_cache = 15; + repeated Action actions = 16; message RemoteCollectionCache { message Entry { @@ -288,6 +289,91 @@ message RemoteViewsProto { } } } + + message Action { + oneof action { + AttributeReflectionAction attribute_reflection_action = 1; + BitmapReflectionAction bitmap_reflection_action = 2; + ComplexUnitDimensionReflectionAction complex_unit_dimension_reflection_action = 3; + LayoutParamAction layout_param_action = 4; + NightModeReflectionAction night_mode_reflection_action = 5; + ReflectionAction reflection_action = 6; + RemoveFromParentAction remove_from_parent_action = 7; + } + } + + message AttributeReflectionAction { + optional string view_id = 1; + optional string method_name = 2; + optional int32 parameter_type = 3; + optional int32 resource_type = 4; + optional string attribute_id = 5; + } + + message BitmapReflectionAction { + optional string view_id = 1; + optional string method_name = 2; + optional int32 bitmap_id = 3; + } + + message ComplexUnitDimensionReflectionAction { + optional string view_id = 1; + optional string method_name = 2; + optional int32 parameter_type = 3; + optional float dimension_value = 4; + optional int32 unit = 5; + } + + message LayoutParamAction { + optional string view_id = 1; + optional int32 property = 2; + optional int32 layout_value = 3; + optional int32 value_type = 4; + } + + message NightModeReflectionAction { + optional string view_id = 1; + optional string method_name = 2; + optional int32 parameter_type = 3; + oneof light { + Icon light_icon = 4; + android.content.res.ColorStateListProto light_color_state_list = 5; + int32 light_int = 6; + } + oneof dark { + Icon dark_icon = 7; + android.content.res.ColorStateListProto dark_color_state_list = 8; + int32 dark_int = 9; + } + } + + message ReflectionAction { + optional string view_id = 1; + optional string method_name = 2; + optional int32 parameter_type = 3; + oneof reflection_value { + bool boolean_value = 4; + bytes byte_value = 5; + int32 short_value = 6; + int32 int_value = 7; + int64 long_value = 8; + float float_value = 9; + double double_value = 10; + int32 char_value = 11; + string string_value = 12; + CharSequence char_sequence_value = 13; + string uri_value = 14; + bytes bitmap_value = 15; + android.content.res.ColorStateListProto color_state_list_value = 16; + Icon icon_value = 17; + int32 blend_mode_value = 18; + // Intent and Bundle values are excluded. + } + } + + message RemoveFromParentAction { + optional string view_id = 1; + } } diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index 2873785e9387..a7b6661a42e5 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -1746,8 +1746,7 @@ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"አንድ መተግበሪያ የፍቃድ ጥያቄውን እያደበዘዘ ነው ስለዚህ የእርስዎ ምላሽ ሊረጋገጥ አይችልም።"</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"አንድ ባህሪን መጠቀም ለመጀመር መታ ያድርጉት፦"</string> <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"በተደራሽነት አዝራር የሚጠቀሙባቸው ባሕሪያት ይምረጡ"</string> - <!-- no translation found for accessibility_edit_shortcut_menu_volume_title (2245540598834891500) --> - <skip /> + <string name="accessibility_edit_shortcut_menu_volume_title" msgid="2245540598834891500">"በድምፅ ቁልፍ አቋራጭ የሚጠቀሙባቸው ባህሪያት ይምረጡ"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"<xliff:g id="SERVICE_NAME">%s</xliff:g> ጠፍቷል"</string> <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"አቋራጮችን አርትዕ ያድርጉ"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"ተከናውኗል"</string> diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml index bc1dba27ff5f..c5ad8bab39d0 100644 --- a/core/res/res/values-as/strings.xml +++ b/core/res/res/values-as/strings.xml @@ -1356,7 +1356,7 @@ <item msgid="9177085807664964627">"ভিপিএন"</item> </string-array> <string name="network_switch_type_name_unknown" msgid="3665696841646851068">"অজ্ঞাত প্ৰকাৰৰ নেটৱৰ্ক"</string> - <string name="accept" msgid="5447154347815825107">"স্বীকাৰ কৰক"</string> + <string name="accept" msgid="5447154347815825107">"গ্ৰহণ কৰক"</string> <string name="decline" msgid="6490507610282145874">"প্ৰত্যাখ্যান কৰক"</string> <string name="select_character" msgid="3352797107930786979">"বর্ণ লিখক"</string> <string name="sms_control_title" msgid="4748684259903148341">"এছএমএছ বার্তাবোৰ পঠিয়াই থকা হৈছে"</string> @@ -1746,8 +1746,7 @@ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"এটা এপে অনুমতিৰ অনুৰোধটো অস্পষ্ট কৰি আছে আৰু সেয়েহে আপোনাৰ সঁহাৰিটো সত্যাপন কৰিব নোৱাৰি।"</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"কোনো এটা সুবিধা ব্যৱহাৰ কৰিবলৈ সেইটোত টিপক:"</string> <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"সাধ্য-সুবিধা বুটামটোৰ জৰিয়তে ব্যৱহাৰ কৰিবলৈ সুবিধাসমূহ বাছনি কৰক"</string> - <!-- no translation found for accessibility_edit_shortcut_menu_volume_title (2245540598834891500) --> - <skip /> + <string name="accessibility_edit_shortcut_menu_volume_title" msgid="2245540598834891500">"ভলিউম কীৰ শ্বৰ্টকাটটোৰ জৰিয়তে ব্যৱহাৰ কৰিবলৈ সুবিধাসমূহ বাছনি কৰক"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"<xliff:g id="SERVICE_NAME">%s</xliff:g> বন্ধ কৰা হৈছে"</string> <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"শ্বৰ্টকাটসমূহ সম্পাদনা কৰক"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"কৰা হ’ল"</string> diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index b83eca56023f..8f0f4b2259c8 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -1747,8 +1747,7 @@ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"Aplikacija krije zahtev za dozvolu, pa odgovor ne može da se verifikuje."</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"Dodirnite neku funkciju da biste počeli da je koristite:"</string> <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"Odaberite funkcije koje ćete koristiti sa dugmetom Pristupačnost"</string> - <!-- no translation found for accessibility_edit_shortcut_menu_volume_title (2245540598834891500) --> - <skip /> + <string name="accessibility_edit_shortcut_menu_volume_title" msgid="2245540598834891500">"Odaberite funkcije koje će se koristiti sa prečicom za tastere za jačinu zvuka"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"Usluga <xliff:g id="SERVICE_NAME">%s</xliff:g> je isključena"</string> <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"Izmenite prečice"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"Gotovo"</string> diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index 596457066268..7a49bf348acf 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -1748,8 +1748,7 @@ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"Праграма хавае запыт дазволу, таму ваш адказ немагчыма спраўдзіць."</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"Каб пачаць выкарыстоўваць функцыю, націсніце на яе:"</string> <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"Выберыце функцыі, якія будзеце выкарыстоўваць з кнопкай спецыяльных магчымасцей"</string> - <!-- no translation found for accessibility_edit_shortcut_menu_volume_title (2245540598834891500) --> - <skip /> + <string name="accessibility_edit_shortcut_menu_volume_title" msgid="2245540598834891500">"Выберыце функцыі для выкарыстання з клавішамі гучнасці"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"Сэрвіс \"<xliff:g id="SERVICE_NAME">%s</xliff:g>\" выключаны"</string> <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"Змяніць ярлыкі"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"Гатова"</string> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index b9ceede3c8be..69e6483a03f4 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -1748,8 +1748,7 @@ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"Žádost o oprávnění skrývá nějaká aplikace, proto vaši odpověď nelze ověřit."</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"Chcete-li některou funkci začít používat, klepněte na ni:"</string> <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"Vyberte funkce, které budete používat s tlačítkem přístupnosti"</string> - <!-- no translation found for accessibility_edit_shortcut_menu_volume_title (2245540598834891500) --> - <skip /> + <string name="accessibility_edit_shortcut_menu_volume_title" msgid="2245540598834891500">"Vyberte funkce, které budete používat se zkratkou tlačítek hlasitosti"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"Služba <xliff:g id="SERVICE_NAME">%s</xliff:g> byla vypnuta"</string> <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"Upravit zkratky"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"Hotovo"</string> diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml index 19547f81d636..dad63334dc6c 100644 --- a/core/res/res/values-en-rCA/strings.xml +++ b/core/res/res/values-en-rCA/strings.xml @@ -1746,8 +1746,7 @@ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"An app is obscuring the permission request so your response cannot be verified."</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"Tap a feature to start using it:"</string> <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"Choose features to use with the accessibility button"</string> - <!-- no translation found for accessibility_edit_shortcut_menu_volume_title (2245540598834891500) --> - <skip /> + <string name="accessibility_edit_shortcut_menu_volume_title" msgid="2245540598834891500">"Choose features to use with the volume keys shortcut"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"<xliff:g id="SERVICE_NAME">%s</xliff:g> has been turned off"</string> <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"Edit shortcuts"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"Done"</string> diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml index c1eade14fbc6..0bcbed786d44 100644 --- a/core/res/res/values-en-rXC/strings.xml +++ b/core/res/res/values-en-rXC/strings.xml @@ -1746,8 +1746,7 @@ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"An app is obscuring the permission request so your response cannot be verified."</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"Tap a feature to start using it:"</string> <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"Choose features to use with the accessibility button"</string> - <!-- no translation found for accessibility_edit_shortcut_menu_volume_title (2245540598834891500) --> - <skip /> + <string name="accessibility_edit_shortcut_menu_volume_title" msgid="2245540598834891500">"Choose features to use with the volume keys shortcut"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"<xliff:g id="SERVICE_NAME">%s</xliff:g> has been turned off"</string> <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"Edit shortcuts"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"Done"</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index ff7d912255cb..e50d5faea41b 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -1747,8 +1747,7 @@ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"Una aplicación está ocultando la solicitud de permiso, por lo que no se puede verificar tu respuesta."</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"Toca una función para empezar a usarla:"</string> <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"Selecciona qué funciones usar con el botón de accesibilidad"</string> - <!-- no translation found for accessibility_edit_shortcut_menu_volume_title (2245540598834891500) --> - <skip /> + <string name="accessibility_edit_shortcut_menu_volume_title" msgid="2245540598834891500">"Selecciona qué funciones usar con el acceso directo de teclas de volumen"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"Se ha desactivado <xliff:g id="SERVICE_NAME">%s</xliff:g>"</string> <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"Editar accesos directos"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"Hecho"</string> @@ -1758,7 +1757,7 @@ <string name="color_correction_feature_name" msgid="7975133554160979214">"Corrección de color"</string> <string name="one_handed_mode_feature_name" msgid="2334330034828094891">"Modo Una mano"</string> <string name="reduce_bright_colors_feature_name" msgid="3222994553174604132">"Atenuación extra"</string> - <string name="hearing_aids_feature_name" msgid="1125892105105852542">"Dispositivos auditivos"</string> + <string name="hearing_aids_feature_name" msgid="1125892105105852542">"Audífonos"</string> <string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"Al mantener pulsadas las teclas de volumen, se ha activado <xliff:g id="SERVICE_NAME">%1$s</xliff:g>."</string> <string name="accessibility_shortcut_disabling_service" msgid="8675244165062700619">"Se han mantenido pulsadas las teclas de volumen. Se ha desactivado <xliff:g id="SERVICE_NAME">%1$s</xliff:g>."</string> <string name="accessibility_shortcut_spoken_feedback" msgid="3760999147597564314">"Suelta las teclas de volumen. Para activar <xliff:g id="SERVICE_NAME">%1$s</xliff:g>, mantén pulsadas las dos teclas de volumen de nuevo durante 3 segundos."</string> diff --git a/core/res/res/values-et-rEE/config.xml b/core/res/res/values-et-rEE/config.xml new file mode 100644 index 000000000000..cf4d07f2ead0 --- /dev/null +++ b/core/res/res/values-et-rEE/config.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** Copyright 2024, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> +<resources> + <bool name="config_use_sim_language_file">false</bool> +</resources> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 5e474cde8a09..0c46ed93a602 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -1746,8 +1746,7 @@ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"پاسخ شما تأیید نشد زیرا یک برنامه درخواست اجازه را مسدود کرده است."</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"برای استفاده از ویژگی، روی آن تکضرب بزنید:"</string> <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"انتخاب ویژگیهای موردنظر برای استفاده با دکمه دسترسپذیری"</string> - <!-- no translation found for accessibility_edit_shortcut_menu_volume_title (2245540598834891500) --> - <skip /> + <string name="accessibility_edit_shortcut_menu_volume_title" msgid="2245540598834891500">"انتخاب کنید کدام ویژگیها با میانبر کلیدهای میزان صدا استفاده شود"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"<xliff:g id="SERVICE_NAME">%s</xliff:g> خاموش شده است"</string> <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"ویرایش میانبرها"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"تمام"</string> diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index 2810b5e40107..2ac70ab79c3b 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -1746,8 +1746,7 @@ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"કોઈ ઍપ પરવાનગીની વિનંતીને ઢાંકી રહી છે, તેથી તમારા પ્રતિસાદની ચકાસણી કરી શકાતી નથી."</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"સુવિધાનો ઉપયોગ શરૂ કરવા તેના પર ટૅપ કરો:"</string> <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"ઍક્સેસિબિલિટી બટન વડે તમે ઉપયોગમાં લેવા માગો છો તે સુવિધાઓ પસંદ કરો"</string> - <!-- no translation found for accessibility_edit_shortcut_menu_volume_title (2245540598834891500) --> - <skip /> + <string name="accessibility_edit_shortcut_menu_volume_title" msgid="2245540598834891500">"વૉલ્યૂમ કી શૉર્ટકટ વડે તમે ઉપયોગમાં લેવા માગો છો તે સુવિધાઓ પસંદ કરો"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"<xliff:g id="SERVICE_NAME">%s</xliff:g> બંધ કરવામાં આવ્યું છે"</string> <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"શૉર્ટકટમાં ફેરફાર કરો"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"થઈ ગયું"</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 700e91ad8eb8..5f1bb9a74d27 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -1746,8 +1746,7 @@ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"ऐप्लिकेशन की वजह से, अनुमति का अनुरोध समझने में परेशानी हो रही है. इसलिए, आपके जवाब की पुष्टि नहीं की जा सकी."</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"किसी सुविधा का इस्तेमाल करने के लिए, उस पर टैप करें:"</string> <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"सुलभता बटन पर टैप करके, इस्तेमाल करने के लिए सुविधाएं चुनें"</string> - <!-- no translation found for accessibility_edit_shortcut_menu_volume_title (2245540598834891500) --> - <skip /> + <string name="accessibility_edit_shortcut_menu_volume_title" msgid="2245540598834891500">"वे सुविधाएं चुनें जिन्हें आवाज़ बटनों के शॉर्टकट के ज़रिए इस्तेमाल करना है"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"<xliff:g id="SERVICE_NAME">%s</xliff:g> को बंद कर दिया गया है"</string> <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"शॉर्टकट में बदलाव करें"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"हो गया"</string> diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml index 3eb2e4bd0a2c..057b830d4fb7 100644 --- a/core/res/res/values-is/strings.xml +++ b/core/res/res/values-is/strings.xml @@ -1746,8 +1746,7 @@ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"Forrit er að fela heimildarbeiðnina svo ekki er hægt að staðfesta svarið þitt."</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"Ýttu á eiginleika til að byrja að nota hann:"</string> <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"Veldu eiginleika sem á að nota með aðgengishnappinum"</string> - <!-- no translation found for accessibility_edit_shortcut_menu_volume_title (2245540598834891500) --> - <skip /> + <string name="accessibility_edit_shortcut_menu_volume_title" msgid="2245540598834891500">"Veldu eiginleika sem á að nota með flýtileið hljóðstyrkstakka"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"Slökkt hefur verið á <xliff:g id="SERVICE_NAME">%s</xliff:g>"</string> <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"Breyta flýtileiðum"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"Lokið"</string> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index bcff8138c103..0705b36d9450 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -1400,10 +1400,10 @@ <string name="usb_tether_notification_title" msgid="8828527870612663771">"USB テザリング ON"</string> <string name="usb_midi_notification_title" msgid="7404506788950595557">"USB MIDI モード ON"</string> <string name="usb_uvc_notification_title" msgid="2030032862673400008">"ウェブカメラとしてデバイスを接続しました"</string> - <string name="usb_accessory_notification_title" msgid="1385394660861956980">"USB アクセサリが接続されました"</string> + <string name="usb_accessory_notification_title" msgid="1385394660861956980">"USB アクセサリーが接続されました"</string> <string name="usb_notification_message" msgid="4715163067192110676">"タップしてその他のオプションを表示します。"</string> <string name="usb_power_notification_message" msgid="7284765627437897702">"接続されているデバイスを充電しています。タップすると、他の項目が表示されます。"</string> - <string name="usb_unsupported_audio_accessory_title" msgid="2335775548086533065">"アナログのオーディオ アクセサリを検出"</string> + <string name="usb_unsupported_audio_accessory_title" msgid="2335775548086533065">"アナログのオーディオ アクセサリーを検出"</string> <string name="usb_unsupported_audio_accessory_message" msgid="1300168007129796621">"接続したデバイスはこのスマートフォンと互換性がありません。タップすると、詳細を確認できます。"</string> <string name="adb_active_notification_title" msgid="408390247354560331">"USB デバッグが接続されました"</string> <string name="adb_active_notification_message" msgid="5617264033476778211">"無効にするにはここをタップしてください"</string> @@ -1746,8 +1746,7 @@ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"権限のリクエストを遮っているアプリがあるため、同意の回答を確認できません。"</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"使用を開始する機能をタップ:"</string> <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"ユーザー補助機能ボタンで使用する機能の選択"</string> - <!-- no translation found for accessibility_edit_shortcut_menu_volume_title (2245540598834891500) --> - <skip /> + <string name="accessibility_edit_shortcut_menu_volume_title" msgid="2245540598834891500">"音量ボタンのショートカットで使用する機能の選択"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"<xliff:g id="SERVICE_NAME">%s</xliff:g> はオフになっています"</string> <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"ショートカットの編集"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"完了"</string> diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml index 0adebb002c05..bac23337e0d1 100644 --- a/core/res/res/values-ka/strings.xml +++ b/core/res/res/values-ka/strings.xml @@ -1746,8 +1746,7 @@ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"აპი მალავს ნებართვის მოთხოვნას, ასე რომ, თქვენი პასუხი ვერ დადასტურდება."</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"შეეხეთ ფუნქციას მისი გამოყენების დასაწყებად:"</string> <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"აირჩიეთ ფუნქციები, რომელთა გამოყენებაც გსურთ მარტივი წვდომის ღილაკით"</string> - <!-- no translation found for accessibility_edit_shortcut_menu_volume_title (2245540598834891500) --> - <skip /> + <string name="accessibility_edit_shortcut_menu_volume_title" msgid="2245540598834891500">"ხმის კლავიშების მალსახმობების მეშვეობით გამოსაყენებელი ფუნქციების არჩევა"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"<xliff:g id="SERVICE_NAME">%s</xliff:g> გამორთულია"</string> <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"მალსახმობების რედაქტირება"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"მზადაა"</string> diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml index f3dd775defef..1f931c6644e3 100644 --- a/core/res/res/values-km/strings.xml +++ b/core/res/res/values-km/strings.xml @@ -1746,8 +1746,7 @@ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"កម្មវិធីមួយកំពុងបិទបាំងសំណើសុំការអនុញ្ញាត ដូច្នេះមិនអាចផ្ទៀងផ្ទាត់ការឆ្លើយតបរបស់អ្នកបានទេ។"</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"ចុចមុខងារណាមួយ ដើម្បចាប់ផ្ដើមប្រើ៖"</string> <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"ជ្រើសរើសមុខងារ ដើម្បីប្រើជាមួយប៊ូតុងភាពងាយស្រួល"</string> - <!-- no translation found for accessibility_edit_shortcut_menu_volume_title (2245540598834891500) --> - <skip /> + <string name="accessibility_edit_shortcut_menu_volume_title" msgid="2245540598834891500">"ជ្រើសរើសមុខងារ ដើម្បីប្រើជាមួយផ្លូវកាត់គ្រាប់ចុចកម្រិតសំឡេង"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"បានបិទ <xliff:g id="SERVICE_NAME">%s</xliff:g>"</string> <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"កែផ្លូវកាត់"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"រួចរាល់"</string> diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml index a772e32c1221..941a1b2572ce 100644 --- a/core/res/res/values-kn/strings.xml +++ b/core/res/res/values-kn/strings.xml @@ -1746,8 +1746,7 @@ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"ಆ್ಯಪ್ವೊಂದು ಅನುಮತಿ ವಿನಂತಿಯನ್ನು ಮರೆಮಾಚುತ್ತಿರುವ ಕಾರಣ ನಿಮ್ಮ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಪರಿಶೀಲಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ."</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"ವೈಶಿಷ್ಟ್ದ ಬಳಸುವುದನ್ನು ಪ್ರಾರಂಭಿಸಲು ಅದನ್ನು ಟ್ಯಾಪ್ ಮಾಡಿ:"</string> <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ ಬಟನ್ ಜೊತೆಗೆ ಬಳಸಲು ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string> - <!-- no translation found for accessibility_edit_shortcut_menu_volume_title (2245540598834891500) --> - <skip /> + <string name="accessibility_edit_shortcut_menu_volume_title" msgid="2245540598834891500">"ವಾಲ್ಯೂಮ್ ಕೀ ಶಾರ್ಟ್ಕಟ್ ಜೊತೆಗೆ ಬಳಸಲು ಫೀಚರ್ಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"<xliff:g id="SERVICE_NAME">%s</xliff:g> ಅನ್ನು ಆಫ್ ಮಾಡಲಾಗಿದೆ"</string> <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"ಶಾರ್ಟ್ಕಟ್ಗಳನ್ನು ಎಡಿಟ್ ಮಾಡಿ"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"ಪೂರ್ಣಗೊಂಡಿದೆ"</string> diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index 4c2ee5f88d99..43fd6a78cc73 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -1746,8 +1746,7 @@ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"Колдонмо уруксат суроону жашырып койгондуктан, жообуңузду ырастоо мүмкүн эмес."</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"Функцияны колдонуп баштоо үчүн аны таптап коюңуз:"</string> <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"Атайын мүмкүнчүлүктөр баскычы менен колдонгуңуз келген функцияларды тандаңыз"</string> - <!-- no translation found for accessibility_edit_shortcut_menu_volume_title (2245540598834891500) --> - <skip /> + <string name="accessibility_edit_shortcut_menu_volume_title" msgid="2245540598834891500">"Үн баскычтары менен кайсы функцияларды иштеткиңиз келет?"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"<xliff:g id="SERVICE_NAME">%s</xliff:g> өчүрүлдү"</string> <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"Кыска жолдорду түзөтүү"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"Бүттү"</string> diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml index b62750311caa..dc15e9afc0cf 100644 --- a/core/res/res/values-lo/strings.xml +++ b/core/res/res/values-lo/strings.xml @@ -1746,8 +1746,7 @@ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"ແອັບໜຶ່ງກຳລັງປິດບັງຄຳຮ້ອງຂໍການອະນຸຍາດ ດັ່ງນັ້ນຈຶ່ງບໍ່ສາມາດຢັ້ງຢືນຄຳຕອບຂອງທ່ານໄດ້."</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"ແຕະໃສ່ຄຸນສົມບັດໃດໜຶ່ງເພື່ອເລີ່ມການນຳໃຊ້ມັນ:"</string> <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"ເລືອກຄຸນສົມບັດເພື່ອໃຊ້ກັບປຸ່ມການຊ່ວຍເຂົ້າເຖິງ"</string> - <!-- no translation found for accessibility_edit_shortcut_menu_volume_title (2245540598834891500) --> - <skip /> + <string name="accessibility_edit_shortcut_menu_volume_title" msgid="2245540598834891500">"ເລືອກຄຸນສົມບັດທີ່ຈະໃຊ້ກັບທາງລັດຂອງປຸ່ມລະດັບສຽງ"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"ປິດ <xliff:g id="SERVICE_NAME">%s</xliff:g> ໄວ້ແລ້ວ"</string> <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"ແກ້ໄຂທາງລັດ"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"ແລ້ວໆ"</string> diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml index 2b1c52ff0825..6d60696f40e9 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -1746,8 +1746,7 @@ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"ഒരു ആപ്പ്, അനുമതി അഭ്യർത്ഥന മറയ്ക്കുന്നതിനാൽ നിങ്ങളുടെ പ്രതികരണം പരിശോധിച്ചുറപ്പിക്കാനാകില്ല."</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"ഉപയോഗിച്ച് തുടങ്ങാൻ ഫീച്ചർ ടാപ്പ് ചെയ്യുക:"</string> <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"ഉപയോഗസഹായി ബട്ടണിന്റെ സഹായത്തോടെ, ഉപയോഗിക്കാൻ ഫീച്ചറുകൾ തിരഞ്ഞെടുക്കുക"</string> - <!-- no translation found for accessibility_edit_shortcut_menu_volume_title (2245540598834891500) --> - <skip /> + <string name="accessibility_edit_shortcut_menu_volume_title" msgid="2245540598834891500">"വോളിയം കീകളുടെ കുറുക്കുവഴികൾക്കൊപ്പം ഉപയോഗിക്കേണ്ട ഫീച്ചറുകൾ തിരഞ്ഞെടുക്കുക"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"<xliff:g id="SERVICE_NAME">%s</xliff:g> ഓഫാക്കിയിരിക്കുന്നു"</string> <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"കുറുക്കുവഴികൾ തിരുത്തുക"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"പൂർത്തിയാക്കി"</string> diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml index 67c3b980d700..30403cf0984f 100644 --- a/core/res/res/values-mr/strings.xml +++ b/core/res/res/values-mr/strings.xml @@ -1746,8 +1746,7 @@ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"परवानगी मागणारी विनंती अॅपमुळे अस्पष्ट होत असल्याने, तुमच्या प्रतिसादाची पडताळणी केली जाऊ शकत नाही."</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"वैशिष्ट्य वापरणे सुरू करण्यासाठी त्यावर टॅप करा:"</string> <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"अॅक्सेसिबिलिटी बटणासोबत वापरायची असलेली ॲप्स निवडा"</string> - <!-- no translation found for accessibility_edit_shortcut_menu_volume_title (2245540598834891500) --> - <skip /> + <string name="accessibility_edit_shortcut_menu_volume_title" msgid="2245540598834891500">"व्हॉल्यूम की शॉर्टकटसोबत वापरायची असलेली ॲप्स निवडा"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"<xliff:g id="SERVICE_NAME">%s</xliff:g> बंद केले आहे"</string> <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"शॉर्टकट संपादित करा"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"पूर्ण झाले"</string> diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml index 5eac79316474..e17c62bb168e 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -1746,8 +1746,7 @@ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"Apl menghalang permintaan kebenaran, maka jawapan anda tidak dapat disahkan."</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"Ketik ciri untuk mula menggunakan ciri itu:"</string> <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"Pilih ciri untuk digunakan dengan butang kebolehaksesan"</string> - <!-- no translation found for accessibility_edit_shortcut_menu_volume_title (2245540598834891500) --> - <skip /> + <string name="accessibility_edit_shortcut_menu_volume_title" msgid="2245540598834891500">"Pilih ciri untuk digunakan dengan pintasan kekunci kelantangan"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"<xliff:g id="SERVICE_NAME">%s</xliff:g> telah dimatikan"</string> <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"Edit pintasan"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"Selesai"</string> diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml index b09539c27bac..85fb0e9e27d7 100644 --- a/core/res/res/values-my/strings.xml +++ b/core/res/res/values-my/strings.xml @@ -1746,8 +1746,7 @@ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"အက်ပ်တစ်ခုသည် ခွင့်ပြုချက်တောင်းဆိုမှုကို ပိတ်နေသဖြင့် သင့်တုံ့ပြန်မှုကို စိစစ်၍မရပါ။"</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"ဝန်ဆောင်မှုကို စတင်အသုံးပြုရန် တို့ပါ−"</string> <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"အများသုံးနိုင်မှု ခလုတ်ဖြင့် အသုံးပြုရန် ဝန်ဆောင်မှုများကို ရွေးပါ"</string> - <!-- no translation found for accessibility_edit_shortcut_menu_volume_title (2245540598834891500) --> - <skip /> + <string name="accessibility_edit_shortcut_menu_volume_title" msgid="2245540598834891500">"အသံထိန်းခလုတ်ဖြတ်လမ်းဖြင့် အသုံးပြုရန်အတွက် တူးလ်များကိုရွေးပါ"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"<xliff:g id="SERVICE_NAME">%s</xliff:g> ကို ပိတ်ထားသည်"</string> <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"ဖြတ်လမ်းများကို တည်းဖြတ်ရန်"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"ပြီးပြီ"</string> diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index 9f3530a3e15d..36e3254135eb 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -1746,8 +1746,7 @@ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"कुनै एपका कारण अनुमतिसम्बन्धी अनुरोध बुझ्न कठिनाइ भइरहेकाले तपाईंको जवाफको पुष्टि गर्न सकिएन।"</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"कुनै सुविधा प्रयोग गर्न थाल्न उक्त सुविधामा ट्याप गर्नुहोस्:"</string> <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"पहुँचको बटनमार्फत प्रयोग गर्न चाहेका सुविधाहरू छनौट गर्नुहोस्"</string> - <!-- no translation found for accessibility_edit_shortcut_menu_volume_title (2245540598834891500) --> - <skip /> + <string name="accessibility_edit_shortcut_menu_volume_title" msgid="2245540598834891500">"भोल्युम बटनको सर्टकटमार्फत प्रयोग गर्न चाहेका सुविधाहरू छनौट गर्नुहोस्"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"<xliff:g id="SERVICE_NAME">%s</xliff:g> निष्क्रिय पारिएको छ"</string> <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"सर्टकटहरू सम्पादन गर्नुहोस्"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"सम्पन्न भयो"</string> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 8209504a62f3..18773f6c1473 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -642,7 +642,7 @@ <string name="permdesc_mediaLocation" msgid="597912899423578138">"Hiermee sta je de app toe locaties van je mediacollectie te bekijken."</string> <string name="biometric_app_setting_name" msgid="3339209978734534457">"Biometrische gegevens gebruiken"</string> <string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Biometrische gegevens of schermvergrendeling gebruiken"</string> - <string name="biometric_dialog_default_title" msgid="55026799173208210">"Je identiteit verifiëren"</string> + <string name="biometric_dialog_default_title" msgid="55026799173208210">"Je identiteit bevestigen"</string> <string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Gebruik je biometrische gegevens om door te gaan"</string> <string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Gebruik je biometrische gegevens of schermvergrendeling om door te gaan"</string> <string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Biometrische hardware niet beschikbaar"</string> @@ -1746,8 +1746,7 @@ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"Een app dekt het verzoek om rechten af, waardoor je reactie niet kan worden geverifieerd."</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"Tik op een functie om deze te gebruiken:"</string> <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"Functies kiezen voor gebruik met de knop Toegankelijkheid"</string> - <!-- no translation found for accessibility_edit_shortcut_menu_volume_title (2245540598834891500) --> - <skip /> + <string name="accessibility_edit_shortcut_menu_volume_title" msgid="2245540598834891500">"Functies kiezen voor gebruik met de snelkoppeling met volumeknoppen"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"<xliff:g id="SERVICE_NAME">%s</xliff:g> is uitgezet"</string> <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"Snelkoppelingen bewerken"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"Klaar"</string> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 71940ef78cbd..28c130c42fe4 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -1747,8 +1747,7 @@ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"Uma app está a ocultar o pedido de autorização e, por isso, não é possível validar a sua resposta."</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"Toque numa funcionalidade para começar a utilizá-la:"</string> <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"Escolha funcionalidades para utilizar com o botão Acessibilidade"</string> - <!-- no translation found for accessibility_edit_shortcut_menu_volume_title (2245540598834891500) --> - <skip /> + <string name="accessibility_edit_shortcut_menu_volume_title" msgid="2245540598834891500">"Escolha funcionalidades para usar com o atalho de teclas de volume"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"O serviço <xliff:g id="SERVICE_NAME">%s</xliff:g> foi desativado."</string> <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"Editar atalhos"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"Concluído"</string> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 22501f2a01b1..3c374ef5de28 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -1748,8 +1748,7 @@ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"Невозможно принять ваш ответ, поскольку запрос разрешения скрыт другим приложением."</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"Выберите, какую функцию использовать:"</string> <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"Выберите функции, которые будут запускаться с помощью кнопки специальных возможностей"</string> - <!-- no translation found for accessibility_edit_shortcut_menu_volume_title (2245540598834891500) --> - <skip /> + <string name="accessibility_edit_shortcut_menu_volume_title" msgid="2245540598834891500">"Выберите функции, которые вы хотите запускать кнопками регулировки громкости"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"Сервис \"<xliff:g id="SERVICE_NAME">%s</xliff:g>\" отключен."</string> <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"Изменить ярлыки"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"Готово"</string> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index 3289bbc7416f..7185bcdb0de6 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -1748,8 +1748,7 @@ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"Aplikácia zakrýva žiadosť o povolenie, takže vaša odpoveď sa nedá overiť."</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"Klepnutím na funkciu ju začnite používať:"</string> <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"Výber funkcií, ktoré chcete používať tlačidlom dostupnosti"</string> - <!-- no translation found for accessibility_edit_shortcut_menu_volume_title (2245540598834891500) --> - <skip /> + <string name="accessibility_edit_shortcut_menu_volume_title" msgid="2245540598834891500">"Vyberte funkcie, ktoré chcete používať so skratkou tlačidiel hlasitosti"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"Služba <xliff:g id="SERVICE_NAME">%s</xliff:g> bola vypnutá"</string> <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"Upraviť skratky"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"Hotovo"</string> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 99ce0469be55..e67bf9c910a3 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -1748,8 +1748,7 @@ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"Aplikacija zakriva zahtevo za dovoljenje, zato ni mogoče potrditi vašega odgovora."</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"Če želite začeti uporabljati funkcijo, se je dotaknite:"</string> <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"Izberite funkcije, ki jih želite uporabljati z gumbom za dostopnost"</string> - <!-- no translation found for accessibility_edit_shortcut_menu_volume_title (2245540598834891500) --> - <skip /> + <string name="accessibility_edit_shortcut_menu_volume_title" msgid="2245540598834891500">"Izberite funkcije, ki jih želite uporabljati z bližnjico gumbov za glasnost"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"Storitev <xliff:g id="SERVICE_NAME">%s</xliff:g> je izklopljena"</string> <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"Uredi bližnjice"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"Končano"</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 0451b561347b..f5988c282e36 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -1747,8 +1747,7 @@ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"Апликација крије захтев за дозволу, па одговор не може да се верификује."</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"Додирните неку функцију да бисте почели да је користите:"</string> <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"Одаберите функције које ћете користити са дугметом Приступачност"</string> - <!-- no translation found for accessibility_edit_shortcut_menu_volume_title (2245540598834891500) --> - <skip /> + <string name="accessibility_edit_shortcut_menu_volume_title" msgid="2245540598834891500">"Одаберите функције које ће се користити са пречицом за тастере за јачину звука"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"Услуга <xliff:g id="SERVICE_NAME">%s</xliff:g> је искључена"</string> <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"Измените пречице"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"Готово"</string> diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml index b1ce5149861d..626205e42483 100644 --- a/core/res/res/values-ta/strings.xml +++ b/core/res/res/values-ta/strings.xml @@ -1746,8 +1746,7 @@ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"அணுகல் கோரிக்கையை ஓர் ஆப்ஸ் மறைப்பதால் உங்கள் பதிலைச் சரிபார்க்க முடியாது."</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"ஒரு அம்சத்தைப் பயன்படுத்த அதைத் தட்டவும்:"</string> <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"அணுகல்தன்மை பட்டன் மூலம் பயன்படுத்த விரும்பும் அம்சங்களைத் தேர்வுசெய்யுங்கள்"</string> - <!-- no translation found for accessibility_edit_shortcut_menu_volume_title (2245540598834891500) --> - <skip /> + <string name="accessibility_edit_shortcut_menu_volume_title" msgid="2245540598834891500">"ஒலியளவு விசைகளுக்கான ஷார்ட்கட்டுடன் பயன்படுத்துவதற்கான அம்சங்களைத் தேர்வுசெய்யுங்கள்"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"<xliff:g id="SERVICE_NAME">%s</xliff:g> ஆஃப் செய்யப்பட்டுள்ளது"</string> <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"ஷார்ட்கட்களை மாற்று"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"முடிந்தது"</string> diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index 4b655d156a50..db19868b37dd 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -1746,8 +1746,7 @@ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"ఒక యాప్ అనుమతి రిక్వెస్ట్కు అడ్డు తగులుతోంది కాబట్టి మీ సమాధానం వెరిఫై చేయడం సాధ్యం కాదు."</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"ఫీచర్ని ఉపయోగించడం ప్రారంభించడానికి, దాన్ని ట్యాప్ చేయండి:"</string> <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"యాక్సెసిబిలిటీ బటన్తో ఉపయోగించడానికి ఫీచర్లను ఎంచుకోండి"</string> - <!-- no translation found for accessibility_edit_shortcut_menu_volume_title (2245540598834891500) --> - <skip /> + <string name="accessibility_edit_shortcut_menu_volume_title" msgid="2245540598834891500">"వాల్యూమ్ కీల షార్ట్కట్తో ఉపయోగించడానికి ఫీచర్లను ఎంచుకోండి"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"<xliff:g id="SERVICE_NAME">%s</xliff:g> ఆఫ్ చేయబడింది"</string> <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"షార్ట్కట్లను ఎడిట్ చేయండి"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"పూర్తయింది"</string> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index d979c340e216..b34cf59a2bb8 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -1746,8 +1746,7 @@ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"มีแอปหนึ่งบดบังคำขอสิทธิ์ เราจึงยืนยันการตอบกลับของคุณไม่ได้"</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"แตะฟีเจอร์เพื่อเริ่มใช้"</string> <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"เลือกฟีเจอร์ที่จะใช้กับปุ่มการช่วยเหลือพิเศษ"</string> - <!-- no translation found for accessibility_edit_shortcut_menu_volume_title (2245540598834891500) --> - <skip /> + <string name="accessibility_edit_shortcut_menu_volume_title" msgid="2245540598834891500">"เลือกฟีเจอร์ที่จะใช้กับทางลัดปุ่มปรับระดับเสียง"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"ปิด <xliff:g id="SERVICE_NAME">%s</xliff:g> แล้ว"</string> <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"แก้ไขทางลัด"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"เสร็จ"</string> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index fbbb32c1c8fa..b976f204e395 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -1746,8 +1746,7 @@ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"May app na pumipigil sa kahilingan sa pahintulot kaya hindi ma-verify ang iyong sagot."</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"I-tap ang isang feature para simulan itong gamitin:"</string> <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"Pumili ng mga feature na gagana sa pamamagitan ng button ng accessibility"</string> - <!-- no translation found for accessibility_edit_shortcut_menu_volume_title (2245540598834891500) --> - <skip /> + <string name="accessibility_edit_shortcut_menu_volume_title" msgid="2245540598834891500">"Pumili ng mga feature na gagana sa pamamagitan ng shortcut ng mga volume key"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"Na-off ang <xliff:g id="SERVICE_NAME">%s</xliff:g>"</string> <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"I-edit ang mga shortcut"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"Tapos na"</string> diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml index d2f0898acd0c..fcfff0faa88c 100644 --- a/core/res/res/values-ur/strings.xml +++ b/core/res/res/values-ur/strings.xml @@ -1746,8 +1746,7 @@ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"ایپ اجازت کی درخواست کو مبہم کر رہی ہے لہذا آپ کے جواب کی تصدیق نہیں کی جا سکتی۔"</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"ایک خصوصیت کا استعمال شروع کرنے کیلئے اسے تھپتھپائیں:"</string> <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"ایکسیسبیلٹی بٹن کے ساتھ استعمال کرنے کیلئے خصوصیات منتخب کریں"</string> - <!-- no translation found for accessibility_edit_shortcut_menu_volume_title (2245540598834891500) --> - <skip /> + <string name="accessibility_edit_shortcut_menu_volume_title" msgid="2245540598834891500">"والیوم کلیدوں کے شارٹ کٹ کے ساتھ استعمال کرنے کیلئے خصوصیات منتخب کریں"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"<xliff:g id="SERVICE_NAME">%s</xliff:g> کو آف کر دیا گیا ہے"</string> <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"شارٹ کٹس میں ترمیم کریں"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"ہو گیا"</string> diff --git a/core/tests/BroadcastRadioTests/Android.bp b/core/tests/BroadcastRadioTests/Android.bp index beffb9aac12b..7d4ae00c405a 100644 --- a/core/tests/BroadcastRadioTests/Android.bp +++ b/core/tests/BroadcastRadioTests/Android.bp @@ -45,7 +45,7 @@ android_test { "flag-junit", "mockito-target-extended", ], - libs: ["android.test.base"], + libs: ["android.test.base.stubs.system"], test_suites: [ "general-tests", "automotive-general-tests", diff --git a/core/tests/ConnectivityManagerTest/Android.bp b/core/tests/ConnectivityManagerTest/Android.bp index f17a28d22c17..6421899631ff 100644 --- a/core/tests/ConnectivityManagerTest/Android.bp +++ b/core/tests/ConnectivityManagerTest/Android.bp @@ -24,8 +24,8 @@ package { android_test { name: "ConnectivityManagerTest", libs: [ - "android.test.runner", - "android.test.base", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", ], static_libs: [ "junit", diff --git a/core/tests/GameManagerTests/Android.bp b/core/tests/GameManagerTests/Android.bp index a252f8b53fab..1abceb820fc1 100644 --- a/core/tests/GameManagerTests/Android.bp +++ b/core/tests/GameManagerTests/Android.bp @@ -32,7 +32,7 @@ android_test { "platform-test-annotations", "truth", ], - libs: ["android.test.runner"], + libs: ["android.test.runner.stubs.system"], platform_apis: true, certificate: "platform", test_suites: ["device-tests"], diff --git a/core/tests/InputMethodCoreTests/Android.bp b/core/tests/InputMethodCoreTests/Android.bp index ac6462589e16..2b524d58ced7 100644 --- a/core/tests/InputMethodCoreTests/Android.bp +++ b/core/tests/InputMethodCoreTests/Android.bp @@ -42,9 +42,9 @@ android_test { ], libs: [ - "android.test.runner", - "android.test.base", - "android.test.mock", + "android.test.runner.stubs", + "android.test.base.stubs", + "android.test.mock.stubs", "framework", "ext", "framework-res", diff --git a/core/tests/PackageInstallerSessions/Android.bp b/core/tests/PackageInstallerSessions/Android.bp index b631df1fcf57..d10ecd07a44c 100644 --- a/core/tests/PackageInstallerSessions/Android.bp +++ b/core/tests/PackageInstallerSessions/Android.bp @@ -39,8 +39,8 @@ android_test { ], libs: [ - "android.test.runner", - "android.test.base", + "android.test.runner.stubs", + "android.test.base.stubs", "framework", "framework-res", ], diff --git a/core/tests/PlatformCompatFramework/Android.bp b/core/tests/PlatformCompatFramework/Android.bp index 2621d280bd9d..a3fdf7b43bee 100644 --- a/core/tests/PlatformCompatFramework/Android.bp +++ b/core/tests/PlatformCompatFramework/Android.bp @@ -12,8 +12,8 @@ android_test { // Include all test java files. srcs: ["src/**/*.java"], libs: [ - "android.test.runner", - "android.test.base", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", ], static_libs: [ "junit", diff --git a/core/tests/bandwidthtests/Android.bp b/core/tests/bandwidthtests/Android.bp index 8645b39da5a8..b7357122dff8 100644 --- a/core/tests/bandwidthtests/Android.bp +++ b/core/tests/bandwidthtests/Android.bp @@ -27,9 +27,9 @@ android_test { // Include all test java files. srcs: ["src/**/*.java"], libs: [ - "android.test.runner", - "org.apache.http.legacy", - "android.test.base", + "android.test.runner.stubs", + "org.apache.http.legacy.stubs", + "android.test.base.stubs", ], static_libs: [ "junit", diff --git a/core/tests/batterystatstests/BatteryStatsLoadTests/Android.bp b/core/tests/batterystatstests/BatteryStatsLoadTests/Android.bp index 1c0ea839ec02..926edfed16ef 100644 --- a/core/tests/batterystatstests/BatteryStatsLoadTests/Android.bp +++ b/core/tests/batterystatstests/BatteryStatsLoadTests/Android.bp @@ -16,7 +16,7 @@ android_test { "compatibility-device-util-axt", "junit", ], - libs: ["android.test.runner"], + libs: ["android.test.runner.stubs.system"], platform_apis: true, certificate: "platform", } diff --git a/core/tests/bugreports/Android.bp b/core/tests/bugreports/Android.bp index 15e07e535b39..664d54d374b4 100644 --- a/core/tests/bugreports/Android.bp +++ b/core/tests/bugreports/Android.bp @@ -26,8 +26,8 @@ android_test { srcs: ["src/**/*.java"], data: [":bugreport_artifacts"], libs: [ - "android.test.runner", - "android.test.base", + "android.test.runner.stubs.test", + "android.test.base.stubs.test", ], static_libs: [ "android.tracing.flags-aconfig-java", @@ -43,3 +43,10 @@ filegroup { name: "bugreport_artifacts", srcs: ["config/test-sysconfig.xml"], } + +test_module_config { + name: "BugreportManagerTestCases_android_server_os", + base: "BugreportManagerTestCases", + test_suites: ["general-tests"], + exclude_annotations: ["androidx.test.filters.LargeTest"], +} diff --git a/core/tests/companiontests/Android.bp b/core/tests/companiontests/Android.bp index d31b8f470108..cb0951e59d04 100644 --- a/core/tests/companiontests/Android.bp +++ b/core/tests/companiontests/Android.bp @@ -12,8 +12,8 @@ android_test { // Include all test java files. srcs: ["src/**/*.java"], libs: [ - "android.test.runner", - "android.test.base", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", ], static_libs: ["junit"], platform_apis: true, diff --git a/core/tests/coretests/Android.bp b/core/tests/coretests/Android.bp index 41599aea1a80..d98836f8ce20 100644 --- a/core/tests/coretests/Android.bp +++ b/core/tests/coretests/Android.bp @@ -107,10 +107,10 @@ android_test { ], libs: [ - "android.test.runner", - "org.apache.http.legacy", - "android.test.base", - "android.test.mock", + "android.test.runner.stubs", + "org.apache.http.legacy.stubs", + "android.test.base.stubs", + "android.test.mock.stubs", "framework", "ext", "framework-res", @@ -158,8 +158,8 @@ android_app { use_resource_processor: false, libs: [ "framework-res", - "android.test.runner", - "org.apache.http.legacy", + "android.test.runner.stubs", + "org.apache.http.legacy.stubs", ], uses_libs: [ "android.test.runner", @@ -225,9 +225,9 @@ android_library { ], libs: [ - "android.test.runner", - "android.test.base", - "android.test.mock", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", + "android.test.mock.stubs.system", "framework", "framework-res", ], @@ -236,8 +236,8 @@ android_library { android_ravenwood_test { name: "FrameworksCoreTestsRavenwood", libs: [ - "android.test.runner", - "android.test.base", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", ], static_libs: [ "core-test-rules", // for libcore.dalvik.system.CloseGuardSupport @@ -303,6 +303,7 @@ test_module_config { name: "FrameworksCoreTests_Presubmit", base: "FrameworksCoreTests", test_suites: [ + "automotive-tests", "device-tests", "device-platinum-tests", ], @@ -313,6 +314,7 @@ test_module_config { name: "FrameworksCoreTests_inputmethod", base: "FrameworksCoreTests", test_suites: [ + "automotive-tests", "device-tests", "device-platinum-tests", ], @@ -327,6 +329,7 @@ test_module_config { name: "FrameworksCoreTests_context", base: "FrameworksCoreTests", test_suites: [ + "automotive-tests", "device-tests", "device-platinum-tests", ], @@ -337,6 +340,7 @@ test_module_config { name: "FrameworksCoreTests_keyguard_manager", base: "FrameworksCoreTests", test_suites: [ + "automotive-tests", "device-tests", "device-platinum-tests", ], @@ -347,6 +351,7 @@ test_module_config { name: "FrameworksCoreTests_property_invalidated_cache", base: "FrameworksCoreTests", test_suites: [ + "automotive-tests", "device-tests", "device-platinum-tests", ], @@ -357,6 +362,7 @@ test_module_config { name: "FrameworksCoreTests_android_content", base: "FrameworksCoreTests", test_suites: [ + "automotive-tests", "device-tests", "device-platinum-tests", ], @@ -371,6 +377,7 @@ test_module_config { name: "FrameworksCoreTests_sqlite", base: "FrameworksCoreTests", test_suites: [ + "automotive-tests", "device-tests", "device-platinum-tests", ], @@ -381,6 +388,7 @@ test_module_config { name: "FrameworksCoreTests_android_net", base: "FrameworksCoreTests", test_suites: [ + "automotive-tests", "device-tests", "device-platinum-tests", ], @@ -392,6 +400,7 @@ test_module_config { name: "FrameworksCoreTests_battery_stats", base: "FrameworksCoreTests", test_suites: [ + "automotive-tests", "device-tests", "device-platinum-tests", ], @@ -403,6 +412,7 @@ test_module_config { name: "FrameworksCoreTests_environment", base: "FrameworksCoreTests", test_suites: [ + "automotive-tests", "device-tests", "device-platinum-tests", ], @@ -413,6 +423,7 @@ test_module_config { name: "FrameworksCoreTests_util_data_charset", base: "FrameworksCoreTests", test_suites: [ + "automotive-tests", "device-tests", "device-platinum-tests", ], @@ -426,6 +437,7 @@ test_module_config { name: "FrameworksCoreTests_xml", base: "FrameworksCoreTests", test_suites: [ + "automotive-tests", "device-tests", "device-platinum-tests", ], @@ -439,6 +451,7 @@ test_module_config { name: "FrameworksCoreTests_util_apk", base: "FrameworksCoreTests", test_suites: [ + "automotive-tests", "device-tests", "device-platinum-tests", ], @@ -449,6 +462,7 @@ test_module_config { name: "FrameworksCoreTests_textclassifier", base: "FrameworksCoreTests", test_suites: [ + "automotive-tests", "device-tests", "device-platinum-tests", ], @@ -460,6 +474,7 @@ test_module_config { name: "FrameworksCoreTests_internal_app", base: "FrameworksCoreTests", test_suites: [ + "automotive-tests", "device-tests", "device-platinum-tests", ], @@ -474,6 +489,7 @@ test_module_config { name: "FrameworksCoreTests_internal_content", base: "FrameworksCoreTests", test_suites: [ + "automotive-tests", "device-tests", "device-platinum-tests", ], @@ -484,6 +500,7 @@ test_module_config { name: "FrameworksCoreTests_internal_infra", base: "FrameworksCoreTests", test_suites: [ + "automotive-tests", "device-tests", "device-platinum-tests", ], @@ -494,6 +511,7 @@ test_module_config { name: "FrameworksCoreTests_internal_jank", base: "FrameworksCoreTests", test_suites: [ + "automotive-tests", "device-tests", "device-platinum-tests", ], @@ -504,6 +522,7 @@ test_module_config { name: "FrameworksCoreTests_internal_os_binder", base: "FrameworksCoreTests", test_suites: [ + "automotive-tests", "device-tests", "device-platinum-tests", ], @@ -515,6 +534,7 @@ test_module_config { name: "FrameworksCoreTests_internal_os_kernel", base: "FrameworksCoreTests", test_suites: [ + "automotive-tests", "device-tests", "device-platinum-tests", ], @@ -531,6 +551,7 @@ test_module_config { name: "FrameworksCoreTests_server_power", base: "FrameworksCoreTests", test_suites: [ + "automotive-tests", "device-tests", "device-platinum-tests", ], @@ -541,6 +562,7 @@ test_module_config { name: "FrameworksCoreTests_internal_security", base: "FrameworksCoreTests", test_suites: [ + "automotive-tests", "device-tests", "device-platinum-tests", ], @@ -552,6 +574,7 @@ test_module_config { name: "FrameworksCoreTests_internal_util_latency_tracker", base: "FrameworksCoreTests", test_suites: [ + "automotive-tests", "device-tests", "device-platinum-tests", ], @@ -562,6 +585,7 @@ test_module_config { name: "FrameworksCoreTests_content_capture_options", base: "FrameworksCoreTests", test_suites: [ + "automotive-tests", "device-tests", "device-platinum-tests", ], @@ -572,6 +596,7 @@ test_module_config { name: "FrameworksCoreTests_android_content_integrity", base: "FrameworksCoreTests", test_suites: [ + "automotive-tests", "device-tests", "device-platinum-tests", ], @@ -582,6 +607,7 @@ test_module_config { name: "FrameworksCoreTests_android_content_pm_PreSubmit", base: "FrameworksCoreTests", test_suites: [ + "automotive-tests", "device-tests", "device-platinum-tests", ], @@ -593,6 +619,7 @@ test_module_config { name: "FrameworksCoreTests_android_content_pm_PostSubmit", base: "FrameworksCoreTests", test_suites: [ + "automotive-tests", "device-tests", "device-platinum-tests", ], @@ -604,6 +631,7 @@ test_module_config { name: "FrameworksCoreTests_android_content_res", base: "FrameworksCoreTests", test_suites: [ + "automotive-tests", "device-tests", "device-platinum-tests", ], @@ -620,6 +648,7 @@ test_module_config { name: "FrameworksCoreTests_android_content_res_PostSubmit", base: "FrameworksCoreTests", test_suites: [ + "automotive-tests", "device-tests", "device-platinum-tests", ], @@ -631,6 +660,7 @@ test_module_config { name: "FrameworksCoreTests_android_service", base: "FrameworksCoreTests", test_suites: [ + "automotive-tests", "device-tests", "device-platinum-tests", ], @@ -650,6 +680,7 @@ test_module_config { name: "FrameworksCoreTests_android_view_contentcapture", base: "FrameworksCoreTests", test_suites: [ + "automotive-tests", "device-tests", "device-platinum-tests", ], @@ -660,6 +691,7 @@ test_module_config { name: "FrameworksCoreTests_android_view_contentprotection", base: "FrameworksCoreTests", test_suites: [ + "automotive-tests", "device-tests", "device-platinum-tests", ], @@ -670,6 +702,7 @@ test_module_config { name: "FrameworksCoreTests_com_android_internal_content_Presubmit", base: "FrameworksCoreTests", test_suites: [ + "automotive-tests", "device-tests", "device-platinum-tests", ], @@ -681,6 +714,7 @@ test_module_config { name: "FrameworksCoreTests_drawable", base: "FrameworksCoreTests", test_suites: [ + "automotive-tests", "device-tests", "device-platinum-tests", ], @@ -691,6 +725,7 @@ test_module_config { name: "FrameworksCoreTests_accessibility", base: "FrameworksCoreTests", test_suites: [ + "automotive-tests", "device-tests", "device-platinum-tests", ], @@ -705,6 +740,7 @@ test_module_config { name: "FrameworksCoreTests_usage", base: "FrameworksCoreTests", test_suites: [ + "automotive-tests", "device-tests", "device-platinum-tests", ], @@ -715,6 +751,7 @@ test_module_config { name: "FrameworksCoreTests_fastdata", base: "FrameworksCoreTests", test_suites: [ + "automotive-tests", "device-tests", "device-platinum-tests", ], @@ -725,6 +762,7 @@ test_module_config { name: "FrameworksCoreTests_hardware_input", base: "FrameworksCoreTests", test_suites: [ + "automotive-tests", "device-tests", "device-platinum-tests", ], @@ -735,6 +773,7 @@ test_module_config { name: "FrameworksCoreTests_view_verified", base: "FrameworksCoreTests", test_suites: [ + "automotive-tests", "device-tests", "device-platinum-tests", ], @@ -745,9 +784,34 @@ test_module_config { } test_module_config { + name: "FrameworksCoreTests_android_net_Presubmit", + base: "FrameworksCoreTests", + test_suites: [ + "automotive-tests", + "device-platinum-tests", + "device-tests", + ], + include_filters: ["android.net"], + include_annotations: ["android.platform.test.annotations.Presubmit"], +} + +test_module_config { + name: "FrameworksCoreTests_content_pm_Postsubmit", + base: "FrameworksCoreTests", + test_suites: [ + "automotive-tests", + "device-platinum-tests", + "device-tests", + ], + include_filters: ["android.content.pm."], + include_annotations: ["android.platform.test.annotations.Postsubmit"], +} + +test_module_config { name: "FrameworksCoreTests_jank", base: "FrameworksCoreTests", test_suites: [ + "automotive-tests", "device-tests", "device-platinum-tests", ], @@ -762,6 +826,7 @@ test_module_config { name: "FrameworksCoreTests_Platinum", base: "FrameworksCoreTests", test_suites: [ + "automotive-tests", "device-tests", "device-platinum-tests", ], diff --git a/core/tests/coretests/src/android/database/sqlite/SQLiteDatabaseTest.java b/core/tests/coretests/src/android/database/sqlite/SQLiteDatabaseTest.java index 00978a099f13..9d477094692a 100644 --- a/core/tests/coretests/src/android/database/sqlite/SQLiteDatabaseTest.java +++ b/core/tests/coretests/src/android/database/sqlite/SQLiteDatabaseTest.java @@ -25,6 +25,7 @@ import static org.junit.Assert.fail; import android.content.Context; import android.database.Cursor; import android.database.DatabaseUtils; +import android.database.DefaultDatabaseErrorHandler; import android.platform.test.annotations.RequiresFlagsEnabled; import android.platform.test.flag.junit.CheckFlagsRule; import android.platform.test.flag.junit.DeviceFlagsValueProvider; @@ -592,4 +593,70 @@ public class SQLiteDatabaseTest { } closeAndDeleteDatabase(); } + + @Test + public void testCloseCorruptionReport() throws Exception { + mDatabase.beginTransaction(); + try { + mDatabase.execSQL("CREATE TABLE t2 (i int, j int);"); + mDatabase.execSQL("INSERT INTO t2 (i, j) VALUES (2, 20)"); + mDatabase.execSQL("INSERT INTO t2 (i, j) VALUES (3, 30)"); + mDatabase.setTransactionSuccessful(); + } finally { + mDatabase.endTransaction(); + } + + // Start a transaction and announce that the DB is corrupted. + DefaultDatabaseErrorHandler errorHandler = new DefaultDatabaseErrorHandler(); + + // Do not bother with endTransaction; the database will have been closed in the corruption + // handler. + mDatabase.beginTransaction(); + try { + errorHandler.onCorruption(mDatabase); + mDatabase.execSQL("INSERT INTO t2 (i, j) VALUES (4, 40)"); + fail("expected an exception"); + } catch (IllegalStateException e) { + final Throwable cause = e.getCause(); + assertNotNull(cause); + boolean found = false; + for (StackTraceElement s : cause.getStackTrace()) { + if (s.getMethodName().contains("onCorruption")) { + found = true; + } + } + assertTrue(found); + } + } + + @Test + public void testCloseReport() throws Exception { + mDatabase.beginTransaction(); + try { + mDatabase.execSQL("CREATE TABLE t2 (i int, j int);"); + mDatabase.execSQL("INSERT INTO t2 (i, j) VALUES (2, 20)"); + mDatabase.execSQL("INSERT INTO t2 (i, j) VALUES (3, 30)"); + mDatabase.setTransactionSuccessful(); + } finally { + mDatabase.endTransaction(); + } + + mDatabase.close(); + try { + // Do not bother with endTransaction; the database has already been close. + mDatabase.beginTransaction(); + fail("expected an exception"); + } catch (IllegalStateException e) { + assertTrue(e.toString().contains("attempt to re-open an already-closed object")); + final Throwable cause = e.getCause(); + assertNotNull(cause); + boolean found = false; + for (StackTraceElement s : cause.getStackTrace()) { + if (s.getMethodName().contains("testCloseReport")) { + found = true; + } + } + assertTrue(found); + } + } } diff --git a/core/tests/coretests/src/android/widget/RemoteViewsProtoTest.java b/core/tests/coretests/src/android/widget/RemoteViewsProtoTest.java deleted file mode 100644 index 7c140329f0e4..000000000000 --- a/core/tests/coretests/src/android/widget/RemoteViewsProtoTest.java +++ /dev/null @@ -1,155 +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.widget; - -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; - -import android.content.Context; -import android.util.SizeF; -import android.util.proto.ProtoInputStream; -import android.util.proto.ProtoOutputStream; -import android.view.View; - -import androidx.test.InstrumentationRegistry; -import androidx.test.ext.junit.runners.AndroidJUnit4; -import androidx.test.filters.SmallTest; - -import com.android.frameworks.coretests.R; - -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.junit.runner.RunWith; - -import java.util.Map; - -/** - * Tests for RemoteViews. - */ -@RunWith(AndroidJUnit4.class) -@SmallTest -public class RemoteViewsProtoTest { - - // This can point to any other package which exists on the device. - private static final String OTHER_PACKAGE = "com.android.systemui"; - - @Rule - public final ExpectedException exception = ExpectedException.none(); - - private Context mContext; - private String mPackage; - private LinearLayout mContainer; - - @Before - public void setup() { - mContext = InstrumentationRegistry.getContext(); - mPackage = mContext.getPackageName(); - mContainer = new LinearLayout(mContext); - } - - @Test - public void copy_canStillBeApplied() { - RemoteViews original = new RemoteViews(mPackage, R.layout.remote_views_test); - - RemoteViews clone = recreateFromProto(original); - - clone.apply(mContext, mContainer); - } - - @SuppressWarnings("ReturnValueIgnored") - @Test - public void clone_repeatedly() { - RemoteViews original = new RemoteViews(mPackage, R.layout.remote_views_test); - - recreateFromProto(original); - recreateFromProto(original); - - original.apply(mContext, mContainer); - } - - @Test - public void clone_chained() { - RemoteViews original = new RemoteViews(mPackage, R.layout.remote_views_test); - - RemoteViews clone = recreateFromProto(recreateFromProto(original)); - - - clone.apply(mContext, mContainer); - } - - @Test - public void landscapePortraitViews_lightBackgroundLayoutFlag() { - RemoteViews inner = new RemoteViews(mPackage, R.layout.remote_views_text); - inner.setLightBackgroundLayoutId(R.layout.remote_views_light_background_text); - - RemoteViews parent = new RemoteViews(inner, inner); - parent.addFlags(RemoteViews.FLAG_USE_LIGHT_BACKGROUND_LAYOUT); - - View view = recreateFromProto(parent).apply(mContext, mContainer); - assertNull(view.findViewById(R.id.text)); - assertNotNull(view.findViewById(R.id.light_background_text)); - } - - @Test - public void sizedViews_lightBackgroundLayoutFlag() { - RemoteViews inner = new RemoteViews(mPackage, R.layout.remote_views_text); - inner.setLightBackgroundLayoutId(R.layout.remote_views_light_background_text); - - RemoteViews parent = new RemoteViews( - Map.of(new SizeF(0, 0), inner, new SizeF(100, 100), inner)); - parent.addFlags(RemoteViews.FLAG_USE_LIGHT_BACKGROUND_LAYOUT); - - View view = recreateFromProto(parent).apply(mContext, mContainer); - assertNull(view.findViewById(R.id.text)); - assertNotNull(view.findViewById(R.id.light_background_text)); - } - - @Test - public void nestedLandscapeViews() throws Exception { - RemoteViews views = new RemoteViews(mPackage, R.layout.remote_views_test); - for (int i = 0; i < 10; i++) { - views = new RemoteViews(views, new RemoteViews(mPackage, R.layout.remote_views_test)); - } - // writeTo/createFromProto works - recreateFromProto(views); - - views = new RemoteViews(mPackage, R.layout.remote_views_test); - for (int i = 0; i < 11; i++) { - views = new RemoteViews(views, new RemoteViews(mPackage, R.layout.remote_views_test)); - } - // writeTo/createFromProto fails - exception.expect(IllegalArgumentException.class); - recreateFromProtoNoRethrow(views); - } - - private RemoteViews recreateFromProto(RemoteViews views) { - try { - return recreateFromProtoNoRethrow(views); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - private RemoteViews recreateFromProtoNoRethrow(RemoteViews views) throws Exception { - ProtoOutputStream out = new ProtoOutputStream(); - views.writePreviewToProto(mContext, out); - ProtoInputStream in = new ProtoInputStream(out.getBytes()); - return RemoteViews.createPreviewFromProto(mContext, in); - } -} diff --git a/core/tests/coretests/src/android/window/WindowOnBackInvokedDispatcherTest.java b/core/tests/coretests/src/android/window/WindowOnBackInvokedDispatcherTest.java index d153edd9da39..46dfcb5247fb 100644 --- a/core/tests/coretests/src/android/window/WindowOnBackInvokedDispatcherTest.java +++ b/core/tests/coretests/src/android/window/WindowOnBackInvokedDispatcherTest.java @@ -44,6 +44,7 @@ import android.view.IWindowSession; import android.view.ImeBackAnimationController; import android.view.MotionEvent; +import androidx.annotation.NonNull; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; import androidx.test.platform.app.InstrumentationRegistry; @@ -61,6 +62,10 @@ import org.mockito.junit.MockitoRule; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; /** * Tests for {@link WindowOnBackInvokedDispatcherTest} @@ -117,6 +122,8 @@ public class WindowOnBackInvokedDispatcherTest { mDispatcher = new WindowOnBackInvokedDispatcher(mContext, Looper.getMainLooper()); mDispatcher.attachToWindow(mWindowSession, mWindow, null, mImeBackAnimationController); + clearInvocations(mCallback1); + clearInvocations(mCallback2); } private void waitForIdle() { @@ -472,6 +479,102 @@ public class WindowOnBackInvokedDispatcherTest { verifyImeCallackRegistrations(); } + @Test + public void onBackInvoked_notCalledAfterCallbackUnregistration() + throws RemoteException, InterruptedException { + // Setup a callback that unregisters itself after the gesture is finished but before the + // fling animation has ended + final AtomicBoolean unregisterOnProgressUpdate = new AtomicBoolean(false); + final AtomicInteger onBackInvokedCalled = new AtomicInteger(0); + final CountDownLatch onBackCancelledCalled = new CountDownLatch(1); + OnBackAnimationCallback onBackAnimationCallback = new OnBackAnimationCallback() { + @Override + public void onBackProgressed(@NonNull BackEvent backEvent) { + if (unregisterOnProgressUpdate.get()) { + mDispatcher.unregisterOnBackInvokedCallback(this); + } + } + + @Override + public void onBackInvoked() { + onBackInvokedCalled.getAndIncrement(); + } + + @Override + public void onBackCancelled() { + onBackCancelledCalled.countDown(); + } + }; + mDispatcher.registerOnBackInvokedCallback(PRIORITY_DEFAULT, onBackAnimationCallback); + OnBackInvokedCallbackInfo callbackInfo = assertSetCallbackInfo(); + + callbackInfo.getCallback().onBackStarted(mBackEvent); + waitForIdle(); + assertTrue(mDispatcher.mProgressAnimator.isBackAnimationInProgress()); + + // simulate back gesture finished and onBackInvoked() called, which starts the fling slow + // down animation. By setting unregisterOnProgressUpdate to true, the callback will + // unregister itself as soon as it receives the first progress event (coming from the + // generated fling slow down events) + unregisterOnProgressUpdate.set(true); + callbackInfo.getCallback().onBackInvoked(); + waitForIdle(); + onBackCancelledCalled.await(1000, TimeUnit.MILLISECONDS); + + // verify that onBackCancelled is called in this case instead of onBackInvoked + assertEquals(0, onBackCancelledCalled.getCount()); + assertEquals(0, onBackInvokedCalled.get()); + verify(mWindowSession).setOnBackInvokedCallbackInfo(Mockito.eq(mWindow), isNull()); + assertFalse(mDispatcher.mProgressAnimator.isBackAnimationInProgress()); + } + + @Test + public void onBackCancelled_calledOnceAfterCallbackUnregistration() + throws RemoteException, InterruptedException { + // Setup a callback that unregisters itself after the gesture is finished but before the + // progress is animated back to 0f + final AtomicBoolean unregisterOnProgressUpdate = new AtomicBoolean(false); + final AtomicInteger onBackInvokedCalled = new AtomicInteger(0); + final CountDownLatch onBackCancelledCalled = new CountDownLatch(1); + OnBackAnimationCallback onBackAnimationCallback = new OnBackAnimationCallback() { + @Override + public void onBackProgressed(@NonNull BackEvent backEvent) { + if (unregisterOnProgressUpdate.get()) { + mDispatcher.unregisterOnBackInvokedCallback(this); + } + } + + @Override + public void onBackInvoked() { + onBackInvokedCalled.getAndIncrement(); + } + + @Override + public void onBackCancelled() { + onBackCancelledCalled.countDown(); + } + }; + mDispatcher.registerOnBackInvokedCallback(PRIORITY_DEFAULT, onBackAnimationCallback); + OnBackInvokedCallbackInfo callbackInfo = assertSetCallbackInfo(); + + callbackInfo.getCallback().onBackStarted(mBackEvent); + waitForIdle(); + assertTrue(mDispatcher.mProgressAnimator.isBackAnimationInProgress()); + + // simulate back gesture finished and onBackCancelled() called, which starts the progress + // animation back to 0f. On the first progress emission, the callback will unregister itself + unregisterOnProgressUpdate.set(true); + callbackInfo.getCallback().onBackCancelled(); + waitForIdle(); + onBackCancelledCalled.await(1000, TimeUnit.MILLISECONDS); + + // verify that onBackCancelled is called exactly once in this case + assertEquals(0, onBackCancelledCalled.getCount()); + assertEquals(0, onBackInvokedCalled.get()); + verify(mWindowSession).setOnBackInvokedCallbackInfo(Mockito.eq(mWindow), isNull()); + assertFalse(mDispatcher.mProgressAnimator.isBackAnimationInProgress()); + } + private void verifyImeCallackRegistrations() throws RemoteException { // verify default callback is replaced with ImeBackAnimationController mDispatcher.registerOnBackInvokedCallbackUnchecked(mDefaultImeCallback, PRIORITY_DEFAULT); diff --git a/core/tests/devicestatetests/Android.bp b/core/tests/devicestatetests/Android.bp index 60848b31eaec..a3303c6ca6d7 100644 --- a/core/tests/devicestatetests/Android.bp +++ b/core/tests/devicestatetests/Android.bp @@ -32,7 +32,7 @@ android_test { "platform-test-annotations", "testng", ], - libs: ["android.test.runner"], + libs: ["android.test.runner.stubs.system"], platform_apis: true, certificate: "platform", } diff --git a/core/tests/featureflagtests/Android.bp b/core/tests/featureflagtests/Android.bp index d9f608ea34c4..c08066720477 100644 --- a/core/tests/featureflagtests/Android.bp +++ b/core/tests/featureflagtests/Android.bp @@ -19,8 +19,8 @@ android_test { "androidx.test.rules", ], libs: [ - "android.test.runner", - "android.test.base", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", ], platform_apis: true, certificate: "platform", diff --git a/core/tests/hdmitests/Android.bp b/core/tests/hdmitests/Android.bp index e11bc552cf15..7a5757cc7a85 100644 --- a/core/tests/hdmitests/Android.bp +++ b/core/tests/hdmitests/Android.bp @@ -32,7 +32,7 @@ android_test { "platform-test-annotations", "truth", ], - libs: ["android.test.runner"], + libs: ["android.test.runner.stubs.system"], platform_apis: true, certificate: "platform", test_suites: ["device-tests"], diff --git a/core/tests/hosttests/test-apps/DownloadManagerTestApp/Android.bp b/core/tests/hosttests/test-apps/DownloadManagerTestApp/Android.bp index d439124c72cb..c9fdec0e61fd 100644 --- a/core/tests/hosttests/test-apps/DownloadManagerTestApp/Android.bp +++ b/core/tests/hosttests/test-apps/DownloadManagerTestApp/Android.bp @@ -27,8 +27,8 @@ android_test { "junit", ], libs: [ - "android.test.runner", - "android.test.base", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", ], platform_apis: true, diff --git a/core/tests/mockingcoretests/Android.bp b/core/tests/mockingcoretests/Android.bp index 7fd813a7421a..8657b8ca52e1 100644 --- a/core/tests/mockingcoretests/Android.bp +++ b/core/tests/mockingcoretests/Android.bp @@ -44,9 +44,9 @@ android_test { ], libs: [ - "android.test.base", - "android.test.mock", - "android.test.runner", + "android.test.base.stubs.system", + "android.test.mock.stubs.system", + "android.test.runner.stubs.system", ], // These are not normally accessible from apps so they must be explicitly included. diff --git a/core/tests/packagemanagertests/Android.bp b/core/tests/packagemanagertests/Android.bp index 5ce71c902c7c..8ff499826866 100644 --- a/core/tests/packagemanagertests/Android.bp +++ b/core/tests/packagemanagertests/Android.bp @@ -17,7 +17,7 @@ android_test { "frameworks-base-testutils", "mockito-target-minus-junit4", ], - libs: ["android.test.runner"], + libs: ["android.test.runner.stubs.system"], platform_apis: true, certificate: "platform", } diff --git a/core/tests/packagemonitortests/Android.bp b/core/tests/packagemonitortests/Android.bp index b08850e90d28..c3b084e4368e 100644 --- a/core/tests/packagemonitortests/Android.bp +++ b/core/tests/packagemonitortests/Android.bp @@ -34,7 +34,7 @@ android_test { "mockito-target-minus-junit4", "truth", ], - libs: ["android.test.runner"], + libs: ["android.test.runner.stubs.system"], platform_apis: true, certificate: "platform", test_suites: ["device-tests"], @@ -52,7 +52,7 @@ android_test { "compatibility-device-util-axt", "frameworks-base-testutils", ], - libs: ["android.test.runner"], + libs: ["android.test.runner.stubs.system"], platform_apis: true, certificate: "platform", test_suites: ["device-tests"], diff --git a/core/tests/privacytests/Android.bp b/core/tests/privacytests/Android.bp index 4e24cd5d91cb..ac9cede84483 100644 --- a/core/tests/privacytests/Android.bp +++ b/core/tests/privacytests/Android.bp @@ -16,7 +16,7 @@ android_test { "androidx.test.rules", "truth", ], - libs: ["android.test.runner"], + libs: ["android.test.runner.stubs.system"], platform_apis: true, certificate: "platform", test_suites: ["device-tests"], diff --git a/core/tests/screenshothelpertests/Android.bp b/core/tests/screenshothelpertests/Android.bp index 3c71e6e4247b..49c3ee94bfd0 100644 --- a/core/tests/screenshothelpertests/Android.bp +++ b/core/tests/screenshothelpertests/Android.bp @@ -25,9 +25,9 @@ android_test { ], libs: [ - "android.test.runner", - "android.test.base", - "android.test.mock", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", + "android.test.mock.stubs.system", ], platform_apis: true, diff --git a/core/tests/systemproperties/Android.bp b/core/tests/systemproperties/Android.bp index ed52cccfb9b9..ed99a1f5cc4a 100644 --- a/core/tests/systemproperties/Android.bp +++ b/core/tests/systemproperties/Android.bp @@ -20,8 +20,8 @@ android_test { "ravenwood-junit", ], libs: [ - "android.test.runner", - "android.test.base", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", ], platform_apis: true, certificate: "platform", @@ -37,8 +37,8 @@ android_ravenwood_test { "ravenwood-junit", ], libs: [ - "android.test.runner", - "android.test.base", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", ], srcs: [ "src/**/*.java", diff --git a/core/tests/timetests/Android.bp b/core/tests/timetests/Android.bp index c33d5ee5008b..04bbe692e488 100644 --- a/core/tests/timetests/Android.bp +++ b/core/tests/timetests/Android.bp @@ -19,7 +19,7 @@ android_test { "platform-test-annotations", "truth", ], - libs: ["android.test.runner"], + libs: ["android.test.runner.stubs.system"], certificate: "platform", test_suites: ["device-tests"], } diff --git a/core/tests/utillib/Android.bp b/core/tests/utillib/Android.bp index 1d5c16c7a536..b6f046bd12d5 100644 --- a/core/tests/utillib/Android.bp +++ b/core/tests/utillib/Android.bp @@ -28,5 +28,5 @@ java_library { srcs: ["**/*.java"], static_libs: ["junit"], - libs: ["android.test.base"], + libs: ["android.test.base.stubs"], } diff --git a/core/tests/utiltests/Android.bp b/core/tests/utiltests/Android.bp index f5563a710563..cdc8a9e06d0b 100644 --- a/core/tests/utiltests/Android.bp +++ b/core/tests/utiltests/Android.bp @@ -39,9 +39,9 @@ android_test { ], libs: [ - "android.test.runner", - "android.test.base", - "android.test.mock", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", + "android.test.mock.stubs.system", ], platform_apis: true, @@ -55,7 +55,7 @@ android_test { android_ravenwood_test { name: "FrameworksUtilTestsRavenwood", libs: [ - "android.test.mock", + "android.test.mock.stubs.system", ], static_libs: [ "androidx.annotation_annotation", diff --git a/core/tests/vibrator/Android.bp b/core/tests/vibrator/Android.bp index 920ab5914548..848e079a2270 100644 --- a/core/tests/vibrator/Android.bp +++ b/core/tests/vibrator/Android.bp @@ -25,9 +25,9 @@ android_test { ], libs: [ - "android.test.runner", - "android.test.base", - "android.test.mock", + "android.test.runner.stubs", + "android.test.base.stubs", + "android.test.mock.stubs", "framework", "framework-res", ], diff --git a/core/tests/vibrator/src/android/os/VibratorInfoTest.java b/core/tests/vibrator/src/android/os/VibratorInfoTest.java index 73cd4647415d..c81081075859 100644 --- a/core/tests/vibrator/src/android/os/VibratorInfoTest.java +++ b/core/tests/vibrator/src/android/os/VibratorInfoTest.java @@ -139,6 +139,35 @@ public class VibratorInfoTest { } @Test + public void testAreEnvelopeEffectsSupported() { + VibratorInfo noCapabilities = new VibratorInfo.Builder(TEST_VIBRATOR_ID).build(); + assertFalse(noCapabilities.areEnvelopeEffectsSupported()); + VibratorInfo envelopeEffectCapability = new VibratorInfo.Builder(TEST_VIBRATOR_ID) + .setCapabilities(IVibrator.CAP_COMPOSE_PWLE_EFFECTS_V2) + .build(); + assertTrue(envelopeEffectCapability.areEnvelopeEffectsSupported()); + } + + @Test + public void testEnvelopeEffectLimits() { + VibratorInfo info = new VibratorInfo.Builder(TEST_VIBRATOR_ID) + .setMaxEnvelopeEffectSize(16) + .setMinEnvelopeEffectControlPointDurationMillis(20) + .setMaxEnvelopeEffectControlPointDurationMillis(1_000) + .build(); + assertEquals(16, info.getMaxEnvelopeEffectSize()); + assertEquals(20, info.getMinEnvelopeEffectControlPointDurationMillis()); + assertEquals(1_000, info.getMaxEnvelopeEffectControlPointDurationMillis()); + assertEquals(16_000, info.getMaxEnvelopeEffectDurationMillis()); + + VibratorInfo emptyInfo = new VibratorInfo.Builder(TEST_VIBRATOR_ID).build(); + assertEquals(0, emptyInfo.getMaxEnvelopeEffectSize()); + assertEquals(0, emptyInfo.getMinEnvelopeEffectControlPointDurationMillis()); + assertEquals(0, emptyInfo.getMaxEnvelopeEffectControlPointDurationMillis()); + assertEquals(0, emptyInfo.getMaxEnvelopeEffectDurationMillis()); + } + + @Test public void testGetDefaultBraking_returnsFirstSupportedBraking() { assertEquals(Braking.NONE, new VibratorInfo.Builder( TEST_VIBRATOR_ID).build().getDefaultBraking()); @@ -262,17 +291,20 @@ public class VibratorInfoTest { VibratorInfo.Builder completeBuilder2 = new VibratorInfo.Builder(TEST_VIBRATOR_ID + 2); for (VibratorInfo.Builder builder : - new VibratorInfo.Builder[] {completeBuilder, completeBuilder2}) { + new VibratorInfo.Builder[]{completeBuilder, completeBuilder2}) { builder.setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL) - .setSupportedEffects(VibrationEffect.EFFECT_CLICK) - .setSupportedPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK, 20) - .setPrimitiveDelayMax(100) - .setCompositionSizeMax(10) - .setSupportedBraking(Braking.CLAB) - .setPwlePrimitiveDurationMax(50) - .setPwleSizeMax(20) - .setQFactor(2f) - .setFrequencyProfile(TEST_FREQUENCY_PROFILE); + .setSupportedEffects(VibrationEffect.EFFECT_CLICK) + .setSupportedPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK, 20) + .setPrimitiveDelayMax(100) + .setCompositionSizeMax(10) + .setSupportedBraking(Braking.CLAB) + .setPwlePrimitiveDurationMax(50) + .setPwleSizeMax(20) + .setQFactor(2f) + .setFrequencyProfile(TEST_FREQUENCY_PROFILE) + .setMaxEnvelopeEffectSize(16) + .setMinEnvelopeEffectControlPointDurationMillis(20) + .setMaxEnvelopeEffectControlPointDurationMillis(1_000); } VibratorInfo complete = completeBuilder.build(); diff --git a/core/tests/vibrator/src/android/os/vibrator/VibrationConfigTest.java b/core/tests/vibrator/src/android/os/vibrator/VibrationConfigTest.java deleted file mode 100644 index a2ff9d77674a..000000000000 --- a/core/tests/vibrator/src/android/os/vibrator/VibrationConfigTest.java +++ /dev/null @@ -1,100 +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.os.vibrator; - -import static com.google.common.truth.Truth.assertThat; - -import static org.mockito.Mockito.when; - -import android.content.res.Resources; - -import com.android.internal.R; - -import org.junit.Rule; -import org.junit.Test; -import org.mockito.Mock; -import org.mockito.junit.MockitoJUnit; -import org.mockito.junit.MockitoRule; - -import java.util.HashMap; -import java.util.Map; - -public class VibrationConfigTest { - - @Rule - public MockitoRule rule = MockitoJUnit.rule(); - - @Mock - private Resources mResourcesMock; - - private final Map<String, String> mSystemProperties = new HashMap<>(); - - @Test - public void getDefaultVibrationAmplitude_returnsConfiguredAmplitude() { - when(mResourcesMock.getInteger(R.integer.config_defaultVibrationAmplitude)).thenReturn(1); - assertThat(createConfig().getDefaultVibrationAmplitude()).isEqualTo(1); - - when(mResourcesMock.getInteger(R.integer.config_defaultVibrationAmplitude)).thenReturn(123); - assertThat(createConfig().getDefaultVibrationAmplitude()).isEqualTo(123); - - when(mResourcesMock.getInteger(R.integer.config_defaultVibrationAmplitude)).thenReturn(255); - assertThat(createConfig().getDefaultVibrationAmplitude()).isEqualTo(255); - } - - @Test - public void getDefaultVibrationAmplitude_invalidValue_returnsMaxAmplitude() { - when(mResourcesMock.getInteger(R.integer.config_defaultVibrationAmplitude)).thenReturn(-1); - assertThat(createConfig().getDefaultVibrationAmplitude()).isEqualTo(255); - - when(mResourcesMock.getInteger(R.integer.config_defaultVibrationAmplitude)).thenReturn(0); - assertThat(createConfig().getDefaultVibrationAmplitude()).isEqualTo(255); - - when(mResourcesMock.getInteger(R.integer.config_defaultVibrationAmplitude)).thenReturn(500); - assertThat(createConfig().getDefaultVibrationAmplitude()).isEqualTo(255); - } - - @Test - public void getDefaultVibrationScaleLevelGain_returnsConfiguredGain() { - mSystemProperties.put(VibrationConfig.SCALE_LEVEL_GAIN_SYSTEM_PROPERTY, "1.2"); - assertThat(createConfig().getDefaultVibrationScaleLevelGain()).isEqualTo(1.2f); - - mSystemProperties.put(VibrationConfig.SCALE_LEVEL_GAIN_SYSTEM_PROPERTY, "2"); - assertThat(createConfig().getDefaultVibrationScaleLevelGain()).isEqualTo(2f); - } - - @Test - public void getDefaultVibrationScaleLevelGain_invalidValue_returnsFixedScaleGain() { - mSystemProperties.put(VibrationConfig.SCALE_LEVEL_GAIN_SYSTEM_PROPERTY, ""); - assertThat(createConfig().getDefaultVibrationScaleLevelGain()).isEqualTo(1.4f); - - mSystemProperties.put(VibrationConfig.SCALE_LEVEL_GAIN_SYSTEM_PROPERTY, "invalid"); - assertThat(createConfig().getDefaultVibrationScaleLevelGain()).isEqualTo(1.4f); - - mSystemProperties.put(VibrationConfig.SCALE_LEVEL_GAIN_SYSTEM_PROPERTY, "-1"); - assertThat(createConfig().getDefaultVibrationScaleLevelGain()).isEqualTo(1.4f); - - mSystemProperties.put(VibrationConfig.SCALE_LEVEL_GAIN_SYSTEM_PROPERTY, "0.5"); - assertThat(createConfig().getDefaultVibrationScaleLevelGain()).isEqualTo(1.4f); - - mSystemProperties.put(VibrationConfig.SCALE_LEVEL_GAIN_SYSTEM_PROPERTY, "1.0"); - assertThat(createConfig().getDefaultVibrationScaleLevelGain()).isEqualTo(1.4f); - } - - private VibrationConfig createConfig() { - return new VibrationConfig(mResourcesMock, mSystemProperties::get); - } -} diff --git a/keystore/tests/Android.bp b/keystore/tests/Android.bp index 7de45233494b..0dcf597644ee 100644 --- a/keystore/tests/Android.bp +++ b/keystore/tests/Android.bp @@ -31,6 +31,6 @@ android_test { "mockito-target-minus-junit4", ], platform_apis: true, - libs: ["android.test.runner"], + libs: ["android.test.runner.stubs.system"], certificate: "platform", } diff --git a/libs/WindowManager/Jetpack/tests/unittest/Android.bp b/libs/WindowManager/Jetpack/tests/unittest/Android.bp index 139ddda5af3c..bd430c0e610b 100644 --- a/libs/WindowManager/Jetpack/tests/unittest/Android.bp +++ b/libs/WindowManager/Jetpack/tests/unittest/Android.bp @@ -47,9 +47,9 @@ android_test { ], libs: [ - "android.test.mock", - "android.test.base", - "android.test.runner", + "android.test.mock.stubs.system", + "android.test.base.stubs.system", + "android.test.runner.stubs.system", ], // These are not normally accessible from apps so they must be explicitly included. @@ -62,3 +62,10 @@ android_test { enabled: false, }, } + +test_module_config { + name: "WMJetpackUnitTests_Presubmit", + base: "WMJetpackUnitTests", + test_suites: ["device-tests"], + include_annotations: ["android.platform.test.annotations.Presubmit"], +} diff --git a/libs/WindowManager/Shell/Android.bp b/libs/WindowManager/Shell/Android.bp index a79bc97c440c..94809f2d258f 100644 --- a/libs/WindowManager/Shell/Android.bp +++ b/libs/WindowManager/Shell/Android.bp @@ -187,6 +187,9 @@ java_library { "shared/**/desktopmode/*.java", "shared/**/desktopmode/*.kt", ], + static_libs: [ + "com.android.window.flags.window-aconfig-java", + ], } android_library { diff --git a/libs/WindowManager/Shell/multivalentTests/Android.bp b/libs/WindowManager/Shell/multivalentTests/Android.bp index 1ad19c9f3033..ee0d5bbed324 100644 --- a/libs/WindowManager/Shell/multivalentTests/Android.bp +++ b/libs/WindowManager/Shell/multivalentTests/Android.bp @@ -77,8 +77,8 @@ android_test { "platform-test-rules", ], libs: [ - "android.test.base", - "android.test.runner", + "android.test.base.stubs.system", + "android.test.runner.stubs.system", ], jni_libs: [ "libdexmakerjvmtiagent", diff --git a/libs/WindowManager/Shell/res/values-af/strings.xml b/libs/WindowManager/Shell/res/values-af/strings.xml index 0ed5a72af44c..4dbff346fbac 100644 --- a/libs/WindowManager/Shell/res/values-af/strings.xml +++ b/libs/WindowManager/Shell/res/values-af/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"vou <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g> in"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>-instellings"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Maak borrel toe"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Gaan na volskerm"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Moenie dat gesprek \'n borrel word nie"</string> <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> diff --git a/libs/WindowManager/Shell/res/values-am/strings.xml b/libs/WindowManager/Shell/res/values-am/strings.xml index c4d9158caf46..d70a317bf36c 100644 --- a/libs/WindowManager/Shell/res/values-am/strings.xml +++ b/libs/WindowManager/Shell/res/values-am/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"<xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>ን ሰብስብ"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"የ<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ቅንብሮች"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"አረፋን አሰናብት"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"ወደ ሙሉ ማያ ገፅ ያንቀሳቅሱ"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"ውይይቶችን በአረፋ አታሳይ"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"አረፋዎችን በመጠቀም ይወያዩ"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"አዲስ ውይይቶች እንደ ተንሳፋፊ አዶዎች ወይም አረፋዎች ሆነው ይታያሉ። አረፋን ለመክፈት መታ ያድርጉ። ለመውሰድ ይጎትቱት።"</string> diff --git a/libs/WindowManager/Shell/res/values-ar/strings.xml b/libs/WindowManager/Shell/res/values-ar/strings.xml index ced9ee95a178..cb316e914d2a 100644 --- a/libs/WindowManager/Shell/res/values-ar/strings.xml +++ b/libs/WindowManager/Shell/res/values-ar/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"تصغير <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"إعدادات <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"إغلاق فقاعة المحادثة"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"الانتقال إلى وضع ملء الشاشة"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"عدم عرض المحادثة كفقاعة محادثة"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"الدردشة باستخدام فقاعات المحادثات"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"تظهر المحادثات الجديدة كرموز عائمة أو كفقاعات. انقر لفتح فقاعة المحادثة، واسحبها لتحريكها."</string> diff --git a/libs/WindowManager/Shell/res/values-as/strings.xml b/libs/WindowManager/Shell/res/values-as/strings.xml index 273d043c4532..9f7fa7cfd0b9 100644 --- a/libs/WindowManager/Shell/res/values-as/strings.xml +++ b/libs/WindowManager/Shell/res/values-as/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"<xliff:g id="BUBBLE_TITLE">%1$s</xliff:g> সংকোচন কৰক"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ছেটিং"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"বাবল অগ্ৰাহ্য কৰক"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"পূৰ্ণ স্ক্ৰীনলৈ নিয়ক"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"বাৰ্তালাপ বাবল নকৰিব"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Bubbles ব্যৱহাৰ কৰি চাট কৰক"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"নতুন বাৰ্তালাপ উপঙি থকা চিহ্নসমূহ অথবা bubbles হিচাপে প্ৰদর্শিত হয়। Bubbles খুলিবলৈ টিপক। এইটো স্থানান্তৰ কৰিবলৈ টানি নিয়ক।"</string> diff --git a/libs/WindowManager/Shell/res/values-az/strings.xml b/libs/WindowManager/Shell/res/values-az/strings.xml index 81bb544217d5..90962f0b5c79 100644 --- a/libs/WindowManager/Shell/res/values-az/strings.xml +++ b/libs/WindowManager/Shell/res/values-az/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"yığcamlaşdırın: <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ayarları"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Yumrucuğu ləğv edin"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Tam ekrana keçin"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Söhbəti yumrucuqda göstərmə"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Yumrucuqlardan istifadə edərək söhbət edin"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Yeni söhbətlər üzən nişanlar və ya yumrucuqlar kimi görünür. Yumrucuğu açmaq üçün toxunun. Hərəkət etdirmək üçün sürüşdürün."</string> diff --git a/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml b/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml index 898b8445d0e1..9c6ed6b95b80 100644 --- a/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml +++ b/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"skupite oblačić <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"Podešavanja za <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Odbaci oblačić"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Prebaci na ceo ekran"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Ne koristi oblačiće za konverzaciju"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Ćaskajte u oblačićima"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Nove konverzacije se prikazuju kao plutajuće ikone ili oblačići. Dodirnite da biste otvorili oblačić. Prevucite da biste ga premestili."</string> diff --git a/libs/WindowManager/Shell/res/values-be/strings.xml b/libs/WindowManager/Shell/res/values-be/strings.xml index c3407296a007..e8b24bdd7bd5 100644 --- a/libs/WindowManager/Shell/res/values-be/strings.xml +++ b/libs/WindowManager/Shell/res/values-be/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"<xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>: згарнуць"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"Налады \"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>\""</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Адхіліць апавяшчэнне"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Адкрыць у поўнаэкранным рэжыме"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Не паказваць размову ў выглядзе ўсплывальных апавяшчэнняў"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Усплывальныя чаты"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Новыя размовы будуць паказвацца як рухомыя значкі ці ўсплывальныя чаты. Націсніце, каб адкрыць усплывальны чат. Перацягніце яго, каб перамясціць."</string> diff --git a/libs/WindowManager/Shell/res/values-bg/strings.xml b/libs/WindowManager/Shell/res/values-bg/strings.xml index 076a815a25ae..1f188f6ec6f9 100644 --- a/libs/WindowManager/Shell/res/values-bg/strings.xml +++ b/libs/WindowManager/Shell/res/values-bg/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"свиване на <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"Настройки за <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Отхвърляне на балончетата"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Преместване на цял екран"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Без балончета за разговора"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Чат с балончета"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Новите разговори се показват като плаващи икони, или балончета. Докоснете балонче, за да го отворите, или го плъзнете, за да го преместите."</string> diff --git a/libs/WindowManager/Shell/res/values-bn/strings.xml b/libs/WindowManager/Shell/res/values-bn/strings.xml index b0d66967bbb4..b572038ada84 100644 --- a/libs/WindowManager/Shell/res/values-bn/strings.xml +++ b/libs/WindowManager/Shell/res/values-bn/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"<xliff:g id="BUBBLE_TITLE">%1$s</xliff:g> আড়াল করুন"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> সেটিংস"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"বাবল খারিজ করুন"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"ফুল-স্ক্রিন ব্যবহার করুন"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"কথোপকথন বাবল হিসেবে দেখাবে না"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"বাবল ব্যবহার করে চ্যাট করুন"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"নতুন কথোপকথন ভেসে থাকা আইকন বা বাবল হিসেবে দেখানো হয়। বাবল খুলতে ট্যাপ করুন। সেটি সরাতে ধরে টেনে আনুন।"</string> diff --git a/libs/WindowManager/Shell/res/values-bs/strings.xml b/libs/WindowManager/Shell/res/values-bs/strings.xml index 0196e5e93a17..630b31b59520 100644 --- a/libs/WindowManager/Shell/res/values-bs/strings.xml +++ b/libs/WindowManager/Shell/res/values-bs/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"sužavanje oblačića <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"Postavke aplikacije <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Odbaci oblačić"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Prikaži preko cijelog ekrana"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Nemoj prikazivati razgovor u oblačićima"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Chatajte koristeći oblačiće"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Novi razgovori se prikazuju kao plutajuće ikone ili oblačići. Dodirnite da otvorite oblačić. Prevucite da ga premjestite."</string> diff --git a/libs/WindowManager/Shell/res/values-ca/strings.xml b/libs/WindowManager/Shell/res/values-ca/strings.xml index fa4b627805c0..98ec381f9085 100644 --- a/libs/WindowManager/Shell/res/values-ca/strings.xml +++ b/libs/WindowManager/Shell/res/values-ca/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"replega <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"Configuració de l\'aplicació <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Ignora la bombolla"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Mou a pantalla completa"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"No mostris la conversa com a bombolla"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Xateja amb bombolles"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Les converses noves es mostren com a icones flotants o bombolles. Toca per obrir una bombolla. Arrossega-la per moure-la."</string> diff --git a/libs/WindowManager/Shell/res/values-cs/strings.xml b/libs/WindowManager/Shell/res/values-cs/strings.xml index 3956fcacbb50..08d5bb51edff 100644 --- a/libs/WindowManager/Shell/res/values-cs/strings.xml +++ b/libs/WindowManager/Shell/res/values-cs/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"sbalit <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"Nastavení <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Zavřít bublinu"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Přejít na celou obrazovku"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Nezobrazovat konverzaci v bublinách"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Chatujte pomocí bublin"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Nové konverzace se zobrazují jako plovoucí ikony, neboli bubliny. Klepnutím bublinu otevřete. Přetažením ji posunete."</string> diff --git a/libs/WindowManager/Shell/res/values-da/strings.xml b/libs/WindowManager/Shell/res/values-da/strings.xml index afe4a1ab877c..ae1bb9afb1ad 100644 --- a/libs/WindowManager/Shell/res/values-da/strings.xml +++ b/libs/WindowManager/Shell/res/values-da/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"skjul <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"Indstillinger for <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Afvis boble"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Flyt til fuld skærm"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Vis ikke samtaler i bobler"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Chat ved hjælp af bobler"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Nye samtaler vises som svævende ikoner eller bobler. Tryk for at åbne boblen. Træk for at flytte den."</string> diff --git a/libs/WindowManager/Shell/res/values-de/strings.xml b/libs/WindowManager/Shell/res/values-de/strings.xml index 1e503393eb8d..abbfa66be780 100644 --- a/libs/WindowManager/Shell/res/values-de/strings.xml +++ b/libs/WindowManager/Shell/res/values-de/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"<xliff:g id="BUBBLE_TITLE">%1$s</xliff:g> minimieren"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"Einstellungen für <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Bubble schließen"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Vollbildmodus"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Unterhaltung nicht als Bubble anzeigen"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Bubbles zum Chatten verwenden"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Neue Unterhaltungen erscheinen als unverankerte Symbole, „Bubbles“ genannt. Wenn du eine Bubble öffnen möchtest, tippe sie an. Wenn du sie verschieben möchtest, zieh an ihr."</string> diff --git a/libs/WindowManager/Shell/res/values-el/strings.xml b/libs/WindowManager/Shell/res/values-el/strings.xml index 5c3c6dedd632..0f762d37e7c2 100644 --- a/libs/WindowManager/Shell/res/values-el/strings.xml +++ b/libs/WindowManager/Shell/res/values-el/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"σύμπτυξη <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"Ρυθμίσεις <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Παράβλ. για συννεφ."</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Μετακίνηση σε πλήρη οθόνη"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Να μην γίνει προβολή της συζήτησης σε συννεφάκια."</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Συζητήστε χρησιμοποιώντας συννεφάκια."</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Οι νέες συζητήσεις εμφανίζονται ως κινούμενα εικονίδια ή συννεφάκια. Πατήστε για να ανοίξετε το συννεφάκι. Σύρετε για να το μετακινήσετε."</string> diff --git a/libs/WindowManager/Shell/res/values-en-rAU/strings.xml b/libs/WindowManager/Shell/res/values-en-rAU/strings.xml index 51c69e559f16..2314e6bc3ec0 100644 --- a/libs/WindowManager/Shell/res/values-en-rAU/strings.xml +++ b/libs/WindowManager/Shell/res/values-en-rAU/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"collapse <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> settings"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Dismiss bubble"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Move to fullscreen"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Don’t bubble conversation"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Chat using bubbles"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"New conversations appear as floating icons, or bubbles. Tap to open bubble. Drag to move it."</string> diff --git a/libs/WindowManager/Shell/res/values-en-rGB/strings.xml b/libs/WindowManager/Shell/res/values-en-rGB/strings.xml index 51c69e559f16..2314e6bc3ec0 100644 --- a/libs/WindowManager/Shell/res/values-en-rGB/strings.xml +++ b/libs/WindowManager/Shell/res/values-en-rGB/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"collapse <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> settings"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Dismiss bubble"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Move to fullscreen"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Don’t bubble conversation"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Chat using bubbles"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"New conversations appear as floating icons, or bubbles. Tap to open bubble. Drag to move it."</string> diff --git a/libs/WindowManager/Shell/res/values-en-rIN/strings.xml b/libs/WindowManager/Shell/res/values-en-rIN/strings.xml index 51c69e559f16..2314e6bc3ec0 100644 --- a/libs/WindowManager/Shell/res/values-en-rIN/strings.xml +++ b/libs/WindowManager/Shell/res/values-en-rIN/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"collapse <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> settings"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Dismiss bubble"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Move to fullscreen"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Don’t bubble conversation"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Chat using bubbles"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"New conversations appear as floating icons, or bubbles. Tap to open bubble. Drag to move it."</string> diff --git a/libs/WindowManager/Shell/res/values-et/strings.xml b/libs/WindowManager/Shell/res/values-et/strings.xml index d36a8d14e76b..cfaa0d317ddc 100644 --- a/libs/WindowManager/Shell/res/values-et/strings.xml +++ b/libs/WindowManager/Shell/res/values-et/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"ahenda <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"Rakenduse <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> seaded"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Sule mull"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Lülitu täisekraanile"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Ära kuva vestlust mullina"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Vestelge mullide abil"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Uued vestlused kuvatakse hõljuvate ikoonidena ehk mullidena. Puudutage mulli avamiseks. Lohistage mulli, et seda liigutada."</string> diff --git a/libs/WindowManager/Shell/res/values-eu/strings.xml b/libs/WindowManager/Shell/res/values-eu/strings.xml index 2ee086e47429..509c97e21ddb 100644 --- a/libs/WindowManager/Shell/res/values-eu/strings.xml +++ b/libs/WindowManager/Shell/res/values-eu/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"tolestu <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> aplikazioaren ezarpenak"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Baztertu burbuila"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Joan pantaila osora"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Ez erakutsi elkarrizketak burbuila gisa"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Txateatu burbuilen bidez"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Elkarrizketa berriak ikono gainerakor edo burbuila gisa agertzen dira. Sakatu burbuila irekitzeko. Arrasta ezazu mugitzeko."</string> diff --git a/libs/WindowManager/Shell/res/values-fa/strings.xml b/libs/WindowManager/Shell/res/values-fa/strings.xml index f4cdd5f6672d..223b67130705 100644 --- a/libs/WindowManager/Shell/res/values-fa/strings.xml +++ b/libs/WindowManager/Shell/res/values-fa/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"جمع کردن <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"تنظیمات <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"رد کردن حبابک"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"رفتن به حالت تمامصفحه"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"مکالمه در حباب نشان داده نشود"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"گپ بااستفاده از حبابکها"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"مکالمههای جدید بهصورت نمادهای شناور یا حبابکها نشان داده میشوند. برای باز کردن حبابکها تکضرب بزنید. برای جابهجایی، آن را بکشید."</string> diff --git a/libs/WindowManager/Shell/res/values-fi/strings.xml b/libs/WindowManager/Shell/res/values-fi/strings.xml index 6be2ee2f00b0..9083c4dae9c3 100644 --- a/libs/WindowManager/Shell/res/values-fi/strings.xml +++ b/libs/WindowManager/Shell/res/values-fi/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"tiivistä <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>: asetukset"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Ohita kupla"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Siirrä koko näytölle"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Älä näytä kuplia keskusteluista"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Chattaile kuplien avulla"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Uudet keskustelut näkyvät kelluvina kuvakkeina tai kuplina. Avaa kupla napauttamalla. Siirrä sitä vetämällä."</string> diff --git a/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml b/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml index 54700990bf6c..2f284ad333cd 100644 --- a/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml +++ b/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"réduire <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"Paramètres <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Ignorer la bulle"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Passez en plein écran"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Ne pas afficher les conversations dans des bulles"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Clavarder en utilisant des bulles"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Les nouvelles conversations s\'affichent sous forme d\'icônes flottantes (de bulles). Touchez une bulle pour l\'ouvrir. Faites-la glisser pour la déplacer."</string> diff --git a/libs/WindowManager/Shell/res/values-gl/strings.xml b/libs/WindowManager/Shell/res/values-gl/strings.xml index 36ad52108337..5126aa29af95 100644 --- a/libs/WindowManager/Shell/res/values-gl/strings.xml +++ b/libs/WindowManager/Shell/res/values-gl/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"contraer <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"Configuración de <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Ignorar burbulla"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Cambiar á pantalla completa"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Non mostrar a conversa como burbulla"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Chatear usando burbullas"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"As conversas novas aparecen como iconas flotantes ou burbullas. Toca para abrir a burbulla e arrastra para movela."</string> diff --git a/libs/WindowManager/Shell/res/values-gu/strings.xml b/libs/WindowManager/Shell/res/values-gu/strings.xml index 868ef5b077ae..3418637283c1 100644 --- a/libs/WindowManager/Shell/res/values-gu/strings.xml +++ b/libs/WindowManager/Shell/res/values-gu/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"<xliff:g id="BUBBLE_TITLE">%1$s</xliff:g> નાનું કરો"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> સેટિંગ"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"બબલને છોડી દો"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"પૂર્ણસ્ક્રીન પર ખસો"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"વાતચીતને બબલ કરશો નહીં"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"બબલનો ઉપયોગ કરીને ચૅટ કરો"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"નવી વાતચીત ફ્લોટિંગ આઇકન અથવા બબલ જેવી દેખાશે. બબલને ખોલવા માટે ટૅપ કરો. તેને ખસેડવા માટે ખેંચો."</string> diff --git a/libs/WindowManager/Shell/res/values-hi/strings.xml b/libs/WindowManager/Shell/res/values-hi/strings.xml index 31c7307688af..8eaa86fe2710 100644 --- a/libs/WindowManager/Shell/res/values-hi/strings.xml +++ b/libs/WindowManager/Shell/res/values-hi/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"<xliff:g id="BUBBLE_TITLE">%1$s</xliff:g> को छोटा करें"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> की सेटिंग"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"बबल खारिज करें"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"फ़ुलस्क्रीन पर मूव करें"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"बातचीत को बबल न करें"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"बबल्स का इस्तेमाल करके चैट करें"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"नई बातचीत फ़्लोटिंग आइकॉन या बबल्स की तरह दिखेंगी. बबल को खोलने के लिए टैप करें. इसे एक जगह से दूसरी जगह ले जाने के लिए खींचें और छोड़ें."</string> diff --git a/libs/WindowManager/Shell/res/values-hr/strings.xml b/libs/WindowManager/Shell/res/values-hr/strings.xml index d99a65d89107..5427a9b357f1 100644 --- a/libs/WindowManager/Shell/res/values-hr/strings.xml +++ b/libs/WindowManager/Shell/res/values-hr/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"sažmite oblačić <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"Postavke za <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Odbaci oblačić"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Prebaci na cijeli zaslon"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Zaustavi razgovor u oblačićima"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Oblačići u chatu"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Novi razgovori pojavljuju se kao pomične ikone ili oblačići. Dodirnite za otvaranje oblačića. Povucite da biste ga premjestili."</string> diff --git a/libs/WindowManager/Shell/res/values-hu/strings.xml b/libs/WindowManager/Shell/res/values-hu/strings.xml index bed760eb5ed7..5b337ea7b41a 100644 --- a/libs/WindowManager/Shell/res/values-hu/strings.xml +++ b/libs/WindowManager/Shell/res/values-hu/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"<xliff:g id="BUBBLE_TITLE">%1$s</xliff:g> összecsukása"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> beállításai"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Buborék elvetése"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Áthelyezés teljes képernyőre"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Ne jelenjen meg a beszélgetés buborékban"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Buborékokat használó csevegés"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Az új beszélgetések lebegő ikonként, vagyis buborékként jelennek meg. A buborék megnyitásához koppintson rá. Áthelyezéshez húzza a kívánt helyre."</string> diff --git a/libs/WindowManager/Shell/res/values-hy/strings.xml b/libs/WindowManager/Shell/res/values-hy/strings.xml index fcb725432286..ef38307dc920 100644 --- a/libs/WindowManager/Shell/res/values-hy/strings.xml +++ b/libs/WindowManager/Shell/res/values-hy/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"<xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>. ծալել"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> – կարգավորումներ"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Փակել ամպիկը"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Տեղափոխել լիաէկրան ռեժիմ"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Զրույցը չցուցադրել ամպիկի տեսքով"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Զրույցի ամպիկներ"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Նոր զրույցները կհայտնվեն լողացող պատկերակների կամ ամպիկների տեսքով։ Հպեք՝ ամպիկը բացելու համար։ Քաշեք՝ այն տեղափոխելու համար։"</string> diff --git a/libs/WindowManager/Shell/res/values-in/strings.xml b/libs/WindowManager/Shell/res/values-in/strings.xml index 85a9bbf253a5..fcb3e7200403 100644 --- a/libs/WindowManager/Shell/res/values-in/strings.xml +++ b/libs/WindowManager/Shell/res/values-in/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"ciutkan <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"Setelan <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Tutup balon"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Pindahkan ke layar penuh"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Jangan gunakan percakapan balon"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Chat dalam tampilan balon"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Percakapan baru muncul sebagai ikon mengambang, atau balon. Ketuk untuk membuka balon. Tarik untuk memindahkannya."</string> diff --git a/libs/WindowManager/Shell/res/values-is/strings.xml b/libs/WindowManager/Shell/res/values-is/strings.xml index 8041162f7b5c..9755083d853d 100644 --- a/libs/WindowManager/Shell/res/values-is/strings.xml +++ b/libs/WindowManager/Shell/res/values-is/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"minnka <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"Stillingar <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Loka blöðru"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Færa í allan skjáinn"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Ekki setja samtal í blöðru"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Spjalla með blöðrum"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Ný samtöl birtast sem fljótandi tákn eða blöðrur. Ýttu til að opna blöðru. Dragðu hana til að færa."</string> diff --git a/libs/WindowManager/Shell/res/values-iw/strings.xml b/libs/WindowManager/Shell/res/values-iw/strings.xml index e1854fa16303..ddbb89ab2211 100644 --- a/libs/WindowManager/Shell/res/values-iw/strings.xml +++ b/libs/WindowManager/Shell/res/values-iw/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"כיווץ של <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"הגדרות <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"סגירת בועה"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"הצגה במסך מלא"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"אין להציג בועות לשיחה"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"לדבר בבועות"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"שיחות חדשות מופיעות כסמלים צפים, או בועות. יש להקיש כדי לפתוח בועה. יש לגרור כדי להזיז אותה."</string> diff --git a/libs/WindowManager/Shell/res/values-ja/strings.xml b/libs/WindowManager/Shell/res/values-ja/strings.xml index 1f1ddc71efa8..82848371d45d 100644 --- a/libs/WindowManager/Shell/res/values-ja/strings.xml +++ b/libs/WindowManager/Shell/res/values-ja/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"<xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>を閉じます"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> の設定"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"バブルを閉じる"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"全画面表示に移動する"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"会話をバブルで表示しない"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"チャットでバブルを使う"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"新しい会話はフローティング アイコン(バブル)として表示されます。タップするとバブルが開きます。ドラッグしてバブルを移動できます。"</string> diff --git a/libs/WindowManager/Shell/res/values-ka/strings.xml b/libs/WindowManager/Shell/res/values-ka/strings.xml index e201a2023d33..82828d81d61a 100644 --- a/libs/WindowManager/Shell/res/values-ka/strings.xml +++ b/libs/WindowManager/Shell/res/values-ka/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"<xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>-ის ჩაკეცვა"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>-ის პარამეტრები"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"ბუშტის დახურვა"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"სრულეკრანიან რეჟიმზე გადატანა"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"აიკრძალოს საუბრის ბუშტები"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"ჩეთი ბუშტების გამოყენებით"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"ახალი საუბრები გამოჩნდება როგორც მოტივტივე ხატულები ან ბუშტები. შეეხეთ ბუშტის გასახსნელად. გადაიტანეთ ჩავლებით."</string> diff --git a/libs/WindowManager/Shell/res/values-kk/strings.xml b/libs/WindowManager/Shell/res/values-kk/strings.xml index 1c335dd4714d..af4e4f33492d 100644 --- a/libs/WindowManager/Shell/res/values-kk/strings.xml +++ b/libs/WindowManager/Shell/res/values-kk/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"<xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>: жию"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> параметрлері"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Қалқымалы хабарды жабу"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Толық экранға ауысу"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Әңгіменің қалқыма хабары көрсетілмесін"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Қалқыма хабарлар арқылы сөйлесу"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Жаңа әңгімелер қалқыма белгішелер немесе хабарлар түрінде көрсетіледі. Қалқыма хабарды ашу үшін түртіңіз. Жылжыту үшін сүйреңіз."</string> diff --git a/libs/WindowManager/Shell/res/values-km/strings.xml b/libs/WindowManager/Shell/res/values-km/strings.xml index d0cceee8aba5..c3a38006374b 100644 --- a/libs/WindowManager/Shell/res/values-km/strings.xml +++ b/libs/WindowManager/Shell/res/values-km/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"បង្រួម <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"ការកំណត់ <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"ច្រានចោលពពុះ"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"ផ្លាស់ទីទៅអេក្រង់ពេញ"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"កុំបង្ហាញការសន្ទនាជាពពុះ"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"ជជែកដោយប្រើពពុះ"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"ការសន្ទនាថ្មីៗបង្ហាញជាពពុះ ឬរូបអណ្ដែត។ ចុច ដើម្បីបើកពពុះ។ អូស ដើម្បីផ្លាស់ទីពពុះនេះ។"</string> diff --git a/libs/WindowManager/Shell/res/values-kn/strings.xml b/libs/WindowManager/Shell/res/values-kn/strings.xml index 63b5c68a96fc..aa8cec582a28 100644 --- a/libs/WindowManager/Shell/res/values-kn/strings.xml +++ b/libs/WindowManager/Shell/res/values-kn/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"<xliff:g id="BUBBLE_TITLE">%1$s</xliff:g> ಅನ್ನು ಕುಗ್ಗಿಸಿ"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ಸೆಟ್ಟಿಂಗ್ಗಳು"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"ಬಬಲ್ ವಜಾಗೊಳಿಸಿ"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"ಫುಲ್ಸ್ಕ್ರೀನ್ಗೆ ಸರಿಸಿ"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"ಸಂಭಾಷಣೆಯನ್ನು ಬಬಲ್ ಮಾಡಬೇಡಿ"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"ಬಬಲ್ಸ್ ಬಳಸಿ ಚಾಟ್ ಮಾಡಿ"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"ಹೊಸ ಸಂಭಾಷಣೆಗಳು ತೇಲುವ ಐಕಾನ್ಗಳು ಅಥವಾ ಬಬಲ್ಸ್ ಆಗಿ ಗೋಚರಿಸುತ್ತವೆ. ಬಬಲ್ ತೆರೆಯಲು ಟ್ಯಾಪ್ ಮಾಡಿ. ಅದನ್ನು ಡ್ರ್ಯಾಗ್ ಮಾಡಲು ಎಳೆಯಿರಿ."</string> diff --git a/libs/WindowManager/Shell/res/values-ko/strings.xml b/libs/WindowManager/Shell/res/values-ko/strings.xml index b5efd10ad19f..fc2a1b91760a 100644 --- a/libs/WindowManager/Shell/res/values-ko/strings.xml +++ b/libs/WindowManager/Shell/res/values-ko/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"<xliff:g id="BUBBLE_TITLE">%1$s</xliff:g> 접기"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> 설정"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"대화창 닫기"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"전체 화면으로 이동"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"대화를 대화창으로 표시하지 않기"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"대화창으로 채팅하기"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"새로운 대화가 플로팅 아이콘인 대화창으로 표시됩니다. 대화창을 열려면 탭하세요. 드래그하여 이동할 수 있습니다."</string> diff --git a/libs/WindowManager/Shell/res/values-ky/strings.xml b/libs/WindowManager/Shell/res/values-ky/strings.xml index e001efe9296a..c294725e8ff9 100644 --- a/libs/WindowManager/Shell/res/values-ky/strings.xml +++ b/libs/WindowManager/Shell/res/values-ky/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"<xliff:g id="BUBBLE_TITLE">%1$s</xliff:g> жыйыштыруу"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> параметрлери"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Калкып чыкма билдирмени жабуу"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Толук экранга өтүү"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Жазышууда калкып чыкма билдирмелер көрүнбөсүн"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Калкып чыкма билдирмелер аркылуу маектешүү"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Жаңы жазышуулар калкыма сүрөтчөлөр же калкып чыкма билдирмелер түрүндө көрүнөт. Калкып чыкма билдирмелерди ачуу үчүн тийип коюңуз. Жылдыруу үчүн сүйрөңүз."</string> diff --git a/libs/WindowManager/Shell/res/values-lo/strings.xml b/libs/WindowManager/Shell/res/values-lo/strings.xml index 029c95b18ce9..7d2f999f4975 100644 --- a/libs/WindowManager/Shell/res/values-lo/strings.xml +++ b/libs/WindowManager/Shell/res/values-lo/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"ຫຍໍ້ <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g> ລົງ"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"ການຕັ້ງຄ່າ <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"ປິດຟອງໄວ້"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"ຍ້າຍໄປໂໝດເຕັມຈໍ"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"ຢ່າໃຊ້ຟອງໃນການສົນທະນາ"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"ສົນທະນາໂດຍໃຊ້ຟອງ"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"ການສົນທະນາໃໝ່ຈະປາກົດເປັນໄອຄອນ ຫຼື ຟອງແບບລອຍ. ແຕະເພື່ອເປີດຟອງ. ລາກເພື່ອຍ້າຍມັນ."</string> diff --git a/libs/WindowManager/Shell/res/values-lt/strings.xml b/libs/WindowManager/Shell/res/values-lt/strings.xml index 791ddcd48933..be446a6d3fba 100644 --- a/libs/WindowManager/Shell/res/values-lt/strings.xml +++ b/libs/WindowManager/Shell/res/values-lt/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"sutraukti „<xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>“"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"„<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>“ nustatymai"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Atsisakyti burbulo"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Pereiti į viso ekrano režimą"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Nerodyti pokalbio burbule"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Pokalbis naudojant burbulus"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Nauji pokalbiai rodomi kaip slankiosios piktogramos arba burbulai. Palieskite, kad atidarytumėte burbulą. Vilkite, kad perkeltumėte."</string> diff --git a/libs/WindowManager/Shell/res/values-lv/strings.xml b/libs/WindowManager/Shell/res/values-lv/strings.xml index 8a86687ebe8e..ed0c05e0a393 100644 --- a/libs/WindowManager/Shell/res/values-lv/strings.xml +++ b/libs/WindowManager/Shell/res/values-lv/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"Sakļaut “<xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>”"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"Lietotnes <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> iestatījumi"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Nerādīt burbuli"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Pārvietot uz pilnekrāna režīmu"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Nerādīt sarunu burbuļos"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Tērzēšana, izmantojot burbuļus"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Jaunas sarunas tiek rādītas kā peldošas ikonas vai burbuļi. Pieskarieties, lai atvērtu burbuli. Velciet, lai to pārvietotu."</string> diff --git a/libs/WindowManager/Shell/res/values-mk/strings.xml b/libs/WindowManager/Shell/res/values-mk/strings.xml index 3a6b2f0a1e4f..9b24b7fa567a 100644 --- a/libs/WindowManager/Shell/res/values-mk/strings.xml +++ b/libs/WindowManager/Shell/res/values-mk/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"собери <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"Поставки за <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Отфрли балонче"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Префрлете на цел екран"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Не прикажувај го разговорот во балончиња"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Разговор во балончиња"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Новите разговори ќе се појавуваат како лебдечки икони или балончиња. Допрете за отворање на балончето. Повлечете за да го преместите."</string> diff --git a/libs/WindowManager/Shell/res/values-ml/strings.xml b/libs/WindowManager/Shell/res/values-ml/strings.xml index 26e4a4661d89..ac67f8d62339 100644 --- a/libs/WindowManager/Shell/res/values-ml/strings.xml +++ b/libs/WindowManager/Shell/res/values-ml/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"<xliff:g id="BUBBLE_TITLE">%1$s</xliff:g> ചുരുക്കുക"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ക്രമീകരണം"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"ബബിൾ ഡിസ്മിസ് ചെയ്യൂ"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"പൂർണ്ണസ്ക്രീനിലേക്ക് നീങ്ങുക"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"സംഭാഷണം ബബിൾ ചെയ്യരുത്"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"ബബിളുകൾ ഉപയോഗിച്ച് ചാറ്റ് ചെയ്യുക"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"പുതിയ സംഭാഷണങ്ങൾ ഫ്ലോട്ടിംഗ് ഐക്കണുകളോ ബബിളുകളോ ആയി ദൃശ്യമാവുന്നു. ബബിൾ തുറക്കാൻ ടാപ്പ് ചെയ്യൂ. ഇത് നീക്കാൻ വലിച്ചിടുക."</string> diff --git a/libs/WindowManager/Shell/res/values-mn/strings.xml b/libs/WindowManager/Shell/res/values-mn/strings.xml index 505a4ad66c96..6d5deb3a1a32 100644 --- a/libs/WindowManager/Shell/res/values-mn/strings.xml +++ b/libs/WindowManager/Shell/res/values-mn/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"<xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>-г хураах"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>-н тохиргоо"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Бөмбөлгийг хаах"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Бүтэн дэлгэц рүү очих"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Харилцан яриаг бүү бөмбөлөг болго"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Бөмбөлөг ашиглан чатлаарай"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Шинэ харилцан яриа нь хөвөгч дүрс тэмдэг эсвэл бөмбөлөг хэлбэрээр харагддаг. Бөмбөлгийг нээхийн тулд товшино уу. Түүнийг зөөхийн тулд чирнэ үү."</string> diff --git a/libs/WindowManager/Shell/res/values-mr/strings.xml b/libs/WindowManager/Shell/res/values-mr/strings.xml index cc35f11fa308..49747f21902c 100644 --- a/libs/WindowManager/Shell/res/values-mr/strings.xml +++ b/libs/WindowManager/Shell/res/values-mr/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"<xliff:g id="BUBBLE_TITLE">%1$s</xliff:g> कोलॅप्स करा"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> सेटिंग्ज"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"बबल डिसमिस करा"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"फुलस्क्रीनवर हलवा"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"संभाषणाला बबल करू नका"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"बबल वापरून चॅट करा"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"नवीन संभाषणे फ्लोटिंग आयकन किंवा बबल म्हणून दिसतात. बबल उघडण्यासाठी टॅप करा. हे हलवण्यासाठी ड्रॅग करा."</string> diff --git a/libs/WindowManager/Shell/res/values-ms/strings.xml b/libs/WindowManager/Shell/res/values-ms/strings.xml index 61d66144cb0c..dec389327c3c 100644 --- a/libs/WindowManager/Shell/res/values-ms/strings.xml +++ b/libs/WindowManager/Shell/res/values-ms/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"kuncupkan <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"Tetapan <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Ketepikan gelembung"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Alihkan kepada skrin penuh"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Jangan jadikan perbualan dalam bentuk gelembung"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Bersembang menggunakan gelembung"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Perbualan baharu muncul sebagai ikon terapung atau gelembung. Ketik untuk membuka gelembung. Seret untuk mengalihkan gelembung tersebut."</string> diff --git a/libs/WindowManager/Shell/res/values-my/strings.xml b/libs/WindowManager/Shell/res/values-my/strings.xml index 7841e07aa949..908ef812ab53 100644 --- a/libs/WindowManager/Shell/res/values-my/strings.xml +++ b/libs/WindowManager/Shell/res/values-my/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"<xliff:g id="BUBBLE_TITLE">%1$s</xliff:g> ကို ချုံ့ရန်"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ဆက်တင်များ"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"ပူဖောင်းကွက် ပယ်ရန်"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"ဖန်သားပြင်အပြည့်သို့ ရွှေ့ရန်"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"စကားဝိုင်းကို ပူဖောင်းကွက် မပြုလုပ်ပါနှင့်"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"ပူဖောင်းကွက် သုံး၍ ချတ်လုပ်ခြင်း"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"စကားဝိုင်းအသစ်များကို မျောနေသည့် သင်္ကေတများ သို့မဟုတ် ပူဖောင်းကွက်များအဖြစ် မြင်ရပါမည်။ ပူဖောင်းကွက်ကိုဖွင့်ရန် တို့ပါ။ ရွှေ့ရန် ၎င်းကို ဖိဆွဲပါ။"</string> diff --git a/libs/WindowManager/Shell/res/values-nb/strings.xml b/libs/WindowManager/Shell/res/values-nb/strings.xml index ea2ae1ba1db4..01ca4ed6fbbb 100644 --- a/libs/WindowManager/Shell/res/values-nb/strings.xml +++ b/libs/WindowManager/Shell/res/values-nb/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"skjul <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>-innstillinger"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Lukk boblen"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Flytt til fullskjerm"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Ikke vis samtaler i bobler"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Chat med bobler"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Nye samtaler vises som flytende ikoner eller bobler. Trykk for å åpne en boble. Dra for å flytte den."</string> diff --git a/libs/WindowManager/Shell/res/values-ne/strings.xml b/libs/WindowManager/Shell/res/values-ne/strings.xml index a3bd5eec6d5e..05ce071fd8e4 100644 --- a/libs/WindowManager/Shell/res/values-ne/strings.xml +++ b/libs/WindowManager/Shell/res/values-ne/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"<xliff:g id="BUBBLE_TITLE">%1$s</xliff:g> कोल्याप्स गर्नुहोस्"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> का सेटिङहरू"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"बबल खारेज गर्नुहोस्"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"सारेर फुल स्क्रिनमा लैजानुहोस्"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"वार्तालाप बबलको रूपमा नदेखाउनुहोस्"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"बबलहरू प्रयोग गरी कुराकानी गर्नुहोस्"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"नयाँ वार्तालापहरू तैरने आइकन वा बबलका रूपमा देखिन्छन्। बबल खोल्न ट्याप गर्नुहोस्। बबल सार्न सो बबललाई ड्र्याग गर्नुहोस्।"</string> diff --git a/libs/WindowManager/Shell/res/values-nl/strings.xml b/libs/WindowManager/Shell/res/values-nl/strings.xml index ad2c60fe4517..9ec44440a697 100644 --- a/libs/WindowManager/Shell/res/values-nl/strings.xml +++ b/libs/WindowManager/Shell/res/values-nl/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"<xliff:g id="BUBBLE_TITLE">%1$s</xliff:g> samenvouwen"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"Instellingen voor <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Bubbel sluiten"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Naar volledig scherm"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Gesprekken niet in bubbels tonen"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Chatten met bubbels"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Nieuwe gesprekken worden als zwevende iconen of bubbels getoond. Tik om een bubbel te openen. Sleep om een bubbel te verplaatsen."</string> diff --git a/libs/WindowManager/Shell/res/values-or/strings.xml b/libs/WindowManager/Shell/res/values-or/strings.xml index 76f2715b54c9..7ee734215708 100644 --- a/libs/WindowManager/Shell/res/values-or/strings.xml +++ b/libs/WindowManager/Shell/res/values-or/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"<xliff:g id="BUBBLE_TITLE">%1$s</xliff:g> ସଙ୍କୁଚିତ କରନ୍ତୁ"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ସେଟିଂସ୍"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"ବବଲ୍ ଖାରଜ କରନ୍ତୁ"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"ପୂର୍ଣ୍ଣସ୍କ୍ରିନକୁ ମୁଭ କରନ୍ତୁ"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"ବାର୍ତ୍ତାଳାପକୁ ବବଲ୍ କରନ୍ତୁ ନାହିଁ"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"ବବଲଗୁଡ଼ିକୁ ବ୍ୟବହାର କରି ଚାଟ୍ କରନ୍ତୁ"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"ନୂଆ ବାର୍ତ୍ତାଳାପଗୁଡ଼ିକ ଫ୍ଲୋଟିଂ ଆଇକନ୍ କିମ୍ବା ବବଲ୍ ଭାବେ ଦେଖାଯିବ। ବବଲ୍ ଖୋଲିବାକୁ ଟାପ୍ କରନ୍ତୁ। ଏହାକୁ ମୁଭ୍ କରିବାକୁ ଟାଣନ୍ତୁ।"</string> diff --git a/libs/WindowManager/Shell/res/values-pa/strings.xml b/libs/WindowManager/Shell/res/values-pa/strings.xml index cd7fd4716c65..cc31e3c3cf6a 100644 --- a/libs/WindowManager/Shell/res/values-pa/strings.xml +++ b/libs/WindowManager/Shell/res/values-pa/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"<xliff:g id="BUBBLE_TITLE">%1$s</xliff:g> ਨੂੰ ਸਮੇਟੋ"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ਸੈਟਿੰਗਾਂ"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"ਬਬਲ ਨੂੰ ਖਾਰਜ ਕਰੋ"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"ਪੂਰੀ-ਸਕ੍ਰੀਨ \'ਤੇ ਜਾਓ"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"ਗੱਲਬਾਤ \'ਤੇ ਬਬਲ ਨਾ ਲਾਓ"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"ਬਬਲ ਵਰਤਦੇ ਹੋਏ ਚੈਟ ਕਰੋ"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"ਨਵੀਆਂ ਗੱਲਾਂਬਾਤਾਂ ਫਲੋਟਿੰਗ ਪ੍ਰਤੀਕਾਂ ਜਾਂ ਬਬਲ ਦੇ ਰੂਪ ਵਿੱਚ ਦਿਸਦੀਆਂ ਹਨ। ਬਬਲ ਨੂੰ ਖੋਲ੍ਹਣ ਲਈ ਟੈਪ ਕਰੋ। ਇਸਨੂੰ ਲਿਜਾਣ ਲਈ ਘਸੀਟੋ।"</string> diff --git a/libs/WindowManager/Shell/res/values-pl/strings.xml b/libs/WindowManager/Shell/res/values-pl/strings.xml index d33b6f15ba37..5dd14c972968 100644 --- a/libs/WindowManager/Shell/res/values-pl/strings.xml +++ b/libs/WindowManager/Shell/res/values-pl/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"zwiń dymek <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> – ustawienia"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Zamknij dymek"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Zmień tryb na pełnoekranowy"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Nie wyświetlaj rozmowy jako dymka"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Czatuj, korzystając z dymków"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Nowe rozmowy będą wyświetlane jako pływające ikony lub dymki. Kliknij, by otworzyć dymek. Przeciągnij, by go przenieść."</string> diff --git a/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml b/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml index c7a00ff3257e..d9c3d44a1563 100644 --- a/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml +++ b/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"fechar <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"Configurações de <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Dispensar balão"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Mude para tela cheia"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Não criar balões de conversa"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Converse usando balões"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Novas conversas aparecerão como ícones flutuantes, ou balões. Toque para abrir o balão. Arraste para movê-lo."</string> diff --git a/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml b/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml index d14144705c56..1ace69998218 100644 --- a/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml +++ b/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"reduzir <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"Definições de <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Ignorar balão"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Mudar para ecrã inteiro"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Não apresentar a conversa em balões"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Converse no chat através de balões"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"As novas conversas aparecem como ícones flutuantes ou balões. Toque para abrir o balão. Arraste para o mover."</string> diff --git a/libs/WindowManager/Shell/res/values-pt/strings.xml b/libs/WindowManager/Shell/res/values-pt/strings.xml index c7a00ff3257e..d9c3d44a1563 100644 --- a/libs/WindowManager/Shell/res/values-pt/strings.xml +++ b/libs/WindowManager/Shell/res/values-pt/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"fechar <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"Configurações de <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Dispensar balão"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Mude para tela cheia"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Não criar balões de conversa"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Converse usando balões"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Novas conversas aparecerão como ícones flutuantes, ou balões. Toque para abrir o balão. Arraste para movê-lo."</string> diff --git a/libs/WindowManager/Shell/res/values-ro/strings.xml b/libs/WindowManager/Shell/res/values-ro/strings.xml index 9bc76602e1d3..ffaea971229c 100644 --- a/libs/WindowManager/Shell/res/values-ro/strings.xml +++ b/libs/WindowManager/Shell/res/values-ro/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"restrânge <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"Setări <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Închide balonul"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Treci la ecran complet"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Nu afișa conversația în balon"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Chat cu baloane"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Conversațiile noi apar ca pictograme flotante sau baloane. Atinge pentru a deschide balonul. Trage pentru a-l muta."</string> diff --git a/libs/WindowManager/Shell/res/values-ru/strings.xml b/libs/WindowManager/Shell/res/values-ru/strings.xml index 044e3b02d439..6231e3e82eca 100644 --- a/libs/WindowManager/Shell/res/values-ru/strings.xml +++ b/libs/WindowManager/Shell/res/values-ru/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"Свернуть <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>: настройки"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Скрыть всплывающий чат"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Перейти в полноэкранный режим"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Не показывать всплывающий чат для разговора"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Всплывающие чаты"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Новые разговоры будут появляться в виде плавающих значков, или всплывающих чатов. Чтобы открыть чат, нажмите на него, а чтобы переместить – перетащите."</string> diff --git a/libs/WindowManager/Shell/res/values-si/strings.xml b/libs/WindowManager/Shell/res/values-si/strings.xml index da2541e2ec14..824bd8d2998f 100644 --- a/libs/WindowManager/Shell/res/values-si/strings.xml +++ b/libs/WindowManager/Shell/res/values-si/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"<xliff:g id="BUBBLE_TITLE">%1$s</xliff:g> හකුළන්න"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> සැකසීම්"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"බුබුලු ඉවත ලන්න"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"පූර්ණ තිරය වෙත ගෙන යන්න"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"සංවාදය බුබුලු නොදමන්න"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"බුබුලු භාවිතයෙන් කතාබහ කරන්න"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"නව සංවාද පාවෙන අයිකන හෝ බුබුලු ලෙස දිස් වේ. බුබුල විවෘත කිරීමට තට්ටු කරන්න. එය ගෙන යාමට අදින්න."</string> diff --git a/libs/WindowManager/Shell/res/values-sk/strings.xml b/libs/WindowManager/Shell/res/values-sk/strings.xml index 394a4cad292b..4a1508d98717 100644 --- a/libs/WindowManager/Shell/res/values-sk/strings.xml +++ b/libs/WindowManager/Shell/res/values-sk/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"zbaliť <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"Nastavenia aplikácie <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Zavrieť bublinu"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Presunúť na celú obrazovku"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Nezobrazovať konverzáciu ako bublinu"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Čet pomocou bublín"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Nové konverzácie sa zobrazujú ako plávajúce ikony či bubliny. Bublinu otvoríte klepnutím. Premiestnite ju presunutím."</string> diff --git a/libs/WindowManager/Shell/res/values-sl/strings.xml b/libs/WindowManager/Shell/res/values-sl/strings.xml index a90c2c216ef4..dd2f9f0291ff 100644 --- a/libs/WindowManager/Shell/res/values-sl/strings.xml +++ b/libs/WindowManager/Shell/res/values-sl/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"strnitev oblačka <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"Nastavitve za <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Opusti oblaček"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Premik na celozaslonski način"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Pogovora ne prikaži v oblačku"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Klepet z oblački"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Novi pogovori so prikazani kot lebdeče ikone ali oblački. Če želite odpreti oblaček, se ga dotaknite. Če ga želite premakniti, ga povlecite."</string> diff --git a/libs/WindowManager/Shell/res/values-sq/strings.xml b/libs/WindowManager/Shell/res/values-sq/strings.xml index 706e75fc53aa..322525bf97c5 100644 --- a/libs/WindowManager/Shell/res/values-sq/strings.xml +++ b/libs/WindowManager/Shell/res/values-sq/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"palos <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"Cilësimet e <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Hiqe flluskën"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Kalo në ekran të plotë"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Mos e vendos bisedën në flluskë"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Bisedo duke përdorur flluskat"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Bisedat e reja shfaqen si ikona pluskuese ose flluska. Trokit për të hapur flluskën. Zvarrit për ta zhvendosur."</string> diff --git a/libs/WindowManager/Shell/res/values-sr/strings.xml b/libs/WindowManager/Shell/res/values-sr/strings.xml index 539a00a20346..87ae78e63b74 100644 --- a/libs/WindowManager/Shell/res/values-sr/strings.xml +++ b/libs/WindowManager/Shell/res/values-sr/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"скупите облачић <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"Подешавања за <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Одбаци облачић"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Пребаци на цео екран"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Не користи облачиће за конверзацију"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Ћаскајте у облачићима"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Нове конверзације се приказују као плутајуће иконе или облачићи. Додирните да бисте отворили облачић. Превуците да бисте га преместили."</string> diff --git a/libs/WindowManager/Shell/res/values-sv/strings.xml b/libs/WindowManager/Shell/res/values-sv/strings.xml index 549eb109f662..6942e957f9cd 100644 --- a/libs/WindowManager/Shell/res/values-sv/strings.xml +++ b/libs/WindowManager/Shell/res/values-sv/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"komprimera <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"Inställningar för <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Stäng bubbla"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Flytta till helskärm"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Visa inte konversationen i bubblor"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Chatta med bubblor"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Nya konversationer visas som flytande ikoner, så kallade bubblor. Tryck på bubblan om du vill öppna den. Dra den om du vill flytta den."</string> diff --git a/libs/WindowManager/Shell/res/values-sw/strings.xml b/libs/WindowManager/Shell/res/values-sw/strings.xml index 9c3469081706..30d68707edc4 100644 --- a/libs/WindowManager/Shell/res/values-sw/strings.xml +++ b/libs/WindowManager/Shell/res/values-sw/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"kunja <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"Mipangilio ya <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Ondoa kiputo"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Hamishia kwenye skrini nzima"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Usiweke viputo kwenye mazungumzo"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Piga gumzo ukitumia viputo"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Mazungumzo mapya huonekena kama aikoni au viputo vinavyoelea. Gusa ili ufungue kiputo. Buruta ili ukisogeze."</string> diff --git a/libs/WindowManager/Shell/res/values-ta/strings.xml b/libs/WindowManager/Shell/res/values-ta/strings.xml index 7e996f332bc2..9e51416d4c3c 100644 --- a/libs/WindowManager/Shell/res/values-ta/strings.xml +++ b/libs/WindowManager/Shell/res/values-ta/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"<xliff:g id="BUBBLE_TITLE">%1$s</xliff:g> ஐச் சுருக்கும்"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> அமைப்புகள்"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"குமிழை அகற்று"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"முழுத்திரைக்கு மாற்று"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"உரையாடலைக் குமிழாக்காதே"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"குமிழ்களைப் பயன்படுத்தி அரட்டையடியுங்கள்"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"புதிய உரையாடல்கள் மிதக்கும் ஐகான்களாகவோ குமிழ்களாகவோ தோன்றும். குமிழைத் திறக்க தட்டவும். நகர்த்த இழுக்கவும்."</string> diff --git a/libs/WindowManager/Shell/res/values-te/strings.xml b/libs/WindowManager/Shell/res/values-te/strings.xml index 984cea87bbf0..be770ca1c514 100644 --- a/libs/WindowManager/Shell/res/values-te/strings.xml +++ b/libs/WindowManager/Shell/res/values-te/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"<xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>ను కుదించండి"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> సెట్టింగ్లు"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"బబుల్ను విస్మరించు"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"ఫుల్ స్క్రీన్కు వెళ్లండి"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"సంభాషణను బబుల్ చేయవద్దు"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"బబుల్స్ను ఉపయోగించి చాట్ చేయండి"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"కొత్త సంభాషణలు తేలియాడే చిహ్నాలుగా లేదా బబుల్స్ లాగా కనిపిస్తాయి. బబుల్ని తెరవడానికి నొక్కండి. తరలించడానికి లాగండి."</string> diff --git a/libs/WindowManager/Shell/res/values-th/strings.xml b/libs/WindowManager/Shell/res/values-th/strings.xml index 3460b0768ad0..e7975ac7d77d 100644 --- a/libs/WindowManager/Shell/res/values-th/strings.xml +++ b/libs/WindowManager/Shell/res/values-th/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"ยุบ <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"การตั้งค่า <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"ปิดบับเบิล"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"เปลี่ยนเป็นแบบเต็มหน้าจอ"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"ไม่ต้องแสดงการสนทนาเป็นบับเบิล"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"แชทโดยใช้บับเบิล"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"การสนทนาใหม่ๆ จะปรากฏเป็นไอคอนแบบลอยหรือบับเบิล แตะเพื่อเปิดบับเบิล ลากเพื่อย้ายที่"</string> diff --git a/libs/WindowManager/Shell/res/values-tl/strings.xml b/libs/WindowManager/Shell/res/values-tl/strings.xml index dc309129ef2e..72d09263ebbc 100644 --- a/libs/WindowManager/Shell/res/values-tl/strings.xml +++ b/libs/WindowManager/Shell/res/values-tl/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"i-collapse ang <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"Mga setting ng <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"I-dismiss ang bubble"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Lumipat sa fullscreen"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Huwag ipakita sa bubble ang mga pag-uusap"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Mag-chat gamit ang bubbles"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Lumalabas bilang mga nakalutang na icon o bubble ang mga bagong pag-uusap. I-tap para buksan ang bubble. I-drag para ilipat ito."</string> diff --git a/libs/WindowManager/Shell/res/values-tr/strings.xml b/libs/WindowManager/Shell/res/values-tr/strings.xml index e9e21739cb61..2b02f472484c 100644 --- a/libs/WindowManager/Shell/res/values-tr/strings.xml +++ b/libs/WindowManager/Shell/res/values-tr/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"daralt: <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ayarları"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Baloncuğu kapat"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Tam ekrana taşı"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Görüşmeyi baloncuk olarak görüntüleme"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Baloncukları kullanarak sohbet edin"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Yeni görüşmeler kayan simgeler veya baloncuk olarak görünür. Açmak için baloncuğa dokunun. Baloncuğu taşımak için sürükleyin."</string> diff --git a/libs/WindowManager/Shell/res/values-uk/strings.xml b/libs/WindowManager/Shell/res/values-uk/strings.xml index e1b6e3505c04..47126acc1213 100644 --- a/libs/WindowManager/Shell/res/values-uk/strings.xml +++ b/libs/WindowManager/Shell/res/values-uk/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"згорнути \"<xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>\""</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"Налаштування параметра \"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>\""</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Закрити підказку"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Перейти в повноекранний режим"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Не показувати спливаючі чати для розмов"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Спливаючий чат"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Нові повідомлення чату з\'являються у вигляді спливаючих значків. Щоб відкрити чат, натисніть його, а щоб перемістити – перетягніть."</string> diff --git a/libs/WindowManager/Shell/res/values-ur/strings.xml b/libs/WindowManager/Shell/res/values-ur/strings.xml index 0508e6d9a7e3..859288f003e7 100644 --- a/libs/WindowManager/Shell/res/values-ur/strings.xml +++ b/libs/WindowManager/Shell/res/values-ur/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"<xliff:g id="BUBBLE_TITLE">%1$s</xliff:g> کو سکیڑیں"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ترتیبات"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"بلبلہ برخاست کریں"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"مکمل اسکرین پر منتقل کریں"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"گفتگو بلبلہ نہ کریں"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"بلبلے کے ذریعے چیٹ کریں"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"نئی گفتگوئیں فلوٹنگ آئیکن یا بلبلے کے طور پر ظاہر ہوں گی۔ بلبلہ کھولنے کے لیے تھپتھپائیں۔ اسے منتقل کرنے کے لیے گھسیٹیں۔"</string> diff --git a/libs/WindowManager/Shell/res/values-uz/strings.xml b/libs/WindowManager/Shell/res/values-uz/strings.xml index 5de3b7bf52aa..625fc8ef7635 100644 --- a/libs/WindowManager/Shell/res/values-uz/strings.xml +++ b/libs/WindowManager/Shell/res/values-uz/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"<xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>ni yopish"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> sozlamalari"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Bulutchani yopish"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Butun ekranga koʻchirish"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Suhbatlar bulutchalar shaklida chiqmasin"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Bulutchalar yordamida subhatlashish"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Yangi xabarlar qalqib chiquvchi belgilar yoki bulutchalar kabi chiqadi. Xabarni ochish uchun bildirishnoma ustiga bosing. Xabarni qayta joylash uchun bildirishnomani suring."</string> diff --git a/libs/WindowManager/Shell/res/values-vi/strings.xml b/libs/WindowManager/Shell/res/values-vi/strings.xml index 9b2f8988fcca..2e643ddc41ca 100644 --- a/libs/WindowManager/Shell/res/values-vi/strings.xml +++ b/libs/WindowManager/Shell/res/values-vi/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"thu gọn <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"Cài đặt <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Đóng bong bóng"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Chuyển sang toàn màn hình"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Dừng sử dụng bong bóng cho cuộc trò chuyện"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Trò chuyện bằng bong bóng trò chuyện"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Các cuộc trò chuyện mới sẽ xuất hiện dưới dạng biểu tượng nổi hoặc bong bóng trò chuyện. Nhấn để mở bong bóng trò chuyện. Kéo để di chuyển bong bóng trò chuyện."</string> diff --git a/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml b/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml index b45b76e876f2..f023f53e3f28 100644 --- a/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml +++ b/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"收起“<xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>”"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>设置"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"关闭消息气泡"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"移至全屏"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"不以消息气泡形式显示对话"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"使用消息气泡聊天"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"新对话会以浮动图标或消息气泡形式显示。点按即可打开消息气泡。拖动即可移动消息气泡。"</string> diff --git a/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml b/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml index ae776b8c9b12..5c2ef045947a 100644 --- a/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml +++ b/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"收埋<xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"「<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>」設定"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"關閉小視窗氣泡"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"移至全螢幕"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"不要透過小視窗顯示對話"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"使用小視窗進行即時通訊"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"新對話會以浮動圖示 (小視窗) 顯示。輕按即可開啟小視窗。拖曳即可移動小視窗。"</string> diff --git a/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml b/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml index 5bfc6b843aad..a362d5b5519e 100644 --- a/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml +++ b/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"收合「<xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>」"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"「<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>」設定"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"關閉對話框"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"移至全螢幕"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"不要以對話框形式顯示對話"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"透過對話框來聊天"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"新的對話會以浮動圖示或對話框形式顯示。輕觸即可開啟對話框,拖曳則可移動對話框。"</string> diff --git a/libs/WindowManager/Shell/res/values-zu/strings.xml b/libs/WindowManager/Shell/res/values-zu/strings.xml index 0598d62dcbb6..3a3f4313b1ae 100644 --- a/libs/WindowManager/Shell/res/values-zu/strings.xml +++ b/libs/WindowManager/Shell/res/values-zu/strings.xml @@ -73,8 +73,7 @@ <string name="bubble_accessibility_announce_collapse" msgid="3178806224494537097">"goqa <xliff:g id="BUBBLE_TITLE">%1$s</xliff:g>"</string> <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> izilungiselelo"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"Cashisa ibhamuza"</string> - <!-- no translation found for bubble_fullscreen_text (1006758103218086231) --> - <skip /> + <string name="bubble_fullscreen_text" msgid="1006758103218086231">"Hambisa esikrinini esigcwele"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Ungayibhamuzi ingxoxo"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Xoxa usebenzisa amabhamuza"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Izingxoxo ezintsha zivela njengezithonjana ezintantayo, noma amabhamuza. Thepha ukuze uvule ibhamuza. Hudula ukuze ulihambise."</string> diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PhonePipKeepClearAlgorithm.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PhonePipKeepClearAlgorithm.java index 133242d15822..a27caf879e8a 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PhonePipKeepClearAlgorithm.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PhonePipKeepClearAlgorithm.java @@ -57,6 +57,12 @@ public class PhonePipKeepClearAlgorithm implements PipKeepClearAlgorithmInterfac Rect startingBounds = pipBoundsState.getBounds().isEmpty() ? pipBoundsAlgorithm.getEntryDestinationBoundsIgnoringKeepClearAreas() : pipBoundsState.getBounds(); + // If IME is not showing and restore bounds (pre-IME bounds) is not empty, we should set PiP + // bounds to the restore bounds. + if (!pipBoundsState.isImeShowing() && !pipBoundsState.getRestoreBounds().isEmpty()) { + startingBounds.set(pipBoundsState.getRestoreBounds()); + pipBoundsState.clearRestoreBounds(); + } Rect insets = new Rect(); pipBoundsAlgorithm.getInsetBounds(insets); if (pipBoundsState.isImeShowing()) { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipBoundsState.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipBoundsState.java index 140d7765e5c1..c487f7543dcf 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipBoundsState.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipBoundsState.java @@ -86,6 +86,7 @@ public class PipBoundsState { @NonNull private final Rect mExpandedBounds = new Rect(); @NonNull private final Rect mNormalMovementBounds = new Rect(); @NonNull private final Rect mExpandedMovementBounds = new Rect(); + @NonNull private final Rect mRestoreBounds = new Rect(); @NonNull private final PipDisplayLayoutState mPipDisplayLayoutState; private final Point mMaxSize = new Point(); private final Point mMinSize = new Point(); @@ -404,6 +405,10 @@ public class PipBoundsState { public void setImeVisibility(boolean imeShowing, int imeHeight) { mIsImeShowing = imeShowing; mImeHeight = imeHeight; + // If IME is showing, save the current PiP bounds in case we need to restore it later. + if (mIsImeShowing) { + mRestoreBounds.set(getBounds()); + } } /** Returns whether the IME is currently showing. */ @@ -411,6 +416,16 @@ public class PipBoundsState { return mIsImeShowing; } + /** Returns the bounds to restore PiP to (bounds before IME was expanded). */ + public Rect getRestoreBounds() { + return mRestoreBounds; + } + + /** Sets mRestoreBounds to (0,0,0,0). */ + public void clearRestoreBounds() { + mRestoreBounds.setEmpty(); + } + /** Returns the IME height. */ public int getImeHeight() { return mImeHeight; @@ -521,6 +536,10 @@ public class PipBoundsState { /** Set whether the user has resized the PIP. */ public void setHasUserResizedPip(boolean hasUserResizedPip) { mHasUserResizedPip = hasUserResizedPip; + // If user resized PiP while IME is showing, clear the pre-IME restore bounds. + if (hasUserResizedPip && isImeShowing()) { + clearRestoreBounds(); + } } /** Returns whether the user has moved the PIP. */ @@ -531,6 +550,10 @@ public class PipBoundsState { /** Set whether the user has moved the PIP. */ public void setHasUserMovedPip(boolean hasUserMovedPip) { mHasUserMovedPip = hasUserMovedPip; + // If user moved PiP while IME is showing, clear the pre-IME restore bounds. + if (hasUserMovedPip && isImeShowing()) { + clearRestoreBounds(); + } } /** diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java index 05d19846bfee..2138acc51eb2 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java @@ -1102,6 +1102,8 @@ public class PipTransition extends PipTransitionController { return; } + // NOTE(b/365300020): Legacy enter PiP path, clear the swipe state. + mPipTransitionState.setInSwipePipToHomeTransition(false); final int enterAnimationType = mEnterAnimationType; if (enterAnimationType == ANIM_TYPE_ALPHA) { startTransaction.setAlpha(leash, 0f); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/IRecentsAnimationController.aidl b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/IRecentsAnimationController.aidl index ccfaab079205..964e5fd62a5f 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/IRecentsAnimationController.aidl +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/IRecentsAnimationController.aidl @@ -16,7 +16,6 @@ package com.android.wm.shell.recents; -import android.app.ActivityManager; import android.graphics.GraphicBuffer; import android.view.IRemoteAnimationFinishedCallback; import android.view.RemoteAnimationTarget; diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/IRecentsAnimationRunner.aidl b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/IRecentsAnimationRunner.aidl index 8021758bf7c3..32c79a2d02de 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/IRecentsAnimationRunner.aidl +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/IRecentsAnimationRunner.aidl @@ -16,7 +16,6 @@ package com.android.wm.shell.recents; -import android.app.ActivityManager; import android.graphics.Rect; import android.view.RemoteAnimationTarget; import android.window.TaskSnapshot; 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 ff4b981f5e8e..f40e0bac1b4e 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 @@ -18,8 +18,8 @@ package com.android.wm.shell.transition; import static android.app.ActivityOptions.ANIM_CLIP_REVEAL; import static android.app.ActivityOptions.ANIM_CUSTOM; -import static android.app.ActivityOptions.ANIM_NONE; import static android.app.ActivityOptions.ANIM_FROM_STYLE; +import static android.app.ActivityOptions.ANIM_NONE; import static android.app.ActivityOptions.ANIM_OPEN_CROSS_PROFILE_APPS; import static android.app.ActivityOptions.ANIM_SCALE_UP; import static android.app.ActivityOptions.ANIM_SCENE_TRANSITION; @@ -470,7 +470,7 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler { change.getLeash(), startTransaction); } else if (isOnlyTranslucent && TransitionUtil.isOpeningType(info.getType()) - && TransitionUtil.isClosingType(mode)) { + && TransitionUtil.isClosingType(mode)) { // If there is a closing translucent task in an OPENING transition, we will // actually select a CLOSING animation, so move the closing task into // the animating part of the z-order. @@ -756,6 +756,7 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler { options = info.getAnimationOptions(); } final int overrideType = options != null ? options.getType() : ANIM_NONE; + final int userId = options != null ? options.getUserId() : UserHandle.USER_CURRENT; final Rect endBounds = TransitionUtil.isClosingType(changeMode) ? mRotator.getEndBoundsInStartRotation(change) : change.getEndAbsBounds(); @@ -764,12 +765,12 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler { a = mTransitionAnimation.loadKeyguardExitAnimation(flags, (changeFlags & FLAG_SHOW_WALLPAPER) != 0); } else if (type == TRANSIT_KEYGUARD_UNOCCLUDE) { - a = mTransitionAnimation.loadKeyguardUnoccludeAnimation(); + a = mTransitionAnimation.loadKeyguardUnoccludeAnimation(userId); } else if ((changeFlags & FLAG_IS_VOICE_INTERACTION) != 0) { if (isOpeningType) { - a = mTransitionAnimation.loadVoiceActivityOpenAnimation(enter); + a = mTransitionAnimation.loadVoiceActivityOpenAnimation(enter, userId); } else { - a = mTransitionAnimation.loadVoiceActivityExitAnimation(enter); + a = mTransitionAnimation.loadVoiceActivityExitAnimation(enter, userId); } } else if (changeMode == TRANSIT_CHANGE) { // In the absence of a specific adapter, we just want to keep everything stationary. @@ -780,9 +781,9 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler { } else if (overrideType == ANIM_CUSTOM && (!isTask || options.getOverrideTaskTransition())) { a = mTransitionAnimation.loadAnimationRes(options.getPackageName(), enter - ? options.getEnterResId() : options.getExitResId()); + ? options.getEnterResId() : options.getExitResId(), userId); } else if (overrideType == ANIM_OPEN_CROSS_PROFILE_APPS && enter) { - a = mTransitionAnimation.loadCrossProfileAppEnterAnimation(); + a = mTransitionAnimation.loadCrossProfileAppEnterAnimation(userId); } else if (overrideType == ANIM_CLIP_REVEAL) { a = mTransitionAnimation.createClipRevealAnimationLocked(type, wallpaperTransit, enter, endBounds, endBounds, options.getTransitionBounds()); @@ -902,9 +903,9 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler { final Rect bounds = change.getEndAbsBounds(); // Show the right drawable depending on the user we're transitioning to. final Drawable thumbnailDrawable = change.hasFlags(FLAG_CROSS_PROFILE_OWNER_THUMBNAIL) - ? mContext.getDrawable(R.drawable.ic_account_circle) - : change.hasFlags(FLAG_CROSS_PROFILE_WORK_THUMBNAIL) - ? mEnterpriseThumbnailDrawable : null; + ? mContext.getDrawable(R.drawable.ic_account_circle) + : change.hasFlags(FLAG_CROSS_PROFILE_WORK_THUMBNAIL) + ? mEnterpriseThumbnailDrawable : null; if (thumbnailDrawable == null) { return; } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/AbstractTaskPositionerDecorator.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/AbstractTaskPositionerDecorator.kt new file mode 100644 index 000000000000..6dd5ac60b063 --- /dev/null +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/AbstractTaskPositionerDecorator.kt @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.wm.shell.windowdecor + +/** + * Abstract decorator for a [TaskPositioner]. + */ +abstract class AbstractTaskPositionerDecorator( + private val taskPositioner: TaskPositioner +) : TaskPositioner by taskPositioner diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/FixedAspectRatioTaskPositionerDecorator.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/FixedAspectRatioTaskPositionerDecorator.kt new file mode 100644 index 000000000000..e8131a00ba40 --- /dev/null +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/FixedAspectRatioTaskPositionerDecorator.kt @@ -0,0 +1,258 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.wm.shell.windowdecor + +import android.graphics.PointF +import android.graphics.Rect +import com.android.wm.shell.windowdecor.DragPositioningCallback.CTRL_TYPE_BOTTOM +import com.android.wm.shell.windowdecor.DragPositioningCallback.CTRL_TYPE_LEFT +import com.android.wm.shell.windowdecor.DragPositioningCallback.CTRL_TYPE_RIGHT +import com.android.wm.shell.windowdecor.DragPositioningCallback.CTRL_TYPE_TOP +import com.android.wm.shell.windowdecor.DragPositioningCallback.CTRL_TYPE_UNDEFINED +import com.android.wm.shell.windowdecor.DragPositioningCallback.CtrlType +import kotlin.math.abs +import kotlin.math.max +import kotlin.math.min + +/** + * [AbstractTaskPositionerDecorator] implementation for validating the coordinates associated with a + * drag action, to maintain a fixed aspect ratio before being used by the task positioner. + */ +class FixedAspectRatioTaskPositionerDecorator ( + private val windowDecoration: DesktopModeWindowDecoration, + decoratedTaskPositioner: TaskPositioner +) : AbstractTaskPositionerDecorator(decoratedTaskPositioner) { + + private var originalCtrlType = CTRL_TYPE_UNDEFINED + private var edgeResizeCtrlType = CTRL_TYPE_UNDEFINED + private val lastRepositionedBounds = Rect() + private val startingPoint = PointF() + private val lastValidPoint = PointF() + private var startingAspectRatio = 0f + private var isTaskPortrait = false + + override fun onDragPositioningStart(@CtrlType ctrlType: Int, x: Float, y: Float): Rect { + originalCtrlType = ctrlType + if (!requiresFixedAspectRatio()) { + return super.onDragPositioningStart(originalCtrlType, x, y) + } + + lastRepositionedBounds.set( + windowDecoration.mTaskInfo.configuration.windowConfiguration.bounds) + startingPoint.set(x, y) + lastValidPoint.set(x, y) + val startingBoundWidth = lastRepositionedBounds.width() + val startingBoundHeight = lastRepositionedBounds.height() + startingAspectRatio = max(startingBoundWidth, startingBoundHeight).toFloat() / + min(startingBoundWidth, startingBoundHeight).toFloat() + isTaskPortrait = startingBoundWidth <= startingBoundHeight + + lastRepositionedBounds.set( + when (originalCtrlType) { + // If resize in an edge resize, adjust ctrlType passed to onDragPositioningStart() to + // mimic a corner resize instead. As at lest two adjacent edges need to be resized + // in relation to each other to maintain the apps aspect ratio. The additional adjacent + // edge is selected based on its proximity (closest) to the start of the drag. + CTRL_TYPE_LEFT, CTRL_TYPE_RIGHT -> { + val verticalMidPoint = lastRepositionedBounds.top + (startingBoundHeight / 2) + edgeResizeCtrlType = originalCtrlType + + if (y < verticalMidPoint) CTRL_TYPE_TOP else CTRL_TYPE_BOTTOM + super.onDragPositioningStart(edgeResizeCtrlType, x, y) + } + CTRL_TYPE_TOP, CTRL_TYPE_BOTTOM -> { + val horizontalMidPoint = lastRepositionedBounds.left + (startingBoundWidth / 2) + edgeResizeCtrlType = originalCtrlType + + if (x < horizontalMidPoint) CTRL_TYPE_LEFT else CTRL_TYPE_RIGHT + super.onDragPositioningStart(edgeResizeCtrlType, x, y) + } + // If resize is corner resize, no alteration to the ctrlType needs to be made. + else -> { + edgeResizeCtrlType = CTRL_TYPE_UNDEFINED + super.onDragPositioningStart(originalCtrlType, x, y) + } + } + ) + return lastRepositionedBounds + } + + override fun onDragPositioningMove(x: Float, y: Float): Rect { + if (!requiresFixedAspectRatio()) { + return super.onDragPositioningMove(x, y) + } + + val diffX = x - lastValidPoint.x + val diffY = y - lastValidPoint.y + when (originalCtrlType) { + CTRL_TYPE_BOTTOM + CTRL_TYPE_RIGHT, CTRL_TYPE_TOP + CTRL_TYPE_LEFT -> { + if ((diffX > 0 && diffY > 0) || (diffX < 0 && diffY < 0)) { + // Drag coordinate falls within valid region (90 - 180 degrees or 270- 360 + // degrees from the corner the previous valid point). Allow resize with adjusted + // coordinates to maintain aspect ratio. + lastRepositionedBounds.set(dragAdjustedMove(x, y)) + } + } + CTRL_TYPE_BOTTOM + CTRL_TYPE_LEFT, CTRL_TYPE_TOP + CTRL_TYPE_RIGHT -> { + if ((diffX > 0 && diffY < 0) || (diffX < 0 && diffY > 0)) { + // Drag coordinate falls within valid region (180 - 270 degrees or 0 - 90 + // degrees from the corner the previous valid point). Allow resize with adjusted + // coordinates to maintain aspect ratio. + lastRepositionedBounds.set(dragAdjustedMove(x, y)) + } + } + CTRL_TYPE_LEFT, CTRL_TYPE_RIGHT -> { + // If resize is on left or right edge, always adjust the y coordinate. + val adjustedY = getScaledChangeForY(x) + lastValidPoint.set(x, adjustedY) + lastRepositionedBounds.set(super.onDragPositioningMove(x, adjustedY)) + } + CTRL_TYPE_TOP, CTRL_TYPE_BOTTOM -> { + // If resize is on top or bottom edge, always adjust the x coordinate. + val adjustedX = getScaledChangeForX(y) + lastValidPoint.set(adjustedX, y) + lastRepositionedBounds.set(super.onDragPositioningMove(adjustedX, y)) + } + } + return lastRepositionedBounds + } + + override fun onDragPositioningEnd(x: Float, y: Float): Rect { + if (!requiresFixedAspectRatio()) { + return super.onDragPositioningEnd(x, y) + } + + val diffX = x - lastValidPoint.x + val diffY = y - lastValidPoint.y + + when (originalCtrlType) { + CTRL_TYPE_BOTTOM + CTRL_TYPE_RIGHT, CTRL_TYPE_TOP + CTRL_TYPE_LEFT -> { + if ((diffX > 0 && diffY > 0) || (diffX < 0 && diffY < 0)) { + // Drag coordinate falls within valid region (90 - 180 degrees or 270- 360 + // degrees from the corner the previous valid point). End resize with adjusted + // coordinates to maintain aspect ratio. + return dragAdjustedEnd(x, y) + } + // If end of resize is not within valid region, end resize from last valid + // coordinates. + return super.onDragPositioningEnd(lastValidPoint.x, lastValidPoint.y) + } + CTRL_TYPE_BOTTOM + CTRL_TYPE_LEFT, CTRL_TYPE_TOP + CTRL_TYPE_RIGHT -> { + if ((diffX > 0 && diffY < 0) || (diffX < 0 && diffY > 0)) { + // Drag coordinate falls within valid region (180 - 260 degrees or 0 - 90 + // degrees from the corner the previous valid point). End resize with adjusted + // coordinates to maintain aspect ratio. + return dragAdjustedEnd(x, y) + } + // If end of resize is not within valid region, end resize from last valid + // coordinates. + return super.onDragPositioningEnd(lastValidPoint.x, lastValidPoint.y) + } + CTRL_TYPE_LEFT, CTRL_TYPE_RIGHT -> { + // If resize is on left or right edge, always adjust the y coordinate. + return super.onDragPositioningEnd(x, getScaledChangeForY(x)) + } + CTRL_TYPE_TOP, CTRL_TYPE_BOTTOM -> { + // If resize is on top or bottom edge, always adjust the x coordinate. + return super.onDragPositioningEnd(getScaledChangeForX(y), y) + } + else -> { + return super.onDragPositioningEnd(x, y) + } + } + } + + private fun dragAdjustedMove(x: Float, y: Float): Rect { + val absDiffX = abs(x - lastValidPoint.x) + val absDiffY = abs(y - lastValidPoint.y) + if (absDiffY < absDiffX) { + lastValidPoint.set(getScaledChangeForX(y), y) + return super.onDragPositioningMove(getScaledChangeForX(y), y) + } + lastValidPoint.set(x, getScaledChangeForY(x)) + return super.onDragPositioningMove(x, getScaledChangeForY(x)) + } + + private fun dragAdjustedEnd(x: Float, y: Float): Rect { + val absDiffX = abs(x - lastValidPoint.x) + val absDiffY = abs(y - lastValidPoint.y) + if (absDiffY < absDiffX) { + return super.onDragPositioningEnd(getScaledChangeForX(y), y) + } + return super.onDragPositioningEnd(x, getScaledChangeForY(x)) + } + + /** + * Calculate the required change in the y dimension, given the change in the x dimension, to + * maintain the applications starting aspect ratio when resizing to a given x coordinate. + */ + private fun getScaledChangeForY(x: Float): Float { + val changeXDimension = x - startingPoint.x + val changeYDimension = if (isTaskPortrait) { + changeXDimension * startingAspectRatio + } else { + changeXDimension / startingAspectRatio + } + if (originalCtrlType.isBottomRightOrTopLeftCorner() + || edgeResizeCtrlType.isBottomRightOrTopLeftCorner()) { + return startingPoint.y + changeYDimension + } + return startingPoint.y - changeYDimension + } + + /** + * Calculate the required change in the x dimension, given the change in the y dimension, to + * maintain the applications starting aspect ratio when resizing to a given y coordinate. + */ + private fun getScaledChangeForX(y: Float): Float { + val changeYDimension = y - startingPoint.y + val changeXDimension = if (isTaskPortrait) { + changeYDimension / startingAspectRatio + } else { + changeYDimension * startingAspectRatio + } + if (originalCtrlType.isBottomRightOrTopLeftCorner() + || edgeResizeCtrlType.isBottomRightOrTopLeftCorner()) { + return startingPoint.x + changeXDimension + } + return startingPoint.x - changeXDimension + } + + /** + * If the action being triggered originated from the bottom right or top left corner of the + * window. + */ + private fun @receiver:CtrlType Int.isBottomRightOrTopLeftCorner(): Boolean { + return this == CTRL_TYPE_BOTTOM + CTRL_TYPE_RIGHT || this == CTRL_TYPE_TOP + CTRL_TYPE_LEFT + } + + /** + * If the action being triggered is a resize action. + */ + private fun @receiver:CtrlType Int.isResizing(): Boolean { + return (this and CTRL_TYPE_TOP) != 0 || (this and CTRL_TYPE_BOTTOM) != 0 + || (this and CTRL_TYPE_LEFT) != 0 || (this and CTRL_TYPE_RIGHT) != 0 + } + + /** + * Whether the aspect ratio of the activity needs to be maintained during the current drag + * action. If the current action is not a resize (there is no bounds change) so the aspect ratio + * is already maintained and does not need handling here. If the activity is resizeable, it + * can handle aspect ratio changes itself so again we do not need to handle it here. + */ + private fun requiresFixedAspectRatio(): Boolean { + return originalCtrlType.isResizing() && !windowDecoration.mTaskInfo.isResizeable + } +} diff --git a/libs/WindowManager/Shell/tests/flicker/Android.bp b/libs/WindowManager/Shell/tests/flicker/Android.bp index 7305f4988aa9..58559ac2c3ca 100644 --- a/libs/WindowManager/Shell/tests/flicker/Android.bp +++ b/libs/WindowManager/Shell/tests/flicker/Android.bp @@ -59,7 +59,7 @@ java_defaults { enabled: false, }, test_suites: ["device-tests"], - libs: ["android.test.runner"], + libs: ["android.test.runner.stubs.system"], static_libs: [ "wm-shell-flicker-utils", "androidx.test.ext.junit", diff --git a/libs/WindowManager/Shell/tests/unittest/Android.bp b/libs/WindowManager/Shell/tests/unittest/Android.bp index 006a4a9ea435..049a5a0615e0 100644 --- a/libs/WindowManager/Shell/tests/unittest/Android.bp +++ b/libs/WindowManager/Shell/tests/unittest/Android.bp @@ -66,9 +66,9 @@ android_test { ], libs: [ - "android.test.mock", - "android.test.base", - "android.test.runner", + "android.test.mock.stubs.system", + "android.test.base.stubs.system", + "android.test.runner.stubs.system", ], jni_libs: [ diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackProgressAnimatorTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackProgressAnimatorTest.java index 4d0348b4f470..9b019ddb8362 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackProgressAnimatorTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackProgressAnimatorTest.java @@ -177,6 +177,31 @@ public class BackProgressAnimatorTest { assertEquals(1, finishCallbackCalled.getCount()); } + @Test + public void testOnBackInvokedFinishCallbackNotInvokedWhenRemoved() throws InterruptedException { + // Give the animator some progress. + final BackMotionEvent backEvent = backMotionEventFrom(100, mTargetProgress); + mMainThreadHandler.post( + () -> mProgressAnimator.onBackProgressed(backEvent)); + mTargetProgressCalled.await(1, TimeUnit.SECONDS); + assertNotNull(mReceivedBackEvent); + + // Trigger back invoked animation + CountDownLatch finishCallbackCalled = new CountDownLatch(1); + InstrumentationRegistry.getInstrumentation().runOnMainSync( + () -> mProgressAnimator.onBackInvoked(finishCallbackCalled::countDown)); + + // remove onBackCancelled finishCallback (while progress is still animating to 0) + InstrumentationRegistry.getInstrumentation().runOnMainSync( + () -> mProgressAnimator.removeOnBackInvokedFinishCallback()); + + // call reset (which triggers the finishCallback invocation, if one is present) + InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> mProgressAnimator.reset()); + + // verify that finishCallback is not invoked + assertEquals(1, finishCallbackCalled.getCount()); + } + private void onGestureProgress(BackEvent backEvent) { if (mTargetProgress == backEvent.getProgress()) { mReceivedBackEvent = backEvent; diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PhonePipKeepClearAlgorithmTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PhonePipKeepClearAlgorithmTest.java index 8c7b47ea7d84..e3798e92c092 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PhonePipKeepClearAlgorithmTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PhonePipKeepClearAlgorithmTest.java @@ -109,6 +109,7 @@ public class PhonePipKeepClearAlgorithmTest extends ShellTestCase { final Rect pipBounds = new Rect(0, 0, 100, 100); final Rect keepClearRect = new Rect(50, 50, 150, 150); when(mMockPipBoundsState.getBounds()).thenReturn(pipBounds); + when(mMockPipBoundsState.getRestoreBounds()).thenReturn(new Rect(0, 0, 0, 0)); when(mMockPipBoundsState.getRestrictedKeepClearAreas()).thenReturn(Set.of(keepClearRect)); doAnswer(invocation -> { Rect arg0 = invocation.getArgument(0); @@ -127,6 +128,7 @@ public class PhonePipKeepClearAlgorithmTest extends ShellTestCase { final Rect pipBounds = new Rect(0, 0, 100, 100); final Rect keepClearRect = new Rect(100, 100, 150, 150); when(mMockPipBoundsState.getBounds()).thenReturn(pipBounds); + when(mMockPipBoundsState.getRestoreBounds()).thenReturn(new Rect(0, 0, 0, 0)); when(mMockPipBoundsState.getRestrictedKeepClearAreas()).thenReturn(Set.of(keepClearRect)); doAnswer(invocation -> { Rect arg0 = invocation.getArgument(0); @@ -145,6 +147,7 @@ public class PhonePipKeepClearAlgorithmTest extends ShellTestCase { final Rect pipBounds = new Rect(0, 0, 100, 100); final Rect keepClearRect = new Rect(50, 50, 150, 150); when(mMockPipBoundsState.getBounds()).thenReturn(pipBounds); + when(mMockPipBoundsState.getRestoreBounds()).thenReturn(new Rect(0, 0, 0, 0)); when(mMockPipBoundsState.isStashed()).thenReturn(true); when(mMockPipBoundsState.getRestrictedKeepClearAreas()).thenReturn(Set.of(keepClearRect)); doAnswer(invocation -> { @@ -164,6 +167,7 @@ public class PhonePipKeepClearAlgorithmTest extends ShellTestCase { final Rect pipBounds = new Rect(0, 0, 100, 100); final Rect keepClearRect = new Rect(100, 100, 150, 150); when(mMockPipBoundsState.getBounds()).thenReturn(pipBounds); + when(mMockPipBoundsState.getRestoreBounds()).thenReturn(new Rect(0, 0, 0, 0)); when(mMockPipBoundsState.isStashed()).thenReturn(true); when(mMockPipBoundsState.getRestrictedKeepClearAreas()).thenReturn(Set.of(keepClearRect)); doAnswer(invocation -> { @@ -185,6 +189,7 @@ public class PhonePipKeepClearAlgorithmTest extends ShellTestCase { final Rect expected = new Rect( 0, DISPLAY_BOUNDS.bottom - 100, 100, DISPLAY_BOUNDS.bottom); when(mMockPipBoundsState.getBounds()).thenReturn(pipBounds); + when(mMockPipBoundsState.getRestoreBounds()).thenReturn(new Rect(0, 0, 0, 0)); doAnswer(invocation -> { Rect arg0 = invocation.getArgument(0); arg0.set(DISPLAY_BOUNDS); @@ -205,6 +210,7 @@ public class PhonePipKeepClearAlgorithmTest extends ShellTestCase { final Rect expected = new Rect( 0, DISPLAY_BOUNDS.bottom - 100, 100, DISPLAY_BOUNDS.bottom); when(mMockPipBoundsState.getBounds()).thenReturn(pipBounds); + when(mMockPipBoundsState.getRestoreBounds()).thenReturn(new Rect(0, 0, 0, 0)); doAnswer(invocation -> { Rect arg0 = invocation.getArgument(0); arg0.set(DISPLAY_BOUNDS); @@ -227,6 +233,7 @@ public class PhonePipKeepClearAlgorithmTest extends ShellTestCase { DISPLAY_BOUNDS.right - 100, DISPLAY_BOUNDS.bottom - 100, DISPLAY_BOUNDS.right, DISPLAY_BOUNDS.bottom); when(mMockPipBoundsState.getBounds()).thenReturn(pipBounds); + when(mMockPipBoundsState.getRestoreBounds()).thenReturn(new Rect(0, 0, 0, 0)); doAnswer(invocation -> { Rect arg0 = invocation.getArgument(0); arg0.set(DISPLAY_BOUNDS); @@ -249,6 +256,7 @@ public class PhonePipKeepClearAlgorithmTest extends ShellTestCase { DISPLAY_BOUNDS.right - 100, DISPLAY_BOUNDS.bottom - 100, DISPLAY_BOUNDS.right, DISPLAY_BOUNDS.bottom); when(mMockPipBoundsState.getBounds()).thenReturn(pipBounds); + when(mMockPipBoundsState.getRestoreBounds()).thenReturn(new Rect(0, 0, 0, 0)); doAnswer(invocation -> { Rect arg0 = invocation.getArgument(0); arg0.set(DISPLAY_BOUNDS); @@ -269,6 +277,7 @@ public class PhonePipKeepClearAlgorithmTest extends ShellTestCase { final Rect expected = new Rect( 0, DISPLAY_BOUNDS.bottom - 100, 100, DISPLAY_BOUNDS.bottom); when(mMockPipBoundsState.getBounds()).thenReturn(pipBounds); + when(mMockPipBoundsState.getRestoreBounds()).thenReturn(new Rect(0, 0, 0, 0)); when(mMockPipBoundsState.isStashed()).thenReturn(true); doAnswer(invocation -> { Rect arg0 = invocation.getArgument(0); @@ -289,6 +298,7 @@ public class PhonePipKeepClearAlgorithmTest extends ShellTestCase { final Rect expected = new Rect( 0, DISPLAY_BOUNDS.bottom - 100, 100, DISPLAY_BOUNDS.bottom); when(mMockPipBoundsState.getBounds()).thenReturn(pipBounds); + when(mMockPipBoundsState.getRestoreBounds()).thenReturn(new Rect(0, 0, 0, 0)); when(mMockPipBoundsState.isStashed()).thenReturn(true); doAnswer(invocation -> { Rect arg0 = invocation.getArgument(0); @@ -301,4 +311,40 @@ public class PhonePipKeepClearAlgorithmTest extends ShellTestCase { assertEquals(expected, outBounds); } + + @Test + public void adjust_restoreBoundsPresent_appliesRestoreBounds() { + final Rect pipBounds = new Rect(0, 0, 100, 100); + final Rect restoreBounds = new Rect(50, 50, 150, 150); + when(mMockPipBoundsState.getBounds()).thenReturn(pipBounds); + when(mMockPipBoundsState.getRestoreBounds()).thenReturn(restoreBounds); + when(mMockPipBoundsState.hasUserMovedPip()).thenReturn(true); + doAnswer(invocation -> { + Rect arg0 = invocation.getArgument(0); + arg0.set(DISPLAY_BOUNDS); + return null; + }).when(mMockPipBoundsAlgorithm).getInsetBounds(any(Rect.class)); + + final Rect outBounds = mPipKeepClearAlgorithm.adjust( + mMockPipBoundsState, mMockPipBoundsAlgorithm); + assertEquals(restoreBounds, outBounds); + } + + @Test + public void adjust_restoreBoundsCleared_boundsUnchanged() { + final Rect pipBounds = new Rect(0, 0, 100, 100); + final Rect restoreBounds = new Rect(0, 0, 0, 0); + when(mMockPipBoundsState.getBounds()).thenReturn(pipBounds); + when(mMockPipBoundsState.getRestoreBounds()).thenReturn(restoreBounds); + when(mMockPipBoundsState.hasUserMovedPip()).thenReturn(true); + doAnswer(invocation -> { + Rect arg0 = invocation.getArgument(0); + arg0.set(DISPLAY_BOUNDS); + return null; + }).when(mMockPipBoundsAlgorithm).getInsetBounds(any(Rect.class)); + + final Rect outBounds = mPipKeepClearAlgorithm.adjust( + mMockPipBoundsState, mMockPipBoundsAlgorithm); + assertEquals(pipBounds, outBounds); + } } diff --git a/libs/dream/lowlight/tests/Android.bp b/libs/dream/lowlight/tests/Android.bp index 42547832133b..d3e101681ef2 100644 --- a/libs/dream/lowlight/tests/Android.bp +++ b/libs/dream/lowlight/tests/Android.bp @@ -37,9 +37,9 @@ android_test { "truth", ], libs: [ - "android.test.mock", - "android.test.base", - "android.test.runner", + "android.test.mock.stubs.system", + "android.test.base.stubs.system", + "android.test.runner.stubs.system", ], jni_libs: [ "libdexmakerjvmtiagent", diff --git a/libs/hwui/hwui/Canvas.h b/libs/hwui/hwui/Canvas.h index 4eb6918d7e9a..b6988b21333b 100644 --- a/libs/hwui/hwui/Canvas.h +++ b/libs/hwui/hwui/Canvas.h @@ -28,11 +28,9 @@ #include "pipeline/skia/AnimatedDrawables.h" #include "utils/Macros.h" -class SkAnimatedImage; enum class SkBlendMode; class SkCanvasState; class SkRRect; -class SkRuntimeShaderBuilder; class SkVertices; namespace minikin { diff --git a/libs/securebox/tests/Android.bp b/libs/securebox/tests/Android.bp index 80b501da1aa5..8429cf4116c5 100644 --- a/libs/securebox/tests/Android.bp +++ b/libs/securebox/tests/Android.bp @@ -35,9 +35,9 @@ android_test { "truth", ], libs: [ - "android.test.mock", - "android.test.base", - "android.test.runner", + "android.test.mock.stubs.system", + "android.test.base.stubs.system", + "android.test.runner.stubs.system", ], jni_libs: [ "libdexmakerjvmtiagent", diff --git a/media/java/android/media/tv/flags/media_tv.aconfig b/media/java/android/media/tv/flags/media_tv.aconfig index 93bca21f3a9d..c814c95e09d9 100644 --- a/media/java/android/media/tv/flags/media_tv.aconfig +++ b/media/java/android/media/tv/flags/media_tv.aconfig @@ -48,3 +48,11 @@ flag { description: "Tuner V4.0 APIs for Android W" bug: "320419647" } + +flag { + name: "hdmi_control_enhanced_behavior" + is_exported: true + namespace: "media_tv" + description: "Enhance HDMI-CEC power state and activeness transitions" + bug: "332780751" +} diff --git a/media/lib/tvremote/tests/Android.bp b/media/lib/tvremote/tests/Android.bp index 280c515e9a9e..83061cf14b0f 100644 --- a/media/lib/tvremote/tests/Android.bp +++ b/media/lib/tvremote/tests/Android.bp @@ -11,9 +11,9 @@ android_test { name: "TvRemoteTests", srcs: ["src/**/*.java"], libs: [ - "android.test.runner", - "android.test.base", - "com.android.media.tv.remoteprovider", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", + "com.android.media.tv.remoteprovider.impl", ], static_libs: [ "mockito-target-minus-junit4", diff --git a/media/mca/tests/Android.bp b/media/mca/tests/Android.bp index 04f083dee093..463e131f1dfd 100644 --- a/media/mca/tests/Android.bp +++ b/media/mca/tests/Android.bp @@ -10,8 +10,8 @@ package { android_test { name: "CameraEffectsTests", libs: [ - "android.test.runner", - "android.test.base", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", ], static_libs: [ "junit", diff --git a/media/packages/BluetoothMidiService/tests/unit/Android.bp b/media/packages/BluetoothMidiService/tests/unit/Android.bp index 67c7e4230f30..54d6dfc658ed 100644 --- a/media/packages/BluetoothMidiService/tests/unit/Android.bp +++ b/media/packages/BluetoothMidiService/tests/unit/Android.bp @@ -39,8 +39,8 @@ android_test { test_suites: ["device-tests"], libs: [ "framework-res", - "android.test.runner", - "android.test.base", - "android.test.mock", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", + "android.test.mock.stubs.system", ], } diff --git a/media/tests/LoudnessCodecApiTest/Android.bp b/media/tests/LoudnessCodecApiTest/Android.bp index 5ca0fc9661c2..5d1153d93b4f 100644 --- a/media/tests/LoudnessCodecApiTest/Android.bp +++ b/media/tests/LoudnessCodecApiTest/Android.bp @@ -25,3 +25,10 @@ android_test { resource_dirs: ["res"], test_suites: ["device-tests"], } + +test_module_config { + name: "LoudnessCodecApiTest_Presubmit", + base: "LoudnessCodecApiTest", + test_suites: ["device-tests"], + include_annotations: ["android.platform.test.annotations.Presubmit"], +} diff --git a/media/tests/MediaFrameworkTest/Android.bp b/media/tests/MediaFrameworkTest/Android.bp index 028c97ec51f7..571e24f16c78 100644 --- a/media/tests/MediaFrameworkTest/Android.bp +++ b/media/tests/MediaFrameworkTest/Android.bp @@ -11,9 +11,9 @@ android_test { name: "mediaframeworktest", srcs: ["**/*.java"], libs: [ - "android.test.runner", - "android.test.base", - "android.test.mock", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", + "android.test.mock.stubs.system", ], static_libs: [ "mockito-target-inline-minus-junit4", diff --git a/media/tests/MediaRouter/Android.bp b/media/tests/MediaRouter/Android.bp index d21cb9319885..e4f88a65ed1a 100644 --- a/media/tests/MediaRouter/Android.bp +++ b/media/tests/MediaRouter/Android.bp @@ -14,8 +14,8 @@ android_test { srcs: ["**/*.java"], libs: [ - "android.test.runner", - "android.test.base", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", ], static_libs: [ diff --git a/media/tests/TunerTest/Android.bp b/media/tests/TunerTest/Android.bp index 8e8816cee876..634438e72b59 100644 --- a/media/tests/TunerTest/Android.bp +++ b/media/tests/TunerTest/Android.bp @@ -13,14 +13,14 @@ android_test { srcs: ["**/*.java"], libs: [ - "android.test.runner", - "android.test.base", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", ], static_libs: [ "androidx.test.rules", "compatibility-device-util-axt", - "testng" + "testng", ], platform_apis: true, diff --git a/media/tests/projection/Android.bp b/media/tests/projection/Android.bp index fd5f19535537..94db2c02eb28 100644 --- a/media/tests/projection/Android.bp +++ b/media/tests/projection/Android.bp @@ -18,9 +18,9 @@ android_test { srcs: ["**/*.java"], libs: [ - "android.test.base", - "android.test.mock", - "android.test.runner", + "android.test.base.stubs.system", + "android.test.mock.stubs.system", + "android.test.runner.stubs.system", ], static_libs: [ diff --git a/native/android/libandroid.map.txt b/native/android/libandroid.map.txt index 346c87daec87..25c063d6ccd8 100644 --- a/native/android/libandroid.map.txt +++ b/native/android/libandroid.map.txt @@ -367,6 +367,7 @@ LIBANDROID_PLATFORM { APerformanceHint_sendHint; APerformanceHint_getThreadIds; APerformanceHint_createSessionInternal; + APerformanceHint_setUseFMQForTesting; extern "C++" { ASurfaceControl_registerSurfaceStatsListener*; ASurfaceControl_unregisterSurfaceStatsListener*; diff --git a/native/android/performance_hint.cpp b/native/android/performance_hint.cpp index e91c7a9ecda8..095d7d1145ae 100644 --- a/native/android/performance_hint.cpp +++ b/native/android/performance_hint.cpp @@ -16,10 +16,14 @@ #define LOG_TAG "perf_hint" +#include <aidl/android/hardware/power/ChannelConfig.h> +#include <aidl/android/hardware/power/ChannelMessage.h> +#include <aidl/android/hardware/power/SessionConfig.h> #include <aidl/android/hardware/power/SessionHint.h> #include <aidl/android/hardware/power/SessionMode.h> #include <aidl/android/hardware/power/SessionTag.h> #include <aidl/android/hardware/power/WorkDuration.h> +#include <aidl/android/hardware/power/WorkDurationFixedV1.h> #include <aidl/android/os/IHintManager.h> #include <aidl/android/os/IHintSession.h> #include <android-base/stringprintf.h> @@ -28,6 +32,8 @@ #include <android/binder_status.h> #include <android/performance_hint.h> #include <android/trace.h> +#include <android_os.h> +#include <fmq/AidlMessageQueue.h> #include <inttypes.h> #include <performance_hint_private.h> #include <utils/SystemClock.h> @@ -45,6 +51,10 @@ using namespace std::chrono_literals; // Namespace for AIDL types coming from the PowerHAL namespace hal = aidl::android::hardware::power; +using ::aidl::android::hardware::common::fmq::SynchronizedReadWrite; +using HalChannelMessageContents = hal::ChannelMessage::ChannelMessageContents; +using HalMessageQueue = ::android::AidlMessageQueue<hal::ChannelMessage, SynchronizedReadWrite>; +using HalFlagQueue = ::android::AidlMessageQueue<int8_t, SynchronizedReadWrite>; using android::base::StringPrintf; struct APerformanceHintSession; @@ -54,18 +64,60 @@ struct AWorkDuration : public hal::WorkDuration {}; // Shared lock for the whole PerformanceHintManager and sessions static std::mutex sHintMutex = std::mutex{}; +class FMQWrapper { +public: + bool isActive(); + bool isSupported(); + bool startChannel(IHintManager* manager); + void stopChannel(IHintManager* manager); + // Number of elements the FMQ can hold + bool reportActualWorkDurations(std::optional<hal::SessionConfig>& config, + hal::WorkDuration* durations, size_t count) REQUIRES(sHintMutex); + bool updateTargetWorkDuration(std::optional<hal::SessionConfig>& config, + int64_t targetDurationNanos) REQUIRES(sHintMutex); + bool sendHint(std::optional<hal::SessionConfig>& config, SessionHint hint) REQUIRES(sHintMutex); + bool setMode(std::optional<hal::SessionConfig>& config, hal::SessionMode, bool enabled) + REQUIRES(sHintMutex); + void setToken(ndk::SpAIBinder& token); + void attemptWake(); + void setUnsupported(); + +private: + template <HalChannelMessageContents::Tag T, bool urgent = false, + class C = HalChannelMessageContents::_at<T>> + bool sendMessages(std::optional<hal::SessionConfig>& config, C* message, size_t count = 1) + REQUIRES(sHintMutex); + template <HalChannelMessageContents::Tag T, class C = HalChannelMessageContents::_at<T>> + void writeBuffer(C* message, hal::SessionConfig& config, size_t count) REQUIRES(sHintMutex); + + bool isActiveLocked() REQUIRES(sHintMutex); + bool updatePersistentTransaction() REQUIRES(sHintMutex); + std::shared_ptr<HalMessageQueue> mQueue GUARDED_BY(sHintMutex) = nullptr; + std::shared_ptr<HalFlagQueue> mFlagQueue GUARDED_BY(sHintMutex) = nullptr; + // android::hardware::EventFlag* mEventFlag GUARDED_BY(sHintMutex) = nullptr; + android::hardware::EventFlag* mEventFlag = nullptr; + int32_t mWriteMask; + ndk::SpAIBinder mToken = nullptr; + // Used to track if operating on the fmq consistently fails + bool mCorrupted = false; + // Used to keep a persistent transaction open with FMQ to reduce latency a bit + size_t mAvailableSlots GUARDED_BY(sHintMutex) = 0; + bool mHalSupported = true; + HalMessageQueue::MemTransaction mFmqTransaction GUARDED_BY(sHintMutex); +}; struct APerformanceHintManager { public: static APerformanceHintManager* getInstance(); - APerformanceHintManager(std::shared_ptr<IHintManager> service, int64_t preferredRateNanos); + APerformanceHintManager(std::shared_ptr<IHintManager>& service, int64_t preferredRateNanos); APerformanceHintManager() = delete; - ~APerformanceHintManager() = default; + ~APerformanceHintManager(); APerformanceHintSession* createSession(const int32_t* threadIds, size_t size, int64_t initialTargetWorkDurationNanos, hal::SessionTag tag = hal::SessionTag::APP); int64_t getPreferredRateNanos() const; + FMQWrapper& getFMQWrapper(); private: // Necessary to create an empty binder object @@ -83,6 +135,7 @@ private: std::shared_ptr<IHintManager> mHintManager; ndk::SpAIBinder mToken; const int64_t mPreferredRateNanos; + FMQWrapper mFMQWrapper; }; struct APerformanceHintSession { @@ -121,40 +174,57 @@ private: std::vector<int64_t> mLastHintSentTimestamp GUARDED_BY(sHintMutex); // Cached samples std::vector<hal::WorkDuration> mActualWorkDurations GUARDED_BY(sHintMutex); - std::string mSessionName GUARDED_BY(sHintMutex); + std::string mSessionName; static int64_t sIDCounter GUARDED_BY(sHintMutex); // The most recent set of thread IDs std::vector<int32_t> mLastThreadIDs GUARDED_BY(sHintMutex); std::optional<hal::SessionConfig> mSessionConfig GUARDED_BY(sHintMutex); // Tracing helpers void traceThreads(std::vector<int32_t>& tids) REQUIRES(sHintMutex); - void tracePowerEfficient(bool powerEfficient) REQUIRES(sHintMutex); - void traceActualDuration(int64_t actualDuration) REQUIRES(sHintMutex); - void traceBatchSize(size_t batchSize) REQUIRES(sHintMutex); - void traceTargetDuration(int64_t targetDuration) REQUIRES(sHintMutex); + void tracePowerEfficient(bool powerEfficient); + void traceActualDuration(int64_t actualDuration); + void traceBatchSize(size_t batchSize); + void traceTargetDuration(int64_t targetDuration); }; static std::shared_ptr<IHintManager>* gIHintManagerForTesting = nullptr; -static APerformanceHintManager* gHintManagerForTesting = nullptr; +static std::shared_ptr<APerformanceHintManager> gHintManagerForTesting = nullptr; + +static std::optional<bool> gForceFMQEnabled = std::nullopt; + // Start above the int32 range so we don't collide with config sessions int64_t APerformanceHintSession::sIDCounter = INT32_MAX; +static FMQWrapper& getFMQ() { + return APerformanceHintManager::getInstance()->getFMQWrapper(); +} + // ===================================== APerformanceHintManager implementation -APerformanceHintManager::APerformanceHintManager(std::shared_ptr<IHintManager> manager, +APerformanceHintManager::APerformanceHintManager(std::shared_ptr<IHintManager>& manager, int64_t preferredRateNanos) : mHintManager(std::move(manager)), mPreferredRateNanos(preferredRateNanos) { static AIBinder_Class* tokenBinderClass = AIBinder_Class_define("phm_token", tokenStubOnCreate, tokenStubOnDestroy, tokenStubOnTransact); mToken = ndk::SpAIBinder(AIBinder_new(tokenBinderClass, nullptr)); + if (mFMQWrapper.isSupported()) { + mFMQWrapper.setToken(mToken); + mFMQWrapper.startChannel(mHintManager.get()); + } +} + +APerformanceHintManager::~APerformanceHintManager() { + mFMQWrapper.stopChannel(mHintManager.get()); } APerformanceHintManager* APerformanceHintManager::getInstance() { - if (gHintManagerForTesting) return gHintManagerForTesting; + if (gHintManagerForTesting) { + return gHintManagerForTesting.get(); + } if (gIHintManagerForTesting) { - APerformanceHintManager* manager = create(*gIHintManagerForTesting); - gIHintManagerForTesting = nullptr; - return manager; + gHintManagerForTesting = + std::shared_ptr<APerformanceHintManager>(create(*gIHintManagerForTesting)); + return gHintManagerForTesting.get(); } static APerformanceHintManager* instance = create(nullptr); return instance; @@ -178,7 +248,7 @@ APerformanceHintManager* APerformanceHintManager::create(std::shared_ptr<IHintMa if (preferredRateNanos <= 0) { preferredRateNanos = -1L; } - return new APerformanceHintManager(std::move(manager), preferredRateNanos); + return new APerformanceHintManager(manager, preferredRateNanos); } APerformanceHintSession* APerformanceHintManager::createSession( @@ -187,15 +257,20 @@ APerformanceHintSession* APerformanceHintManager::createSession( std::vector<int32_t> tids(threadIds, threadIds + size); std::shared_ptr<IHintSession> session; ndk::ScopedAStatus ret; - std::optional<hal::SessionConfig> sessionConfig; + hal::SessionConfig sessionConfig{.id = -1}; ret = mHintManager->createHintSessionWithConfig(mToken, tids, initialTargetWorkDurationNanos, tag, &sessionConfig, &session); if (!ret.isOk() || !session) { + ALOGE("%s: PerformanceHint cannot create session. %s", __FUNCTION__, ret.getMessage()); return nullptr; } auto out = new APerformanceHintSession(mHintManager, std::move(session), mPreferredRateNanos, - initialTargetWorkDurationNanos, sessionConfig); + initialTargetWorkDurationNanos, + sessionConfig.id == -1 + ? std::nullopt + : std::make_optional<hal::SessionConfig>( + std::move(sessionConfig))); std::scoped_lock lock(sHintMutex); out->traceThreads(tids); out->traceTargetDuration(initialTargetWorkDurationNanos); @@ -207,8 +282,15 @@ int64_t APerformanceHintManager::getPreferredRateNanos() const { return mPreferredRateNanos; } +FMQWrapper& APerformanceHintManager::getFMQWrapper() { + return mFMQWrapper; +} + // ===================================== APerformanceHintSession implementation +constexpr int kNumEnums = + ndk::enum_range<hal::SessionHint>().end() - ndk::enum_range<hal::SessionHint>().begin(); + APerformanceHintSession::APerformanceHintSession(std::shared_ptr<IHintManager> hintManager, std::shared_ptr<IHintSession> session, int64_t preferredRateNanos, @@ -220,14 +302,11 @@ APerformanceHintSession::APerformanceHintSession(std::shared_ptr<IHintManager> h mTargetDurationNanos(targetDurationNanos), mFirstTargetMetTimestamp(0), mLastTargetMetTimestamp(0), + mLastHintSentTimestamp(std::vector<int64_t>(kNumEnums, 0)), mSessionConfig(sessionConfig) { if (sessionConfig->id > INT32_MAX) { ALOGE("Session ID too large, must fit 32-bit integer"); } - std::scoped_lock lock(sHintMutex); - constexpr int numEnums = - ndk::enum_range<hal::SessionHint>().end() - ndk::enum_range<hal::SessionHint>().begin(); - mLastHintSentTimestamp = std::vector<int64_t>(numEnums, 0); int64_t traceId = sessionConfig.has_value() ? sessionConfig->id : ++sIDCounter; mSessionName = android::base::StringPrintf("ADPF Session %" PRId64, traceId); } @@ -244,19 +323,18 @@ int APerformanceHintSession::updateTargetWorkDuration(int64_t targetDurationNano ALOGE("%s: targetDurationNanos must be positive", __FUNCTION__); return EINVAL; } - { - std::scoped_lock lock(sHintMutex); - if (mTargetDurationNanos == targetDurationNanos) { - return 0; - } + std::scoped_lock lock(sHintMutex); + if (mTargetDurationNanos == targetDurationNanos) { + return 0; } - ndk::ScopedAStatus ret = mHintSession->updateTargetWorkDuration(targetDurationNanos); - if (!ret.isOk()) { - ALOGE("%s: HintSession updateTargetWorkDuration failed: %s", __FUNCTION__, - ret.getMessage()); - return EPIPE; + if (!getFMQ().updateTargetWorkDuration(mSessionConfig, targetDurationNanos)) { + ndk::ScopedAStatus ret = mHintSession->updateTargetWorkDuration(targetDurationNanos); + if (!ret.isOk()) { + ALOGE("%s: HintSession updateTargetWorkDuration failed: %s", __FUNCTION__, + ret.getMessage()); + return EPIPE; + } } - std::scoped_lock lock(sHintMutex); mTargetDurationNanos = targetDurationNanos; /** * Most of the workload is target_duration dependent, so now clear the cached samples @@ -292,11 +370,13 @@ int APerformanceHintSession::sendHint(SessionHint hint) { return 0; } - ndk::ScopedAStatus ret = mHintSession->sendHint(hint); + if (!getFMQ().sendHint(mSessionConfig, hint)) { + ndk::ScopedAStatus ret = mHintSession->sendHint(hint); - if (!ret.isOk()) { - ALOGE("%s: HintSession sendHint failed: %s", __FUNCTION__, ret.getMessage()); - return EPIPE; + if (!ret.isOk()) { + ALOGE("%s: HintSession sendHint failed: %s", __FUNCTION__, ret.getMessage()); + return EPIPE; + } } mLastHintSentTimestamp[hint] = now; return 0; @@ -369,10 +449,10 @@ int APerformanceHintSession::reportActualWorkDuration(AWorkDuration* workDuratio int APerformanceHintSession::reportActualWorkDurationInternal(AWorkDuration* workDuration) { int64_t actualTotalDurationNanos = workDuration->durationNanos; + traceActualDuration(workDuration->durationNanos); int64_t now = uptimeNanos(); workDuration->timeStampNanos = now; std::scoped_lock lock(sHintMutex); - traceActualDuration(workDuration->durationNanos); mActualWorkDurations.push_back(std::move(*workDuration)); if (actualTotalDurationNanos >= mTargetDurationNanos) { @@ -396,20 +476,177 @@ int APerformanceHintSession::reportActualWorkDurationInternal(AWorkDuration* wor mLastTargetMetTimestamp = now; } - ndk::ScopedAStatus ret = mHintSession->reportActualWorkDuration2(mActualWorkDurations); - if (!ret.isOk()) { - ALOGE("%s: HintSession reportActualWorkDuration failed: %s", __FUNCTION__, - ret.getMessage()); - mFirstTargetMetTimestamp = 0; - mLastTargetMetTimestamp = 0; - traceBatchSize(mActualWorkDurations.size()); - return ret.getExceptionCode() == EX_ILLEGAL_ARGUMENT ? EINVAL : EPIPE; + if (!getFMQ().reportActualWorkDurations(mSessionConfig, mActualWorkDurations.data(), + mActualWorkDurations.size())) { + ndk::ScopedAStatus ret = mHintSession->reportActualWorkDuration2(mActualWorkDurations); + if (!ret.isOk()) { + ALOGE("%s: HintSession reportActualWorkDuration failed: %s", __FUNCTION__, + ret.getMessage()); + mFirstTargetMetTimestamp = 0; + mLastTargetMetTimestamp = 0; + traceBatchSize(mActualWorkDurations.size()); + return ret.getExceptionCode() == EX_ILLEGAL_ARGUMENT ? EINVAL : EPIPE; + } } + mActualWorkDurations.clear(); traceBatchSize(0); return 0; } + +// ===================================== FMQ wrapper implementation + +bool FMQWrapper::isActive() { + std::scoped_lock lock{sHintMutex}; + return isActiveLocked(); +} + +bool FMQWrapper::isActiveLocked() { + return mQueue != nullptr; +} + +void FMQWrapper::setUnsupported() { + mHalSupported = false; +} + +bool FMQWrapper::isSupported() { + if (!mHalSupported) { + return false; + } + // Used for testing + if (gForceFMQEnabled.has_value()) { + return *gForceFMQEnabled; + } + return android::os::adpf_use_fmq_channel_fixed(); +} + +bool FMQWrapper::startChannel(IHintManager* manager) { + if (isSupported() && !isActive()) { + std::optional<hal::ChannelConfig> config; + auto ret = manager->getSessionChannel(mToken, &config); + if (ret.isOk() && config.has_value()) { + std::scoped_lock lock{sHintMutex}; + mQueue = std::make_shared<HalMessageQueue>(config->channelDescriptor, true); + if (config->eventFlagDescriptor.has_value()) { + mFlagQueue = std::make_shared<HalFlagQueue>(*config->eventFlagDescriptor, true); + android::hardware::EventFlag::createEventFlag(mFlagQueue->getEventFlagWord(), + &mEventFlag); + mWriteMask = config->writeFlagBitmask; + } + updatePersistentTransaction(); + } else if (ret.isOk() && !config.has_value()) { + ALOGV("FMQ channel enabled but unsupported."); + setUnsupported(); + } else { + ALOGE("%s: FMQ channel initialization failed: %s", __FUNCTION__, ret.getMessage()); + } + } + return isActive(); +} + +void FMQWrapper::stopChannel(IHintManager* manager) { + { + std::scoped_lock lock{sHintMutex}; + if (!isActiveLocked()) { + return; + } + mFlagQueue = nullptr; + mQueue = nullptr; + } + manager->closeSessionChannel(); +} + +template <HalChannelMessageContents::Tag T, class C> +void FMQWrapper::writeBuffer(C* message, hal::SessionConfig& config, size_t) { + new (mFmqTransaction.getSlot(0)) hal::ChannelMessage{ + .sessionID = static_cast<int32_t>(config.id), + .timeStampNanos = ::android::uptimeNanos(), + .data = HalChannelMessageContents::make<T, C>(std::move(*message)), + }; +} + +template <> +void FMQWrapper::writeBuffer<HalChannelMessageContents::workDuration>(hal::WorkDuration* messages, + hal::SessionConfig& config, + size_t count) { + for (size_t i = 0; i < count; ++i) { + hal::WorkDuration& message = messages[i]; + new (mFmqTransaction.getSlot(i)) hal::ChannelMessage{ + .sessionID = static_cast<int32_t>(config.id), + .timeStampNanos = + (i == count - 1) ? ::android::uptimeNanos() : message.timeStampNanos, + .data = HalChannelMessageContents::make<HalChannelMessageContents::workDuration, + hal::WorkDurationFixedV1>({ + .durationNanos = message.cpuDurationNanos, + .workPeriodStartTimestampNanos = message.workPeriodStartTimestampNanos, + .cpuDurationNanos = message.cpuDurationNanos, + .gpuDurationNanos = message.gpuDurationNanos, + }), + }; + } +} + +template <HalChannelMessageContents::Tag T, bool urgent, class C> +bool FMQWrapper::sendMessages(std::optional<hal::SessionConfig>& config, C* message, size_t count) { + if (!isActiveLocked() || !config.has_value() || mCorrupted) { + return false; + } + // If we didn't reserve enough space, try re-creating the transaction + if (count > mAvailableSlots) { + if (!updatePersistentTransaction()) { + return false; + } + // If we actually don't have enough space, give up + if (count > mAvailableSlots) { + return false; + } + } + writeBuffer<T, C>(message, *config, count); + mQueue->commitWrite(count); + mEventFlag->wake(mWriteMask); + // Re-create the persistent transaction after writing + updatePersistentTransaction(); + return true; +} + +void FMQWrapper::setToken(ndk::SpAIBinder& token) { + mToken = token; +} + +bool FMQWrapper::updatePersistentTransaction() { + mAvailableSlots = mQueue->availableToWrite(); + if (mAvailableSlots > 0 && !mQueue->beginWrite(mAvailableSlots, &mFmqTransaction)) { + ALOGE("ADPF FMQ became corrupted, falling back to binder calls!"); + mCorrupted = true; + return false; + } + return true; +} + +bool FMQWrapper::reportActualWorkDurations(std::optional<hal::SessionConfig>& config, + hal::WorkDuration* durations, size_t count) { + return sendMessages<HalChannelMessageContents::workDuration>(config, durations, count); +} + +bool FMQWrapper::updateTargetWorkDuration(std::optional<hal::SessionConfig>& config, + int64_t targetDurationNanos) { + return sendMessages<HalChannelMessageContents::targetDuration>(config, &targetDurationNanos); +} + +bool FMQWrapper::sendHint(std::optional<hal::SessionConfig>& config, SessionHint hint) { + return sendMessages<HalChannelMessageContents::hint>(config, + reinterpret_cast<hal::SessionHint*>( + &hint)); +} + +bool FMQWrapper::setMode(std::optional<hal::SessionConfig>& config, hal::SessionMode mode, + bool enabled) { + hal::ChannelMessage::ChannelMessageContents::SessionModeSetter modeObj{.modeInt = mode, + .enabled = enabled}; + return sendMessages<HalChannelMessageContents::mode, true>(config, &modeObj); +} + // ===================================== Tracing helpers void APerformanceHintSession::traceThreads(std::vector<int32_t>& tids) { @@ -585,7 +822,12 @@ void AWorkDuration_setActualGpuDurationNanos(AWorkDuration* aWorkDuration, } void APerformanceHint_setIHintManagerForTesting(void* iManager) { - delete gHintManagerForTesting; - gHintManagerForTesting = nullptr; + if (iManager == nullptr) { + gHintManagerForTesting = nullptr; + } gIHintManagerForTesting = static_cast<std::shared_ptr<IHintManager>*>(iManager); } + +void APerformanceHint_setUseFMQForTesting(bool enabled) { + gForceFMQEnabled = enabled; +} diff --git a/native/android/tests/performance_hint/Android.bp b/native/android/tests/performance_hint/Android.bp index 608d5d8a923a..f6f1da1eed79 100644 --- a/native/android/tests/performance_hint/Android.bp +++ b/native/android/tests/performance_hint/Android.bp @@ -36,10 +36,13 @@ cc_test { srcs: ["PerformanceHintNativeTest.cpp"], shared_libs: [ + "android.hardware.common.fmq-V1-ndk", "libandroid", - "liblog", "libbinder", "libbinder_ndk", + "libcutils", + "libfmq", + "liblog", "libpowermanager", "libutils", ], @@ -56,8 +59,8 @@ cc_test { ], cflags: [ - "-Werror", "-Wall", + "-Werror", ], header_libs: [ diff --git a/native/android/tests/performance_hint/PerformanceHintNativeTest.cpp b/native/android/tests/performance_hint/PerformanceHintNativeTest.cpp index d19fa98f1171..9de3a6f525e6 100644 --- a/native/android/tests/performance_hint/PerformanceHintNativeTest.cpp +++ b/native/android/tests/performance_hint/PerformanceHintNativeTest.cpp @@ -24,6 +24,7 @@ #include <android/binder_manager.h> #include <android/binder_status.h> #include <android/performance_hint.h> +#include <fmq/AidlMessageQueue.h> #include <gmock/gmock.h> #include <gtest/gtest.h> #include <performance_hint_private.h> @@ -31,11 +32,16 @@ #include <memory> #include <vector> +using namespace std::chrono_literals; namespace hal = aidl::android::hardware::power; using aidl::android::os::IHintManager; using aidl::android::os::IHintSession; using ndk::ScopedAStatus; using ndk::SpAIBinder; +using HalChannelMessageContents = hal::ChannelMessage::ChannelMessageContents; + +using ::aidl::android::hardware::common::fmq::SynchronizedReadWrite; +using HalFlagQueue = ::android::AidlMessageQueue<int8_t, SynchronizedReadWrite>; using namespace android; using namespace testing; @@ -44,7 +50,7 @@ class MockIHintManager : public IHintManager { public: MOCK_METHOD(ScopedAStatus, createHintSessionWithConfig, (const SpAIBinder& token, const ::std::vector<int32_t>& tids, int64_t durationNanos, - hal::SessionTag tag, std::optional<hal::SessionConfig>* config, + hal::SessionTag tag, hal::SessionConfig* config, std::shared_ptr<IHintSession>* _aidl_return), (override)); MOCK_METHOD(ScopedAStatus, getHintSessionPreferredRate, (int64_t * _aidl_return), (override)); @@ -56,7 +62,9 @@ public: (const std::shared_ptr<IHintSession>& hintSession, ::std::vector<int32_t>* tids), (override)); MOCK_METHOD(ScopedAStatus, getSessionChannel, - (const ::ndk::SpAIBinder& in_token, hal::ChannelConfig* _aidl_return), (override)); + (const ::ndk::SpAIBinder& in_token, + std::optional<hal::ChannelConfig>* _aidl_return), + (override)); MOCK_METHOD(ScopedAStatus, closeSessionChannel, (), (override)); MOCK_METHOD(SpAIBinder, asBinder, (), (override)); MOCK_METHOD(bool, isRemote, (), (override)); @@ -92,10 +100,12 @@ public: } APerformanceHintManager* createManager() { + APerformanceHint_setUseFMQForTesting(mUsingFMQ); ON_CALL(*mMockIHintManager, getHintSessionPreferredRate(_)) .WillByDefault(DoAll(SetArgPointee<0>(123L), [] { return ScopedAStatus::ok(); })); return APerformanceHint_getManager(); } + APerformanceHintSession* createSession(APerformanceHintManager* manager, int64_t targetDuration = 56789L, bool isHwui = false) { mMockSession = ndk::SharedRefBase::make<NiceMock<MockIHintSession>>(); @@ -106,8 +116,7 @@ public: ON_CALL(*mMockIHintManager, createHintSessionWithConfig(_, Eq(tids), Eq(targetDuration), _, _, _)) - .WillByDefault(DoAll(SetArgPointee<4>(std::make_optional<hal::SessionConfig>( - {.id = sessionId})), + .WillByDefault(DoAll(SetArgPointee<4>(hal::SessionConfig({.id = sessionId})), SetArgPointee<5>(std::shared_ptr<IHintSession>(mMockSession)), [] { return ScopedAStatus::ok(); })); @@ -133,8 +142,47 @@ public: return APerformanceHint_createSession(manager, tids.data(), tids.size(), targetDuration); } + void setFMQEnabled(bool enabled) { + mUsingFMQ = enabled; + if (enabled) { + mMockFMQ = std::make_shared< + AidlMessageQueue<hal::ChannelMessage, SynchronizedReadWrite>>(kMockQueueSize, + true); + mMockFlagQueue = + std::make_shared<AidlMessageQueue<int8_t, SynchronizedReadWrite>>(1, true); + hardware::EventFlag::createEventFlag(mMockFlagQueue->getEventFlagWord(), &mEventFlag); + + ON_CALL(*mMockIHintManager, getSessionChannel(_, _)) + .WillByDefault([&](ndk::SpAIBinder, std::optional<hal::ChannelConfig>* config) { + config->emplace( + hal::ChannelConfig{.channelDescriptor = mMockFMQ->dupeDesc(), + .eventFlagDescriptor = + mMockFlagQueue->dupeDesc(), + .readFlagBitmask = + static_cast<int32_t>(mReadBits), + .writeFlagBitmask = + static_cast<int32_t>(mWriteBits)}); + return ::ndk::ScopedAStatus::ok(); + }); + } + } + uint32_t mReadBits = 0x00000001; + uint32_t mWriteBits = 0x00000002; std::shared_ptr<NiceMock<MockIHintManager>> mMockIHintManager = nullptr; std::shared_ptr<NiceMock<MockIHintSession>> mMockSession = nullptr; + std::shared_ptr<AidlMessageQueue<hal::ChannelMessage, SynchronizedReadWrite>> mMockFMQ; + std::shared_ptr<AidlMessageQueue<int8_t, SynchronizedReadWrite>> mMockFlagQueue; + hardware::EventFlag* mEventFlag; + int kMockQueueSize = 20; + bool mUsingFMQ = false; + + template <HalChannelMessageContents::Tag T, class C = HalChannelMessageContents::_at<T>> + void expectToReadFromFmq(C expected) { + hal::ChannelMessage readData; + mMockFMQ->readBlocking(&readData, 1, mReadBits, mWriteBits, 1000000000, mEventFlag); + C got = static_cast<C>(readData.data.get<T>()); + ASSERT_EQ(got, expected); + } }; bool equalsWithoutTimestamp(hal::WorkDuration lhs, hal::WorkDuration rhs) { @@ -306,7 +354,7 @@ TEST_F(PerformanceHintTest, TestAPerformanceHint_reportActualWorkDuration2) { actualWorkDurations.push_back(pair.duration); EXPECT_CALL(*mMockSession, reportActualWorkDuration2(WorkDurationEq(actualWorkDurations))) - .Times(Exactly(1)); + .Times(Exactly(pair.expectedResult == OK)); result = APerformanceHint_reportActualWorkDuration2(session, reinterpret_cast<AWorkDuration*>( &pair.duration)); @@ -327,3 +375,48 @@ TEST_F(PerformanceHintTest, TestAWorkDuration) { AWorkDuration_setActualGpuDurationNanos(aWorkDuration, 8); AWorkDuration_release(aWorkDuration); } + +TEST_F(PerformanceHintTest, TestCreateUsingFMQ) { + setFMQEnabled(true); + APerformanceHintManager* manager = createManager(); + APerformanceHintSession* session = createSession(manager); + ASSERT_TRUE(session); +} + +TEST_F(PerformanceHintTest, TestUpdateTargetWorkDurationUsingFMQ) { + setFMQEnabled(true); + APerformanceHintManager* manager = createManager(); + APerformanceHintSession* session = createSession(manager); + APerformanceHint_updateTargetWorkDuration(session, 456); + expectToReadFromFmq<HalChannelMessageContents::Tag::targetDuration>(456); +} + +TEST_F(PerformanceHintTest, TestSendHintUsingFMQ) { + setFMQEnabled(true); + APerformanceHintManager* manager = createManager(); + APerformanceHintSession* session = createSession(manager); + APerformanceHint_sendHint(session, SessionHint::CPU_LOAD_UP); + expectToReadFromFmq<HalChannelMessageContents::Tag::hint>(hal::SessionHint::CPU_LOAD_UP); +} + +TEST_F(PerformanceHintTest, TestReportActualUsingFMQ) { + setFMQEnabled(true); + APerformanceHintManager* manager = createManager(); + APerformanceHintSession* session = createSession(manager); + hal::WorkDuration duration{.timeStampNanos = 3, + .durationNanos = 999999, + .workPeriodStartTimestampNanos = 1, + .cpuDurationNanos = 999999, + .gpuDurationNanos = 999999}; + + hal::WorkDurationFixedV1 durationExpected{ + .durationNanos = duration.durationNanos, + .workPeriodStartTimestampNanos = duration.workPeriodStartTimestampNanos, + .cpuDurationNanos = duration.cpuDurationNanos, + .gpuDurationNanos = duration.gpuDurationNanos, + }; + + APerformanceHint_reportActualWorkDuration2(session, + reinterpret_cast<AWorkDuration*>(&duration)); + expectToReadFromFmq<HalChannelMessageContents::Tag::workDuration>(durationExpected); +} diff --git a/nfc/Android.bp b/nfc/Android.bp index 0282e6f5c246..db3dcb0631dd 100644 --- a/nfc/Android.bp +++ b/nfc/Android.bp @@ -38,8 +38,8 @@ java_sdk_library { name: "framework-nfc", libs: [ "unsupportedappusage", // for android.compat.annotation.UnsupportedAppUsage - "framework-permission-s", - "framework-permission", + "framework-permission-s.stubs.module_lib", + "framework-permission.stubs.module_lib", ], static_libs: [ "android.nfc.flags-aconfig-java", diff --git a/nfc/tests/Android.bp b/nfc/tests/Android.bp index 6ebc03cc6ffc..bfa814d149f0 100644 --- a/nfc/tests/Android.bp +++ b/nfc/tests/Android.bp @@ -32,7 +32,7 @@ android_test { ], libs: [ "framework-nfc.impl", - "android.test.runner", + "android.test.runner.stubs.system", ], srcs: ["src/**/*.java"], platform_apis: true, diff --git a/packages/CarrierDefaultApp/tests/unit/Android.bp b/packages/CarrierDefaultApp/tests/unit/Android.bp index 0d08ec6ca2b3..bec81ad5f92e 100644 --- a/packages/CarrierDefaultApp/tests/unit/Android.bp +++ b/packages/CarrierDefaultApp/tests/unit/Android.bp @@ -25,8 +25,8 @@ android_test { name: "CarrierDefaultAppUnitTests", certificate: "platform", libs: [ - "android.test.runner", - "android.test.base", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", "SlicePurchaseController", ], static_libs: [ diff --git a/packages/CompanionDeviceManager/res/values-es-rUS/strings.xml b/packages/CompanionDeviceManager/res/values-es-rUS/strings.xml index 4df836511a94..63d57c40aa5a 100644 --- a/packages/CompanionDeviceManager/res/values-es-rUS/strings.xml +++ b/packages/CompanionDeviceManager/res/values-es-rUS/strings.xml @@ -52,7 +52,7 @@ <string name="permission_contacts" msgid="3858319347208004438">"Contactos"</string> <string name="permission_calendar" msgid="6805668388691290395">"Calendario"</string> <string name="permission_microphone" msgid="2152206421428732949">"Micrófono"</string> - <string name="permission_call_logs" msgid="5546761417694586041">"Registros de llamadas"</string> + <string name="permission_call_logs" msgid="5546761417694586041">"Llamadas"</string> <string name="permission_nearby_devices" msgid="7530973297737123481">"Dispositivos cercanos"</string> <string name="permission_media_routing_control" msgid="5498639511586715253">"Cambiar la salida multimedia"</string> <string name="permission_storage" msgid="6831099350839392343">"Fotos y contenido multimedia"</string> diff --git a/packages/CredentialManager/tests/robotests/Android.bp b/packages/CredentialManager/tests/robotests/Android.bp index 75a0dcce0b9e..27afaaa49fdd 100644 --- a/packages/CredentialManager/tests/robotests/Android.bp +++ b/packages/CredentialManager/tests/robotests/Android.bp @@ -48,9 +48,9 @@ android_robolectric_test { "flag-junit-base", ], libs: [ - "android.test.runner", - "android.test.base", - "android.test.mock", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", + "android.test.mock.stubs.system", "truth", ], upstream: true, diff --git a/packages/ExternalStorageProvider/tests/Android.bp b/packages/ExternalStorageProvider/tests/Android.bp index 097bb8603877..56348b77e679 100644 --- a/packages/ExternalStorageProvider/tests/Android.bp +++ b/packages/ExternalStorageProvider/tests/Android.bp @@ -21,9 +21,9 @@ android_test { ], libs: [ - "android.test.base", - "android.test.mock", - "android.test.runner", + "android.test.base.stubs.system", + "android.test.mock.stubs.system", + "android.test.runner.stubs.system", ], static_libs: [ diff --git a/packages/FusedLocation/Android.bp b/packages/FusedLocation/Android.bp index 61a82701d155..719aa28a4e30 100644 --- a/packages/FusedLocation/Android.bp +++ b/packages/FusedLocation/Android.bp @@ -35,7 +35,7 @@ android_app { name: "FusedLocation", defaults: ["platform_app_defaults"], srcs: ["src/**/*.java"], - libs: ["com.android.location.provider"], + libs: ["com.android.location.provider.impl"], platform_apis: true, certificate: "platform", privileged: true, @@ -50,9 +50,9 @@ android_test { "src/**/*.java", // include real sources because we're forced to test this directly ], libs: [ - "android.test.base", - "android.test.runner", - "com.android.location.provider", + "android.test.base.stubs.system", + "android.test.runner.stubs.system", + "com.android.location.provider.impl", ], static_libs: [ "androidx.test.core", diff --git a/packages/PrintSpooler/res/values-or/strings.xml b/packages/PrintSpooler/res/values-or/strings.xml index a29f320cabdd..4aca0a49aee5 100644 --- a/packages/PrintSpooler/res/values-or/strings.xml +++ b/packages/PrintSpooler/res/values-or/strings.xml @@ -40,7 +40,7 @@ <string name="print_dialog" msgid="32628687461331979">"ପ୍ରିଣ୍ଟ ଡାୟଲଗ୍"</string> <string name="current_page_template" msgid="5145005201131935302">"<xliff:g id="CURRENT_PAGE">%1$d</xliff:g>/<xliff:g id="PAGE_COUNT">%2$d</xliff:g>"</string> <string name="page_description_template" msgid="6831239682256197161">"<xliff:g id="PAGE_COUNT">%2$d</xliff:g>ରୁ <xliff:g id="CURRENT_PAGE">%1$d</xliff:g> ପୃଷ୍ଠା"</string> - <string name="summary_template" msgid="8899734908625669193">"ସାରାଂଶ, କପୀ <xliff:g id="COPIES">%1$s</xliff:g>, କାଗଜ ଆକାର <xliff:g id="PAPER_SIZE">%2$s</xliff:g>"</string> + <string name="summary_template" msgid="8899734908625669193">"ସାରାଂଶ, କପି <xliff:g id="COPIES">%1$s</xliff:g>, କାଗଜ ଆକାର <xliff:g id="PAPER_SIZE">%2$s</xliff:g>"</string> <string name="expand_handle" msgid="7282974448109280522">"ହ୍ୟାଣ୍ଡେଲ୍ ବଡ଼ କରନ୍ତୁ"</string> <string name="collapse_handle" msgid="6886637989442507451">"ହ୍ୟାଣ୍ଡେଲ୍ ଛୋଟ କରନ୍ତୁ"</string> <string name="print_button" msgid="645164566271246268">"ପ୍ରିଣ୍ଟ କରନ୍ତୁ"</string> diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/GallerySpaEnvironment.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/GallerySpaEnvironment.kt index ffd28798d82f..83d657ef380d 100644 --- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/GallerySpaEnvironment.kt +++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/GallerySpaEnvironment.kt @@ -22,7 +22,7 @@ import com.android.settingslib.spa.framework.common.SettingsPageProviderReposito import com.android.settingslib.spa.framework.common.SpaEnvironment import com.android.settingslib.spa.framework.common.createSettingsPage import com.android.settingslib.spa.gallery.button.ActionButtonPageProvider -import com.android.settingslib.spa.gallery.card.CardPageProvider +import com.android.settingslib.spa.gallery.banner.BannerPageProvider import com.android.settingslib.spa.gallery.chart.ChartPageProvider import com.android.settingslib.spa.gallery.dialog.DialogMainPageProvider import com.android.settingslib.spa.gallery.dialog.NavDialogProvider @@ -107,7 +107,7 @@ class GallerySpaEnvironment(context: Context) : SpaEnvironment(context) { SettingsTextFieldPasswordPageProvider, SearchScaffoldPageProvider, SuwScaffoldPageProvider, - CardPageProvider, + BannerPageProvider, CopyablePageProvider, ), rootPages = listOf( diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/card/CardPageProvider.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/banner/BannerPageProvider.kt index 5dd7cafb962a..6edd9173d7e5 100644 --- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/card/CardPageProvider.kt +++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/banner/BannerPageProvider.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.settingslib.spa.gallery.card +package com.android.settingslib.spa.gallery.banner import android.os.Bundle import androidx.compose.foundation.clickable @@ -46,39 +46,39 @@ import com.android.settingslib.spa.framework.compose.navigator import com.android.settingslib.spa.framework.theme.SettingsDimension import com.android.settingslib.spa.framework.theme.SettingsTheme import com.android.settingslib.spa.gallery.R -import com.android.settingslib.spa.widget.card.CardButton -import com.android.settingslib.spa.widget.card.CardModel -import com.android.settingslib.spa.widget.card.SettingsCard -import com.android.settingslib.spa.widget.card.SettingsCardContent -import com.android.settingslib.spa.widget.card.SettingsCollapsibleCard +import com.android.settingslib.spa.widget.banner.BannerButton +import com.android.settingslib.spa.widget.banner.BannerModel +import com.android.settingslib.spa.widget.banner.SettingsBanner +import com.android.settingslib.spa.widget.banner.SettingsBannerContent +import com.android.settingslib.spa.widget.banner.SettingsCollapsibleBanner import com.android.settingslib.spa.widget.preference.Preference import com.android.settingslib.spa.widget.preference.PreferenceModel import com.android.settingslib.spa.widget.scaffold.RegularScaffold -object CardPageProvider : SettingsPageProvider { - override val name = "Card" +object BannerPageProvider : SettingsPageProvider { + override val name = "Banner" override fun getTitle(arguments: Bundle?) = TITLE @Composable override fun Page(arguments: Bundle?) { RegularScaffold(title = TITLE) { - SettingsCardWithIcon() - SettingsCardWithoutIcon() - SampleSettingsCollapsibleCard() - SampleSettingsCardContent() + SettingsBannerWithIcon() + SettingsBannerWithoutIcon() + SampleSettingsCollapsibleBanner() + SampleSettingsBannerContent() } } @Composable - private fun SettingsCardWithIcon() { - SettingsCard( - CardModel( + private fun SettingsBannerWithIcon() { + SettingsBanner( + BannerModel( title = stringResource(R.string.sample_title), text = stringResource(R.string.sample_text), imageVector = Icons.Outlined.WarningAmber, buttons = listOf( - CardButton(text = "Action") {}, + BannerButton(text = "Action") {}, ), tintColor = MaterialTheme.colorScheme.error, containerColor = MaterialTheme.colorScheme.errorContainer, @@ -87,11 +87,11 @@ object CardPageProvider : SettingsPageProvider { } @Composable - private fun SettingsCardWithoutIcon() { + private fun SettingsBannerWithoutIcon() { val sampleTitle = stringResource(R.string.sample_title) var title by remember { mutableStateOf(sampleTitle) } - SettingsCard( - CardModel( + SettingsBanner( + BannerModel( title = title, text = stringResource(R.string.sample_text), ) { title = "Clicked" } @@ -99,46 +99,46 @@ object CardPageProvider : SettingsPageProvider { } @Composable - fun SampleSettingsCollapsibleCard() { + fun SampleSettingsCollapsibleBanner() { val context = LocalContext.current var isVisible0 by rememberSaveable { mutableStateOf(true) } var isVisible1 by rememberSaveable { mutableStateOf(true) } - val cards = remember { + val banners = remember { mutableStateListOf( - CardModel( + BannerModel( title = context.getString(R.string.sample_title), text = context.getString(R.string.sample_text), imageVector = Icons.Outlined.PowerOff, isVisible = { isVisible0 }, onDismiss = { isVisible0 = false }, buttons = listOf( - CardButton(text = "Override") {}, - CardButton(text = "Learn more") {}, + BannerButton(text = "Override") {}, + BannerButton(text = "Learn more") {}, ), ), - CardModel( + BannerModel( title = context.getString(R.string.sample_title), text = context.getString(R.string.sample_text), imageVector = Icons.Outlined.Shield, isVisible = { isVisible1 }, onDismiss = { isVisible1 = false }, buttons = listOf( - CardButton(text = "Action") {}, + BannerButton(text = "Action") {}, ), ) ) } - SettingsCollapsibleCard( + SettingsCollapsibleBanner( title = "More alerts", imageVector = Icons.Outlined.Error, - models = cards.toList() + models = banners.toList() ) } @Composable - fun SampleSettingsCardContent() { - SettingsCard { - SettingsCardContent { + fun SampleSettingsBannerContent() { + SettingsBanner { + SettingsBannerContent { Box( Modifier .fillMaxWidth() @@ -148,7 +148,7 @@ object CardPageProvider : SettingsPageProvider { Text(text = "Abc") } } - SettingsCardContent { + SettingsBannerContent { Box( Modifier .fillMaxWidth() @@ -171,13 +171,13 @@ object CardPageProvider : SettingsPageProvider { } } - private const val TITLE = "Sample Card" + private const val TITLE = "Sample Banner" } @Preview @Composable -private fun CardPagePreview() { +private fun BannerPagePreview() { SettingsTheme { - CardPageProvider.Page(null) + BannerPageProvider.Page(null) } } diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/home/HomePageProvider.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/home/HomePageProvider.kt index 654719d906a9..b1558cce718a 100644 --- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/home/HomePageProvider.kt +++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/home/HomePageProvider.kt @@ -28,7 +28,7 @@ import com.android.settingslib.spa.framework.theme.SettingsTheme import com.android.settingslib.spa.gallery.R import com.android.settingslib.spa.gallery.SettingsPageProviderEnum import com.android.settingslib.spa.gallery.button.ActionButtonPageProvider -import com.android.settingslib.spa.gallery.card.CardPageProvider +import com.android.settingslib.spa.gallery.banner.BannerPageProvider import com.android.settingslib.spa.gallery.chart.ChartPageProvider import com.android.settingslib.spa.gallery.dialog.DialogMainPageProvider import com.android.settingslib.spa.gallery.editor.EditorMainPageProvider @@ -73,7 +73,7 @@ object HomePageProvider : SettingsPageProvider { ChartPageProvider.buildInjectEntry().setLink(fromPage = owner).build(), DialogMainPageProvider.buildInjectEntry().setLink(fromPage = owner).build(), EditorMainPageProvider.buildInjectEntry().setLink(fromPage = owner).build(), - CardPageProvider.buildInjectEntry().setLink(fromPage = owner).build(), + BannerPageProvider.buildInjectEntry().setLink(fromPage = owner).build(), CopyablePageProvider.buildInjectEntry().setLink(fromPage = owner).build(), ) } diff --git a/packages/SettingsLib/Spa/screenshot/robotests/Android.bp b/packages/SettingsLib/Spa/screenshot/robotests/Android.bp index c834c80ad536..f6477e2f052a 100644 --- a/packages/SettingsLib/Spa/screenshot/robotests/Android.bp +++ b/packages/SettingsLib/Spa/screenshot/robotests/Android.bp @@ -63,9 +63,9 @@ android_robolectric_test { "uiautomator-helpers", ], libs: [ - "android.test.runner", - "android.test.base", - "android.test.mock", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", + "android.test.mock.stubs.system", "truth", ], upstream: true, diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/banner/BannerModel.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/banner/BannerModel.kt new file mode 100644 index 000000000000..4ef258f24776 --- /dev/null +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/banner/BannerModel.kt @@ -0,0 +1,50 @@ +/* + * 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.settingslib.spa.widget.banner + +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.vector.ImageVector + +data class BannerButton( + val text: String, + val contentDescription: String? = null, + val onClick: () -> Unit, +) + +data class BannerModel( + val title: String, + val text: String, + val imageVector: ImageVector? = null, + val isVisible: () -> Boolean = { true }, + + /** + * A dismiss button will be displayed if this is not null. + * + * And this callback will be called when user clicks the button. + */ + val onDismiss: (() -> Unit)? = null, + + val buttons: List<BannerButton> = emptyList(), + + /** If specified, this color will be used to tint the icon and the buttons. */ + val tintColor: Color = Color.Unspecified, + + /** If specified, this color will be used to tint the icon and the buttons. */ + val containerColor: Color = Color.Unspecified, + + val onClick: (() -> Unit)? = null, +) diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/banner/SettingsBanner.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/banner/SettingsBanner.kt new file mode 100644 index 000000000000..e3f4860ee764 --- /dev/null +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/banner/SettingsBanner.kt @@ -0,0 +1,214 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settingslib.spa.widget.banner + +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.ExperimentalLayoutApi +import androidx.compose.foundation.layout.FlowRow +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.Close +import androidx.compose.material.icons.outlined.WarningAmber +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.takeOrElse +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import com.android.settingslib.spa.debug.UiModePreviews +import com.android.settingslib.spa.framework.compose.contentDescription +import com.android.settingslib.spa.framework.theme.SettingsDimension +import com.android.settingslib.spa.framework.theme.SettingsShape.CornerExtraLarge +import com.android.settingslib.spa.framework.theme.SettingsShape.CornerExtraSmall +import com.android.settingslib.spa.framework.theme.SettingsTheme +import com.android.settingslib.spa.widget.ui.SettingsBody +import com.android.settingslib.spa.widget.ui.SettingsTitle + +@Composable +fun SettingsBanner(content: @Composable ColumnScope.() -> Unit) { + Card( + shape = CornerExtraLarge, + colors = CardDefaults.cardColors( + containerColor = Color.Transparent, + ), + modifier = Modifier + .fillMaxWidth() + .padding( + horizontal = SettingsDimension.itemPaddingEnd, + vertical = SettingsDimension.itemPaddingAround, + ), + content = content, + ) +} + +@Composable +fun SettingsBannerContent( + containerColor: Color = Color.Unspecified, + content: @Composable ColumnScope.() -> Unit, +) { + Card( + shape = CornerExtraSmall, + colors = CardDefaults.cardColors( + containerColor = containerColor.takeOrElse { MaterialTheme.colorScheme.surface }, + ), + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 1.dp), + content = content, + ) +} + +@Composable +fun SettingsBanner(model: BannerModel) { + SettingsBanner { + SettingsBannerImpl(model) + } +} + +@Composable +internal fun SettingsBannerImpl(model: BannerModel) { + AnimatedVisibility(visible = model.isVisible()) { + SettingsBannerContent(containerColor = model.containerColor) { + Column( + modifier = (model.onClick?.let { Modifier.clickable(onClick = it) } ?: Modifier) + .padding( + horizontal = SettingsDimension.dialogItemPaddingHorizontal, + vertical = SettingsDimension.itemPaddingAround, + ), + verticalArrangement = Arrangement.spacedBy(SettingsDimension.itemPaddingAround) + ) { + BannerHeader(model.imageVector, model.tintColor, model.onDismiss) + SettingsTitle(model.title) + SettingsBody(model.text) + Buttons(model.buttons, model.tintColor) + } + } + } +} + +@Composable +fun BannerHeader(imageVector: ImageVector?, iconColor: Color, onDismiss: (() -> Unit)? = null) { + if (imageVector != null || onDismiss != null) { + Spacer(Modifier.height(SettingsDimension.buttonPaddingVertical)) + } + Row(Modifier.fillMaxWidth()) { + BannerIcon(imageVector, iconColor) + Spacer(modifier = Modifier.weight(1f)) + DismissButton(onDismiss) + } +} + +@Composable +private fun BannerIcon(imageVector: ImageVector?, color: Color) { + if (imageVector != null) { + Icon( + imageVector = imageVector, + contentDescription = null, + modifier = Modifier.size(SettingsDimension.itemIconSize), + tint = color.takeOrElse { MaterialTheme.colorScheme.primary }, + ) + } +} + +@Composable +private fun DismissButton(onDismiss: (() -> Unit)?) { + if (onDismiss == null) return + Surface( + shape = CircleShape, + color = MaterialTheme.colorScheme.secondaryContainer, + ) { + IconButton( + onClick = onDismiss, + modifier = Modifier.size(SettingsDimension.itemIconSize) + ) { + Icon( + imageVector = Icons.Outlined.Close, + contentDescription = stringResource( + androidx.compose.material3.R.string.m3c_snackbar_dismiss + ), + modifier = Modifier.padding(SettingsDimension.paddingSmall), + ) + } + } +} + +@OptIn(ExperimentalLayoutApi::class) +@Composable +private fun Buttons(buttons: List<BannerButton>, color: Color) { + if (buttons.isNotEmpty()) { + FlowRow( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy( + space = SettingsDimension.itemPaddingEnd, + alignment = Alignment.End, + ), + ) { + for (button in buttons) { + Button(button, color) + } + } + } else { + Spacer(Modifier.height(SettingsDimension.itemPaddingAround)) + } +} + +@Composable +private fun Button(button: BannerButton, color: Color) { + TextButton( + onClick = button.onClick, + modifier = Modifier.contentDescription(button.contentDescription), + ) { + Text(text = button.text, color = color) + } +} + +@UiModePreviews +@Composable +private fun SettingsBannerPreview() { + SettingsTheme { + SettingsBanner( + BannerModel( + title = "Lorem ipsum", + text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + imageVector = Icons.Outlined.WarningAmber, + buttons = listOf( + BannerButton(text = "Action") {}, + ) + ) + ) + } +} diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/banner/SettingsCollapsibleBanner.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/banner/SettingsCollapsibleBanner.kt new file mode 100644 index 000000000000..31a1e9cd36a8 --- /dev/null +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/banner/SettingsCollapsibleBanner.kt @@ -0,0 +1,149 @@ +/* + * 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.settingslib.spa.widget.banner + +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.Error +import androidx.compose.material.icons.outlined.PowerOff +import androidx.compose.material.icons.outlined.Shield +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.vector.ImageVector +import com.android.settingslib.spa.debug.UiModePreviews +import com.android.settingslib.spa.framework.theme.SettingsDimension +import com.android.settingslib.spa.framework.theme.SettingsShape +import com.android.settingslib.spa.framework.theme.SettingsTheme +import com.android.settingslib.spa.widget.ui.ExpandIcon +import com.android.settingslib.spa.widget.ui.SettingsDialogItem +import com.android.settingslib.spa.widget.ui.SettingsTitleSmall + +@Composable +fun SettingsCollapsibleBanner( + title: String, + imageVector: ImageVector, + models: List<BannerModel>, +) { + var expanded by rememberSaveable { mutableStateOf(false) } + SettingsBanner { + SettingsBannerContent { + Header(title, imageVector, models.count { it.isVisible() }, expanded) { expanded = it } + } + AnimatedVisibility(expanded) { + Column { + for (model in models) { + SettingsBannerImpl(model) + } + } + } + } +} + +@Composable +private fun Header( + title: String, + imageVector: ImageVector, + cardCount: Int, + expanded: Boolean, + setExpanded: (Boolean) -> Unit, +) { + Row( + modifier = Modifier + .fillMaxWidth() + .clickable { setExpanded(!expanded) } + .padding( + horizontal = SettingsDimension.itemPaddingStart, + vertical = SettingsDimension.itemPaddingVertical, + ), + horizontalArrangement = Arrangement.spacedBy(SettingsDimension.itemPaddingStart), + verticalAlignment = Alignment.CenterVertically, + ) { + Icon( + imageVector = imageVector, + contentDescription = null, + modifier = Modifier.size(SettingsDimension.itemIconSize), + tint = MaterialTheme.colorScheme.primary, + ) + Box(modifier = Modifier.weight(1f)) { + SettingsTitleSmall(title, useMediumWeight = true) + } + BannerCount(cardCount, expanded) + } +} + +@Composable +private fun BannerCount(modelSize: Int, expanded: Boolean) { + Surface( + shape = SettingsShape.CornerExtraLarge, + color = MaterialTheme.colorScheme.secondaryContainer, + ) { + Row( + modifier = Modifier.padding(SettingsDimension.paddingSmall), + verticalAlignment = Alignment.CenterVertically, + ) { + Spacer(modifier = Modifier.padding(SettingsDimension.paddingSmall)) + SettingsDialogItem(modelSize.toString()) + ExpandIcon(expanded) + } + } +} + +@UiModePreviews +@Composable +private fun SettingsCollapsibleBannerPreview() { + SettingsTheme { + SettingsCollapsibleBanner( + title = "More alerts", + imageVector = Icons.Outlined.Error, + models = listOf( + BannerModel( + title = "Lorem ipsum", + text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + imageVector = Icons.Outlined.PowerOff, + buttons = listOf( + BannerButton(text = "Action") {}, + ) + ), + BannerModel( + title = "Lorem ipsum", + text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + imageVector = Icons.Outlined.Shield, + buttons = listOf( + BannerButton(text = "Action") {}, + ) + ) + ) + ) + } +} diff --git a/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/card/SettingsCardTest.kt b/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/card/SettingsBannerTest.kt index ffc7e86665dd..a8479b01a861 100644 --- a/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/card/SettingsCardTest.kt +++ b/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/card/SettingsBannerTest.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.settingslib.spa.widget.card +package com.android.settingslib.spa.widget.banner import android.content.Context import androidx.compose.runtime.getValue @@ -35,16 +35,16 @@ import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) -class SettingsCardTest { +class SettingsBannerTest { @get:Rule val composeTestRule = createComposeRule() private val context: Context = ApplicationProvider.getApplicationContext() @Test - fun settingsCard_titleDisplayed() { + fun settingsBanner_titleDisplayed() { composeTestRule.setContent { - SettingsCard( - CardModel( + SettingsBanner( + BannerModel( title = TITLE, text = "", ) @@ -55,10 +55,10 @@ class SettingsCardTest { } @Test - fun settingsCard_textDisplayed() { + fun settingsBanner_textDisplayed() { composeTestRule.setContent { - SettingsCard( - CardModel( + SettingsBanner( + BannerModel( title = "", text = TEXT, ) @@ -69,13 +69,13 @@ class SettingsCardTest { } @Test - fun settingsCard_buttonDisplayed() { + fun settingsBanner_buttonDisplayed() { composeTestRule.setContent { - SettingsCard( - CardModel( + SettingsBanner( + BannerModel( title = "", text = "", - buttons = listOf(CardButton(text = TEXT) {}), + buttons = listOf(BannerButton(text = TEXT) {}), ) ) } @@ -84,14 +84,14 @@ class SettingsCardTest { } @Test - fun settingsCard_buttonCanBeClicked() { + fun settingsBanner_buttonCanBeClicked() { var buttonClicked = false composeTestRule.setContent { - SettingsCard( - CardModel( + SettingsBanner( + BannerModel( title = "", text = "", - buttons = listOf(CardButton(text = TEXT) { buttonClicked = true }), + buttons = listOf(BannerButton(text = TEXT) { buttonClicked = true }), ) ) } @@ -102,13 +102,13 @@ class SettingsCardTest { } @Test - fun settingsCard_buttonHaveContentDescription() { + fun settingsBanner_buttonHaveContentDescription() { composeTestRule.setContent { - SettingsCard( - CardModel( + SettingsBanner( + BannerModel( title = "", text = "", - buttons = listOf(CardButton( + buttons = listOf(BannerButton( text = TEXT, contentDescription = CONTENT_DESCRIPTION, ) {} @@ -121,11 +121,11 @@ class SettingsCardTest { } @Test - fun settingsCard_dismiss() { + fun settingsBanner_dismiss() { composeTestRule.setContent { var isVisible by remember { mutableStateOf(true) } - SettingsCard( - CardModel( + SettingsBanner( + BannerModel( title = TITLE, text = "", isVisible = { isVisible }, @@ -142,11 +142,11 @@ class SettingsCardTest { } @Test - fun settingsCard_clickable() { + fun settingsBanner_clickable() { var clicked by mutableStateOf(false) composeTestRule.setContent { - SettingsCard( - CardModel( + SettingsBanner( + BannerModel( title = TITLE, text = "", ) { clicked = true } diff --git a/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/card/SettingsCollapsibleCardTest.kt b/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/card/SettingsCollapsibleBannerTest.kt index aba9d7be1e91..1080fdea9455 100644 --- a/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/card/SettingsCollapsibleCardTest.kt +++ b/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/card/SettingsCollapsibleBannerTest.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.settingslib.spa.widget.card +package com.android.settingslib.spa.widget.banner import android.content.Context import androidx.compose.material.icons.Icons @@ -36,44 +36,44 @@ import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) -class SettingsCollapsibleCardTest { +class SettingsCollapsibleBannerTest { @get:Rule val composeTestRule = createComposeRule() private val context: Context = ApplicationProvider.getApplicationContext() @Test - fun settingsCollapsibleCard_titleDisplayed() { + fun settingsCollapsibleBanner_titleDisplayed() { setContent() composeTestRule.onNodeWithText(TITLE).assertIsDisplayed() } @Test - fun settingsCollapsibleCard_cardCountDisplayed() { + fun settingsCollapsibleBanner_BannerCountDisplayed() { setContent() composeTestRule.onNodeWithText("1").assertIsDisplayed() } @Test - fun settingsCollapsibleCard_initial_cardTextNotExists() { + fun settingsCollapsibleBanner_initial_BannerTextNotExists() { setContent() - composeTestRule.onNodeWithText(CARD_TEXT).assertDoesNotExist() + composeTestRule.onNodeWithText(Banner_TEXT).assertDoesNotExist() } @Test - fun settingsCollapsibleCard_afterExpand_cardTextDisplayed() { + fun settingsCollapsibleBanner_afterExpand_BannerTextDisplayed() { setContent() composeTestRule.onNodeWithText(TITLE).performClick() - composeTestRule.onNodeWithText(CARD_TEXT).assertIsDisplayed() + composeTestRule.onNodeWithText(Banner_TEXT).assertIsDisplayed() } @Test - fun settingsCollapsibleCard_dismiss() { + fun settingsCollapsibleBanner_dismiss() { setContent() composeTestRule.onNodeWithText(TITLE).performClick() @@ -81,20 +81,20 @@ class SettingsCollapsibleCardTest { context.getString(androidx.compose.material3.R.string.m3c_snackbar_dismiss) ).performClick() - composeTestRule.onNodeWithText(CARD_TEXT).isNotDisplayed() + composeTestRule.onNodeWithText(Banner_TEXT).isNotDisplayed() composeTestRule.onNodeWithText("0").assertIsDisplayed() } private fun setContent() { composeTestRule.setContent { var isVisible by rememberSaveable { mutableStateOf(true) } - SettingsCollapsibleCard( + SettingsCollapsibleBanner( title = TITLE, imageVector = Icons.Outlined.Error, models = listOf( - CardModel( + BannerModel( title = "", - text = CARD_TEXT, + text = Banner_TEXT, isVisible = { isVisible }, onDismiss = { isVisible = false }, ) @@ -105,6 +105,6 @@ class SettingsCollapsibleCardTest { private companion object { const val TITLE = "Title" - const val CARD_TEXT = "Card Text" + const val Banner_TEXT = "Banner Text" } } diff --git a/packages/SettingsLib/res/layout/zen_mode_condition.xml b/packages/SettingsLib/res/layout/zen_mode_condition.xml index 32221744e26f..805c81ff35dd 100644 --- a/packages/SettingsLib/res/layout/zen_mode_condition.xml +++ b/packages/SettingsLib/res/layout/zen_mode_condition.xml @@ -52,6 +52,7 @@ android:ellipsize="end" android:textAlignment="viewStart" android:maxLines="1" + android:scrollbars="none" android:textColor="?android:attr/textColorSecondary" android:textSize="14sp"/> diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml index 9c75556732b8..1963b15c21b3 100644 --- a/packages/SettingsLib/res/values-af/strings.xml +++ b/packages/SettingsLib/res/values-af/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Wekkers en onthounotas"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Laat hierdie app toe om wekkers te stel en tydsensitiewe handelinge te skeduleer. Dit laat die app op die agtergrond werk, wat meer batterykrag kan gebruik.\n\nAs hierdie toestemming af is, sal bestaande wekkers en tydgegronde geleenthede wat deur hierdie app geskeduleer is, nie werk nie."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"skedule, wekker, onthounota, horlosie"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Moenie Steur Nie"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Moenie Steur Nie"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Skakel aan"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Skakel Moenie steur nie aan"</string> diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml index 093fbbbd1b27..002d3bc17755 100644 --- a/packages/SettingsLib/res/values-am/strings.xml +++ b/packages/SettingsLib/res/values-am/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"ማንቂያዎች እና አስታዋሾች"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"ይህ መተግበሪያ ማንቂያዎችን እንዲያቀናብር እና የጊዜ ትብነት ያላቸው እርምጃዎችን መርሐግብር እንዲያስይዝ ይፍቀዱለት። ይህ መተግበሪያው ከበስተጀርባ ማሄድ እንዲችል ያስችለዋል፣ ይህም የበለጠ ባትሪ ሊጠቀም ይችላል።\n\nይህ ፈቃድ ከጠፋ በዚህ መተግበሪያ መርሐግብር የተያዘላቸው ነባር ማንቂያዎች እና ጊዜ-ተኮር ክስተቶች አይሰሩም።"</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"የጊዜ መርሐግብር፣ ማንቂያ፣ አስታዋሽ ሰዓት"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"አትረብሽ"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"አይረብሹ"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"አብራ"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"አትረብሽን አብራ"</string> diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml index a1f410984cb8..a459a8688960 100644 --- a/packages/SettingsLib/res/values-ar/strings.xml +++ b/packages/SettingsLib/res/values-ar/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"المنبّهات والتذكيرات"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"يمكنك السماح لهذا التطبيق بضبط المنبّهات وجدولة الإجراءات لتنفيذها في الوقت المناسب. ويسمح هذا الإذن بتشغيل التطبيق في الخلفية، ما قد يستهلك المزيد من البطارية.\n\nفي حال عدم تفعيل هذا الإذن، لن تعمل المنبهات المضبوطة والأحداث المستندة إلى الوقت المجدولة حاليًا في هذا التطبيق."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"جدول زمني، جدولة، منبّه، تذكير، ساعة"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"عدم الإزعاج"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"وضع \"عدم الإزعاج\""</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"تفعيل"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"تفعيل ميزة \"عدم الإزعاج\""</string> diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml index 019fb860d5fa..6f6dce75747d 100644 --- a/packages/SettingsLib/res/values-as/strings.xml +++ b/packages/SettingsLib/res/values-as/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"এলাৰ্ম আৰু ৰিমাইণ্ডাৰ"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"এই এপ্টোক এলাৰ্ম ছেট কৰিবলৈ আৰু সময় সংবেদনশীল কাৰ্যৰ সময়সূচী নিৰ্ধাৰণ কৰিবলৈ দিয়ক। ই এপ্টোক নেপথ্যত চলি থকাৰ অনুমতি দিয়ে যাৰ ফলত অধিক বেটাৰী ব্যৱহাৰ হয়।\n\nএই অনুমতিটো অফ কৰা থাকিলে, ইতিমধ্যে ছেট কৰা এলাৰ্ম আৰু এই এপ্টোৱে সময়সূচী নিৰ্ধাৰণ কৰা সময় ভিত্তিক অনুষ্ঠানসমূহে কাম নকৰা হ’ব।"</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"সময়সূচী, এলাৰ্ম, ৰিমাইণ্ডাৰ, ঘড়ী"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"অসুবিধা নিদিব ম’ড"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"অসুবিধা নিদিব"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"অন কৰক"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"অসুবিধা নিদিব অন কৰক"</string> diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml index 7f17e79b21f9..8cc67cb70500 100644 --- a/packages/SettingsLib/res/values-az/strings.xml +++ b/packages/SettingsLib/res/values-az/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Siqnallar və xatırlatmalar"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Bu tətbiqə siqnallar ayarlamağa və vaxta əsaslanan əməliyyatları planlaşdırmağa icazə verin. Bu, tətbiqin arxa fonda işləməsinə imkan verir ki, nəticədə daha çox enerji istifadə edilə bilər.\n\nBu icazə deaktiv olsa, bu tətbiq tərəfindən planlaşdırılan mövcud siqnallar və vaxta əsaslanan tədbirlər işləməyəcəkdir."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"cədvəl, siqnal, xatırlatma, saat"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Narahat etməyin"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Narahat etməyin"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Aktiv edin"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"\"Narahat Etməyin\" rejimini aktiv edin"</string> diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml index 25bf58755d8c..3688d0cbb35d 100644 --- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml +++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Alarmi i podsetnici"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Omogućite ovoj aplikaciji da podešava alarme i zakazuje vremenski osetljive radnje. To omogućava da aplikacija bude pokrenuta u pozadini, što može da troši više baterije.\n\nAko je ova dozvola isključena, postojeći alarmi i događaji zasnovani na vremenu zakazani pomoću ove aplikacije neće raditi."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"zakazati, alarm, podsetnik, sat"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Ne uznemiravaj"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Ne uznemiravaj"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Uključi"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Uključite režim Ne uznemiravaj"</string> diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml index 3a6198084f72..f4f5331cbea0 100644 --- a/packages/SettingsLib/res/values-be/strings.xml +++ b/packages/SettingsLib/res/values-be/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Будзільнікі і напаміны"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Дазвольце гэтай праграме ўключаць будзільнікі і задаваць час дзеянняў. З такім дазволам праграма можа працаваць у фонавым рэжыме і ў выніку хутчэй разраджаць акумулятар.\n\nКалі вы не ўключыце гэты дазвол, існуючыя будзільнікі і запланаваны праграмай час падзей не будуць працаваць."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"расклад, будзільнік, напамін, гадзіннік"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Не турбаваць"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Не турбаваць"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Уключыць"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Уключэнне рэжыму \"Не турбаваць\""</string> diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml index 5f0def586eb6..dd16fc91db09 100644 --- a/packages/SettingsLib/res/values-bg/strings.xml +++ b/packages/SettingsLib/res/values-bg/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Будилници и напомняния"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Разрешаване на това приложение да задава будилници и да насрочва действия, ограничени във времето. Това му позволява да работи на заден план, при което може да се използва повече батерия.\n\nАко разрешението е изключено, съществуващите будилници и събитията въз основа на времето, насрочени от приложението, няма да работят."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"график, будилник, напомняне, часовник"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Не безпокойте"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Не безпокойте"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Включване"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Включване на режима „Не безпокойте“"</string> diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml index 0c0b5690b930..6b377178bd50 100644 --- a/packages/SettingsLib/res/values-bn/strings.xml +++ b/packages/SettingsLib/res/values-bn/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"অ্যালার্ম এবং রিমাইন্ডার"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"অ্যালার্ম এবং সময়ের মধ্যে শেষ করতে হবে এমন অ্যাকশনের শিডিউল সেট করতে এই অ্যাপকে অনুমতি দিন। এর ফলে ব্যাকগ্রাউন্ডে অ্যাপ চলতে পারে, যার জন্য আরও ব্যাটারির চার্জ খরচ হতে পারে।\n\nএই অনুমতি বন্ধ করা থাকলে, আগে থেকে থাকা অ্যালার্ম এবং অ্যাপের মাধ্যমে শিডিউল করা সময় ভিত্তিক ইভেন্টের রিমাইন্ডার কাজ করবে না।"</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"শিডিউল, অ্যালার্ম, রিমাইন্ডার, ঘড়ি"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"বিরক্ত করবে না"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"বিরক্ত করবে না"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"চালু করুন"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"\'বিরক্ত করবে না\' মোড চালু করুন"</string> diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml index ea4150fc1f8b..cb71f256a48c 100644 --- a/packages/SettingsLib/res/values-bs/strings.xml +++ b/packages/SettingsLib/res/values-bs/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Alarmi i podsjetnici"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Dozvolite ovoj aplikaciji da postavlja alarme i zakazuje vremenski osjetljive radnje. Ovim će se omogućiti aplikaciji da radi u pozadini, čime se može povećati potrošnja baterije.\n\nAko je ovo odobrenje isključeno, postojeći alarmi i događaji zasnovani na vremenu, a koje je ova aplikacija zakazala, neće funkcionirati."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"raspored, alarm, podsjetnik, sat"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Ne ometaj"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Ne ometaj"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Uključi"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Uključi način rada Ne ometaj"</string> diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml index adfa6f2c044b..84eb51fedda8 100644 --- a/packages/SettingsLib/res/values-ca/strings.xml +++ b/packages/SettingsLib/res/values-ca/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Alarmes i recordatoris"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Permet que aquesta aplicació configuri alarmes i programi accions a una hora determinada. Això permet a l\'aplicació executar-se en segon pla i, per tant, és possible que consumeixi més bateria.\n\nSi aquest permís està desactivat, les alarmes i els esdeveniments que ja hagi programat l\'aplicació no funcionaran."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"programació, alarma, recordatori, rellotge"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"No molestis"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"No molestis"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Activa"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Activa el mode No molestis"</string> diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml index 96d04a8810fc..a8764b6cd9e4 100644 --- a/packages/SettingsLib/res/values-cs/strings.xml +++ b/packages/SettingsLib/res/values-cs/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Budíky a připomenutí"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Když tuto možnost povolíte, aplikace bude moci nastavovat budíky a plánovat akce závislé na čase. Aplikace poběží na pozadí, což může vést k vyšší spotřebě baterie.\n\nPokud toto oprávnění zůstane vypnuté, stávající budíky a události závislé na čase naplánované touto aplikací nebudou fungovat."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"plán, budík, připomenutí, hodiny"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Nerušit"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Nerušit"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Zapnout"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Zapněte funkci Nerušit"</string> diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml index c6a5a4392a33..697802ead227 100644 --- a/packages/SettingsLib/res/values-da/strings.xml +++ b/packages/SettingsLib/res/values-da/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Alarmer og påmindelser"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Tillad, at denne app indstiller alarmer og planlægger tidsbestemte handlinger. Appen vil køre i baggrunden, hvor den muligvis bruger mere batteri.\n\nHvis denne tilladelse er deaktiveret, vil eksisterende alarmer og tidsbestemte handlinger, der er planlagt af denne app, ikke fungere."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"planlæg, alarm, påmindelse, ur"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Forstyr ikke"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Forstyr ikke"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Aktivér"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Aktivér Forstyr ikke"</string> diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml index 88db8238ca12..cb745fca6148 100644 --- a/packages/SettingsLib/res/values-de/strings.xml +++ b/packages/SettingsLib/res/values-de/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Wecker und Erinnerungen"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Dieser App erlauben, Wecker zu stellen und zeitgebundene Aktionen zu planen. Dadurch läuft die App im Hintergrund. Dies kann den Akkuverbrauch erhöhen. \n\nWenn diese Berechtigung deaktiviert ist, funktionieren bereits gestellte Wecker und zeitgebundene Ereignisse, die von dieser App geplant sind, nicht wie erwartet."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"planen, Wecker, Erinnerung, Uhr"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Bitte nicht stören"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Bitte nicht stören"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Aktivieren"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"„Bitte nicht stören“ aktivieren"</string> diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml index 35734a933a18..89817dd59661 100644 --- a/packages/SettingsLib/res/values-el/strings.xml +++ b/packages/SettingsLib/res/values-el/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Ξυπνητήρια και υπενθυμίσεις"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Επιτρέψτε σε αυτή την εφαρμογή να ορίζει ξυπνητήρια και να προγραμματίζει ενέργειες που εξαρτώνται από τον χρόνο. Αυτό επιτρέπει στην εφαρμογή να εκτελείται στο παρασκήνιο και, ως εκ τούτου, μπορεί να καταναλώνει περισσότερη μπαταρία.\n\nΑν αυτή η άδεια δεν είναι ενεργή, τα υπάρχοντα ξυπνητήρια και συμβάντα βάσει χρόνου που έχουν προγραμματιστεί από αυτή την εφαρμογή δεν θα λειτουργούν."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"πρόγραμμα, ξυπνητήρι, υπενθύμιση, ρολόι"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Μην ενοχλείτε"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Μην ενοχλείτε"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Ενεργοποίηση"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Ενεργοποίηση λειτουργίας \"Μην ενοχλείτε\""</string> diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml index 2d034373f088..b6e41c474746 100644 --- a/packages/SettingsLib/res/values-en-rAU/strings.xml +++ b/packages/SettingsLib/res/values-en-rAU/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Alarms and reminders"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Allow this app to set alarms and schedule time-sensitive actions. This lets the app run in the background, which may use more battery.\n\nIf this permission is off, existing alarms and time-based events scheduled by this app won’t work."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"schedule, alarm, reminder, clock"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Do Not Disturb"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Do Not Disturb"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Turn on"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Turn on Do Not Disturb"</string> diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml index 2d034373f088..b6e41c474746 100644 --- a/packages/SettingsLib/res/values-en-rGB/strings.xml +++ b/packages/SettingsLib/res/values-en-rGB/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Alarms and reminders"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Allow this app to set alarms and schedule time-sensitive actions. This lets the app run in the background, which may use more battery.\n\nIf this permission is off, existing alarms and time-based events scheduled by this app won’t work."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"schedule, alarm, reminder, clock"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Do Not Disturb"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Do Not Disturb"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Turn on"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Turn on Do Not Disturb"</string> diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml index 2d034373f088..b6e41c474746 100644 --- a/packages/SettingsLib/res/values-en-rIN/strings.xml +++ b/packages/SettingsLib/res/values-en-rIN/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Alarms and reminders"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Allow this app to set alarms and schedule time-sensitive actions. This lets the app run in the background, which may use more battery.\n\nIf this permission is off, existing alarms and time-based events scheduled by this app won’t work."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"schedule, alarm, reminder, clock"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Do Not Disturb"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Do Not Disturb"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Turn on"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Turn on Do Not Disturb"</string> diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml index e4490a3e2553..8f7c4a722f1b 100644 --- a/packages/SettingsLib/res/values-et/strings.xml +++ b/packages/SettingsLib/res/values-et/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Alarmid ja meeldetuletused"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Lubage sellel rakendusel määrata alarme ja ajastada ajakriitilisi toiminguid. See võimaldab rakendusel töötada taustal, mistõttu võib akukasutus olla suurem.\n\nKui see luba on välja lülitatud, siis olemasolevad alarmid ja selle rakenduse ajastatud ajapõhised sündmused ei tööta."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"ajakava, äratus, meeldetuletus, kell"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Mitte segada"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Mitte segada"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Lülita sisse"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Valiku Mitte segada sisselülitamine"</string> diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml index 828831edd240..72855477ad25 100644 --- a/packages/SettingsLib/res/values-eu/strings.xml +++ b/packages/SettingsLib/res/values-eu/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Alarmak eta abisuak"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Eman alarmak ezartzeko eta denbora-muga duten ekintzak programatzeko baimena aplikazioari. Hala, aplikazioak atzeko planoan funtzionatuko du, eta litekeena da bateria gehiago kontsumitzea.\n\nBaimen hori ematen ez baduzu, ez dute funtzionatuko aplikazio honen bidez programatutako alarmek eta denbora-muga duten ekintzek."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"programazioa, alarma, abisua, erlojua"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Ez molestatzeko modua"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Ez molestatzeko modua"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Aktibatu"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Aktibatu ez molestatzeko modua"</string> diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml index 7858cc881db5..ff0ad1df79b6 100644 --- a/packages/SettingsLib/res/values-fa/strings.xml +++ b/packages/SettingsLib/res/values-fa/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"زنگهای ساعت و یادآوریها"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"به این برنامه اجازه میدهد زنگ ساعت تنظیم کند و کنشهای حساس به زمان را زمانبندی کند. این تنظیم به برنامه اجازه میدهد در پسزمینه اجرا شود که ممکن است باتری بیشتری مصرف کند.\n\nاگر این اجازه خاموش باشد، زنگهای ساعت موجود و رویدادهای زمانمحور که این برنامه زمانبندی کرده است کار نخواهند کرد."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"زمانبندی، زنگ ساعت، یادآوری، ساعت"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"مزاحم نشوید"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"مزاحم نشوید"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"روشن کردن"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"روشن کردن «مزاحم نشوید»"</string> diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml index 8ad343a060cf..800f327f2a39 100644 --- a/packages/SettingsLib/res/values-fi/strings.xml +++ b/packages/SettingsLib/res/values-fi/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Herätykset ja muistutukset"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Anna sovelluksen lisätä herätyksiä ja ajoittaa kiireellisiä tapahtumia. Näin sovellus voi toimia taustalla, mikä voi kuluttaa enemmän virtaa.\n\nIlman tätä lupaa sovelluksen ajoittamat herätykset ja aikaan perustuvat tapahtumat eivät toimi."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"ajoitus, herätys, muistutus, kello"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Älä häiritse"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Älä häiritse"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Ota käyttöön"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Laita Älä häiritse ‑tila päälle"</string> diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml index 2e3a6a7e6e66..f36b5f00beb3 100644 --- a/packages/SettingsLib/res/values-fr-rCA/strings.xml +++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Alarmes et rappels"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Autorisez cette appli à créer des alarmes et à programmer des actions urgentes. Cela permet à l’appli de s\'exécuter en arrière-plan, ce qui peut nécessiter plus de pile.\n\nSi cette autorisation est désactivée, les alarmes existantes et les événements en temps réel programmés par cette appli ne fonctionneront pas."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"horaire, alarme, rappel, horloge"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Ne pas déranger"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Ne pas déranger"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Activer"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Activer le mode Ne pas déranger"</string> diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml index 9bcdc97a2339..bac62f22f1fd 100644 --- a/packages/SettingsLib/res/values-gl/strings.xml +++ b/packages/SettingsLib/res/values-gl/strings.xml @@ -81,7 +81,7 @@ <string name="speed_label_fast" msgid="2677719134596044051">"Rápida"</string> <string name="speed_label_very_fast" msgid="8215718029533182439">"Moi rápida"</string> <string name="wifi_passpoint_expired" msgid="6540867261754427561">"Caducou"</string> - <string name="preference_summary_default_combination" msgid="2644094566845577901">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string> + <string name="preference_summary_default_combination" msgid="2644094566845577901">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string> <string name="bluetooth_disconnected" msgid="7739366554710388701">"Desconectado"</string> <string name="bluetooth_disconnecting" msgid="7638892134401574338">"Desconectando..."</string> <string name="bluetooth_connecting" msgid="5871702668260192755">"Conectando..."</string> @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Alarmas e recordatorios"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Permite que esta aplicación defina alarmas e planifique accións que dependan da hora. Con este permiso, a aplicación pode executarse en segundo plano, o que pode provocar un maior consumo de batería.\n\nSe este permiso está desactivado, non funcionarán as alarmas que xa se definisen nin os eventos que dependan da hora planificados por esta aplicación."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"planificar, alarma, recordatorio, reloxo"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Modo Non molestar"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Non molestar"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Activar"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Activar modo Non molestar"</string> diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml index e402ad3666db..9af8e48d818a 100644 --- a/packages/SettingsLib/res/values-gu/strings.xml +++ b/packages/SettingsLib/res/values-gu/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"અલાર્મ અને રિમાઇન્ડર"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"આ ઍપને અલાર્મ સેટ કરવા અને સમય પ્રતિ સંવેદનશીલ ક્રિયાઓ શેડ્યૂલ કરવા માટે મંજૂરી આપો. આ ઍપને બૅકગ્રાઉન્ડમાં ચાલવા દે છે, જેને કારણે બૅટરીનો વધુ વપરાશ થઈ શકે છે.\n\nજો આ પરવાનગી બંધ હોય, તો આ ઍપ દ્વારા શેડ્યૂલ કરવામાં આવેલા વર્તમાન અલાર્મ અને સમય આધારિત ઇવેન્ટ કામ કરશે નહીં."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"શેડ્યૂલ, અલાર્મ, રિમાઇન્ડર, ઘડિયાળ"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"ખલેલ પાડશો નહીં"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"ખલેલ પાડશો નહીં"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"ચાલુ કરો"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"ખલેલ પાડશો નહીં ચાલુ કરો"</string> diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml index 2e484e40ad91..785ef59df6d6 100644 --- a/packages/SettingsLib/res/values-hi/strings.xml +++ b/packages/SettingsLib/res/values-hi/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"अलार्म और रिमाइंडर"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"इस ऐप्लिकेशन को अलार्म और तय समय पर होने वाली कार्रवाइयों के रिमाइंडर सेट करने की अनुमति दें. ऐसा करने से, ऐप्लिकेशन को बैकग्राउंड में चलने की अनुमति मिलती है. इससे बैटरी ज़्यादा खर्च होती है.\n\nऐप्लिकेशन को यह अनुमति न देने पर, इसकी मदद से सेट किए गए अलार्म और तय समय पर होने वाली कार्रवाइयों के रिमाइंडर काम नहीं करेंगे."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"शेड्यूल, अलार्म, रिमाइंडर, घड़ी"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"परेशान न करें"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"परेशान न करें"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"चालू करें"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"\'परेशान न करें\' चालू करें"</string> diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml index a1c9a61efde7..107c5617998b 100644 --- a/packages/SettingsLib/res/values-hr/strings.xml +++ b/packages/SettingsLib/res/values-hr/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Alarmi i podsjetnici"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Omogućite toj aplikaciji da postavlja alarme i zakazuje radnje u točno određeno vrijeme. To aplikaciji omogućuje da se izvodi u pozadini, pa je moguća dodatna potrošnja baterije.\n\nAko je to dopuštenje isključeno, postojeći alarmi i događaji zakazani putem te aplikacije neće funkcionirati."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"raspored, alarm, podsjetnik, sat"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Ne uznemiravaj"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Ne uznemiravaj"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Uključi"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Uključite opciju Ne uznemiravaj."</string> diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml index 5ea4fdb01eac..dff22d9d3517 100644 --- a/packages/SettingsLib/res/values-hu/strings.xml +++ b/packages/SettingsLib/res/values-hu/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Ébresztések és emlékeztetők"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Lehetővé teszi ennek az alkalmazásnak, hogy ébresztéseket állítson be és időérzékeny feladatokat ütemezzen. Ezzel engedélyezi az alkalmazásnak, hogy a háttérben fusson, ami megnövekedett akkumulátorhasználattal járhat.\n\nHa ez az engedély ki van kapcsolva, az alkalmazás által beállított ébresztések és ütemezett időérzékeny események nem fognak működni."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"ütemezés, ébresztés, emlékeztető, óra"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Ne zavarjanak"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Ne zavarjanak"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Bekapcsolás"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"A Ne zavarjanak mód bekapcsolása"</string> diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml index f7b51a521532..60e5adfee7f1 100644 --- a/packages/SettingsLib/res/values-hy/strings.xml +++ b/packages/SettingsLib/res/values-hy/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Զարթուցիչներ և հիշեցումներ"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Թույլատրել այս հավելվածին զարթուցիչներ կարգավորել և որոշակի ժամանակի համար գործողություններ պլանավորել։ Այդ դեպքում հավելվածն աշխատում է ֆոնային ռեժիմում, և արդյունքում մարտկոցի լիցքն ավելի արագ է սպառվում։\n\nԵթե այս թույլտվությունն անջատված է, հավելվածի կողմից կարգավորված զարթուցիչները և գործողությունների ժամանակացույցները չեն աշխատի։"</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"ժամանակացույց, զարթուցիչ, հիշեցում, ժամացույց"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Չանհանգստացնել"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Չանհանգստացնել"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Միացնել"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Միացրեք «Չանհանգստացնել» ռեժիմը"</string> diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml index 070c16110e7b..f0b76cef02c6 100644 --- a/packages/SettingsLib/res/values-in/strings.xml +++ b/packages/SettingsLib/res/values-in/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Alarm & pengingat"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Mengizinkan aplikasi ini menyetel alarm dan menjadwalkan tindakan yang sensitif waktu. Hal ini memungkinkan aplikasi berjalan di latar belakang, sehingga mungkin menggunakan lebih banyak daya baterai.\n\nJika izin ini dinonaktifkan, alarm dan acara berbasis waktu yang dijadwalkan oleh aplikasi ini tidak akan berfungsi."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"jadwal, alarm, pengingat, jam"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Jangan Ganggu"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Jangan Ganggu"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Aktifkan"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Aktifkan mode Jangan Ganggu"</string> diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml index 5408b50cbc56..61813a392bc8 100644 --- a/packages/SettingsLib/res/values-is/strings.xml +++ b/packages/SettingsLib/res/values-is/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Vekjarar og áminningar"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Leyfa þessu forriti að stilla vekjara og áætla aðgerðir sem þurfa að eiga sér stað innan ákveðins tímaramma. Þetta leyfir forritinu að keyra í bakgrunninum sem getur notað meiri rafhlöðuorku.\n\nEf slökkt er á þessari heimild munu núverandi vekjarar og tímasettir viðburðir sem þetta forrit stillir ekki virka."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"áætlun, vekjari, áminning, klukka"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Ónáðið ekki"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Ónáðið ekki"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Kveikja"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Kveikja á „Ónáðið ekki“"</string> diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml index fce947ad4663..c0f1e8782a74 100644 --- a/packages/SettingsLib/res/values-iw/strings.xml +++ b/packages/SettingsLib/res/values-iw/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"שעונים מעוררים ותזכורות"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"ההרשאה הזו מתירה לאפליקציה להגדיר שעון מעורר ולתזמן פעולות דחופות. האפליקציה תוכל לפעול ברקע ובכך להגביר את צריכת הסוללה.\n\nאם ההרשאה מושבתת, ההתראות והאירועים מבוססי-הזמן שהוגדרו ותוזמנו על ידי האפליקציה לא יפעלו."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"תזמון, שעון מעורר, תזכורת, שעון"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"נא לא להפריע"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"נא לא להפריע"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"הפעלה"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"הפעלת מצב נא לא להפריע"</string> diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml index 41acfc02336c..71aae44b000b 100644 --- a/packages/SettingsLib/res/values-ja/strings.xml +++ b/packages/SettingsLib/res/values-ja/strings.xml @@ -477,7 +477,7 @@ <string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g>によって上書き済み"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_charging_on_hold_settings_home_page" msgid="7690464049464805856">"<xliff:g id="LEVEL">%1$s</xliff:g> - バッテリーを保護するため、充電を一時停止しています"</string> - <string name="power_incompatible_charging_settings_home_page" msgid="1322050766135126880">"<xliff:g id="LEVEL">%1$s</xliff:g> - 充電用アクセサリを確認してください"</string> + <string name="power_incompatible_charging_settings_home_page" msgid="1322050766135126880">"<xliff:g id="LEVEL">%1$s</xliff:g> - 充電用アクセサリーを確認してください"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"残り時間: 約 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> <string name="power_discharging_duration" msgid="1076561255466053220">"残り時間: 約 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>(<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="2527842780666073218">"残り時間: 約 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>(使用状況に基づく)"</string> @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"アラームとリマインダー"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"アラームの設定や時間ベースのアクション設定を、このアプリに許可します。これによりアプリがバックグラウンドで実行できるようになるため、バッテリーの使用量が増えることがあります。\n\nこの権限が OFF の場合、このアプリで設定された既存のアラームと時間ベースのイベントは機能しなくなります。"</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"スケジュール, アラーム, リマインダー, 時計"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"サイレント モード"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"サイレント モード"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"ON にする"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"サイレント モードを ON にする"</string> diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml index 58a01a452594..7801417586df 100644 --- a/packages/SettingsLib/res/values-ka/strings.xml +++ b/packages/SettingsLib/res/values-ka/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"მაღვიძარები და შეხსენებები"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"ნებას რთავს ამ აპს, დააყენოს მაღვიძარები და დაგეგმოს დროზე დამოკიდებული მოქმედებები. ეს საშუალებას აძლევს აპს, იმუშაოს ფონურად, რამაც შეიძლება ბატარეის ხარჯი გაზარდოს.\n\nთუ ეს ნებართვა გამორთულია, ამ აპით დაგეგმილი მაღვიძარები და დროზე დამოკიდებული მოვლენები არ იმუშავებს."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"განრიგი, მაღვიძარა, შეხსენება, საათი"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"არ შემაწუხოთ"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"არ შემაწუხოთ"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"ჩართვა"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"„არ შემაწუხოთ“ რეჟიმის ჩართვა"</string> diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml index 485120d17e07..2ae8250189fd 100644 --- a/packages/SettingsLib/res/values-kk/strings.xml +++ b/packages/SettingsLib/res/values-kk/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Оятқыштар мен еске салғыштар"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Бұл қолданбаға оятқыштарды орнатуға және уақытқа байланысты әрекеттерді жоспарлауға рұқсат береді. Мұндайда қолданба фондық режимде жұмыс істейді, сондықтан батарея шығыны артуы мүмкін.\n\nБұл рұқсат өшірулі болса, осы қолданбада жоспарланған ағымдағы оятқыштар мен уақытқа байланысты іс-шаралар жұмыс істемейді."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"кесте, оятқыш, еске салғыш, сағат"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Мазаламау"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Мазаламау"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Қосу"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Мазаламау режимін қосу"</string> diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml index 7fbc509e51ac..85801c9cd606 100644 --- a/packages/SettingsLib/res/values-km/strings.xml +++ b/packages/SettingsLib/res/values-km/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"ម៉ោងរោទ៍ និងការរំលឹក"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"អនុញ្ញាតឱ្យកម្មវិធីនេះកំណត់ម៉ោងរោទ៍ និងកំណត់កាលវិភាគសកម្មភាពដែលតម្រូវឱ្យទាន់ពេលវេលា។ ការធ្វើបែបនេះអនុញ្ញាតឱ្យកម្មវិធីនេះដំណើរការនៅផ្ទៃខាងក្រោយ ដែលអាចប្រើថ្មកាន់តែច្រើន។\n\nប្រសិនបើបិទការអនុញ្ញាតនេះ ម៉ោងរោទ៍ដែលមានស្រាប់ និងព្រឹត្តិការណ៍ផ្អែកលើពេលវេលាដែលកំណត់ដោយកម្មវិធីនេះនឹងមិនដំណើរការទេ។"</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"កាលវិភាគ ម៉ោងរោទ៍ ការរំលឹក នាឡិកា"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"កុំរំខាន"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"កុំរំខាន"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"បើក"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"បើកមុខងារកុំរំខាន"</string> diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml index 85075c3cedd1..6dc3ae9d2ea1 100644 --- a/packages/SettingsLib/res/values-kn/strings.xml +++ b/packages/SettingsLib/res/values-kn/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"ಅಲಾರಂಗಳು ಮತ್ತು ರಿಮೈಂಡರ್ಗಳು"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"ಅಲಾರಂಗಳನ್ನು ಹೊಂದಿಸಲು ಮತ್ತು ಸಮಯ-ಸೂಕ್ಷ್ಮವಾದ ಕ್ರಿಯೆಗಳನ್ನು ನಿಗದಿಪಡಿಸಲು ಈ ಆ್ಯಪ್ಗೆ ಅನುಮತಿಸಿ. ಇದು ಹಿನ್ನೆಲೆಯಲ್ಲಿ ರನ್ ಆಗಲು ಆ್ಯಪ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ, ಅದರಿಂದ ಹೆಚ್ಚು ಬ್ಯಾಟರಿ ಬಳಕೆಯಾಗಬಹುದು.\n\nಈ ಅನುಮತಿ ಆಫ್ ಆಗಿದ್ದರೆ, ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಅಲಾರಂಗಳು ಮತ್ತು ಈ ಆ್ಯಪ್ ನಿಗದಿಪಡಿಸಿದ ಸಮಯ-ಸೂಕ್ಷ್ಮ ಈವೆಂಟ್ಗಳು ಕೆಲಸ ಮಾಡುವುದಿಲ್ಲ."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"ವೇಳಾಪಟ್ಟಿ, ಅಲಾರಂ, ರಿಮೈಂಡರ್, ಗಡಿಯಾರ"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"ಆನ್ ಮಾಡಿ"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಅನ್ನು ಆನ್ ಮಾಡಿ"</string> diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml index 480d78f75759..14e8f4f1561b 100644 --- a/packages/SettingsLib/res/values-ko/strings.xml +++ b/packages/SettingsLib/res/values-ko/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"알람 및 리마인더"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"이 앱이 알람을 설정하고 시간 기반 작업을 예약할 수 있도록 허용합니다. 이렇게 하면 백그라운드에서 앱 실행이 허용되어 배터리 사용량이 증가할 수 있습니다.\n\n이 권한을 사용 중지하면 이 앱에서 예약한 기존의 알람 및 시간 기반 일정이 작동하지 않습니다."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"일정 예약, 알람, 리마인더, 시계"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"방해 금지 모드"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"방해 금지 모드"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"사용 설정"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"방해 금지 모드 사용 설정"</string> diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml index 1667041a3504..9ff62cf0f96a 100644 --- a/packages/SettingsLib/res/values-ky/strings.xml +++ b/packages/SettingsLib/res/values-ky/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Ойготкучтар жана эстеткичтер"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Бул колдонмого ойготкучтарды коюуга жана башка аракеттерди графикке киргизүүгө уруксат бересиз. Ушуну менен колдонмо фондо иштеп, батареяны көбүрөөк сарпташы мүмкүн.\n\nЭгер бул уруксат өчүрүлсө, колдонмодогу ойготкучтар жана графикке киргизилген башка аракеттер иштебейт."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"график, ойготкуч, эстеткич, саат"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Тынчымды алба"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Тынчымды алба"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Күйгүзүү"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"\"Тынчымды алба\" режимин күйгүзүү"</string> diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml index 2c6d6ba6f4a5..5d5a4c6188a5 100644 --- a/packages/SettingsLib/res/values-lo/strings.xml +++ b/packages/SettingsLib/res/values-lo/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"ໂມງປຸກ ແລະ ການແຈ້ງເຕືອນ"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"ອະນຸຍາດໃຫ້ແອັບນີ້ຕັ້ງໂມງປຸກ ແລະ ກຳນົດເວລາຄຳສັ່ງທີ່ເນັ້ນເລື່ອງເວລາເປັນສຳຄັນໄດ້. ນີ້ຈະເຮັດໃຫ້ແອັບເຮັດວຽກໄດ້ໃນພື້ນຫຼັງ, ເຊິ່ງອາດໃຊ້ແບັດເຕີຣີຫຼາຍຂຶ້ນ.\n\nຫາກປິດການອະນຸຍາດນີ້ໄວ້, ໂມງປຸກທີ່ມີຢູ່ກ່ອນແລ້ວ ແລະ ເຫດການທີ່ອ້າງອີງເວລາທີ່ກຳນົດໄວ້ໂດຍແອັບນີ້ຈະບໍ່ສາມາດເຮັດວຽກໄດ້."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"ກຳນົດເວລາ, ໂມງປຸກ, ການແຈ້ງເຕືອນ, ໂມງ"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"ຫ້າມລົບກວນ"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"ຫ້າມລົບກວນ"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"ເປີດ"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"ເປີດໂໝດຫ້າມລົບກວນ"</string> diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml index a6ef0783a1f7..2b0b71d368e5 100644 --- a/packages/SettingsLib/res/values-lt/strings.xml +++ b/packages/SettingsLib/res/values-lt/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Signalai ir priminimai"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Leiskite šiai programai nustatyti signalus ir suplanuoti veiksmus, kuriems svarbus laiko veiksnys. Dėl to programa gali veikti fone ir sunaudoti daugiau akumuliatoriaus energijos.\n\nJei šis leidimas išjungtas, šios programos suplanuoti esami signalai ir laiku pagrįsti įvykiai neveiks."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"tvarkaraštis, signalas, priminimas, laikrodis"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Netrukdymo režimas"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Netrukdymo režimas"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Įjungti"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Netrukdymo režimo įjungimas"</string> diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml index a1fef6404fb8..a8a4ea063cb7 100644 --- a/packages/SettingsLib/res/values-lv/strings.xml +++ b/packages/SettingsLib/res/values-lv/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Signāli un atgādinājumi"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Atļaujiet šai lietotnei iestatīt signālus un ieplānot darbības, kas jāveic konkrētā laikā. Tādējādi lietotne darbosies fonā un, iespējams, patērēs vairāk akumulatora enerģijas.\n\nJa šī atļauja nav piešķirta, esošie signāli un šīs lietotnes ieplānotie notikumi, kas jāizpilda konkrētā laikā, nedarbosies."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"ieplānot, signāls, atgādinājums, pulkstenis"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Netraucēt"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Netraucēt"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Ieslēgt"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Režīma “Netraucēt” ieslēgšana"</string> diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml index e22f67c6142a..923ea5cc046a 100644 --- a/packages/SettingsLib/res/values-mk/strings.xml +++ b/packages/SettingsLib/res/values-mk/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Аларми и потсетници"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Дозволете ѝ на апликацијава да поставува аларми и да закажува дејства со временски рокови. Ова овозможува апликацијата да работи во заднина и така може повеќе да ја троши батеријата.\n\nАко дозволава е исклучена, нема да функционираат постојните аларми и настаните според време закажани од апликацијава."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"закажување, аларм, потсетник, часовник"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Не вознемирувај"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Не вознемирувај"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Вклучи"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Исклучување на „Не вознемирувај“"</string> diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml index 0b6d3fb3444a..05579fec0a10 100644 --- a/packages/SettingsLib/res/values-ml/strings.xml +++ b/packages/SettingsLib/res/values-ml/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"അലാറങ്ങളും റിമെെൻഡറുകളും"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"അലാറങ്ങൾ സജ്ജീകരിക്കാനും സമയപ്രാധാന്യമുള്ള പ്രവർത്തനങ്ങൾ ഷെഡ്യൂൾ ചെയ്യാനും ഈ ആപ്പിനെ അനുവദിക്കുക. പശ്ചാത്തലത്തിൽ റൺ ചെയ്യാൻ ഇത് ഈ ആപ്പിന് അനുവാദം നൽകുന്നു, ഇതിന് കൂടുതൽ ബാറ്ററി ഉപയോഗിച്ചേക്കാം.\n\nഈ അനുമതി ഓഫാണെങ്കിൽ, ഈ ആപ്പ് നിലവിൽ ഷെഡ്യൂൾ ചെയ്ത അലാറങ്ങളും സമയാധിഷ്ഠിത ഇവന്റുകളും പ്രവർത്തിക്കില്ല."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"ഷെഡ്യൂൾ, അലാറം, റിമെെൻഡർ, ക്ലോക്ക്"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"ശല്യപ്പെടുത്തരുത്"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"ശല്യപ്പെടുത്തരുത്"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"ഓണാക്കുക"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"\'ശല്യപ്പെടുത്തരുത്\' ഓണാക്കുക"</string> diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml index 1ce8b0f073df..8957a2b174a1 100644 --- a/packages/SettingsLib/res/values-mn/strings.xml +++ b/packages/SettingsLib/res/values-mn/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Сэрүүлэг, сануулагч"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Энэ аппад сэрүүлэг тавих болон хугацаанд мэдрэг үйлдлийн хуваарь гаргахыг зөвшөөрнө үү. Энэ нь аппад ард ажиллахыг зөвшөөрөх бөгөөд ингэснээр илүү их батарей ашиглаж магадгүй.\n\nХэрэв энэ зөвшөөрөл унтраалттай бол энэ аппын аль хэдийн тавьсан сэрүүлэг болон хуваарь гаргасан хугацаанд мэдрэг үйл явдал ажиллахгүй."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"хуваарь, сэрүүлэг, сануулагч, цаг"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Бүү саад бол"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Бүү саад бол"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Асаах"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Бүү саад бол горимыг асаах"</string> diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml index ad67ef2b1dd8..36b967e3131f 100644 --- a/packages/SettingsLib/res/values-mr/strings.xml +++ b/packages/SettingsLib/res/values-mr/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"अलार्म आणि रिमाइंडर"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"या ॲपला अलार्म सेट करण्याची किंवा वेळेनुसार संवेदनशील असलेल्या कृती शेड्युल करण्याची अनुमती द्या. हे ॲपला बॅकग्राउंडमध्ये रन होऊ देते, ज्यामुळे जास्त बॅटरी वापरली जाऊ शकते.\n\nही परवानगी बंद असल्यास, सध्याचे अलार्म आणि या ॲपद्वारे शेड्युल केलेले वेळेवर आधारित इव्हेंट काम करणार नाहीत."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"शेड्युल, अलार्म, रिमाइंडर, घड्याळ"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"व्यत्यय आणू नका"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"व्यत्यय आणू नका"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"सुरू करा"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"व्यत्यय आणू नका सुरू करा"</string> diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml index 5bb3ba0918e8..2db04be96e21 100644 --- a/packages/SettingsLib/res/values-ms/strings.xml +++ b/packages/SettingsLib/res/values-ms/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Penggera & peringatan"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Benarkan apl ini menetapkan penggera dan menjadualkan tindakan yang sensitif masa. Hal ini membolehkan apl berjalan di latar, yang mungkin menggunakan lebih banyak bateri.\n\nJika kebenaran ini dimatikan, penggera sedia ada dan acara berdasarkan masa yang dijadualkan oleh apl ini tidak akan berfungsi."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"jadual, penggera, peringatan, jam"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Jangan Ganggu"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Jangan Ganggu"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Hidupkan"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Hidupkan Jangan Ganggu"</string> diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml index 7cce3d9193c6..660fd146e8bd 100644 --- a/packages/SettingsLib/res/values-my/strings.xml +++ b/packages/SettingsLib/res/values-my/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"နှိုးစက်နှင့် သတိပေးချက်များ"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"နှိုးစက်သတ်မှတ်ရန်နှင့် အချိန်တိကျရန် လိုအပ်သည့် လုပ်ဆောင်ချက်များအတွက် အစီအစဉ်ဆွဲရန် ဤအက်ပ်ကို ခွင့်ပြုသည်။ ၎င်းက အက်ပ်ကို နောက်ခံတွင် လုပ်ဆောင်ခွင့်ပေးပြီး ဘက်ထရီပိုသုံးနိုင်သည်။\n\nဤခွင့်ပြုချက်ကို ပိတ်ထားပါက ဤအက်ပ်ဖြင့် အစီအစဉ်ဆွဲထားသော လက်ရှိနှိုးစက်နှင့် အချိန်သတ်မှတ်ထားသည့် အစီအစဉ်များ အလုပ်လုပ်တော့မည် မဟုတ်ပါ။"</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"အချိန်ဇယား၊ နှိုးစက်၊ သတိပေးချက်၊ နာရီ"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"မနှောင့်ယှက်ရ"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"မနှောင့်ယှက်ရ"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"ဖွင့်ရန်"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"\'မနှောင့်ယှက်ရ\' ဖွင့်ခြင်း"</string> diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml index c6fbea19630d..3e5d141616b1 100644 --- a/packages/SettingsLib/res/values-nb/strings.xml +++ b/packages/SettingsLib/res/values-nb/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Alarmer og påminnelser"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Gi denne appen tillatelse til å angi alarmer og planlegge tidssensitive handlinger. Dette gir appen tillatelse til å kjøre i bakgrunnen, noe som kan bruke mer batteri.\n\nHvis denne tillatelsen er av, fungerer ikke eksisterende alarmer og tidsbaserte hendelser som er planlagt av denne appen."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"tidsplan, alarm, påminnelse, klokke"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Ikke forstyrr"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Ikke forstyrr"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Slå på"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Slå på Ikke forstyrr"</string> diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml index 5d18fd303b60..ad2888285c42 100644 --- a/packages/SettingsLib/res/values-ne/strings.xml +++ b/packages/SettingsLib/res/values-ne/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"अलार्म तथा रिमाइन्डर"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"यो एपलाई अलार्म सेट गर्ने र समयमै पूरा गर्नु पर्ने कारबाहीहरूको रुटिन बनाउने अनुमति दिनुहोस्। यो अनुमति दिइएको छ भने यो एप ब्याकग्राउन्डमा चल्छ र धेरै ब्याट्री खपत हुन्छ।\n\nयो अनुमति दिइएको छैन भने सेट गरिएका अलार्म बज्दैनन् र यो एपले तय गरेका गतिविधि चल्दैनन्।"</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"समयतालिका, अलार्म, रिमाइन्डर, घडी"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Do Not Disturb"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"बाधा नपुऱ्याउनुहोस्"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"अन गर्नुहोस्"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"बाधा नपुऱ्याउनुहोस् नामक मोडलाई अन गर्नुहोस्"</string> diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml index e457376838d3..0fcc6fecf578 100644 --- a/packages/SettingsLib/res/values-nl/strings.xml +++ b/packages/SettingsLib/res/values-nl/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Wekkers en herinneringen"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Sta toe dat deze app wekkers zet en tijdgevoelige acties plant. De app kan hierdoor op de achtergrond worden uitgevoerd, waardoor je misschien meer batterijlading verbruikt.\n\nAls dit recht uitstaat, werken door deze app geplande bestaande wekkers en tijdgebaseerde afspraken niet."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"plannen, schema, wekker, alarm, herinnering, klok"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Niet storen"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Niet storen"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Aanzetten"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Zet Niet storen aan."</string> diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml index 2f25cde51923..694d034812c8 100644 --- a/packages/SettingsLib/res/values-or/strings.xml +++ b/packages/SettingsLib/res/values-or/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"ଆଲାରାମ୍ ଏବଂ ରିମାଇଣ୍ଡରଗୁଡ଼ିକ"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"ଏହି ଆପକୁ ଆଲାରାମ୍ ସେଟ୍ କରିବାକୁ ଏବଂ ସମୟ-ସମ୍ବେଦନଶୀଳ କାର୍ଯ୍ୟଗୁଡ଼ିକୁ ସିଡୁଲ୍ କରିବାକୁ ଅନୁମତି ଦିଅନ୍ତୁ। ଏହା ଆପକୁ ପୃଷ୍ଠପଟରେ ଚାଲିବାକୁ ଦେଇଥାଏ, ଯାହା ଅଧିକ ବ୍ୟାଟେରୀ ବ୍ୟବହାର କରିପାରେ।\n\nଯଦି ଏହି ଅନୁମତି ବନ୍ଦ ଅଛି, ତେବେ ଏହି ଆପ୍ ଦ୍ୱାରା ସିଡୁଲ୍ କରାଯାଇଥିବା ପୂର୍ବରୁ ଥିବା ଆଲାରାମ୍ ଏବଂ ସମୟ-ଆଧାରିତ ଇଭେଣ୍ଟଗୁଡ଼ିକ କାମ କରିବ ନାହିଁ।"</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"ସିଡୁଲ୍, ଆଲାରାମ୍, ରିମାଇଣ୍ଡର୍, ଘଣ୍ଟା"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"ଚାଲୁ କରନ୍ତୁ"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ଅନ୍ କରନ୍ତୁ"</string> diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml index b13ef1bc3ee6..d0cf8205aa92 100644 --- a/packages/SettingsLib/res/values-pa/strings.xml +++ b/packages/SettingsLib/res/values-pa/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"ਅਲਾਰਮ ਅਤੇ ਰਿਮਾਈਂਡਰ"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"ਇਸ ਐਪ ਨੂੰ ਅਲਾਰਮ ਸੈੱਟ ਕਰਨ ਜਾਂ ਹੋਰ ਸਮਾਂ-ਸੰਵੇਦਨਸ਼ੀਲ ਕਾਰਵਾਈਆਂ ਨੂੰ ਨਿਯਤ ਕਰਨ ਦਿਓ। ਇਸ ਨਾਲ ਐਪ ਨੂੰ ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਚੱਲਣ ਦੀ ਇਜਾਜ਼ਤ ਮਿਲਦੀ ਹੈ, ਜਿਸ ਨਾਲ ਬੈਟਰੀ ਦੀ ਵਰਤੋਂ ਵੱਧ ਸਕਦੀ ਹੈ।\n\nਜੇ ਇਹ ਇਜਾਜ਼ਤ ਬੰਦ ਹੈ, ਤਾਂ ਇਸ ਐਪ ਰਾਹੀਂ ਨਿਯਤ ਕੀਤੇ ਮੌਜੂਦਾ ਅਲਾਰਮ ਅਤੇ ਸਮਾਂ-ਆਧਾਰਿਤ ਇਵੈਂਟ ਕੰਮ ਨਹੀਂ ਕਰਨਗੇ।"</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"ਸਮਾਂ-ਸੂਚੀ, ਅਲਾਰਮ, ਰਿਮਾਈਂਡਰ, ਘੜੀ"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"ਚਾਲੂ ਕਰੋ"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"\'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਨੂੰ ਚਾਲੂ ਕਰੋ"</string> diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml index 3f9077487af1..c6d78f6f9e20 100644 --- a/packages/SettingsLib/res/values-pl/strings.xml +++ b/packages/SettingsLib/res/values-pl/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Alarmy i przypomnienia"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Zezwalaj tej aplikacji na ustawianie alarmów i planowanie działań, w przypadku których czas jest istotny. Aplikacja będzie mogła działać w tle, co może zwiększyć wykorzystanie baterii.\n\nJeśli nie włączysz tego uprawnienia, istniejące alarmy i zaplanowane wydarzenia z tej aplikacji nie będą działać."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"harmonogram, alarm, przypomnienie, zegar"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Nie przeszkadzać"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Nie przeszkadzać"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Włącz"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Włącz tryb Nie przeszkadzać"</string> diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml index 00375b04521b..98bda8519c50 100644 --- a/packages/SettingsLib/res/values-pt-rBR/strings.xml +++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Alarmes e lembretes"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Permitir que o app defina alarmes e programe ações com hora marcada. Essa opção autoriza o app a ser executado em segundo plano, o que pode consumir mais bateria.\n\nSe a permissão for desativada, os alarmes e eventos programados pelo app não funcionarão."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"programar, alarme, lembrete, relógio"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Não perturbe"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Não perturbe"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Ativar"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Ativar o Não perturbe"</string> diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml index 97d2848782ec..20acb00d89e5 100644 --- a/packages/SettingsLib/res/values-pt-rPT/strings.xml +++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Alarmes e lembretes"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Permita que a app defina alarmes e agende ações com um horário específico. Esta ação permite que a app seja executada em segundo plano, o que pode usar mais bateria.\n\nSe esta autorização estiver desativada, os alarmes existentes e os eventos com base no tempo agendados por esta app não funcionam."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"agendar, alarme, lembrete, relógio"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Não incomodar"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Não incomodar"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Ativar"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Ativar o modo Não incomodar"</string> diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml index 00375b04521b..98bda8519c50 100644 --- a/packages/SettingsLib/res/values-pt/strings.xml +++ b/packages/SettingsLib/res/values-pt/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Alarmes e lembretes"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Permitir que o app defina alarmes e programe ações com hora marcada. Essa opção autoriza o app a ser executado em segundo plano, o que pode consumir mais bateria.\n\nSe a permissão for desativada, os alarmes e eventos programados pelo app não funcionarão."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"programar, alarme, lembrete, relógio"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Não perturbe"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Não perturbe"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Ativar"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Ativar o Não perturbe"</string> diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml index 900851e84aa5..a6d17c19d6c1 100644 --- a/packages/SettingsLib/res/values-ro/strings.xml +++ b/packages/SettingsLib/res/values-ro/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Alarme și mementouri"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Permite acestei aplicații să seteze alarme și să planifice acțiuni care trebuie realizate în timp scurt. Astfel, aplicația poate să ruleze în fundal, ceea ce ar putea crește consumul de baterie.\n\nDacă permisiunea este dezactivată, alarmele și evenimentele dependente de timp planificate de aplicație nu vor funcționa."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"programare, alarmă, memento, ceas"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Nu deranja"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Nu deranja"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Activează"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Activează Nu deranja"</string> diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml index db4be66c2d17..838b5eda1573 100644 --- a/packages/SettingsLib/res/values-ru/strings.xml +++ b/packages/SettingsLib/res/values-ru/strings.xml @@ -81,7 +81,7 @@ <string name="speed_label_fast" msgid="2677719134596044051">"Быстрая"</string> <string name="speed_label_very_fast" msgid="8215718029533182439">"Очень быстрая"</string> <string name="wifi_passpoint_expired" msgid="6540867261754427561">"Срок действия истек"</string> - <string name="preference_summary_default_combination" msgid="2644094566845577901">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string> + <string name="preference_summary_default_combination" msgid="2644094566845577901">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string> <string name="bluetooth_disconnected" msgid="7739366554710388701">"Нет подключения"</string> <string name="bluetooth_disconnecting" msgid="7638892134401574338">"Отключение..."</string> <string name="bluetooth_connecting" msgid="5871702668260192755">"Подключение..."</string> @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Будильники и напоминания"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Вы можете разрешить этому приложению устанавливать будильники и планировать запуск действий в определенное время. В этом случае оно будет работать в фоновом режиме и быстрее расходовать заряд батареи.\n\nЕсли отключить это разрешение, текущие будильники и созданные приложением события перестанут запускаться."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"установить, будильник, напоминание, часы"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Не беспокоить"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Не беспокоить"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Включить"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Включите режим \"Не беспокоить\""</string> diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml index d9df5eb5b737..cc7a45eb344f 100644 --- a/packages/SettingsLib/res/values-si/strings.xml +++ b/packages/SettingsLib/res/values-si/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"එලාම සහ සිහිකැඳවීම්"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"එලාම සැකසීමට සහ කාල සංවේදී ක්රියා කාලසටහන්ගත කිරීමට මෙම යෙදුමට ඉඩ දෙන්න. මෙය පසුබිමේ ධාවනය වීමට යෙදුමට ඉඩ දෙයි, එය වැඩි බැටරිය වැඩියෙන් භාවිත කළ හැකිය.\n\nමෙම අවසරය ක්රියාවිරහිත නම්, මෙම යෙදුම මඟින් සැලසුම් කර ඇති තිබෙන එලාම සහ වේලාව පදනම් කර ගත් සිදුවීම් ක්රියා නොකරනු ඇත."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"කාල සටහන, එලාමය, සිහිකැඳවීම, ඔරලෝසුව"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"බාධා නොකිරීම"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"බාධා නොකරන්න"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"ක්රියාත්මක කරන්න"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"බාධා නොකරන්න ක්රියාත්මක කරන්න"</string> diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml index c690a19b48c6..43db02b48ce9 100644 --- a/packages/SettingsLib/res/values-sk/strings.xml +++ b/packages/SettingsLib/res/values-sk/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Budíky a pripomenutia"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Povoľte tejto aplikácii nastavovať budíky a plánovať akcie s časovým obmedzením. Aplikácii to umožní pracovať na pozadí, čo môže zvýšiť spotrebu batérie.\n\nAk je toto povolenie vypnuté, existujúce budíky a udalosti s časovým obmedzením naplánované touto aplikáciou nebudú fungovať."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"plán, budík, pripomenutie, hodiny"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Režim bez vyrušení"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Režim bez vyrušení"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Zapnúť"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Zapnite režim bez vyrušení"</string> diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml index 7fa5ed1a77e0..ddd0fb235be6 100644 --- a/packages/SettingsLib/res/values-sl/strings.xml +++ b/packages/SettingsLib/res/values-sl/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Alarmi in opomniki"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Tej aplikaciji dovolite nastavljanje alarmov in načrtovanje časovno občutljivih dejanj. S tem aplikaciji omogočite izvajanje v ozadju, kar bo morda povečalo porabo energije baterije.\n\nČe je to dovoljenje izklopljeno, obstoječi alarmi in časovno občutljivi dogodki, ki jih nastavi ta aplikacija, ne bodo delovali."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"načrtovanje, urnik, alarm, opomnik, ura"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Ne moti"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Ne moti"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Vklopi"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Vklop načina »Ne moti«"</string> diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml index b64c8fd2ae99..3831cf4e3ec6 100644 --- a/packages/SettingsLib/res/values-sq/strings.xml +++ b/packages/SettingsLib/res/values-sq/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Alarmet dhe alarmet rikujtuese"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Lejo që ky aplikacion të caktojë alarmet dhe të planifikojë veprime që kanë një afat të caktuar. Kjo mundëson që aplikacioni të ekzekutohet në sfond, gjë që mund të përdorë më shumë bateri.\n\nNëse kjo leje është caktuar si joaktive, alarmet ekzistuese dhe ngjarjet në bazë kohore të planifikuara nga ky aplikacion nuk do të funksionojnë."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"planifiko, alarm, alarm rikujtues, ora"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Mos shqetëso"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Mos shqetëso"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Aktivizo"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Aktivizo \"Mos shqetëso\""</string> diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml index f9001a83d0ae..73794bd5f1be 100644 --- a/packages/SettingsLib/res/values-sr/strings.xml +++ b/packages/SettingsLib/res/values-sr/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Аларми и подсетници"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Омогућите овој апликацији да подешава аларме и заказује временски осетљиве радње. То омогућава да апликација буде покренута у позадини, што може да троши више батерије.\n\nАко је ова дозвола искључена, постојећи аларми и догађаји засновани на времену заказани помоћу ове апликације неће радити."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"заказати, аларм, подсетник, сат"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Не узнемиравај"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Не узнемиравај"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Укључи"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Укључите режим Не узнемиравај"</string> diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml index 4ca4835aef63..f47bdabaa594 100644 --- a/packages/SettingsLib/res/values-sv/strings.xml +++ b/packages/SettingsLib/res/values-sv/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Alarm och påminnelser"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Tillåt att den här appen ställer in alarm och schemalägger tidskänsliga åtgärder. Om du tillåter detta kan appen köras i bakgrunden, vilket kan dra mer batteri.\n\nOm behörigheten är inaktiverad fungerar inte befintliga alarm och tidsbaserade händelser som schemalagts av den här appen."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"schema, alarm, påminnelse, klocka"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Stör ej"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Stör ej"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Aktivera"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Aktivera Stör ej."</string> diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml index 3198d0aeeceb..02db3e13c8bf 100644 --- a/packages/SettingsLib/res/values-sw/strings.xml +++ b/packages/SettingsLib/res/values-sw/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Kengele na vikumbusho"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Ruhusu programu hii iweke kengele na ratiba za vitendo vingine vinavyotegemea wakati. Hatua hii inairuhusu programu itumike chinichini, hali inayoweza kutumia chaji nyingi ya betri.\n\nIkiwa ruhusa hii itazimwa, kengele zilizopo na ratiba za vitendo vinavyotegemea wakati zilizowekwa na programu hii hazitafanya kazi."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"ratiba, kengele, kikumbusho, saa"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Usinisumbue"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Usinisumbue"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Washa"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Washa kipengele cha Usinisumbue"</string> diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml index 108ddce90dc8..a5a96f20b8e1 100644 --- a/packages/SettingsLib/res/values-ta/strings.xml +++ b/packages/SettingsLib/res/values-ta/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"அலாரங்கள் & நினைவூட்டல்கள்"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"அலாரங்களை அமைக்கவும் குறிப்பிட்ட கால இடைவெளியில் செயல்களைத் திட்டமிடவும் இந்த ஆப்ஸை அனுமதிக்கும். இது ஆப்ஸ் பின்னணியில் இயங்குவதை அனுமதிக்கும், இதற்காக அதிக பேட்டரியைப் பயன்படுத்தக்கூடும்.\n\nஇந்த அனுமதி முடக்கப்பட்டிருந்தால் இந்த ஆப்ஸ் மூலம் திட்டமிடப்பட்ட ஏற்கெனவே அமைத்த அலாரங்களும் நேர அடிப்படையிலான நிகழ்வுகளும் வேலை செய்யாது."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"திட்டமிடல், அலாரம், நினைவூட்டல், கடிகாரம்"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"தொந்தரவு செய்ய வேண்டாம்"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"தொந்தரவு செய்யாதே"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"ஆன் செய்"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"தொந்தரவு செய்ய வேண்டாம் என்பதை ஆன் செய்யும்"</string> diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml index 48115945f6d6..5577389cafa8 100644 --- a/packages/SettingsLib/res/values-te/strings.xml +++ b/packages/SettingsLib/res/values-te/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"అలారాలు & రిమైండర్లు"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"అలారాలను సెట్ చేయడానికి, టైమ్-సెన్సిటివ్ చర్యలను షెడ్యూల్ చేయడానికి ఈ యాప్ను అనుమతించండి. ఇది యాప్ను బ్యాక్గ్రౌండ్లో రన్ అవడానికి అనుమతిస్తుంది, ఇది ఎక్కువ బ్యాటరీని ఉపయోగించవచ్చు.\n\nఈ అనుమతిని ఆఫ్ చేస్తే, ఈ యాప్ ద్వారా షెడ్యూల్ చేసినటువంటి ఇప్పటికే ఉన్న అలారాలు, టైమ్-ఆధారిత ఈవెంట్లు పనిచేయవు."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"షెడ్యూల్, అలారం, రిమైండర్, గడియారం"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"అంతరాయం కలిగించవద్దు"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"అంతరాయం కలిగించవద్దు"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"ఆన్ చేయండి"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"అంతరాయం కలిగించవద్దును ఆన్ చేయండి"</string> diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml index b33215426ccc..48087c27cf93 100644 --- a/packages/SettingsLib/res/values-th/strings.xml +++ b/packages/SettingsLib/res/values-th/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"การปลุกและการช่วยเตือน"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"อนุญาตให้แอปนี้ตั้งปลุกและกำหนดเวลาการดำเนินการที่ต้องคำนึงถึงเวลาเป็นสำคัญ สิทธิ์นี้ช่วยให้แอปทำงานในเบื้องหลังได้ จึงอาจทำให้ใช้แบตเตอรี่มากขึ้น\n\nหากปิดใช้สิทธิ์นี้ การปลุกที่มีอยู่และกิจกรรมที่ต้องคำนึงถึงเวลาเป็นสำคัญซึ่งแอปนี้กำหนดเวลาไว้จะไม่ทำงาน"</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"กำหนดเวลา การปลุก การช่วยเตือน นาฬิกา"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"ห้ามรบกวน"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"ห้ามรบกวน"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"เปิด"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"เปิด \"ห้ามรบกวน\""</string> diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml index cf88980ac483..34d51d4434e9 100644 --- a/packages/SettingsLib/res/values-tl/strings.xml +++ b/packages/SettingsLib/res/values-tl/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Mga alarm at paalala"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Payagan ang app na ito na magtakda ng mga alarm at mag-iskedyul ng mga pagkilos na may limitadong oras. Papayagan nitong tumakbo ang app sa background, na posibleng gumamit ng mas maraming baterya.\n\nKung naka-off ang pahintulot na ito, hindi gagana ang mga kasalukuyang alarm at event na nakabatay sa oras na naiskedyul ng app na ito."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"iskedyul, alarm, paalala, orasan"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Huwag Istorbohin"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Huwag Istorbohin"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"I-on"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"I-on ang Huwag Istorbohin"</string> diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml index 6cdfa2e8c79d..9b5cc2926479 100644 --- a/packages/SettingsLib/res/values-tr/strings.xml +++ b/packages/SettingsLib/res/values-tr/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Alarmlar ve hatırlatıcılar"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Bu uygulamanın alarm kurmasına ve zamana bağlı işlemler programlamasına izin verin. Bu izin, uygulamanın arka planda çalışmasına olanak sağlayarak daha fazla pil harcanmasına neden olabilir.\n\nBu izin verilmezse bu uygulama tarafından programlanmış mevcut alarmlar ve zamana bağlı etkinlikler çalışmaz."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"program, alarm, hatırlatıcı, saat"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Rahatsız Etmeyin"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Rahatsız Etmeyin"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Aç"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Rahatsız Etmeyin\'i açın"</string> diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml index 7abd4a8683fa..a3967987340f 100644 --- a/packages/SettingsLib/res/values-uk/strings.xml +++ b/packages/SettingsLib/res/values-uk/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Будильники й нагадування"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Дозволити цьому додатку налаштовувати будильники й створювати розклад дій. Додаток зможе працювати у фоновому режимі й використовувати більше заряду акумулятора.\n\nЯкщо вимкнути такий дозвіл, наявні будильники й дії, створені цим додатком, не працюватимуть."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"запланувати, будильник, нагадування, годинник"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Не турбувати"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Не турбувати"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Увімкнути"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Увімкнути режим \"Не турбувати\""</string> diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml index bf7ac583a31d..c60a58bb41ba 100644 --- a/packages/SettingsLib/res/values-ur/strings.xml +++ b/packages/SettingsLib/res/values-ur/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"الارمز اور یاد دہانیاں"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"اس ایپ کو الارمز سیٹ کرنے اور وقت کے لحاظ سے حساس کارروائیوں کو شیڈول کرنے کی اجازت دیں۔ اس سے ایپ کو پس منظر میں چلنے کی اجازت ملتی ہے، جس میں زیادہ بیٹری استعمال ہو سکتی ہے۔\n\n اگر یہ اجازت آف ہے تو موجودہ الارمز اور اس ایپ کے ذریعے شیڈول کردہ وقت پر مبنی ایونٹس کام نہیں کریں گے۔"</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"شیڈول، الارم، یاد دہانی، گھڑی"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"ڈسٹرب نہ کریں"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"ڈسٹرب نہ کریں"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"آن کریں"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"\'ڈسٹرب نہ کریں\' کو آن کریں"</string> diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml index 2418053c278a..3beb5148844d 100644 --- a/packages/SettingsLib/res/values-uz/strings.xml +++ b/packages/SettingsLib/res/values-uz/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Signal va eslatmalar"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Bu ilovaga signal oʻrnatish va vaqtga asoslangan amallarni rejalashtirishga ruxsat berish. Bunda ilovaga orqa fonda ishlashiga imkon beriladi, shu sababli batareya ortiqcha sarflanishi mumkin.\n\nAgar bu ruxsat oʻchirilsa, ushbu ilova tomonidan rejalashtirilgan mavjud signallar va vaqtga asoslangan tadbirlar ishlamaydi."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"reja, signal, eslatma, soat"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Bezovta qilinmasin"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Bezovta qilinmasin"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Yoqish"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Bezovta qilinmasin rejimini yoqing"</string> diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml index 15839b8dd2a6..d3152f4c7850 100644 --- a/packages/SettingsLib/res/values-vi/strings.xml +++ b/packages/SettingsLib/res/values-vi/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Chuông báo và lời nhắc"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Cho phép ứng dụng này đặt chuông báo và lên lịch các hành động cần chính xác về thời gian. Tùy chọn này cho phép ứng dụng chạy ở chế độ nền và có thể làm tiêu hao nhiều pin.\n\nNếu không cấp quyền này, các chuông báo và sự kiện theo thời gian do ứng dụng này lên lịch sẽ không hoạt động."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"lịch biểu, chuông báo, lời nhắc, đồng hồ"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Không làm phiền"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Không làm phiền"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Bật"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Bật chế độ Không làm phiền"</string> diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml index a2fd4eaafd0a..964c3dacafc2 100644 --- a/packages/SettingsLib/res/values-zh-rCN/strings.xml +++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"闹钟和提醒"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"允许该应用设置闹钟以及安排在特定时间执行某些操作。这项权限开启后,该应用将在后台运行,可能会消耗更多电池电量。\n\n如果您关闭此权限,该应用设置的现有闹钟将不会响起,而且该应用安排在特定时间执行的现有活动也不会执行。"</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"设置, 闹钟, 提醒, 时钟, schedule, alarm, reminder, clock"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"勿扰"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"勿扰模式"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"开启"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"开启勿扰模式"</string> diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml index bcf624e4d00e..a35b9f23667c 100644 --- a/packages/SettingsLib/res/values-zh-rHK/strings.xml +++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"鬧鐘和提醒"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"允許此應用程式設定鬧鐘及安排具時效性的操作。這讓應用程式在背景中執行,因此可能會較耗電。\n\n如果關閉此權限,此應用程式將不會在預定時間響起已設定的鬧鐘,亦不會就特定時間的活動傳送通知。"</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"日程表, 鬧鐘, 提醒, 時鐘"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"請勿騷擾"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"請勿騷擾"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"開啟"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"開啟「請勿騷擾」模式"</string> diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml index 58a1979302f6..274767b11e97 100644 --- a/packages/SettingsLib/res/values-zh-rTW/strings.xml +++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"鬧鐘和提醒"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"允許這個應用程式設定鬧鐘及安排有時效性的動作。之後應用程式可以在背景執行,並可能耗用較多電量。\n\n如果關閉這項權限,這個應用程式設定的現有鬧鐘將不會響起,系統也無法在預定的時間發出活動提醒。"</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"時間表, 鬧鐘, 提醒, 時鐘"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"零打擾"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"零打擾"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"開啟"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"開啟「零打擾」模式"</string> diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml index 28b9b0529504..9ccb2616e3ad 100644 --- a/packages/SettingsLib/res/values-zu/strings.xml +++ b/packages/SettingsLib/res/values-zu/strings.xml @@ -564,8 +564,7 @@ <string name="alarms_and_reminders_title" msgid="8819933264635406032">"Ama-alamu nezikhumbuzi"</string> <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Vumela le app isethe ama-alamu futhi ushejule izenzo zesikhathi esizwelayo. Lokhu kuvumela i-app iqhubeke ngemuva okungasebenzisa ibhethri lakho eliningi.\n\nUma le mvume ivaliwe, ama-alamu asele nemicimbi esekelwe esikhathini ehlelwe yile app ngeke kusebenze."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"ishejuli, i-alamu, isikhumbuzi, iwashi"</string> - <!-- no translation found for zen_mode_do_not_disturb_name (6798711401734798283) --> - <skip /> + <string name="zen_mode_do_not_disturb_name" msgid="6798711401734798283">"Ungaphazamisi"</string> <string name="zen_mode_settings_title" msgid="7374070457626419755">"Ungaphazamisi"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Vula"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Vula ukungaphazamisi"</string> diff --git a/packages/SettingsLib/src/com/android/settingslib/media/OWNERS b/packages/SettingsLib/src/com/android/settingslib/media/OWNERS index 7467ee1c1a7c..d58add4bb5eb 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/OWNERS +++ b/packages/SettingsLib/src/com/android/settingslib/media/OWNERS @@ -2,7 +2,6 @@ ethibodeau@google.com michaelmikhil@google.com apotapov@google.com -shaoweishen@google.com #Android Media - For minor changes and renames only. aquilescanta@google.com #{LAST_RESORT_SUGGESTION} diff --git a/packages/SettingsLib/src/com/android/settingslib/notification/modes/TestModeBuilder.java b/packages/SettingsLib/src/com/android/settingslib/notification/modes/TestModeBuilder.java index 8e0cdf8109de..712ddc8aea4b 100644 --- a/packages/SettingsLib/src/com/android/settingslib/notification/modes/TestModeBuilder.java +++ b/packages/SettingsLib/src/com/android/settingslib/notification/modes/TestModeBuilder.java @@ -85,7 +85,7 @@ public class TestModeBuilder { public TestModeBuilder(ZenMode previous) { mId = previous.getId(); - mRule = previous.getRule(); + mRule = new AutomaticZenRule.Builder(previous.getRule()).build(); mConfigZenRule = new ZenModeConfig.ZenRule(); mConfigZenRule.enabled = previous.getRule().isEnabled(); diff --git a/packages/SettingsLib/tests/integ/Android.bp b/packages/SettingsLib/tests/integ/Android.bp index 48a1af6cb0e8..03dd7122660d 100644 --- a/packages/SettingsLib/tests/integ/Android.bp +++ b/packages/SettingsLib/tests/integ/Android.bp @@ -37,10 +37,10 @@ android_test { ], libs: [ - "android.test.runner", + "android.test.runner.stubs", "telephony-common", - "android.test.base", - "android.test.mock", + "android.test.base.stubs", + "android.test.mock.stubs", "truth", ], diff --git a/packages/SettingsProvider/Android.bp b/packages/SettingsProvider/Android.bp index 3e62b7b2cf6e..c107ff5a34ce 100644 --- a/packages/SettingsProvider/Android.bp +++ b/packages/SettingsProvider/Android.bp @@ -76,8 +76,8 @@ android_test { "Harrier", ], libs: [ - "android.test.base", - "android.test.mock", + "android.test.base.stubs.system", + "android.test.mock.stubs.system", "unsupportedappusage", ], resource_dirs: [], diff --git a/packages/Shell/tests/Android.bp b/packages/Shell/tests/Android.bp index 0dc331478997..082a58942059 100644 --- a/packages/Shell/tests/Android.bp +++ b/packages/Shell/tests/Android.bp @@ -11,9 +11,9 @@ android_test { name: "ShellTests", srcs: ["src/**/*.java"], libs: [ - "android.test.runner", - "android.test.base", - "android.test.mock", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", + "android.test.mock.stubs.system", ], static_libs: [ "androidx.test.rules", @@ -26,3 +26,10 @@ android_test { instrumentation_for: "Shell", certificate: "platform", } + +test_module_config { + name: "ShellTests_android_server_os", + base: "ShellTests", + test_suites: ["device-tests"], + exclude_annotations: ["androidx.test.filters.LargeTest"], +} diff --git a/packages/SystemUI/Android.bp b/packages/SystemUI/Android.bp index a9e81c77acad..be4e9a14b043 100644 --- a/packages/SystemUI/Android.bp +++ b/packages/SystemUI/Android.bp @@ -805,9 +805,9 @@ android_library { "androidx.test.rules", ], libs: [ - "android.test.runner", - "android.test.base", - "android.test.mock", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", + "android.test.mock.stubs.system", "keepanno-annotations", ], kotlincflags: [ @@ -897,9 +897,9 @@ android_robolectric_test { "androidx.compose.runtime_runtime", ], libs: [ - "android.test.runner", - "android.test.base", - "android.test.mock", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", + "android.test.mock.stubs.system", "truth", ], @@ -972,9 +972,9 @@ android_ravenwood_test { "androidx.compose.runtime_runtime", ], libs: [ - "android.test.runner", - "android.test.base", - "android.test.mock", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", + "android.test.mock.stubs.system", ], auto_gen_config: true, plugins: [ diff --git a/packages/SystemUI/accessibility/accessibilitymenu/tests/Android.bp b/packages/SystemUI/accessibility/accessibilitymenu/tests/Android.bp index 9d5a2e0dba4b..a48476744eeb 100644 --- a/packages/SystemUI/accessibility/accessibilitymenu/tests/Android.bp +++ b/packages/SystemUI/accessibility/accessibilitymenu/tests/Android.bp @@ -24,8 +24,8 @@ android_test { use_resource_processor: true, certificate: "platform", libs: [ - "android.test.runner", - "android.test.base", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", ], static_libs: [ "androidx.test.core", diff --git a/packages/SystemUI/aconfig/systemui.aconfig b/packages/SystemUI/aconfig/systemui.aconfig index ad14035d9d0a..02e8cd6c398d 100644 --- a/packages/SystemUI/aconfig/systemui.aconfig +++ b/packages/SystemUI/aconfig/systemui.aconfig @@ -247,13 +247,6 @@ flag { } flag { - name: "haptic_brightness_slider" - namespace: "systemui" - description: "Adds haptic feedback to the brightness slider." - bug: "296467915" -} - -flag { name: "unfold_animation_background_progress" namespace: "systemui" description: "Moves unfold animation progress calculation to a background thread" @@ -1401,4 +1394,4 @@ flag { namespace: "systemui" description: "Allow non-touchscreen devices to bypass falsing" bug: "319809270" -}
\ No newline at end of file +} diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/PinBouncer.kt b/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/PinBouncer.kt index 480e4e47ecf0..1287993081fa 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/PinBouncer.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/PinBouncer.kt @@ -17,6 +17,7 @@ package com.android.systemui.bouncer.ui.composable import android.view.HapticFeedbackConstants +import android.view.MotionEvent import androidx.compose.animation.animateColorAsState import androidx.compose.animation.core.Animatable import androidx.compose.animation.core.AnimationSpec @@ -49,6 +50,7 @@ import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.geometry.CornerRadius import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.graphicsLayer +import androidx.compose.ui.input.pointer.pointerInteropFilter import androidx.compose.ui.platform.LocalView import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp @@ -110,6 +112,7 @@ fun PinPad( onClicked = viewModel::onPinButtonClicked, scaling = buttonScaleAnimatables[index]::value, isAnimationEnabled = isDigitButtonAnimationEnabled, + onPointerDown = viewModel::onDigitButtonDown, ) } @@ -133,6 +136,7 @@ fun PinPad( onClicked = viewModel::onPinButtonClicked, scaling = buttonScaleAnimatables[10]::value, isAnimationEnabled = isDigitButtonAnimationEnabled, + onPointerDown = viewModel::onDigitButtonDown ) ActionButton( @@ -155,6 +159,7 @@ private fun DigitButton( digit: Int, isInputEnabled: Boolean, onClicked: (Int) -> Unit, + onPointerDown: () -> Unit, scaling: () -> Float, isAnimationEnabled: Boolean, ) { @@ -164,6 +169,7 @@ private fun DigitButton( backgroundColor = MaterialTheme.colorScheme.surfaceVariant, foregroundColor = MaterialTheme.colorScheme.onSurfaceVariant, isAnimationEnabled = isAnimationEnabled, + onPointerDown = onPointerDown, modifier = Modifier.graphicsLayer { val scale = if (isAnimationEnabled) scaling() else 1f @@ -235,6 +241,7 @@ private fun PinPadButton( isAnimationEnabled: Boolean, modifier: Modifier = Modifier, onLongPressed: (() -> Unit)? = null, + onPointerDown: (() -> Unit)? = null, content: @Composable (contentColor: () -> Color) -> Unit, ) { val interactionSource = remember { MutableInteractionSource() } @@ -303,11 +310,17 @@ private fun PinPadButton( .clip(CircleShape) .thenIf(isEnabled) { Modifier.combinedClickable( - interactionSource = interactionSource, - indication = indication, - onClick = onClicked, - onLongClick = onLongPressed - ) + interactionSource = interactionSource, + indication = indication, + onClick = onClicked, + onLongClick = onLongPressed + ) + .pointerInteropFilter { motionEvent -> + if (motionEvent.action == MotionEvent.ACTION_DOWN) { + onPointerDown?.let { it() } + } + false + } }, ) { content(contentColor::value) diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalHub.kt b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalHub.kt index c63b29dd9051..efe0f2e815da 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalHub.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalHub.kt @@ -19,7 +19,9 @@ package com.android.systemui.communal.ui.compose import android.content.Context import android.content.res.Configuration import android.graphics.drawable.Icon +import android.os.SystemClock import android.util.SizeF +import android.view.MotionEvent import android.widget.FrameLayout import android.widget.RemoteViews import androidx.annotation.VisibleForTesting @@ -40,6 +42,7 @@ import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.focusable import androidx.compose.foundation.gestures.awaitFirstDown +import androidx.compose.foundation.gestures.detectHorizontalDragGestures import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -1389,17 +1392,35 @@ private fun TutorialContent(modifier: Modifier = Modifier) { @Composable private fun Umo(viewModel: BaseCommunalViewModel, modifier: Modifier = Modifier) { AndroidView( - modifier = modifier, - factory = { - viewModel.mediaHost.hostView.layoutParams = - FrameLayout.LayoutParams( - FrameLayout.LayoutParams.MATCH_PARENT, - FrameLayout.LayoutParams.MATCH_PARENT - ) + modifier = + modifier.pointerInput(Unit) { + detectHorizontalDragGestures { change, _ -> + change.consume() + val upTime = SystemClock.uptimeMillis() + val event = + MotionEvent.obtain( + upTime, + upTime, + MotionEvent.ACTION_MOVE, + change.position.x, + change.position.y, + 0 + ) + viewModel.mediaHost.hostView.dispatchTouchEvent(event) + event.recycle() + } + }, + factory = { _ -> + viewModel.mediaHost.hostView.apply { + layoutParams = + FrameLayout.LayoutParams( + FrameLayout.LayoutParams.MATCH_PARENT, + FrameLayout.LayoutParams.MATCH_PARENT + ) + } viewModel.mediaHost.hostView }, - // For reusing composition in lazy lists. - onReset = {}, + onReset = {} ) } 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 8d5189eb34e9..2a2c2fc4934e 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 @@ -21,12 +21,16 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.layout.Layout +import androidx.compose.ui.res.dimensionResource +import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.IntRect import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.android.compose.animation.scene.SceneScope @@ -42,6 +46,7 @@ import com.android.systemui.keyguard.ui.composable.section.SettingsMenuSection import com.android.systemui.keyguard.ui.composable.section.StatusBarSection import com.android.systemui.keyguard.ui.composable.section.TopAreaSection import com.android.systemui.keyguard.ui.viewmodel.LockscreenContentViewModel +import com.android.systemui.res.R import java.util.Optional import javax.inject.Inject import kotlin.math.roundToInt @@ -117,7 +122,7 @@ constructor( with(notificationSection) { Notifications( areNotificationsVisible = areNotificationsVisible, - isShadeLayoutWide = isShadeLayoutWide, + isShadeLayoutWide = true, burnInParams = null, modifier = Modifier.fillMaxWidth(0.5f) @@ -127,13 +132,27 @@ constructor( } } } - if (!isShadeLayoutWide && !isBypassEnabled) { - with(notificationSection) { - Notifications( - areNotificationsVisible = areNotificationsVisible, - isShadeLayoutWide = isShadeLayoutWide, - burnInParams = null, - modifier = Modifier.weight(weight = 1f) + + val aodIconPadding: Dp = + dimensionResource(R.dimen.below_clock_padding_start_icons) + + with(notificationSection) { + if (!isShadeLayoutWide && !isBypassEnabled) { + Box(modifier = Modifier.weight(weight = 1f)) { + AodNotificationIcons( + modifier = + Modifier.align(alignment = Alignment.TopStart) + .padding(start = aodIconPadding), + ) + Notifications( + areNotificationsVisible = areNotificationsVisible, + isShadeLayoutWide = false, + burnInParams = null, + ) + } + } else { + AodNotificationIcons( + modifier = Modifier.padding(start = aodIconPadding), ) } } diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/NotificationSection.kt b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/NotificationSection.kt index 18e1092fba2e..6fc51e4d0f65 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/NotificationSection.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/NotificationSection.kt @@ -17,32 +17,60 @@ package com.android.systemui.keyguard.ui.composable.section import android.view.ViewGroup +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.core.MutableTransitionState +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp +import androidx.compose.ui.viewinterop.AndroidView +import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.android.compose.animation.scene.SceneScope import com.android.compose.modifiers.thenIf +import com.android.systemui.common.ui.ConfigurationState import com.android.systemui.dagger.SysUISingleton import com.android.systemui.keyguard.MigrateClocksToBlueprint +import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor +import com.android.systemui.keyguard.ui.composable.blueprint.rememberBurnIn import com.android.systemui.keyguard.ui.composable.modifier.burnInAware import com.android.systemui.keyguard.ui.viewmodel.AodBurnInViewModel import com.android.systemui.keyguard.ui.viewmodel.BurnInParameters +import com.android.systemui.keyguard.ui.viewmodel.KeyguardRootViewModel import com.android.systemui.lifecycle.rememberViewModel import com.android.systemui.notifications.ui.composable.ConstrainedNotificationStack import com.android.systemui.notifications.ui.composable.SnoozeableHeadsUpNotificationSpace +import com.android.systemui.res.R import com.android.systemui.shade.LargeScreenHeaderHelper +import com.android.systemui.statusbar.notification.icon.ui.viewbinder.AlwaysOnDisplayNotificationIconViewStore +import com.android.systemui.statusbar.notification.icon.ui.viewbinder.NotificationIconContainerViewBinder +import com.android.systemui.statusbar.notification.icon.ui.viewbinder.StatusBarIconViewBindingFailureTracker +import com.android.systemui.statusbar.notification.icon.ui.viewmodel.NotificationIconContainerAlwaysOnDisplayViewModel import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout import com.android.systemui.statusbar.notification.stack.ui.view.NotificationScrollView import com.android.systemui.statusbar.notification.stack.ui.view.SharedNotificationContainer import com.android.systemui.statusbar.notification.stack.ui.viewbinder.SharedNotificationContainerBinder import com.android.systemui.statusbar.notification.stack.ui.viewmodel.NotificationsPlaceholderViewModel import com.android.systemui.statusbar.notification.stack.ui.viewmodel.SharedNotificationContainerViewModel +import com.android.systemui.statusbar.phone.NotificationIconContainer +import com.android.systemui.statusbar.ui.SystemBarUtilsState +import com.android.systemui.util.ui.isAnimating +import com.android.systemui.util.ui.stopAnimating +import com.android.systemui.util.ui.value import dagger.Lazy import javax.inject.Inject +import kotlinx.coroutines.launch @SysUISingleton class NotificationSection @@ -55,6 +83,13 @@ constructor( sharedNotificationContainerViewModel: SharedNotificationContainerViewModel, stackScrollLayout: NotificationStackScrollLayout, sharedNotificationContainerBinder: SharedNotificationContainerBinder, + private val keyguardRootViewModel: KeyguardRootViewModel, + private val configurationState: ConfigurationState, + private val iconBindingFailureTracker: StatusBarIconViewBindingFailureTracker, + private val nicAodViewModel: NotificationIconContainerAlwaysOnDisplayViewModel, + private val nicAodIconViewStore: AlwaysOnDisplayNotificationIconViewStore, + private val systemBarUtilsState: SystemBarUtilsState, + private val clockInteractor: KeyguardClockInteractor, ) { init { @@ -80,6 +115,47 @@ constructor( } @Composable + fun AodNotificationIcons(modifier: Modifier = Modifier) { + val isVisible by + keyguardRootViewModel.isNotifIconContainerVisible.collectAsStateWithLifecycle() + val transitionState = remember { MutableTransitionState(isVisible.value) } + LaunchedEffect(key1 = isVisible, key2 = transitionState.isIdle) { + transitionState.targetState = isVisible.value + if (isVisible.isAnimating && transitionState.isIdle) { + isVisible.stopAnimating() + } + } + val burnIn = rememberBurnIn(clockInteractor) + AnimatedVisibility( + visibleState = transitionState, + enter = fadeIn(), + exit = fadeOut(), + modifier = + modifier + .height(dimensionResource(R.dimen.notification_shelf_height)) + .burnInAware(aodBurnInViewModel, burnIn.parameters), + ) { + val scope = rememberCoroutineScope() + AndroidView( + factory = { context -> + NotificationIconContainer(context, null).also { nic -> + scope.launch { + NotificationIconContainerViewBinder.bind( + nic, + nicAodViewModel, + configurationState, + systemBarUtilsState, + iconBindingFailureTracker, + nicAodIconViewStore, + ) + } + } + }, + ) + } + } + + @Composable fun SceneScope.HeadsUpNotifications() { SnoozeableHeadsUpNotificationSpace( stackScrollView = stackScrollView.get(), diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/media/controls/ui/composable/MediaContentPicker.kt b/packages/SystemUI/compose/features/src/com/android/systemui/media/controls/ui/composable/MediaContentPicker.kt index 5dccb681b041..d52323295db7 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/media/controls/ui/composable/MediaContentPicker.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/media/controls/ui/composable/MediaContentPicker.kt @@ -22,29 +22,32 @@ import com.android.compose.animation.scene.ElementKey import com.android.compose.animation.scene.SceneTransitionLayoutState import com.android.compose.animation.scene.StaticElementContentPicker import com.android.compose.animation.scene.content.state.TransitionState +import com.android.systemui.scene.shared.model.Overlays import com.android.systemui.scene.shared.model.Scenes +import com.android.systemui.shade.shared.flag.DualShade /** [ElementContentPicker] implementation for the media carousel object. */ object MediaContentPicker : StaticElementContentPicker { override val contents = setOf( + Overlays.NotificationsShade, + Overlays.QuickSettingsShade, Scenes.Lockscreen, Scenes.Shade, Scenes.QuickSettings, - Scenes.QuickSettingsShade, - Scenes.Communal + Scenes.Communal, ) override fun contentDuringTransition( element: ElementKey, transition: TransitionState.Transition, fromContentZIndex: Float, - toContentZIndex: Float + toContentZIndex: Float, ): ContentKey { return when { shouldElevateMedia(transition) -> { - Scenes.Shade + if (DualShade.isEnabled) Overlays.NotificationsShade else Scenes.Shade } transition.isTransitioningBetween(Scenes.Lockscreen, Scenes.Communal) -> { Scenes.Lockscreen @@ -52,6 +55,12 @@ object MediaContentPicker : StaticElementContentPicker { transition.isTransitioningBetween(Scenes.QuickSettings, Scenes.Shade) -> { Scenes.QuickSettings } + transition.isTransitioningBetween( + Overlays.QuickSettingsShade, + Overlays.NotificationsShade, + ) -> { + Overlays.QuickSettingsShade + } transition.toContent in contents -> transition.toContent else -> { check(transition.fromContent in contents) { @@ -65,7 +74,8 @@ object MediaContentPicker : StaticElementContentPicker { /** Returns true when the media should be laid on top of the rest for the given [transition]. */ fun shouldElevateMedia(transition: TransitionState.Transition): Boolean { - return transition.isTransitioningBetween(Scenes.Lockscreen, Scenes.Shade) + return transition.isTransitioningBetween(Scenes.Lockscreen, Scenes.Shade) || + transition.isTransitioningBetween(Scenes.Lockscreen, Overlays.NotificationsShade) } } diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainerTransitions.kt b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainerTransitions.kt index 5a350a69920b..f660808fb015 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainerTransitions.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainerTransitions.kt @@ -11,21 +11,16 @@ import com.android.systemui.scene.shared.model.TransitionKeys.SlightlyFasterShad import com.android.systemui.scene.shared.model.TransitionKeys.ToSplitShade import com.android.systemui.scene.ui.composable.transitions.bouncerToGoneTransition import com.android.systemui.scene.ui.composable.transitions.bouncerToLockscreenPreview -import com.android.systemui.scene.ui.composable.transitions.goneToNotificationsShadeTransition -import com.android.systemui.scene.ui.composable.transitions.goneToQuickSettingsShadeTransition import com.android.systemui.scene.ui.composable.transitions.goneToQuickSettingsTransition import com.android.systemui.scene.ui.composable.transitions.goneToShadeTransition import com.android.systemui.scene.ui.composable.transitions.goneToSplitShadeTransition import com.android.systemui.scene.ui.composable.transitions.lockscreenToBouncerTransition import com.android.systemui.scene.ui.composable.transitions.lockscreenToCommunalTransition import com.android.systemui.scene.ui.composable.transitions.lockscreenToGoneTransition -import com.android.systemui.scene.ui.composable.transitions.lockscreenToNotificationsShadeTransition -import com.android.systemui.scene.ui.composable.transitions.lockscreenToQuickSettingsShadeTransition import com.android.systemui.scene.ui.composable.transitions.lockscreenToQuickSettingsTransition import com.android.systemui.scene.ui.composable.transitions.lockscreenToShadeTransition import com.android.systemui.scene.ui.composable.transitions.lockscreenToSplitShadeTransition import com.android.systemui.scene.ui.composable.transitions.shadeToQuickSettingsTransition -import com.android.systemui.shade.ui.composable.OverlayShade import com.android.systemui.shade.ui.composable.Shade /** @@ -48,8 +43,6 @@ val SceneContainerTransitions = transitions { // Scene transitions from(Scenes.Bouncer, to = Scenes.Gone) { bouncerToGoneTransition() } - from(Scenes.Gone, to = Scenes.NotificationsShade) { goneToNotificationsShadeTransition() } - from(Scenes.Gone, to = Scenes.QuickSettingsShade) { goneToQuickSettingsShadeTransition() } from(Scenes.Gone, to = Scenes.Shade) { goneToShadeTransition() } from(Scenes.Gone, to = Scenes.Shade, key = ToSplitShade) { goneToSplitShadeTransition() } from(Scenes.Gone, to = Scenes.Shade, key = SlightlyFasterShadeCollapse) { @@ -65,17 +58,11 @@ val SceneContainerTransitions = transitions { Scenes.Lockscreen, to = Scenes.Bouncer, key = TransitionKey.PredictiveBack, - reversePreview = { bouncerToLockscreenPreview() } + reversePreview = { bouncerToLockscreenPreview() }, ) { lockscreenToBouncerTransition() } from(Scenes.Lockscreen, to = Scenes.Communal) { lockscreenToCommunalTransition() } - from(Scenes.Lockscreen, to = Scenes.NotificationsShade) { - lockscreenToNotificationsShadeTransition() - } - from(Scenes.Lockscreen, to = Scenes.QuickSettingsShade) { - lockscreenToQuickSettingsShadeTransition() - } from(Scenes.Lockscreen, to = Scenes.Shade) { lockscreenToShadeTransition() } from(Scenes.Lockscreen, to = Scenes.Shade, key = ToSplitShade) { lockscreenToSplitShadeTransition() @@ -96,7 +83,7 @@ val SceneContainerTransitions = transitions { overscroll(Scenes.Shade, Orientation.Vertical) { translate( Notifications.Elements.NotificationScrim, - y = Shade.Dimensions.ScrimOverscrollLimit + y = Shade.Dimensions.ScrimOverscrollLimit, ) translate(Shade.Elements.SplitShadeStartColumn, y = Shade.Dimensions.ScrimOverscrollLimit) translate( @@ -104,10 +91,4 @@ val SceneContainerTransitions = transitions { y = Shade.Dimensions.ScrimOverscrollLimit, ) } - overscroll(Scenes.NotificationsShade, Orientation.Vertical) { - translate(OverlayShade.Elements.Panel, y = OverlayShade.Dimensions.OverscrollLimit) - } - overscroll(Scenes.QuickSettingsShade, Orientation.Vertical) { - translate(OverlayShade.Elements.Panel, y = OverlayShade.Dimensions.OverscrollLimit) - } } 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 1061cc4f5989..5a084dbd9905 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 @@ -828,15 +828,21 @@ private fun shouldPlaceElement( // Don't place the element in this content if this content is not part of the current element // transition. - if (content != transition.fromContent && content != transition.toContent) { + val isReplacingOverlay = transition is TransitionState.Transition.ReplaceOverlay + if ( + content != transition.fromContent && + content != transition.toContent && + (!isReplacingOverlay || content != transition.currentScene) + ) { return false } // Place the element if it is not shared. - if ( - transition.fromContent !in element.stateByContent || - transition.toContent !in element.stateByContent - ) { + var copies = 0 + if (transition.fromContent in element.stateByContent) copies++ + if (transition.toContent in element.stateByContent) copies++ + if (isReplacingOverlay && transition.currentScene in element.stateByContent) copies++ + if (copies <= 1) { return true } @@ -1269,9 +1275,10 @@ private inline fun <T> computeValue( // If we are replacing an overlay and the element is both in a single overlay and in the current // scene, interpolate the state of the element using the current scene as the other scene. + var currentSceneState: Element.State? = null if (!isSharedElement && transition is TransitionState.Transition.ReplaceOverlay) { - val currentSceneState = element.stateByContent[transition.currentScene] - if (currentSceneState != null) { + currentSceneState = element.stateByContent[transition.currentScene] + if (currentSceneState != null && isSharedElementEnabled(element.key, transition)) { return interpolateSharedElement( transition = transition, contentValue = contentValue, @@ -1290,6 +1297,8 @@ private inline fun <T> computeValue( when { isSharedElement && currentContent == fromContent -> fromState isSharedElement -> toState + currentSceneState != null && currentContent == transition.currentScene -> + currentSceneState else -> fromState ?: toState } ) @@ -1409,7 +1418,13 @@ private inline fun <T> computeValue( val rangeProgress = transformation.range?.progress(progress) ?: progress // Interpolate between the value at rest and the value before entering/after leaving. - val isEntering = content == toContent + val isEntering = + when { + content == toContent -> true + content == fromContent -> false + content == transition.currentScene -> toState == null + else -> content == toContent + } return if (isEntering) { lerp(targetValue, idleValue, rangeProgress) } else { diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/ObservableTransitionState.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/ObservableTransitionState.kt index 9f2ac24b844e..30eb302b3bcb 100644 --- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/ObservableTransitionState.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/ObservableTransitionState.kt @@ -206,6 +206,17 @@ sealed interface ObservableTransitionState { (from == null || this.fromContent == from) && (to == null || this.toContent == to) } + + /** Whether we are transitioning from [content] to [other], or from [other] to [content]. */ + fun isTransitioningBetween(content: ContentKey, other: ContentKey): Boolean { + return isTransitioning(from = content, to = other) || + isTransitioning(from = other, to = content) + } + + /** Whether we are transitioning from or to [content]. */ + fun isTransitioningFromOrTo(content: ContentKey): Boolean { + return isTransitioning(from = content) || isTransitioning(to = content) + } } /** diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/OverlayTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/OverlayTest.kt index a001fa975391..ffed15b457f9 100644 --- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/OverlayTest.kt +++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/OverlayTest.kt @@ -654,6 +654,85 @@ class OverlayTest { } @Test + fun replaceAnimation_elementInCurrentSceneAndOneOverlay_sharedElementDisabled() { + rule.testReplaceOverlayTransition( + currentSceneContent = { + Box(Modifier.size(width = 180.dp, height = 120.dp)) { + Foo(width = 60.dp, height = 40.dp) + } + }, + fromContent = {}, + fromAlignment = Alignment.TopStart, + toContent = { Foo(width = 100.dp, height = 80.dp) }, + transition = { + // 4 frames of animation + spec = tween(4 * 16, easing = LinearEasing) + + // Scale Foo to/from size 0 in each content instead of sharing it. + sharedElement(TestElements.Foo, enabled = false) + scaleSize(TestElements.Foo, width = 0f, height = 0f) + }, + ) { + before { + rule + .onNode(isElement(TestElements.Foo, content = SceneA)) + .assertSizeIsEqualTo(60.dp, 40.dp) + .assertPositionInRootIsEqualTo(0.dp, 0.dp) + rule.onNode(isElement(TestElements.Foo, content = OverlayA)).assertDoesNotExist() + rule.onNode(isElement(TestElements.Foo, content = OverlayB)).assertDoesNotExist() + } + + at(16) { + rule + .onNode(isElement(TestElements.Foo, content = SceneA)) + .assertSizeIsEqualTo(45.dp, 30.dp) + .assertPositionInRootIsEqualTo(0.dp, 0.dp) + rule.onNode(isElement(TestElements.Foo, content = OverlayA)).assertDoesNotExist() + rule + .onNode(isElement(TestElements.Foo, content = OverlayB)) + .assertSizeIsEqualTo(25.dp, 20.dp) + .assertPositionInRootIsEqualTo(((180 - 25) / 2f).dp, ((120 - 20) / 2f).dp) + } + + at(32) { + rule + .onNode(isElement(TestElements.Foo, content = SceneA)) + .assertSizeIsEqualTo(30.dp, 20.dp) + .assertPositionInRootIsEqualTo(0.dp, 0.dp) + rule.onNode(isElement(TestElements.Foo, content = OverlayA)).assertDoesNotExist() + rule + .onNode(isElement(TestElements.Foo, content = OverlayB)) + .assertSizeIsEqualTo(50.dp, 40.dp) + .assertPositionInRootIsEqualTo(((180 - 50) / 2f).dp, ((120 - 40) / 2f).dp) + } + + at(48) { + rule + .onNode(isElement(TestElements.Foo, content = SceneA)) + .assertSizeIsEqualTo(15.dp, 10.dp) + .assertPositionInRootIsEqualTo(0.dp, 0.dp) + rule.onNode(isElement(TestElements.Foo, content = OverlayA)).assertDoesNotExist() + rule + .onNode(isElement(TestElements.Foo, content = OverlayB)) + .assertSizeIsEqualTo(75.dp, 60.dp) + .assertPositionInRootIsEqualTo(((180 - 75) / 2f).dp, ((120 - 60) / 2f).dp) + } + + after { + rule + .onNode(isElement(TestElements.Foo, content = SceneA)) + .assertExists() + .assertIsNotDisplayed() + rule.onNode(isElement(TestElements.Foo, content = OverlayA)).assertDoesNotExist() + rule + .onNode(isElement(TestElements.Foo, content = OverlayB)) + .assertSizeIsEqualTo(100.dp, 80.dp) + .assertPositionInRootIsEqualTo(40.dp, 20.dp) + } + } + } + + @Test fun overscrollingOverlay_movableElementNotInOverlay() { val state = rule.runOnUiThread { diff --git a/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardPasswordViewControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardPasswordViewControllerTest.kt index 062d351100d6..a1d944b403d3 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardPasswordViewControllerTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardPasswordViewControllerTest.kt @@ -34,9 +34,11 @@ import com.android.systemui.SysuiTestCase import com.android.systemui.classifier.FalsingCollector import com.android.systemui.flags.FakeFeatureFlags import com.android.systemui.flags.Flags +import com.android.systemui.haptics.msdl.bouncerHapticPlayer import com.android.systemui.keyboard.data.repository.FakeKeyboardRepository import com.android.systemui.res.R import com.android.systemui.statusbar.policy.DevicePostureController +import com.android.systemui.testKosmos import com.android.systemui.user.domain.interactor.SelectedUserInteractor import com.android.systemui.util.concurrency.DelayableExecutor import com.android.systemui.util.mockito.mock @@ -86,6 +88,7 @@ class KeyguardPasswordViewControllerTest : SysuiTestCase() { @Mock private lateinit var postureController: DevicePostureController @Mock private lateinit var mUserActivityNotifier: UserActivityNotifier @Captor private lateinit var keyListenerArgumentCaptor: ArgumentCaptor<View.OnKeyListener> + private val kosmos = testKosmos() private lateinit var keyguardPasswordViewController: KeyguardPasswordViewController @@ -132,8 +135,8 @@ class KeyguardPasswordViewControllerTest : SysuiTestCase() { fakeFeatureFlags, mSelectedUserInteractor, keyguardKeyboardInteractor, - null, - mUserActivityNotifier + kosmos.bouncerHapticPlayer, + mUserActivityNotifier, ) } @@ -194,7 +197,7 @@ class KeyguardPasswordViewControllerTest : SysuiTestCase() { keyListenerArgumentCaptor.value.onKey( keyguardPasswordView, KeyEvent.KEYCODE_SPACE, - KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_SPACE) + KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_SPACE), ) assertFalse("Unlock attempted.", eventHandled) @@ -213,7 +216,7 @@ class KeyguardPasswordViewControllerTest : SysuiTestCase() { keyListenerArgumentCaptor.value.onKey( keyguardPasswordView, KeyEvent.KEYCODE_ENTER, - KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_ENTER) + KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_ENTER), ) assertTrue("Unlock not attempted.", eventHandled) diff --git a/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardPatternViewControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardPatternViewControllerTest.kt index bb152086cdab..d63e728cf443 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardPatternViewControllerTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardPatternViewControllerTest.kt @@ -30,7 +30,7 @@ import com.android.systemui.classifier.FalsingCollector import com.android.systemui.classifier.FalsingCollectorFake import com.android.systemui.flags.FakeFeatureFlags import com.android.systemui.flags.Flags -import com.android.systemui.haptics.msdl.msdlPlayer +import com.android.systemui.haptics.msdl.bouncerHapticPlayer import com.android.systemui.res.R import com.android.systemui.statusbar.policy.DevicePostureController import com.android.systemui.statusbar.policy.DevicePostureController.DEVICE_POSTURE_HALF_OPENED @@ -92,7 +92,7 @@ class KeyguardPatternViewControllerTest : SysuiTestCase() { @Captor lateinit var postureCallbackCaptor: ArgumentCaptor<DevicePostureController.Callback> private val kosmos = testKosmos() - private val msdlPlayer = kosmos.msdlPlayer + private val bouncerHapticHelper = kosmos.bouncerHapticPlayer @Before fun setup() { @@ -118,7 +118,7 @@ class KeyguardPatternViewControllerTest : SysuiTestCase() { mPostureController, fakeFeatureFlags, mSelectedUserInteractor, - msdlPlayer, + bouncerHapticHelper, ) mKeyguardPatternView.onAttachedToWindow() } diff --git a/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardPinBasedInputViewControllerTest.java b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardPinBasedInputViewControllerTest.java index 1076d9089d79..4d1660e71c0a 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardPinBasedInputViewControllerTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardPinBasedInputViewControllerTest.java @@ -34,10 +34,12 @@ import com.android.internal.widget.LockPatternUtils; import com.android.keyguard.KeyguardSecurityModel.SecurityMode; import com.android.keyguard.domain.interactor.KeyguardKeyboardInteractor; import com.android.systemui.SysuiTestCase; +import com.android.systemui.bouncer.ui.helper.BouncerHapticPlayer; import com.android.systemui.classifier.FalsingCollector; import com.android.systemui.classifier.FalsingCollectorFake; import com.android.systemui.flags.FakeFeatureFlags; import com.android.systemui.keyboard.data.repository.FakeKeyboardRepository; +import com.android.systemui.kosmos.KosmosJavaAdapter; import com.android.systemui.res.R; import com.android.systemui.user.domain.interactor.SelectedUserInteractor; @@ -93,6 +95,9 @@ public class KeyguardPinBasedInputViewControllerTest extends SysuiTestCase { private KeyguardPinBasedInputViewController mKeyguardPinViewController; + private KosmosJavaAdapter mKosmosJavaAdapter = new KosmosJavaAdapter(this); + private BouncerHapticPlayer mBouncerHapticPlayer = mKosmosJavaAdapter.getBouncerHapticHelper(); + @Before public void setup() { MockitoAnnotations.initMocks(this); @@ -119,7 +124,8 @@ public class KeyguardPinBasedInputViewControllerTest extends SysuiTestCase { mKeyguardUpdateMonitor, mSecurityMode, mLockPatternUtils, mKeyguardSecurityCallback, mKeyguardMessageAreaControllerFactory, mLatencyTracker, mLiftToactivateListener, mEmergencyButtonController, mFalsingCollector, featureFlags, - mSelectedUserInteractor, keyguardKeyboardInteractor, null, mUserActivityNotifier) { + mSelectedUserInteractor, keyguardKeyboardInteractor, mBouncerHapticPlayer, + mUserActivityNotifier) { @Override public void onResume(int reason) { super.onResume(reason); diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/extradim/ExtraDimDialogManagerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/extradim/ExtraDimDialogManagerTest.kt index 1386092ef93e..b7b98d41da93 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/extradim/ExtraDimDialogManagerTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/extradim/ExtraDimDialogManagerTest.kt @@ -18,6 +18,7 @@ package com.android.systemui.accessibility.extradim import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase +import com.android.systemui.animation.DialogTransitionAnimator import com.android.systemui.plugins.ActivityStarter import javax.inject.Provider import org.junit.Before @@ -41,10 +42,12 @@ class ExtraDimDialogManagerTest : SysuiTestCase() { @Mock private lateinit var activityStarter: ActivityStarter @Mock private lateinit var dialogProvider: Provider<ExtraDimDialogDelegate> + @Mock private lateinit var dialogTransitionAnimator: DialogTransitionAnimator @Before fun setUp() { - extraDimDialogManager = ExtraDimDialogManager(dialogProvider, activityStarter) + extraDimDialogManager = + ExtraDimDialogManager(dialogProvider, activityStarter, dialogTransitionAnimator) } @Test @@ -56,7 +59,7 @@ class ExtraDimDialogManagerTest : SysuiTestCase() { /* cancelAction= */ eq(null), /* dismissShade= */ eq(false), /* afterKeyguardGone= */ eq(true), - /* deferred= */ eq(false) + /* deferred= */ eq(false), ) } } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/PinBouncerViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/PinBouncerViewModelTest.kt index 8d82e972bdaa..2ee4aee2abab 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/PinBouncerViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/PinBouncerViewModelTest.kt @@ -16,6 +16,8 @@ package com.android.systemui.bouncer.ui.viewmodel +import android.platform.test.annotations.DisableFlags +import android.platform.test.annotations.EnableFlags import android.view.KeyEvent.KEYCODE_0 import android.view.KeyEvent.KEYCODE_4 import android.view.KeyEvent.KEYCODE_A @@ -31,6 +33,7 @@ import com.android.systemui.authentication.data.repository.fakeAuthenticationRep import com.android.systemui.authentication.domain.interactor.authenticationInteractor import com.android.systemui.authentication.shared.model.AuthenticationMethodModel import com.android.systemui.bouncer.data.repository.fakeSimBouncerRepository +import com.android.systemui.classifier.fakeFalsingCollector import com.android.systemui.coroutines.collectLastValue import com.android.systemui.kosmos.testScope import com.android.systemui.lifecycle.activateIn @@ -41,6 +44,7 @@ import com.android.systemui.testKosmos import com.google.common.truth.Truth.assertThat import kotlin.random.Random import kotlin.random.nextInt +import kotlin.test.assertTrue import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.map @@ -60,12 +64,13 @@ class PinBouncerViewModelTest : SysuiTestCase() { private val testScope = kosmos.testScope private val sceneInteractor by lazy { kosmos.sceneInteractor } private val authenticationInteractor by lazy { kosmos.authenticationInteractor } - private val underTest = + private val underTest by lazy { kosmos.pinBouncerViewModelFactory.create( isInputEnabled = MutableStateFlow(true), onIntentionalUserInput = {}, authenticationMethod = AuthenticationMethodModel.Pin, ) + } @Before fun setUp() { @@ -475,6 +480,18 @@ class PinBouncerViewModelTest : SysuiTestCase() { assertThat(pin).containsExactly(*expectedPin) } + @Test + @EnableFlags(com.android.systemui.Flags.FLAG_COMPOSE_BOUNCER) + @DisableFlags(com.android.systemui.Flags.FLAG_SCENE_CONTAINER) + fun onDigitButtonDown_avoidGesture_invoked() = + testScope.runTest { + lockDeviceAndOpenPinBouncer() + + underTest.onDigitButtonDown() + + assertTrue(kosmos.fakeFalsingCollector.wasLastGestureAvoided()) + } + private fun TestScope.switchToScene(toScene: SceneKey) { val currentScene by collectLastValue(sceneInteractor.currentScene) val bouncerHidden = currentScene == Scenes.Bouncer && toScene != Scenes.Bouncer diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/domain/interactor/CommunalInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/domain/interactor/CommunalInteractorTest.kt index 777ddab4e259..75ae4148d1df 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/domain/interactor/CommunalInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/domain/interactor/CommunalInteractorTest.kt @@ -664,22 +664,31 @@ class CommunalInteractorTest : SysuiTestCase() { testScope.runTest { // Verify default is false val isCommunalShowing by collectLastValue(underTest.isCommunalShowing) - runCurrent() - assertThat(isCommunalShowing).isFalse() - - // Verify scene changes without the flag doesn't have any impact - underTest.changeScene(CommunalScenes.Communal, "test") - runCurrent() assertThat(isCommunalShowing).isFalse() // Verify scene changes (with the flag) to communal sets the value to true sceneInteractor.changeScene(Scenes.Communal, loggingReason = "") - runCurrent() assertThat(isCommunalShowing).isTrue() // Verify scene changes (with the flag) to lockscreen sets the value to false sceneInteractor.changeScene(Scenes.Lockscreen, loggingReason = "") - runCurrent() + assertThat(isCommunalShowing).isFalse() + } + + @Test + @EnableSceneContainer + fun isCommunalShowing_whenSceneContainerEnabledAndChangeToLegacyScene() = + testScope.runTest { + // Verify default is false + val isCommunalShowing by collectLastValue(underTest.isCommunalShowing) + assertThat(isCommunalShowing).isFalse() + + // Verify legacy scene change still makes communal show + underTest.changeScene(CommunalScenes.Communal, "test") + assertThat(isCommunalShowing).isTrue() + + // Verify legacy scene change to blank makes communal hidden + underTest.changeScene(CommunalScenes.Blank, "test") assertThat(isCommunalShowing).isFalse() } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/domain/interactor/CommunalSceneInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/domain/interactor/CommunalSceneInteractorTest.kt index dfb75cae6ecd..6a9b9beaa614 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/domain/interactor/CommunalSceneInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/domain/interactor/CommunalSceneInteractorTest.kt @@ -16,18 +16,23 @@ package com.android.systemui.communal.domain.interactor -import androidx.test.ext.junit.runners.AndroidJUnit4 +import android.platform.test.annotations.DisableFlags +import android.platform.test.annotations.EnableFlags +import android.platform.test.flag.junit.FlagsParameterization import androidx.test.filters.SmallTest import com.android.compose.animation.scene.ObservableTransitionState +import com.android.systemui.Flags.FLAG_SCENE_CONTAINER import com.android.systemui.SysuiTestCase import com.android.systemui.animation.ActivityTransitionAnimator import com.android.systemui.communal.data.repository.communalSceneRepository import com.android.systemui.communal.domain.interactor.CommunalSceneInteractor.OnSceneAboutToChangeListener import com.android.systemui.communal.domain.model.CommunalTransitionProgressModel import com.android.systemui.communal.shared.model.CommunalScenes -import com.android.systemui.communal.shared.model.EditModeState import com.android.systemui.coroutines.collectLastValue +import com.android.systemui.flags.andSceneContainer import com.android.systemui.kosmos.testScope +import com.android.systemui.scene.initialSceneKey +import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.testKosmos import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -42,10 +47,24 @@ import org.mockito.kotlin.anyOrNull import org.mockito.kotlin.mock import org.mockito.kotlin.never import org.mockito.kotlin.verify +import platform.test.runner.parameterized.ParameterizedAndroidJunit4 +import platform.test.runner.parameterized.Parameters @SmallTest -@RunWith(AndroidJUnit4::class) -class CommunalSceneInteractorTest : SysuiTestCase() { +@RunWith(ParameterizedAndroidJunit4::class) +class CommunalSceneInteractorTest(flags: FlagsParameterization) : SysuiTestCase() { + + companion object { + @JvmStatic + @Parameters(name = "{0}") + fun getParams(): List<FlagsParameterization> { + return FlagsParameterization.allCombinationsOf().andSceneContainer() + } + } + + init { + mSetFlagsRule.setFlagsParameterization(flags) + } private val kosmos = testKosmos() private val testScope = kosmos.testScope @@ -53,6 +72,7 @@ class CommunalSceneInteractorTest : SysuiTestCase() { private val repository = kosmos.communalSceneRepository private val underTest by lazy { kosmos.communalSceneInteractor } + @DisableFlags(FLAG_SCENE_CONTAINER) @Test fun changeScene() = testScope.runTest { @@ -63,6 +83,7 @@ class CommunalSceneInteractorTest : SysuiTestCase() { assertThat(currentScene).isEqualTo(CommunalScenes.Communal) } + @DisableFlags(FLAG_SCENE_CONTAINER) @Test fun changeScene_callsSceneStateProcessor() = testScope.runTest { @@ -78,6 +99,7 @@ class CommunalSceneInteractorTest : SysuiTestCase() { verify(callback).onSceneAboutToChange(CommunalScenes.Communal, null) } + @DisableFlags(FLAG_SCENE_CONTAINER) @Test fun changeScene_doesNotCallSceneStateProcessorForDuplicateState() = testScope.runTest { @@ -93,6 +115,7 @@ class CommunalSceneInteractorTest : SysuiTestCase() { verify(callback, never()).onSceneAboutToChange(any(), anyOrNull()) } + @DisableFlags(FLAG_SCENE_CONTAINER) @Test fun snapToScene() = testScope.runTest { @@ -104,6 +127,7 @@ class CommunalSceneInteractorTest : SysuiTestCase() { } @OptIn(ExperimentalCoroutinesApi::class) + @DisableFlags(FLAG_SCENE_CONTAINER) @Test fun snapToSceneWithDelay() = testScope.runTest { @@ -119,30 +143,7 @@ class CommunalSceneInteractorTest : SysuiTestCase() { assertThat(currentScene).isEqualTo(CommunalScenes.Communal) } - @Test - fun changeSceneForActivityStartOnDismissKeyguard() = - testScope.runTest { - val currentScene by collectLastValue(underTest.currentScene) - underTest.snapToScene(CommunalScenes.Communal, "test") - assertThat(currentScene).isEqualTo(CommunalScenes.Communal) - - underTest.changeSceneForActivityStartOnDismissKeyguard() - assertThat(currentScene).isEqualTo(CommunalScenes.Blank) - } - - @Test - fun changeSceneForActivityStartOnDismissKeyguard_willNotChangeScene_forEditModeActivity() = - testScope.runTest { - val currentScene by collectLastValue(underTest.currentScene) - underTest.snapToScene(CommunalScenes.Communal, "test") - assertThat(currentScene).isEqualTo(CommunalScenes.Communal) - - underTest.setEditModeState(EditModeState.STARTING) - - underTest.changeSceneForActivityStartOnDismissKeyguard() - assertThat(currentScene).isEqualTo(CommunalScenes.Communal) - } - + @DisableFlags(FLAG_SCENE_CONTAINER) @Test fun transitionProgress_fullProgress() = testScope.runTest { @@ -161,6 +162,7 @@ class CommunalSceneInteractorTest : SysuiTestCase() { .isEqualTo(CommunalTransitionProgressModel.Idle(CommunalScenes.Communal)) } + @DisableFlags(FLAG_SCENE_CONTAINER) @Test fun transitionProgress_transitioningAwayFromTrackedScene() = testScope.runTest { @@ -201,6 +203,7 @@ class CommunalSceneInteractorTest : SysuiTestCase() { .isEqualTo(CommunalTransitionProgressModel.Idle(CommunalScenes.Communal)) } + @DisableFlags(FLAG_SCENE_CONTAINER) @Test fun transitionProgress_transitioningToTrackedScene() = testScope.runTest { @@ -238,6 +241,7 @@ class CommunalSceneInteractorTest : SysuiTestCase() { .isEqualTo(CommunalTransitionProgressModel.Idle(CommunalScenes.Communal)) } + @DisableFlags(FLAG_SCENE_CONTAINER) @Test fun isIdleOnCommunal() = testScope.runTest { @@ -265,6 +269,7 @@ class CommunalSceneInteractorTest : SysuiTestCase() { assertThat(isIdleOnCommunal).isEqualTo(false) } + @DisableFlags(FLAG_SCENE_CONTAINER) @Test fun isCommunalVisible() = testScope.runTest { @@ -304,4 +309,206 @@ class CommunalSceneInteractorTest : SysuiTestCase() { ) assertThat(isCommunalVisible).isEqualTo(true) } + + @EnableFlags(FLAG_SCENE_CONTAINER) + @Test + fun changeScene_legacyCommunalScene_mapToStfScene() = + testScope.runTest { + val currentScene by collectLastValue(underTest.currentScene) + + // Verify that the current scene is the initial scene + assertThat(currentScene).isEqualTo(kosmos.initialSceneKey) + + // Change to legacy communal scene + underTest.changeScene(CommunalScenes.Communal, loggingReason = "test") + + // Verify that scene changed to communal scene in STF + assertThat(currentScene).isEqualTo(Scenes.Communal) + + // Now change to legacy blank scene + underTest.changeScene(CommunalScenes.Blank, loggingReason = "test") + + // Verify that scene changed to lock screen scene in STF + assertThat(currentScene).isEqualTo(Scenes.Lockscreen) + } + + @EnableFlags(FLAG_SCENE_CONTAINER) + @Test + fun changeScene_stfScenes() = + testScope.runTest { + val currentScene by collectLastValue(underTest.currentScene) + + // Verify that the current scene is the initial scene + assertThat(currentScene).isEqualTo(kosmos.initialSceneKey) + + // Change to communal scene + underTest.changeScene(Scenes.Communal, loggingReason = "test") + + // Verify changed to communal scene + assertThat(currentScene).isEqualTo(Scenes.Communal) + + // Now change to lockscreen scene + underTest.changeScene(Scenes.Lockscreen, loggingReason = "test") + + // Verify changed to lockscreen scene + assertThat(currentScene).isEqualTo(Scenes.Lockscreen) + } + + @EnableFlags(FLAG_SCENE_CONTAINER) + @Test + fun snapToScene_legacyCommunalScene_mapToStfScene() = + testScope.runTest { + val currentScene by collectLastValue(underTest.currentScene) + + // Verify that the current scene is the initial scene + assertThat(currentScene).isEqualTo(kosmos.initialSceneKey) + + // Snap to legacy communal scene + underTest.snapToScene(CommunalScenes.Communal, loggingReason = "test") + + // Verify that scene changed to communal scene in STF + assertThat(currentScene).isEqualTo(Scenes.Communal) + + // Now snap to legacy blank scene + underTest.snapToScene(CommunalScenes.Blank, loggingReason = "test") + + // Verify that scene changed to lock screen scene in STF + assertThat(currentScene).isEqualTo(Scenes.Lockscreen) + } + + @EnableFlags(FLAG_SCENE_CONTAINER) + @Test + fun snapToScene_stfScenes() = + testScope.runTest { + val currentScene by collectLastValue(underTest.currentScene) + + // Verify that the current scene is the initial scene + assertThat(currentScene).isEqualTo(kosmos.initialSceneKey) + + // Snap to communal scene + underTest.snapToScene(Scenes.Communal, loggingReason = "test") + + // Verify changed to communal scene + assertThat(currentScene).isEqualTo(Scenes.Communal) + + // Now snap to lockscreen scene + underTest.snapToScene(Scenes.Lockscreen, loggingReason = "test") + + // Verify changed to lockscreen scene + assertThat(currentScene).isEqualTo(Scenes.Lockscreen) + } + + @EnableFlags(FLAG_SCENE_CONTAINER) + @Test + fun isIdleOnCommunal_sceneContainerEnabled() = + testScope.runTest { + val transitionState: MutableStateFlow<ObservableTransitionState> = + MutableStateFlow(ObservableTransitionState.Idle(Scenes.Lockscreen)) + underTest.setTransitionState(transitionState) + + // isIdleOnCommunal is initially false + val isIdleOnCommunal by collectLastValue(underTest.isIdleOnCommunal) + assertThat(isIdleOnCommunal).isEqualTo(false) + + // Start transition to communal. + transitionState.value = + ObservableTransitionState.Transition( + fromScene = Scenes.Lockscreen, + toScene = Scenes.Communal, + currentScene = flowOf(Scenes.Lockscreen), + progress = flowOf(0.1f), + isInitiatedByUserInput = false, + isUserInputOngoing = flowOf(false), + ) + assertThat(isIdleOnCommunal).isEqualTo(false) + + // Finish transition to communal + transitionState.value = ObservableTransitionState.Idle(Scenes.Communal) + assertThat(isIdleOnCommunal).isEqualTo(true) + + // Start transition away from communal + transitionState.value = + ObservableTransitionState.Transition( + fromScene = Scenes.Communal, + toScene = Scenes.Lockscreen, + currentScene = flowOf(Scenes.Communal), + progress = flowOf(0.1f), + isInitiatedByUserInput = false, + isUserInputOngoing = flowOf(false), + ) + assertThat(isIdleOnCommunal).isEqualTo(false) + + // Finish transition to lock screen + transitionState.value = ObservableTransitionState.Idle(Scenes.Lockscreen) + assertThat(isIdleOnCommunal).isEqualTo(false) + } + + @EnableFlags(FLAG_SCENE_CONTAINER) + @Test + fun isCommunalVisible_sceneContainerEnabled() = + testScope.runTest { + val transitionState: MutableStateFlow<ObservableTransitionState> = + MutableStateFlow(ObservableTransitionState.Idle(Scenes.Lockscreen)) + underTest.setTransitionState(transitionState) + + // isCommunalVisible is initially false + val isCommunalVisible by collectLastValue(underTest.isCommunalVisible) + assertThat(isCommunalVisible).isEqualTo(false) + + // Start transition to communal. + transitionState.value = + ObservableTransitionState.Transition( + fromScene = Scenes.Lockscreen, + toScene = Scenes.Communal, + currentScene = flowOf(Scenes.Lockscreen), + progress = flowOf(0.1f), + isInitiatedByUserInput = false, + isUserInputOngoing = flowOf(false), + ) + assertThat(isCommunalVisible).isEqualTo(true) + + // Half-way transition to communal. + transitionState.value = + ObservableTransitionState.Transition( + fromScene = Scenes.Lockscreen, + toScene = Scenes.Communal, + currentScene = flowOf(Scenes.Lockscreen), + progress = flowOf(0.5f), + isInitiatedByUserInput = false, + isUserInputOngoing = flowOf(false), + ) + assertThat(isCommunalVisible).isEqualTo(true) + + // Finish transition to communal + transitionState.value = ObservableTransitionState.Idle(Scenes.Communal) + assertThat(isCommunalVisible).isEqualTo(true) + + // Start transition away from communal + transitionState.value = + ObservableTransitionState.Transition( + fromScene = Scenes.Communal, + toScene = Scenes.Lockscreen, + currentScene = flowOf(Scenes.Communal), + progress = flowOf(0.1f), + isInitiatedByUserInput = false, + isUserInputOngoing = flowOf(false), + ) + assertThat(isCommunalVisible).isEqualTo(true) + + // Half-way transition away from communal + transitionState.value = + ObservableTransitionState.Transition( + fromScene = Scenes.Communal, + toScene = Scenes.Lockscreen, + currentScene = flowOf(Scenes.Communal), + progress = flowOf(0.5f), + isInitiatedByUserInput = false, + isUserInputOngoing = flowOf(false), + ) + assertThat(isCommunalVisible).isEqualTo(true) + + // Finish transition to lock screen + transitionState.value = ObservableTransitionState.Idle(Scenes.Lockscreen) + assertThat(isCommunalVisible).isEqualTo(false) + } } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryInteractorTest.kt index 3253edfb5fca..d90d58b8d25c 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryInteractorTest.kt @@ -19,6 +19,7 @@ package com.android.systemui.deviceentry.domain.interactor import android.testing.TestableLooper import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest +import com.android.compose.animation.scene.ObservableTransitionState import com.android.compose.animation.scene.SceneKey import com.android.systemui.SysuiTestCase import com.android.systemui.authentication.data.repository.FakeAuthenticationRepository @@ -42,11 +43,16 @@ import com.android.systemui.keyguard.data.repository.fakeTrustRepository import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.SuccessFingerprintAuthenticationStatus import com.android.systemui.kosmos.testScope +import com.android.systemui.scene.domain.interactor.sceneBackInteractor import com.android.systemui.scene.domain.interactor.sceneInteractor +import com.android.systemui.scene.domain.startable.sceneContainerStartable import com.android.systemui.scene.shared.model.Scenes +import com.android.systemui.statusbar.sysuiStatusBarStateController import com.android.systemui.testKosmos import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.flowOf +import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.runCurrent import kotlinx.coroutines.test.runTest import org.junit.Before @@ -66,10 +72,14 @@ class DeviceEntryInteractorTest : SysuiTestCase() { private val trustRepository by lazy { kosmos.fakeTrustRepository } private val sceneInteractor by lazy { kosmos.sceneInteractor } private val authenticationInteractor by lazy { kosmos.authenticationInteractor } + private val sceneBackInteractor by lazy { kosmos.sceneBackInteractor } + private val sceneContainerStartable by lazy { kosmos.sceneContainerStartable } + private val sysuiStatusBarStateController by lazy { kosmos.sysuiStatusBarStateController } private lateinit var underTest: DeviceEntryInteractor @Before fun setUp() { + sceneContainerStartable.start() underTest = kosmos.deviceEntryInteractor } @@ -423,8 +433,37 @@ class DeviceEntryInteractorTest : SysuiTestCase() { assertThat(isUnlocked).isTrue() } - private fun switchToScene(sceneKey: SceneKey) { + @Test + fun isDeviceEntered_unlockedWhileOnShade_emitsTrue() = + testScope.runTest { + val isDeviceEntered by collectLastValue(underTest.isDeviceEntered) + assertThat(isDeviceEntered).isFalse() + val currentScene by collectLastValue(sceneInteractor.currentScene) + assertThat(currentScene).isEqualTo(Scenes.Lockscreen) + + // Navigate to shade and bouncer: + switchToScene(Scenes.Shade) + assertThat(currentScene).isEqualTo(Scenes.Shade) + // Simulating a "leave it open when the keyguard is hidden" which means the bouncer will + // be + // shown and successful authentication should take the user back to where they are, the + // shade scene. + sysuiStatusBarStateController.setLeaveOpenOnKeyguardHide(true) + switchToScene(Scenes.Bouncer) + assertThat(currentScene).isEqualTo(Scenes.Bouncer) + + assertThat(isDeviceEntered).isFalse() + // Authenticate with PIN to unlock and dismiss the lockscreen: + authenticationInteractor.authenticate(FakeAuthenticationRepository.DEFAULT_PIN) + runCurrent() + + assertThat(isDeviceEntered).isTrue() + } + + private fun TestScope.switchToScene(sceneKey: SceneKey) { sceneInteractor.changeScene(sceneKey, "reason") + sceneInteractor.setTransitionState(flowOf(ObservableTransitionState.Idle(sceneKey))) + runCurrent() } private suspend fun givenCanShowAlternateBouncer() { diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorTest.kt index ebefb4d51943..b843fd508616 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorTest.kt @@ -225,6 +225,39 @@ class KeyguardInteractorTest : SysuiTestCase() { } @Test + fun dismissAlpha_onGlanceableHub_doesNotEmitWhenShadeResets() = + testScope.runTest { + val dismissAlpha by collectValues(underTest.dismissAlpha) + assertThat(dismissAlpha[0]).isEqualTo(1f) + assertThat(dismissAlpha.size).isEqualTo(1) + + keyguardTransitionRepository.sendTransitionSteps( + from = KeyguardState.AOD, + to = KeyguardState.LOCKSCREEN, + testScope, + ) + + // User begins to swipe up + repository.setStatusBarState(StatusBarState.KEYGUARD) + repository.setKeyguardDismissible(true) + shadeRepository.setLegacyShadeExpansion(0.98f) + + assertThat(dismissAlpha[1]).isGreaterThan(0.5f) + assertThat(dismissAlpha[1]).isLessThan(1f) + assertThat(dismissAlpha.size).isEqualTo(2) + + keyguardTransitionRepository.sendTransitionSteps( + from = KeyguardState.LOCKSCREEN, + to = KeyguardState.GLANCEABLE_HUB, + testScope, + ) + + // Now reset the shade and verify we don't emit any new values + shadeRepository.setLegacyShadeExpansion(1f) + assertThat(dismissAlpha.size).isEqualTo(2) + } + + @Test fun dismissAlpha_doesNotEmitWhileTransitioning() = testScope.runTest { val dismissAlpha by collectLastValue(underTest.dismissAlpha) @@ -262,7 +295,7 @@ class KeyguardInteractorTest : SysuiTestCase() { configRepository.setDimensionPixelSize( R.dimen.keyguard_translate_distance_on_swipe_up, - 100 + 100, ) configRepository.onAnyConfigurationChange() @@ -284,7 +317,7 @@ class KeyguardInteractorTest : SysuiTestCase() { configRepository.setDimensionPixelSize( R.dimen.keyguard_translate_distance_on_swipe_up, - 100 + 100, ) configRepository.onAnyConfigurationChange() @@ -306,7 +339,7 @@ class KeyguardInteractorTest : SysuiTestCase() { configRepository.setDimensionPixelSize( R.dimen.keyguard_translate_distance_on_swipe_up, - 100 + 100, ) configRepository.onAnyConfigurationChange() @@ -328,7 +361,7 @@ class KeyguardInteractorTest : SysuiTestCase() { configRepository.setDimensionPixelSize( R.dimen.keyguard_translate_distance_on_swipe_up, - 100 + 100, ) configRepository.onAnyConfigurationChange() diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelTest.kt index 3b2b12c4363d..e4098ae885ac 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelTest.kt @@ -335,6 +335,7 @@ class KeyguardRootViewModelTest(flags: FlagsParameterization) : SysuiTestCase() } @Test + @DisableSceneContainer fun alpha_idleOnHub_isZero() = testScope.runTest { val alpha by collectLastValue(underTest.alpha(viewState)) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenUserActionsViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenUserActionsViewModelTest.kt index 4253c29d241c..a330cf01624f 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenUserActionsViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenUserActionsViewModelTest.kt @@ -18,6 +18,7 @@ package com.android.systemui.keyguard.ui.viewmodel +import android.platform.test.annotations.DisableFlags import android.platform.test.annotations.EnableFlags import android.testing.TestableLooper.RunWithLooper import androidx.test.filters.SmallTest @@ -27,6 +28,7 @@ import com.android.compose.animation.scene.Swipe import com.android.compose.animation.scene.SwipeDirection import com.android.compose.animation.scene.TransitionKey import com.android.compose.animation.scene.UserActionResult +import com.android.compose.animation.scene.UserActionResult.ShowOverlay import com.android.systemui.Flags import com.android.systemui.SysuiTestCase import com.android.systemui.authentication.data.repository.fakeAuthenticationRepository @@ -42,8 +44,10 @@ import com.android.systemui.lifecycle.activateIn import com.android.systemui.power.data.repository.fakePowerRepository import com.android.systemui.power.shared.model.WakefulnessState import com.android.systemui.scene.domain.interactor.sceneInteractor +import com.android.systemui.scene.shared.model.Overlays import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.scene.shared.model.TransitionKeys +import com.android.systemui.scene.ui.viewmodel.SceneContainerEdge import com.android.systemui.shade.data.repository.shadeRepository import com.android.systemui.shade.domain.interactor.shadeInteractor import com.android.systemui.testKosmos @@ -111,12 +115,12 @@ class LockscreenUserActionsViewModelTest : SysuiTestCase() { private fun expectedDownDestination( downFromEdge: Boolean, - isSingleShade: Boolean, + isNarrowScreen: Boolean, isShadeTouchable: Boolean, ): SceneKey? { return when { !isShadeTouchable -> null - downFromEdge && isSingleShade -> Scenes.QuickSettings + downFromEdge && isNarrowScreen -> Scenes.QuickSettings else -> Scenes.Shade } } @@ -162,7 +166,7 @@ class LockscreenUserActionsViewModelTest : SysuiTestCase() { @JvmField @Parameter(0) var canSwipeToEnter: Boolean = false @JvmField @Parameter(1) var downWithTwoPointers: Boolean = false @JvmField @Parameter(2) var downFromEdge: Boolean = false - @JvmField @Parameter(3) var isSingleShade: Boolean = true + @JvmField @Parameter(3) var isNarrowScreen: Boolean = true @JvmField @Parameter(4) var isCommunalAvailable: Boolean = false @JvmField @Parameter(5) var isShadeTouchable: Boolean = false @@ -170,7 +174,8 @@ class LockscreenUserActionsViewModelTest : SysuiTestCase() { @Test @EnableFlags(Flags.FLAG_COMMUNAL_HUB) - fun userActions() = + @DisableFlags(Flags.FLAG_DUAL_SHADE) + fun userActions_fullscreenShade() = testScope.runTest { underTest.activateIn(this) kosmos.fakeDeviceEntryRepository.setLockscreenEnabled(true) @@ -182,7 +187,7 @@ class LockscreenUserActionsViewModelTest : SysuiTestCase() { } ) sceneInteractor.changeScene(Scenes.Lockscreen, "reason") - kosmos.shadeRepository.setShadeLayoutWide(!isSingleShade) + kosmos.shadeRepository.setShadeLayoutWide(!isNarrowScreen) kosmos.setCommunalAvailable(isCommunalAvailable) kosmos.fakePowerRepository.updateWakefulness( rawState = @@ -190,7 +195,7 @@ class LockscreenUserActionsViewModelTest : SysuiTestCase() { WakefulnessState.AWAKE } else { WakefulnessState.ASLEEP - }, + } ) val userActions by collectLastValue(underTest.actions) @@ -212,7 +217,7 @@ class LockscreenUserActionsViewModelTest : SysuiTestCase() { .isEqualTo( expectedDownDestination( downFromEdge = downFromEdge, - isSingleShade = isSingleShade, + isNarrowScreen = isNarrowScreen, isShadeTouchable = isShadeTouchable, ) ) @@ -220,10 +225,105 @@ class LockscreenUserActionsViewModelTest : SysuiTestCase() { assertThat(downDestination?.transitionKey) .isEqualTo( expectedDownTransitionKey( - isSingleShade = isSingleShade, + isSingleShade = isNarrowScreen, + isShadeTouchable = isShadeTouchable, + ) + ) + + val upScene by + collectLastValue( + (userActions?.get(Swipe.Up) as? UserActionResult.ChangeScene)?.toScene?.let { + scene -> + kosmos.sceneInteractor.resolveSceneFamily(scene) + } ?: flowOf(null) + ) + + assertThat(upScene) + .isEqualTo( + expectedUpDestination( + canSwipeToEnter = canSwipeToEnter, + isShadeTouchable = isShadeTouchable, + ) + ) + + val leftScene by + collectLastValue( + (userActions?.get(Swipe.Left) as? UserActionResult.ChangeScene)?.toScene?.let { + scene -> + kosmos.sceneInteractor.resolveSceneFamily(scene) + } ?: flowOf(null) + ) + + assertThat(leftScene) + .isEqualTo( + expectedLeftDestination( + isCommunalAvailable = isCommunalAvailable, isShadeTouchable = isShadeTouchable, ) ) + } + + @Test + @EnableFlags(Flags.FLAG_COMMUNAL_HUB, Flags.FLAG_DUAL_SHADE) + fun userActions_dualShade() = + testScope.runTest { + underTest.activateIn(this) + kosmos.fakeDeviceEntryRepository.setLockscreenEnabled(true) + kosmos.fakeAuthenticationRepository.setAuthenticationMethod( + if (canSwipeToEnter) { + AuthenticationMethodModel.None + } else { + AuthenticationMethodModel.Pin + } + ) + sceneInteractor.changeScene(Scenes.Lockscreen, "reason") + kosmos.shadeRepository.setShadeLayoutWide(!isNarrowScreen) + kosmos.setCommunalAvailable(isCommunalAvailable) + kosmos.fakePowerRepository.updateWakefulness( + rawState = + if (isShadeTouchable) { + WakefulnessState.AWAKE + } else { + WakefulnessState.ASLEEP + } + ) + + val userActions by collectLastValue(underTest.actions) + + val downDestination = + userActions?.get( + Swipe( + SwipeDirection.Down, + fromSource = Edge.Top.takeIf { downFromEdge }, + pointerCount = if (downWithTwoPointers) 2 else 1, + ) + ) + + if (downFromEdge || downWithTwoPointers || !isShadeTouchable) { + // Top edge is not applicable in dual shade, as well as two-finger swipe. + assertThat(downDestination).isNull() + } else { + assertThat(downDestination).isEqualTo(ShowOverlay(Overlays.NotificationsShade)) + assertThat(downDestination?.transitionKey).isNull() + } + + val downFromTopRightDestination = + userActions?.get( + Swipe( + SwipeDirection.Down, + fromSource = SceneContainerEdge.TopRight, + pointerCount = if (downWithTwoPointers) 2 else 1, + ) + ) + when { + !isShadeTouchable -> assertThat(downFromTopRightDestination).isNull() + downWithTwoPointers -> assertThat(downFromTopRightDestination).isNull() + else -> { + assertThat(downFromTopRightDestination) + .isEqualTo(ShowOverlay(Overlays.QuickSettingsShade)) + assertThat(downFromTopRightDestination?.transitionKey).isNull() + } + } val upScene by collectLastValue( diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/reducebrightness/domain/interactor/ReduceBrightColorsTileUserActionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/reducebrightness/domain/interactor/ReduceBrightColorsTileUserActionInteractorTest.kt index 313331286b45..b54fd86779e6 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/reducebrightness/domain/interactor/ReduceBrightColorsTileUserActionInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/reducebrightness/domain/interactor/ReduceBrightColorsTileUserActionInteractorTest.kt @@ -19,12 +19,15 @@ package com.android.systemui.qs.tiles.impl.reducebrightness.domain.interactor import android.platform.test.annotations.EnabledOnRavenwood import android.platform.test.annotations.RequiresFlagsDisabled import android.platform.test.annotations.RequiresFlagsEnabled +import android.platform.test.flag.junit.CheckFlagsRule +import android.platform.test.flag.junit.DeviceFlagsValueProvider import android.provider.Settings import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.internal.R import com.android.server.display.feature.flags.Flags import com.android.systemui.SysuiTestCase +import com.android.systemui.accessibility.extradim.ExtraDimDialogManager import com.android.systemui.accessibility.reduceBrightColorsController import com.android.systemui.kosmos.Kosmos import com.android.systemui.qs.tiles.base.actions.FakeQSTileIntentUserInputHandler @@ -33,8 +36,14 @@ import com.android.systemui.qs.tiles.base.interactor.QSTileInputTestKtx import com.android.systemui.qs.tiles.impl.reducebrightness.domain.model.ReduceBrightColorsTileModel 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.MockitoAnnotations +import org.mockito.kotlin.anyOrNull +import org.mockito.kotlin.verify @SmallTest @EnabledOnRavenwood @@ -45,21 +54,34 @@ class ReduceBrightColorsTileUserActionInteractorTest : SysuiTestCase() { private val inputHandler = FakeQSTileIntentUserInputHandler() private val controller = kosmos.reduceBrightColorsController - private val underTest = - ReduceBrightColorsTileUserActionInteractor( - context.resources, - inputHandler, - controller, - ) - - private val underTestEvenDimmerEnabled = - ReduceBrightColorsTileUserActionInteractor( - context.orCreateTestableResources - .apply { addOverride(R.bool.config_evenDimmerEnabled, true) } - .resources, - inputHandler, - controller, - ) + @Mock private lateinit var mExtraDimDialogManager: ExtraDimDialogManager + + @get:Rule val checkFlagsRule: CheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule() + + private lateinit var underTest: ReduceBrightColorsTileUserActionInteractor + private lateinit var underTestEvenDimmerEnabled: ReduceBrightColorsTileUserActionInteractor + + @Before + fun setup() { + MockitoAnnotations.initMocks(this) + underTest = + ReduceBrightColorsTileUserActionInteractor( + context.resources, + inputHandler, + controller, + mExtraDimDialogManager, + ) + + underTestEvenDimmerEnabled = + ReduceBrightColorsTileUserActionInteractor( + context.orCreateTestableResources + .apply { addOverride(R.bool.config_evenDimmerEnabled, true) } + .resources, + inputHandler, + controller, + mExtraDimDialogManager, + ) + } @Test @RequiresFlagsDisabled(Flags.FLAG_EVEN_DIMMER) @@ -142,9 +164,7 @@ class ReduceBrightColorsTileUserActionInteractorTest : SysuiTestCase() { QSTileInputTestKtx.longClick(ReduceBrightColorsTileModel(enabled)) ) - QSTileIntentUserInputHandlerSubject.assertThat(inputHandler).handledOneIntentInput { - assertThat(it.intent.action).isEqualTo(Settings.ACTION_DISPLAY_SETTINGS) - } + verify(mExtraDimDialogManager).dismissKeyguardIfNeededAndShowDialog(anyOrNull()) } @Test @@ -155,9 +175,6 @@ class ReduceBrightColorsTileUserActionInteractorTest : SysuiTestCase() { underTestEvenDimmerEnabled.handleInput( QSTileInputTestKtx.longClick(ReduceBrightColorsTileModel(enabled)) ) - - QSTileIntentUserInputHandlerSubject.assertThat(inputHandler).handledOneIntentInput { - assertThat(it.intent.action).isEqualTo(Settings.ACTION_DISPLAY_SETTINGS) - } + verify(mExtraDimDialogManager).dismissKeyguardIfNeededAndShowDialog(anyOrNull()) } } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt index 2d42c4247ab7..a0cafcbd5ad1 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt @@ -161,9 +161,7 @@ class SceneFrameworkIntegrationTest : SysuiTestCase() { val upDestinationSceneKey = (actions?.get(Swipe.Up) as? UserActionResult.ChangeScene)?.toScene assertThat(upDestinationSceneKey).isEqualTo(Scenes.Bouncer) - kosmos.emulateUserDrivenTransition( - to = upDestinationSceneKey, - ) + kosmos.emulateUserDrivenTransition(to = upDestinationSceneKey) kosmos.fakeSceneDataSource.pause() kosmos.enterPin() @@ -226,16 +224,14 @@ class SceneFrameworkIntegrationTest : SysuiTestCase() { (actions?.get(Swipe.Up) as? UserActionResult.ChangeScene)?.toScene assertThat(upDestinationSceneKey).isEqualTo(SceneFamilies.Home) assertThat(homeScene).isEqualTo(Scenes.Gone) - kosmos.emulateUserDrivenTransition( - to = homeScene, - ) + kosmos.emulateUserDrivenTransition(to = homeScene) } @Test fun withAuthMethodNone_deviceWakeUp_skipsLockscreen() = testScope.runTest { kosmos.setAuthMethod(AuthenticationMethodModel.None, enableLockscreen = false) - kosmos.putDeviceToSleep(instantlyLockDevice = false) + kosmos.putDeviceToSleep() kosmos.assertCurrentScene(Scenes.Lockscreen) kosmos.wakeUpDevice() @@ -246,7 +242,7 @@ class SceneFrameworkIntegrationTest : SysuiTestCase() { fun withAuthMethodSwipe_deviceWakeUp_doesNotSkipLockscreen() = testScope.runTest { kosmos.setAuthMethod(AuthenticationMethodModel.None, enableLockscreen = true) - kosmos.putDeviceToSleep(instantlyLockDevice = false) + kosmos.putDeviceToSleep() kosmos.assertCurrentScene(Scenes.Lockscreen) kosmos.wakeUpDevice() @@ -302,7 +298,7 @@ class SceneFrameworkIntegrationTest : SysuiTestCase() { testScope.runTest { kosmos.unlockDevice() kosmos.assertCurrentScene(Scenes.Gone) - kosmos.putDeviceToSleep(instantlyLockDevice = false) + kosmos.putDeviceToSleep() kosmos.assertCurrentScene(Scenes.Lockscreen) // Pretend like the timeout elapsed and now lock the device. @@ -318,9 +314,7 @@ class SceneFrameworkIntegrationTest : SysuiTestCase() { val upDestinationSceneKey = (actions?.get(Swipe.Up) as? UserActionResult.ChangeScene)?.toScene assertThat(upDestinationSceneKey).isEqualTo(Scenes.Bouncer) - kosmos.emulateUserDrivenTransition( - to = upDestinationSceneKey, - ) + kosmos.emulateUserDrivenTransition(to = upDestinationSceneKey) kosmos.fakeSceneDataSource.pause() kosmos.dismissIme() @@ -388,7 +382,7 @@ class SceneFrameworkIntegrationTest : SysuiTestCase() { kosmos.emulatePendingTransitionProgress(expectedVisible = true) kosmos.enterSimPin( authMethodAfterSimUnlock = AuthenticationMethodModel.None, - enableLockscreen = false + enableLockscreen = false, ) kosmos.assertCurrentScene(Scenes.Gone) @@ -434,7 +428,7 @@ class SceneFrameworkIntegrationTest : SysuiTestCase() { /** Updates the current authentication method and related states in the data layer. */ private fun Kosmos.setAuthMethod( authMethod: AuthenticationMethodModel, - enableLockscreen: Boolean = true + enableLockscreen: Boolean = true, ) { if (authMethod.isSecure) { assert(enableLockscreen) { @@ -538,24 +532,27 @@ class SceneFrameworkIntegrationTest : SysuiTestCase() { kosmos.fakeSceneDataSource.pause() sceneInteractor.changeScene(to, "reason") - emulatePendingTransitionProgress( - expectedVisible = to != Scenes.Gone, - ) + emulatePendingTransitionProgress(expectedVisible = to != Scenes.Gone) } /** - * Locks the device immediately (without delay). + * Locks the device. * * Asserts the device to be lockable (e.g. that the current authentication is secure). * - * Not to be confused with [putDeviceToSleep], which may also instantly lock the device. + * Internally emulates a power button press that puts the device to sleep, followed by another + * power button press that wakes up the device but is then expected to be in the locked state. */ private suspend fun Kosmos.lockDevice() { val authMethod = authenticationInteractor.getAuthenticationMethod() assertWithMessage("The authentication method of $authMethod is not secure, cannot lock!") .that(authMethod.isSecure) .isTrue() - sceneInteractor.changeScene(Scenes.Lockscreen, "") + + powerInteractor.setAsleepForTest() + testScope.runCurrent() + + powerInteractor.setAwakeForTest() testScope.runCurrent() } @@ -569,9 +566,7 @@ class SceneFrameworkIntegrationTest : SysuiTestCase() { fakeSceneDataSource.pause() enterPin() - emulatePendingTransitionProgress( - expectedVisible = false, - ) + emulatePendingTransitionProgress(expectedVisible = false) } /** @@ -645,9 +640,7 @@ class SceneFrameworkIntegrationTest : SysuiTestCase() { } /** Changes device wakefulness state from awake to asleep, going through intermediary states. */ - private suspend fun Kosmos.putDeviceToSleep( - instantlyLockDevice: Boolean = true, - ) { + private suspend fun Kosmos.putDeviceToSleep() { val wakefulnessModel = powerInteractor.detailedWakefulness.value assertWithMessage("Cannot put device to sleep as it's already asleep!") .that(wakefulnessModel.isAwake()) @@ -655,10 +648,6 @@ class SceneFrameworkIntegrationTest : SysuiTestCase() { powerInteractor.setAsleepForTest() testScope.runCurrent() - - if (instantlyLockDevice) { - lockDevice() - } } /** Emulates the dismissal of the IME (soft keyboard). */ diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/interactor/SceneBackInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/interactor/SceneBackInteractorTest.kt index 1f3454de14d7..405cfd38d49a 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/interactor/SceneBackInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/interactor/SceneBackInteractorTest.kt @@ -28,6 +28,8 @@ import com.android.systemui.authentication.domain.interactor.authenticationInter import com.android.systemui.coroutines.collectLastValue import com.android.systemui.flags.EnableSceneContainer import com.android.systemui.kosmos.testScope +import com.android.systemui.scene.data.model.asIterable +import com.android.systemui.scene.data.model.sceneStackOf import com.android.systemui.scene.domain.startable.sceneContainerStartable import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.testKosmos @@ -173,12 +175,32 @@ class SceneBackInteractorTest : SysuiTestCase() { ) } + @Test + @EnableSceneContainer + fun updateBackStack() = + testScope.runTest { + underTest.onSceneChange(from = Scenes.Lockscreen, to = Scenes.Shade) + underTest.onSceneChange(from = Scenes.Shade, to = Scenes.QuickSettings) + underTest.onSceneChange(from = Scenes.QuickSettings, to = Scenes.Bouncer) + assertThat(underTest.backStack.value.asIterable().toList()) + .isEqualTo(listOf(Scenes.QuickSettings, Scenes.Shade, Scenes.Lockscreen)) + + underTest.updateBackStack { stack -> + // Reverse the stack, just to see if it can be done: + sceneStackOf(*stack.asIterable().reversed().toTypedArray()) + } + + assertThat(underTest.backStack.value.asIterable().toList()) + .isEqualTo(listOf(Scenes.Lockscreen, Scenes.Shade, Scenes.QuickSettings)) + } + private suspend fun TestScope.assertRoute(vararg route: RouteNode) { val currentScene by collectLastValue(sceneInteractor.currentScene) val backScene by collectLastValue(underTest.backScene) route.forEachIndexed { index, node -> sceneInteractor.changeScene(node.changeSceneTo, "") + runCurrent() assertWithMessage("node at index $index currentScene mismatch") .that(currentScene) .isEqualTo(node.changeSceneTo) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt index d1804608d130..763a1a943bf8 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt @@ -33,7 +33,9 @@ import com.android.internal.policy.IKeyguardDismissCallback import com.android.keyguard.AuthInteractionProperties import com.android.systemui.Flags import com.android.systemui.SysuiTestCase +import com.android.systemui.authentication.data.repository.FakeAuthenticationRepository import com.android.systemui.authentication.data.repository.fakeAuthenticationRepository +import com.android.systemui.authentication.domain.interactor.authenticationInteractor import com.android.systemui.authentication.shared.model.AuthenticationMethodModel import com.android.systemui.biometrics.data.repository.fingerprintPropertyRepository import com.android.systemui.biometrics.shared.model.FingerprintSensorType @@ -82,7 +84,9 @@ import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.se import com.android.systemui.power.domain.interactor.powerInteractor import com.android.systemui.power.shared.model.WakeSleepReason import com.android.systemui.power.shared.model.WakefulnessState +import com.android.systemui.scene.data.model.asIterable import com.android.systemui.scene.data.repository.Transition +import com.android.systemui.scene.domain.interactor.sceneBackInteractor import com.android.systemui.scene.domain.interactor.sceneInteractor import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.scene.shared.model.fakeSceneDataSource @@ -131,6 +135,7 @@ class SceneContainerStartableTest : SysuiTestCase() { private val testScope = kosmos.testScope private val deviceEntryHapticsInteractor by lazy { kosmos.deviceEntryHapticsInteractor } private val sceneInteractor by lazy { kosmos.sceneInteractor } + private val sceneBackInteractor by lazy { kosmos.sceneBackInteractor } private val bouncerInteractor by lazy { kosmos.bouncerInteractor } private val faceAuthRepository by lazy { kosmos.fakeDeviceEntryFaceAuthRepository } private val bouncerRepository by lazy { kosmos.fakeKeyguardBouncerRepository } @@ -237,17 +242,14 @@ class SceneContainerStartableTest : SysuiTestCase() { fun hydrateVisibility_basedOnOcclusion() = testScope.runTest { val isVisible by collectLastValue(sceneInteractor.isVisible) - prepareState( - isDeviceUnlocked = true, - initialSceneKey = Scenes.Lockscreen, - ) + prepareState(isDeviceUnlocked = true, initialSceneKey = Scenes.Lockscreen) underTest.start() assertThat(isVisible).isTrue() kosmos.keyguardOcclusionInteractor.setWmNotifiedShowWhenLockedActivityOnTop( true, - mock() + mock(), ) assertThat(isVisible).isFalse() @@ -259,10 +261,7 @@ class SceneContainerStartableTest : SysuiTestCase() { fun hydrateVisibility_basedOnAlternateBouncer() = testScope.runTest { val isVisible by collectLastValue(sceneInteractor.isVisible) - prepareState( - isDeviceUnlocked = false, - initialSceneKey = Scenes.Lockscreen, - ) + prepareState(isDeviceUnlocked = false, initialSceneKey = Scenes.Lockscreen) underTest.start() assertThat(isVisible).isTrue() @@ -270,7 +269,7 @@ class SceneContainerStartableTest : SysuiTestCase() { // WHEN the device is occluded, kosmos.keyguardOcclusionInteractor.setWmNotifiedShowWhenLockedActivityOnTop( true, - mock() + mock(), ) // THEN scenes are not visible assertThat(isVisible).isFalse() @@ -393,6 +392,7 @@ class SceneContainerStartableTest : SysuiTestCase() { fun switchFromBouncerToQuickSettingsWhenDeviceUnlocked_whenLeaveOpenShade() = testScope.runTest { val currentSceneKey by collectLastValue(sceneInteractor.currentScene) + val backStack by collectLastValue(sceneBackInteractor.backStack) kosmos.sysuiStatusBarStateController.leaveOpen = true // leave shade open val transitionState = @@ -414,12 +414,14 @@ class SceneContainerStartableTest : SysuiTestCase() { transitionState.value = ObservableTransitionState.Idle(Scenes.Bouncer) runCurrent() assertThat(currentSceneKey).isEqualTo(Scenes.Bouncer) + assertThat(backStack?.asIterable()?.last()).isEqualTo(Scenes.Lockscreen) kosmos.fakeDeviceEntryFingerprintAuthRepository.setAuthenticationStatus( SuccessFingerprintAuthenticationStatus(0, true) ) assertThat(currentSceneKey).isEqualTo(Scenes.QuickSettings) + assertThat(backStack?.asIterable()?.last()).isEqualTo(Scenes.Gone) } @Test @@ -478,10 +480,7 @@ class SceneContainerStartableTest : SysuiTestCase() { fun stayOnLockscreenWhenDeviceUnlocksWithBypassOff() = testScope.runTest { val currentSceneKey by collectLastValue(sceneInteractor.currentScene) - prepareState( - isBypassEnabled = false, - initialSceneKey = Scenes.Lockscreen, - ) + prepareState(isBypassEnabled = false, initialSceneKey = Scenes.Lockscreen) assertThat(currentSceneKey).isEqualTo(Scenes.Lockscreen) underTest.start() @@ -520,10 +519,7 @@ class SceneContainerStartableTest : SysuiTestCase() { fun switchToGoneWhenDeviceIsUnlockedAndUserIsOnBouncerWithBypassDisabled() = testScope.runTest { val currentSceneKey by collectLastValue(sceneInteractor.currentScene) - prepareState( - isBypassEnabled = false, - initialSceneKey = Scenes.Bouncer, - ) + prepareState(isBypassEnabled = false, initialSceneKey = Scenes.Bouncer) assertThat(currentSceneKey).isEqualTo(Scenes.Bouncer) underTest.start() @@ -539,10 +535,7 @@ class SceneContainerStartableTest : SysuiTestCase() { val alternateBouncerVisible by collectLastValue(bouncerRepository.alternateBouncerVisible) val currentSceneKey by collectLastValue(sceneInteractor.currentScene) - prepareState( - isDeviceUnlocked = false, - initialSceneKey = Scenes.Shade, - ) + prepareState(isDeviceUnlocked = false, initialSceneKey = Scenes.Shade) assertThat(currentSceneKey).isEqualTo(Scenes.Shade) bouncerRepository.setAlternateVisible(true) underTest.start() @@ -564,10 +557,7 @@ class SceneContainerStartableTest : SysuiTestCase() { fun switchToLockscreenWhenDeviceSleepsLocked() = testScope.runTest { val currentSceneKey by collectLastValue(sceneInteractor.currentScene) - prepareState( - isDeviceUnlocked = false, - initialSceneKey = Scenes.Shade, - ) + prepareState(isDeviceUnlocked = false, initialSceneKey = Scenes.Shade) assertThat(currentSceneKey).isEqualTo(Scenes.Shade) underTest.start() powerInteractor.setAsleepForTest() @@ -583,10 +573,7 @@ class SceneContainerStartableTest : SysuiTestCase() { val currentTransitionInfo by collectLastValue(kosmos.keyguardTransitionRepository.currentTransitionInfoInternal) val transitionState = - prepareState( - isDeviceUnlocked = false, - initialSceneKey = Scenes.Shade, - ) + prepareState(isDeviceUnlocked = false, initialSceneKey = Scenes.Shade) kosmos.keyguardRepository.setAodAvailable(true) runCurrent() assertThat(asleepState).isEqualTo(KeyguardState.AOD) @@ -615,10 +602,7 @@ class SceneContainerStartableTest : SysuiTestCase() { val currentTransitionInfo by collectLastValue(kosmos.keyguardTransitionRepository.currentTransitionInfoInternal) val transitionState = - prepareState( - isDeviceUnlocked = false, - initialSceneKey = Scenes.Shade, - ) + prepareState(isDeviceUnlocked = false, initialSceneKey = Scenes.Shade) kosmos.keyguardRepository.setAodAvailable(false) runCurrent() assertThat(asleepState).isEqualTo(KeyguardState.DOZING) @@ -1078,16 +1062,14 @@ class SceneContainerStartableTest : SysuiTestCase() { @Test fun hydrateSystemUiState_onLockscreen_basedOnOcclusion() = testScope.runTest { - prepareState( - initialSceneKey = Scenes.Lockscreen, - ) + prepareState(initialSceneKey = Scenes.Lockscreen) underTest.start() runCurrent() clearInvocations(sysUiState) kosmos.keyguardOcclusionInteractor.setWmNotifiedShowWhenLockedActivityOnTop( true, - mock() + mock(), ) runCurrent() assertThat( @@ -1210,7 +1192,7 @@ class SceneContainerStartableTest : SysuiTestCase() { initialSceneKey = Scenes.Lockscreen, authenticationMethod = AuthenticationMethodModel.Pin, isDeviceUnlocked = false, - startsAwake = false + startsAwake = false, ) assertThat(currentSceneKey).isEqualTo(Scenes.Lockscreen) underTest.start() @@ -1228,11 +1210,14 @@ class SceneContainerStartableTest : SysuiTestCase() { @Test fun collectFalsingSignals_onSuccessfulUnlock() = testScope.runTest { - prepareState( - initialSceneKey = Scenes.Lockscreen, - authenticationMethod = AuthenticationMethodModel.Pin, - isDeviceUnlocked = false, - ) + val currentScene by collectLastValue(sceneInteractor.currentScene) + + val transitionStateFlow = + prepareState( + initialSceneKey = Scenes.Lockscreen, + authenticationMethod = AuthenticationMethodModel.Pin, + isDeviceUnlocked = false, + ) underTest.start() runCurrent() verify(falsingCollector, never()).onSuccessfulUnlock() @@ -1247,36 +1232,46 @@ class SceneContainerStartableTest : SysuiTestCase() { ) .forEach { sceneKey -> sceneInteractor.changeScene(sceneKey, "reason") + transitionStateFlow.value = ObservableTransitionState.Idle(sceneKey) runCurrent() verify(falsingCollector, never()).onSuccessfulUnlock() } // Changing to the Gone scene should report a successful unlock. - kosmos.fakeDeviceEntryFingerprintAuthRepository.setAuthenticationStatus( - SuccessFingerprintAuthenticationStatus(0, true) - ) + kosmos.authenticationInteractor.authenticate(FakeAuthenticationRepository.DEFAULT_PIN) runCurrent() - sceneInteractor.changeScene(Scenes.Gone, "reason") + // Make sure that the startable changed the scene to Gone because the device unlocked. + assertThat(currentScene).isEqualTo(Scenes.Gone) + // Make the transition state match the current state + transitionStateFlow.value = ObservableTransitionState.Idle(Scenes.Gone) runCurrent() verify(falsingCollector).onSuccessfulUnlock() // Move around scenes without changing back to Lockscreen, shouldn't report another // unlock. - listOf( - Scenes.Shade, - Scenes.QuickSettings, - Scenes.Shade, - Scenes.Gone, - ) - .forEach { sceneKey -> - sceneInteractor.changeScene(sceneKey, "reason") - runCurrent() - verify(falsingCollector, times(1)).onSuccessfulUnlock() - } - - // Changing to the Lockscreen scene shouldn't report a successful unlock. - sceneInteractor.changeScene(Scenes.Lockscreen, "reason") + listOf(Scenes.Shade, Scenes.QuickSettings, Scenes.Shade, Scenes.Gone).forEach { sceneKey + -> + sceneInteractor.changeScene(sceneKey, "reason") + transitionStateFlow.value = ObservableTransitionState.Idle(sceneKey) + runCurrent() + verify(falsingCollector, times(1)).onSuccessfulUnlock() + } + + // Putting the device to sleep to lock it again, which shouldn't report another + // successful unlock. + kosmos.powerInteractor.setAsleepForTest() + runCurrent() + // Verify that the startable changed the scene to Lockscreen because the device locked + // following the sleep. + assertThat(currentScene).isEqualTo(Scenes.Lockscreen) + // Make the transition state match the current state + transitionStateFlow.value = ObservableTransitionState.Idle(Scenes.Lockscreen) + // Wake up the device again before continuing with the test. + kosmos.powerInteractor.setAwakeForTest() runCurrent() + // Verify that the current scene is still the Lockscreen scene, now that the device is + // still locked. + assertThat(currentScene).isEqualTo(Scenes.Lockscreen) verify(falsingCollector, times(1)).onSuccessfulUnlock() // Move around scenes without unlocking. @@ -1289,12 +1284,17 @@ class SceneContainerStartableTest : SysuiTestCase() { ) .forEach { sceneKey -> sceneInteractor.changeScene(sceneKey, "reason") + transitionStateFlow.value = ObservableTransitionState.Idle(sceneKey) runCurrent() verify(falsingCollector, times(1)).onSuccessfulUnlock() } - // Changing to the Gone scene should report a second successful unlock. - sceneInteractor.changeScene(Scenes.Gone, "reason") + kosmos.authenticationInteractor.authenticate(FakeAuthenticationRepository.DEFAULT_PIN) + runCurrent() + // Make sure that the startable changed the scene to Gone because the device unlocked. + assertThat(currentScene).isEqualTo(Scenes.Gone) + // Make the transition state match the current scene. + transitionStateFlow.value = ObservableTransitionState.Idle(Scenes.Gone) runCurrent() verify(falsingCollector, times(2)).onSuccessfulUnlock() } @@ -1608,7 +1608,7 @@ class SceneContainerStartableTest : SysuiTestCase() { kosmos.keyguardOcclusionInteractor.setWmNotifiedShowWhenLockedActivityOnTop( true, - mock() + mock(), ) runCurrent() verify(notificationShadeWindowController, times(1)).setKeyguardOccluded(true) @@ -1623,10 +1623,7 @@ class SceneContainerStartableTest : SysuiTestCase() { @Test fun hydrateInteractionState_whileLocked() = testScope.runTest { - val transitionStateFlow = - prepareState( - initialSceneKey = Scenes.Lockscreen, - ) + val transitionStateFlow = prepareState(initialSceneKey = Scenes.Lockscreen) underTest.start() runCurrent() verify(centralSurfaces).setInteracting(StatusBarManager.WINDOW_STATUS_BAR, true) @@ -1643,10 +1640,7 @@ class SceneContainerStartableTest : SysuiTestCase() { }, verifyAfterTransition = { verify(centralSurfaces) - .setInteracting( - StatusBarManager.WINDOW_STATUS_BAR, - false, - ) + .setInteracting(StatusBarManager.WINDOW_STATUS_BAR, false) }, ) @@ -1661,11 +1655,7 @@ class SceneContainerStartableTest : SysuiTestCase() { verify(centralSurfaces, never()).setInteracting(anyInt(), anyBoolean()) }, verifyAfterTransition = { - verify(centralSurfaces) - .setInteracting( - StatusBarManager.WINDOW_STATUS_BAR, - true, - ) + verify(centralSurfaces).setInteracting(StatusBarManager.WINDOW_STATUS_BAR, true) }, ) @@ -1681,10 +1671,7 @@ class SceneContainerStartableTest : SysuiTestCase() { }, verifyAfterTransition = { verify(centralSurfaces) - .setInteracting( - StatusBarManager.WINDOW_STATUS_BAR, - false, - ) + .setInteracting(StatusBarManager.WINDOW_STATUS_BAR, false) }, ) @@ -1699,11 +1686,7 @@ class SceneContainerStartableTest : SysuiTestCase() { verify(centralSurfaces, never()).setInteracting(anyInt(), anyBoolean()) }, verifyAfterTransition = { - verify(centralSurfaces) - .setInteracting( - StatusBarManager.WINDOW_STATUS_BAR, - true, - ) + verify(centralSurfaces).setInteracting(StatusBarManager.WINDOW_STATUS_BAR, true) }, ) @@ -1881,9 +1864,7 @@ class SceneContainerStartableTest : SysuiTestCase() { testScope.runTest { val currentScene by collectLastValue(sceneInteractor.currentScene) val transitionStateFlow = - prepareState( - authenticationMethod = AuthenticationMethodModel.None, - ) + prepareState(authenticationMethod = AuthenticationMethodModel.None) underTest.start() assertThat(currentScene).isEqualTo(Scenes.Lockscreen) // Swipe to Gone, more than halfway @@ -1949,9 +1930,7 @@ class SceneContainerStartableTest : SysuiTestCase() { fun switchToGone_whenKeyguardBecomesDisabled_whenOnShadeScene() = testScope.runTest { val currentScene by collectLastValue(sceneInteractor.currentScene) - prepareState( - initialSceneKey = Scenes.Shade, - ) + prepareState(initialSceneKey = Scenes.Shade) assertThat(currentScene).isEqualTo(Scenes.Shade) underTest.start() @@ -1981,10 +1960,7 @@ class SceneContainerStartableTest : SysuiTestCase() { fun doesNotSwitchToGone_whenKeyguardBecomesDisabled_whenDeviceEntered() = testScope.runTest { val currentScene by collectLastValue(sceneInteractor.currentScene) - prepareState( - isDeviceUnlocked = true, - initialSceneKey = Scenes.Gone, - ) + prepareState(isDeviceUnlocked = true, initialSceneKey = Scenes.Gone) assertThat(currentScene).isEqualTo(Scenes.Gone) assertThat(kosmos.deviceEntryInteractor.isDeviceEntered.value).isTrue() underTest.start() @@ -2097,10 +2073,7 @@ class SceneContainerStartableTest : SysuiTestCase() { fun refreshLockscreenEnabled() = testScope.runTest { val transitionState = - prepareState( - isDeviceUnlocked = true, - initialSceneKey = Scenes.Gone, - ) + prepareState(isDeviceUnlocked = true, initialSceneKey = Scenes.Gone) underTest.start() val isLockscreenEnabled by collectLastValue(kosmos.deviceEntryInteractor.isLockscreenEnabled) @@ -2174,10 +2147,7 @@ class SceneContainerStartableTest : SysuiTestCase() { runCurrent() verifyDuringTransition?.invoke() - transitionStateFlow.value = - ObservableTransitionState.Idle( - currentScene = toScene, - ) + transitionStateFlow.value = ObservableTransitionState.Idle(currentScene = toScene) runCurrent() verifyAfterTransition?.invoke() } @@ -2262,7 +2232,7 @@ class SceneContainerStartableTest : SysuiTestCase() { private fun TestScope.allowHapticsOnSfps( isPowerButtonDown: Boolean = false, - lastPowerPress: Long = 10000 + lastPowerPress: Long = 10000, ) { kosmos.fakeKeyEventRepository.setPowerButtonDown(isPowerButtonDown) @@ -2287,7 +2257,7 @@ class SceneContainerStartableTest : SysuiTestCase() { private fun TestScope.setupBiometricAuth( hasSfps: Boolean = false, hasUdfps: Boolean = false, - hasFace: Boolean = false + hasFace: Boolean = false, ) { if (hasSfps) { setFingerprintSensorType(FingerprintSensorType.POWER_BUTTON) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/ui/viewmodel/GoneUserActionsViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/ui/viewmodel/GoneUserActionsViewModelTest.kt index 03106eca1f63..e6a24e373218 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/ui/viewmodel/GoneUserActionsViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/ui/viewmodel/GoneUserActionsViewModelTest.kt @@ -16,6 +16,8 @@ package com.android.systemui.scene.ui.viewmodel +import android.platform.test.annotations.DisableFlags +import android.platform.test.annotations.EnableFlags import android.testing.TestableLooper import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest @@ -29,6 +31,7 @@ import com.android.systemui.lifecycle.activateIn import com.android.systemui.scene.shared.model.TransitionKeys.ToSplitShade 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 import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -52,14 +55,12 @@ class GoneUserActionsViewModelTest : SysuiTestCase() { @Before fun setUp() { - underTest = - GoneUserActionsViewModel( - shadeInteractor = kosmos.shadeInteractor, - ) + underTest = GoneUserActionsViewModel(shadeInteractor = kosmos.shadeInteractor) underTest.activateIn(testScope) } @Test + @DisableFlags(DualShade.FLAG_NAME) fun downTransitionKey_splitShadeEnabled_isGoneToSplitShade() = testScope.runTest { val userActions by collectLastValue(underTest.actions) @@ -71,6 +72,7 @@ class GoneUserActionsViewModelTest : SysuiTestCase() { } @Test + @DisableFlags(DualShade.FLAG_NAME) fun downTransitionKey_splitShadeDisabled_isNull() = testScope.runTest { val userActions by collectLastValue(underTest.actions) @@ -79,4 +81,15 @@ class GoneUserActionsViewModelTest : SysuiTestCase() { assertThat(userActions?.get(Swipe(SwipeDirection.Down))?.transitionKey).isNull() } + + @Test + @EnableFlags(DualShade.FLAG_NAME) + fun downTransitionKey_dualShadeEnabled_isNull() = + testScope.runTest { + val userActions by collectLastValue(underTest.actions) + shadeRepository.setShadeLayoutWide(true) + runCurrent() + + assertThat(userActions?.get(Swipe(SwipeDirection.Down))?.transitionKey).isNull() + } } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelTest.kt index 3f97f0b7a67d..425f16ec7da1 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelTest.kt @@ -312,7 +312,7 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S from = LOCKSCREEN, to = GLANCEABLE_HUB, value = 0f, - ) + ), ) runCurrent() @@ -321,7 +321,7 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S Transition( from = Scenes.Lockscreen, to = Scenes.Communal, - progress = flowOf(progress) + progress = flowOf(progress), ), stateTransition = TransitionStep( @@ -329,7 +329,7 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S from = LOCKSCREEN, to = GLANCEABLE_HUB, value = progress, - ) + ), ) runCurrent() @@ -344,7 +344,7 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S from = LOCKSCREEN, to = GLANCEABLE_HUB, value = 1f, - ) + ), ) assertThat(alpha).isEqualTo(0f) @@ -378,7 +378,7 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S from = DREAMING, to = GLANCEABLE_HUB, value = 0f, - ) + ), ) runCurrent() kosmos.setTransition( @@ -386,7 +386,7 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S Transition( from = Scenes.Lockscreen, to = Scenes.Communal, - progress = flowOf(progress) + progress = flowOf(progress), ), stateTransition = TransitionStep( @@ -394,7 +394,7 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S from = DREAMING, to = GLANCEABLE_HUB, value = progress, - ) + ), ) runCurrent() // Keep notifications hidden during the transition from dream to hub @@ -409,7 +409,7 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S from = DREAMING, to = GLANCEABLE_HUB, value = 1f, - ) + ), ) assertThat(alpha).isEqualTo(0f) } @@ -435,13 +435,13 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S kosmos.setTransition( sceneTransition = Idle(Scenes.Gone), - stateTransition = TransitionStep(from = LOCKSCREEN, to = GONE) + stateTransition = TransitionStep(from = LOCKSCREEN, to = GONE), ) assertThat(isOnLockscreen).isFalse() kosmos.setTransition( sceneTransition = Idle(Scenes.Lockscreen), - stateTransition = TransitionStep(from = GONE, to = LOCKSCREEN) + stateTransition = TransitionStep(from = GONE, to = LOCKSCREEN), ) assertThat(isOnLockscreen).isTrue() // While progressing from lockscreen, should still be true @@ -452,28 +452,20 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S from = LOCKSCREEN, to = GONE, value = 0.8f, - transitionState = TransitionState.RUNNING - ) + transitionState = TransitionState.RUNNING, + ), ) assertThat(isOnLockscreen).isTrue() kosmos.setTransition( sceneTransition = Idle(Scenes.Lockscreen), - stateTransition = - TransitionStep( - from = GONE, - to = LOCKSCREEN, - ) + stateTransition = TransitionStep(from = GONE, to = LOCKSCREEN), ) assertThat(isOnLockscreen).isTrue() kosmos.setTransition( sceneTransition = Idle(Scenes.Bouncer), - stateTransition = - TransitionStep( - from = LOCKSCREEN, - to = PRIMARY_BOUNCER, - ) + stateTransition = TransitionStep(from = LOCKSCREEN, to = PRIMARY_BOUNCER), ) assertThat(isOnLockscreen).isTrue() } @@ -527,11 +519,7 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S // Move to glanceable hub kosmos.setTransition( sceneTransition = Idle(Scenes.Communal), - stateTransition = - TransitionStep( - from = LOCKSCREEN, - to = GLANCEABLE_HUB, - ) + stateTransition = TransitionStep(from = LOCKSCREEN, to = GLANCEABLE_HUB), ) assertThat(isOnGlanceableHubWithoutShade).isTrue() @@ -553,11 +541,7 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S shadeTestUtil.setLockscreenShadeExpansion(0f) kosmos.setTransition( sceneTransition = Idle(Scenes.Communal), - stateTransition = - TransitionStep( - from = LOCKSCREEN, - to = GLANCEABLE_HUB, - ) + stateTransition = TransitionStep(from = LOCKSCREEN, to = GLANCEABLE_HUB), ) assertThat(isOnGlanceableHubWithoutShade).isTrue() } @@ -779,7 +763,7 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S configurationRepository.setDimensionPixelSize( R.dimen.keyguard_translate_distance_on_swipe_up, - -100 + -100, ) configurationRepository.onAnyConfigurationChange() @@ -800,7 +784,7 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S configurationRepository.setDimensionPixelSize( R.dimen.keyguard_translate_distance_on_swipe_up, - -100 + -100, ) configurationRepository.onAnyConfigurationChange() @@ -839,7 +823,8 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S fun alphaOnFullQsExpansion() = testScope.runTest { val viewState = ViewStateAccessor() - val alpha by collectLastValue(underTest.keyguardAlpha(viewState)) + val alpha by + collectLastValue(underTest.keyguardAlpha(viewState, testScope.backgroundScope)) showLockscreenWithQSExpanded() @@ -856,12 +841,15 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S @Test @BrokenWithSceneContainer(330311871) - fun alphaDoesNotUpdateWhileGoneTransitionIsRunning() = + fun alphaWhenGoneIsSetToOne() = testScope.runTest { val viewState = ViewStateAccessor() - val alpha by collectLastValue(underTest.keyguardAlpha(viewState)) + val alpha by + collectLastValue(underTest.keyguardAlpha(viewState, testScope.backgroundScope)) showLockscreen() + assertThat(alpha).isEqualTo(1f) + // GONE transition gets to 90% complete keyguardTransitionRepository.sendTransitionStep( TransitionStep( @@ -881,65 +869,23 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S ) ) runCurrent() + // Change in state should not immediately set value to 1f. Should wait for + // transition to complete + keyguardRepository.setStatusBarState(StatusBarState.SHADE) - // At this point, alpha should be zero - assertThat(alpha).isEqualTo(0f) - - // An attempt to override by the shade should be ignored - shadeTestUtil.setQsExpansion(0.5f) - assertThat(alpha).isEqualTo(0f) - } - - @Test - fun alphaDoesNotUpdateWhileOcclusionTransitionIsRunning() = - testScope.runTest { - val viewState = ViewStateAccessor() - val alpha by collectLastValue(underTest.keyguardAlpha(viewState)) + // Transition is active, and NSSL should be nearly faded out + assertThat(alpha).isLessThan(0.5f) - showLockscreen() - // OCCLUDED transition gets to 90% complete keyguardTransitionRepository.sendTransitionStep( TransitionStep( from = LOCKSCREEN, - to = OCCLUDED, - transitionState = TransitionState.STARTED, - value = 0f, - ) - ) - runCurrent() - keyguardTransitionRepository.sendTransitionStep( - TransitionStep( - from = LOCKSCREEN, - to = OCCLUDED, - transitionState = TransitionState.RUNNING, - value = 0.9f, + to = GONE, + transitionState = TransitionState.FINISHED, + value = 1f, ) ) runCurrent() - - // At this point, alpha should be zero - assertThat(alpha).isEqualTo(0f) - - // An attempt to override by the shade should be ignored - shadeTestUtil.setQsExpansion(0.5f) - assertThat(alpha).isEqualTo(0f) - } - - @Test - fun alphaWhenGoneIsSetToOne() = - testScope.runTest { - val viewState = ViewStateAccessor() - val alpha by collectLastValue(underTest.keyguardAlpha(viewState)) - - showLockscreen() - - keyguardTransitionRepository.sendTransitionSteps( - from = LOCKSCREEN, - to = GONE, - testScope - ) - keyguardRepository.setStatusBarState(StatusBarState.SHADE) - + // Should reset to 1f assertThat(alpha).isEqualTo(1f) } @@ -978,11 +924,7 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S assertThat(fadeIn[0]).isEqualTo(false) // ... then user hits power to go to AOD - keyguardTransitionRepository.sendTransitionSteps( - from = LOCKSCREEN, - to = AOD, - testScope, - ) + keyguardTransitionRepository.sendTransitionSteps(from = LOCKSCREEN, to = AOD, testScope) // ... followed by a shade collapse showLockscreen() // ... does not trigger a fade in @@ -994,7 +936,8 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S fun alpha_isZero_fromPrimaryBouncerToGoneWhileCommunalSceneVisible() = testScope.runTest { val viewState = ViewStateAccessor() - val alpha by collectLastValue(underTest.keyguardAlpha(viewState)) + val alpha by + collectLastValue(underTest.keyguardAlpha(viewState, testScope.backgroundScope)) showPrimaryBouncer() showCommunalScene() @@ -1039,7 +982,7 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S from = PRIMARY_BOUNCER, to = GONE, transitionState = TransitionState.FINISHED, - value = 1f + value = 1f, ) ) runCurrent() @@ -1052,7 +995,8 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S fun alpha_fromPrimaryBouncerToGoneWhenCommunalSceneNotVisible() = testScope.runTest { val viewState = ViewStateAccessor() - val alpha by collectLastValue(underTest.keyguardAlpha(viewState)) + val alpha by + collectLastValue(underTest.keyguardAlpha(viewState, testScope.backgroundScope)) showPrimaryBouncer() hideCommunalScene() @@ -1095,7 +1039,7 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S from = PRIMARY_BOUNCER, to = GONE, transitionState = TransitionState.FINISHED, - value = 1f + value = 1f, ) ) runCurrent() @@ -1107,7 +1051,8 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S fun alpha_isZero_fromAlternateBouncerToGoneWhileCommunalSceneVisible() = testScope.runTest { val viewState = ViewStateAccessor() - val alpha by collectLastValue(underTest.keyguardAlpha(viewState)) + val alpha by + collectLastValue(underTest.keyguardAlpha(viewState, testScope.backgroundScope)) showAlternateBouncer() showCommunalScene() @@ -1152,7 +1097,7 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S from = ALTERNATE_BOUNCER, to = GONE, transitionState = TransitionState.FINISHED, - value = 1f + value = 1f, ) ) runCurrent() @@ -1165,7 +1110,8 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S fun alpha_fromAlternateBouncerToGoneWhenCommunalSceneNotVisible() = testScope.runTest { val viewState = ViewStateAccessor() - val alpha by collectLastValue(underTest.keyguardAlpha(viewState)) + val alpha by + collectLastValue(underTest.keyguardAlpha(viewState, testScope.backgroundScope)) showAlternateBouncer() hideCommunalScene() @@ -1208,7 +1154,7 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S from = ALTERNATE_BOUNCER, to = GONE, transitionState = TransitionState.FINISHED, - value = 1f + value = 1f, ) ) runCurrent() @@ -1221,11 +1167,7 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S runCurrent() keyguardRepository.setStatusBarState(StatusBarState.KEYGUARD) runCurrent() - keyguardTransitionRepository.sendTransitionSteps( - from = AOD, - to = LOCKSCREEN, - testScope, - ) + keyguardTransitionRepository.sendTransitionSteps(from = AOD, to = LOCKSCREEN, testScope) } private suspend fun TestScope.showDream() { @@ -1247,11 +1189,7 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S runCurrent() keyguardRepository.setStatusBarState(StatusBarState.SHADE_LOCKED) runCurrent() - keyguardTransitionRepository.sendTransitionSteps( - from = AOD, - to = LOCKSCREEN, - testScope, - ) + keyguardTransitionRepository.sendTransitionSteps(from = AOD, to = LOCKSCREEN, testScope) } private suspend fun TestScope.showLockscreenWithQSExpanded() { @@ -1260,11 +1198,7 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S runCurrent() keyguardRepository.setStatusBarState(StatusBarState.SHADE_LOCKED) runCurrent() - keyguardTransitionRepository.sendTransitionSteps( - from = AOD, - to = LOCKSCREEN, - testScope, - ) + keyguardTransitionRepository.sendTransitionSteps(from = AOD, to = LOCKSCREEN, testScope) } private suspend fun TestScope.showPrimaryBouncer() { diff --git a/packages/SystemUI/res-keyguard/values-ja/strings.xml b/packages/SystemUI/res-keyguard/values-ja/strings.xml index 9752eca46a97..7c91dafb857d 100644 --- a/packages/SystemUI/res-keyguard/values-ja/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ja/strings.xml @@ -34,7 +34,7 @@ <string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • 急速充電中"</string> <string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • 低速充電中"</string> <string name="keyguard_plugged_in_charging_limited" msgid="5369697538556777542">"<xliff:g id="PERCENTAGE">%s</xliff:g> • バッテリーを保護するため、充電を一時停止しています"</string> - <string name="keyguard_plugged_in_incompatible_charger" msgid="6384203333154532125">"<xliff:g id="PERCENTAGE">%s</xliff:g> • 充電用アクセサリを確認してください"</string> + <string name="keyguard_plugged_in_incompatible_charger" msgid="6384203333154532125">"<xliff:g id="PERCENTAGE">%s</xliff:g> • 充電用アクセサリーを確認してください"</string> <string name="keyguard_network_locked_message" msgid="407096292844868608">"ネットワークがロックされました"</string> <string name="keyguard_missing_sim_message_short" msgid="685029586173458728">"SIM がありません"</string> <string name="keyguard_permanent_disabled_sim_message_short" msgid="3955052454216046100">"SIM が使用できません。"</string> diff --git a/packages/SystemUI/res/drawable/ic_volume_media_off.xml b/packages/SystemUI/res/drawable/ic_volume_media_off.xml deleted file mode 100644 index 875b7b6d1f40..000000000000 --- a/packages/SystemUI/res/drawable/ic_volume_media_off.xml +++ /dev/null @@ -1,20 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License - --> - -<selector xmlns:android="http://schemas.android.com/apk/res/android"> - <item android:drawable="@drawable/ic_volume_media_mute" /> -</selector> diff --git a/packages/SystemUI/res/layout/shelf_action_chip.xml b/packages/SystemUI/res/layout/shelf_action_chip.xml index c7606e404215..1c65e366d619 100644 --- a/packages/SystemUI/res/layout/shelf_action_chip.xml +++ b/packages/SystemUI/res/layout/shelf_action_chip.xml @@ -28,6 +28,7 @@ <ImageView android:id="@+id/overlay_action_chip_icon" android:tint="?androidprv:attr/materialColorOnSecondary" + android:tintMode="src_in" android:layout_width="@dimen/overlay_action_chip_icon_size" android:layout_height="@dimen/overlay_action_chip_icon_size"/> <TextView diff --git a/packages/SystemUI/res/layout/status_bar.xml b/packages/SystemUI/res/layout/status_bar.xml index 541aebeed4d3..32bcca1cb23d 100644 --- a/packages/SystemUI/res/layout/status_bar.xml +++ b/packages/SystemUI/res/layout/status_bar.xml @@ -102,7 +102,9 @@ <include layout="@layout/ongoing_activity_chip" android:id="@+id/ongoing_activity_chip_primary"/> - <!-- TODO(b/364653005): Add a second activity chip. --> + <include layout="@layout/ongoing_activity_chip" + android:id="@+id/ongoing_activity_chip_secondary" + android:visibility="gone"/> <com.android.systemui.statusbar.AlphaOptimizedFrameLayout android:id="@+id/notification_icon_area" diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index 2a669de9aeee..0fb0aaf20fe2 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Voeg by nota"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Sluit skakel in"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"Skermopnemer"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Verwerk tans skermopname"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Deurlopende kennisgewing vir \'n skermopnamesessie"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Sluimerskerm"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Moenie Steur Nie"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Modusse"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Geen saamgebinde toestelle beskikbaar nie"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Tik om ’n toestel te koppel of ontkoppel"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Maak Instellings oop"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Ander toestel"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Wissel oorsig"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Modusse"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Klaar"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Instellings"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Aan"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Vou ikoon in"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Vou ikoon uit"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"of"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navigeer met jou sleutelbord"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Leer kortpadsleutels"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navigeer met jou raakpaneel"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Leer raakpaneelgebare"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Navigeer met jou sleutelbord en raakpaneel"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Leer raakpaneelgebare, kortpadsleutels en meer"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Teruggebaar"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Tuisgebaar"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Handelingsleutel"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Jy kan nou die skerm ekstra donker maak deur die helderheidvlak vanaf die bokant van jou skerm nog laer te maak.\n\nDit werk die beste wanneer jy in ’n donker omgewing is."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Verwyder kortpad vir ekstra donker"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Kortpad vir ekstra donker is verwyder. Gebruik die gewone helderheidbalk om jou helderheid te verlaag."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index f7f97635b34d..286acea48dd3 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -105,6 +105,7 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"ወደ ማስታወሻ አክል"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"አገናኝ አካትት"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g><xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <string name="backlinks_cross_profile_error" msgid="1355798585727802282">"አገናኞች ከሌሎች መገለጫዎች ሊታከሉ አይችሉም"</string> <string name="screenrecord_title" msgid="4257171601439507792">"የማያ መቅረጫ"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"የማያ ገፅ ቀረጻን በማሰናዳት ላይ"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"ለአንድ የማያ ገፅ ቀረጻ ክፍለ-ጊዜ በመካሄድ ያለ ማሳወቂያ"</string> @@ -292,8 +293,7 @@ <string name="start_dreams" msgid="9131802557946276718">"የማያ ገፅ ማቆያ"</string> <string name="ethernet_label" msgid="2203544727007463351">"ኤተርኔት"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"አትረብሽ"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"ሁነታዎች"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"ብሉቱዝ"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"ምንም የተጣመሩ መሣሪያዎች አይገኝም"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"መሣሪያን ለማገናኘት ወይም ግንኙነቱን ለማቋረጥ መታ ያድርጉ"</string> @@ -434,8 +434,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"ቅንብሮችን ክፈት"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"ሌላ መሣሪያ"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"አጠቃላይ እይታን ቀያይር"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"ሁነታዎች"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"ተከናውኗል"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"ቅንብሮች"</string> <string name="zen_mode_on" msgid="9085304934016242591">"በርቷል"</string> @@ -1393,18 +1392,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"መሰብሰቢያ አዶ"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"መዘርጊያ አዶ"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ወይም"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"የቁልፍ ሰሌዳዎን በመጠቀም ያስሱ"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"የቁልፍ ሰሌዳ አቋራጮችን ይወቁ"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"የመዳሰሻ ሰሌዳዎን በመጠቀም ያስሱ"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"የመዳሰሻ ሰሌዳ ምልክቶችን ይወቁ"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"የእርስዎን የቁልፍ ሰሌዳ እና የመዳሰሻ ሰሌዳ በመጠቀም ያስሱ"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"የመዳሰሻ ሰሌዳ ምልክቶችን፣ የቁልፍ ሰሌዳ አቋራጮችን እና ሌሎችን ይወቁ"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"የተመለስ ምልክት"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"የቤት ምልክት"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"የተግባር ቁልፍ"</string> @@ -1444,4 +1437,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"አሁን ከማያ ገፅዎ በላይ የብሩህነት ደረጃውን ይበልጥ በመቀነስ ማያ ገፁን ተጨማሪ ደብዛዛ ማድረግ ይችላሉ።\n\nይህ በጨለማ አካባቢ ውስጥ ሲሆኑ በተሻለ ይሠራል።"</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"ተጨማሪ ደብዛዛ አቋራጭን አስወግድ"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"የተጨማሪ ደብዛዛ አቋራጭን ያስወግዱ። የእርስዎን ብሩሃማነት ለመቀነስ መደበኛ የብሩሃማነት አሞሌውን ይጠቀሙ።"</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 5d6b90808aa4..5b844f238028 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"إضافة إلى الملاحظة"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"تضمين الرابط"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"مسجّل الشاشة"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"جارٍ معالجة تسجيل الشاشة"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"إشعار مستمر لجلسة تسجيل شاشة"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"شاشة الاستراحة"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"عدم الإزعاج"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"الأوضاع"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"بلوتوث"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"لا يتوفر أي أجهزة مقترنة"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"انقر للاتصال بجهاز أو قطع الاتصال به"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"فتح الإعدادات"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"جهاز آخر"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"تبديل \"النظرة العامة\""</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"الأوضاع"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"تم"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"الإعدادات"</string> <string name="zen_mode_on" msgid="9085304934016242591">"مفعَّل"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"رمز التصغير"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"رمز التوسيع"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"أو"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"التنقّل باستخدام لوحة المفاتيح"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"تعرَّف على اختصارات لوحة المفاتيح"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"التنقّل باستخدام لوحة اللمس"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"تعرَّف على إيماءات لوحة اللمس"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"التنقّل باستخدام لوحة المفاتيح ولوحة اللمس"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"تعرَّف على إيماءات لوحة اللمس واختصارات لوحة المفاتيح والمزيد"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"إيماءة الرجوع"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"إيماءة الانتقال إلى الشاشة الرئيسية"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"مفتاح الإجراء"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"يمكنك الآن زيادة تعتيم الشاشة عن طريق خفض مستوى السطوع بشكل أكبر من أعلى الشاشة.\n\nيُعد هذا الخيار مناسبًا عندما تكون في مكان مظلم."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"إزالة اختصار \"زيادة تعتيم الشاشة\""</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"تمت إزالة اختصار \"زيادة تعتيم الشاشة\". لخفض مستوى سطوع شاشتك، استخدِم شريط مستوى السطوع العادي."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index 2e8a552012dd..06f28f11f3a4 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -105,6 +105,7 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"টোকাত যোগ দিয়ক"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"লিংক অন্তৰ্ভুক্ত কৰক"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <string name="backlinks_cross_profile_error" msgid="1355798585727802282">"অন্য প্ৰ’ফাইলৰ পৰা লিংক যোগ দিব নোৱাৰি"</string> <string name="screenrecord_title" msgid="4257171601439507792">"স্ক্ৰীন ৰেকৰ্ডাৰ"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"স্ক্রীন ৰেকৰ্ডিঙৰ প্ৰক্ৰিয়াকৰণ হৈ আছে"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"স্ক্রীন ৰেকৰ্ডিং ছেশ্বন চলি থকা সময়ত পোৱা জাননী"</string> @@ -292,8 +293,7 @@ <string name="start_dreams" msgid="9131802557946276718">"স্ক্ৰীন ছেভাৰ"</string> <string name="ethernet_label" msgid="2203544727007463351">"ইথাৰনেট"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"অসুবিধা নিদিব"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"ম’ড"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"ব্লুটুথ"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"কোনো যোৰা লগোৱা ডিভাইচ উপলব্ধ নহয়।"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"ডিভাইচ সংযোগ কৰিবলৈ অথবা সংযোগ বিচ্ছিন্ন কৰিবলৈ টিপক"</string> @@ -434,8 +434,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"ছেটিং খোলক"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"অন্য ডিভাইচ"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"অৱলোকন ট’গল কৰক"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"ম’ড"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"কৰা হ’ল"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"ছেটিং"</string> <string name="zen_mode_on" msgid="9085304934016242591">"অন আছে"</string> @@ -1393,18 +1392,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"সংকোচন কৰাৰ চিহ্ন"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"বিস্তাৰ কৰাৰ চিহ্ন"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"অথবা"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"কীব’ৰ্ড ব্যৱহাৰ কৰি নেভিগে’ট কৰক"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"কীব’ৰ্ডৰ শ্বৰ্টকাটসমূহৰ বিষয়ে জানক"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"আপোনাৰ টাচ্চপেড ব্যৱহাৰ কৰি নেভিগে’ট কৰক"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"টাচ্চপেডৰ নিৰ্দেশসমূহ জানক"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"আপোনাৰ কীব’ৰ্ড আৰু টাচ্চপেড ব্যৱহাৰ কৰি নেভিগে’ট কৰক"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"টাচ্চপেডৰ নিৰ্দেশ, কীব’ৰ্ডৰ শ্বৰ্টকাট আৰু অধিকৰ বিষয়ে জানক"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"উভতি যাওক নিৰ্দেশ"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"গৃহ স্ক্ৰীনলৈ যোৱাৰ নিৰ্দেশ"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"কাৰ্য কী"</string> @@ -1444,4 +1437,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"আপুনি এতিয়া আপোনাৰ স্ক্ৰীনৰ একেবাৰে ওপৰৰ পৰা উজ্জ্বলতাৰ স্তৰ আৰু অধিক হ্ৰাস কৰি স্ক্ৰীনখন এক্সট্ৰা ডিম কৰিব পাৰে।\n\nআপুনি অন্ধকাৰ পৰিৱেশত থাকিলে এই সুবিধাটোৱে আটাইতকৈ ভাল কাম কৰে।"</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"এক্সট্ৰা ডিম শ্বৰ্টকাট আঁতৰাওক"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"এক্সট্ৰা ডিম শ্বৰ্টকাট আঁতৰোৱা হৈছে। আপোনাৰ উজ্জ্বলতা হ্ৰাস কৰিবলৈ, নিয়মীয়া উজ্জ্বলতা বাৰ ব্যৱহাৰ কৰক।"</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index b011ca646f5d..24ab6aecaff0 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Qeydə əlavə edin"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Keçid daxil edin"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g><xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"Ekran yazıcısı"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Ekran çəkilişi emal edilir"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ekranın video çəkimi ərzində silinməyən bildiriş"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Ekran qoruyucu"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Narahat etməyin"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Rejimlər"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Heç bir cütlənmiş cihaz əlçatan deyil"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Toxunaraq cihaza qoşulun, yaxud əlaqəni ayırın"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Ayarları açın"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Digər cihaz"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"İcmala Keçin"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Rejimlər"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Hazırdır"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Ayarlar"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Aktiv"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"İkonanı yığcamlaşdırın"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"İkonanı genişləndirin"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"və ya"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Klaviaturadan istifadə edərək hərəkət edin"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Klaviatura qısayolları haqqında öyrənin"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Taçpeddən istifadə edərək hərəkət edin"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Taçped jestlərini öyrənin"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Klaviatura və taçpeddən istifadə edərək hərəkət edin"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Taçped jestləri, klaviatura qısayolları və s. haqqında öyrənin"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Geri jesti"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Əsas ekran jesti"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Əməliyyat düyməsi"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"İndi ekranın yuxarısında parlaqlıq səviyyəsini daha da aşağı salaraq ekranı əlavə qaralda bilərsiniz.\n\nTünd mühitdə olduqda nəticə yaxşı olur."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Əlavə qaraltma qısayolunu silin"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Əlavə qaraltma qısayolu silindi. Parlaqlığı aşağı salmaq üçün adi parlaqlıq panelindən istifadə edin."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index c581fd5b0488..5efa223dcd9a 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -105,6 +105,7 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Dodaj u belešku"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Uvrsti link"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <string name="backlinks_cross_profile_error" msgid="1355798585727802282">"Ne možete da dodate linkove sa drugih profila"</string> <string name="screenrecord_title" msgid="4257171601439507792">"Snimač ekrana"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Obrađujemo video snimka ekrana"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Obaveštenje o sesiji snimanja ekrana je aktivno"</string> @@ -292,8 +293,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Čuvar ekrana"</string> <string name="ethernet_label" msgid="2203544727007463351">"Eternet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Ne uznemiravaj"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Režimi"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Nije dostupan nijedan upareni uređaj"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Dodirnite da biste povezali uređaj ili prekinuli vezu"</string> @@ -434,8 +434,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Otvori Podešavanja"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Drugi uređaj"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Uključi/isključi pregled"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Režimi"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Gotovo"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Podešavanja"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Uključeno"</string> @@ -488,7 +487,7 @@ <string name="cta_tile_button_to_dismiss" msgid="3377597875997861754">"Odbaci"</string> <string name="cta_label_to_edit_widget" msgid="6496885074209203756">"Dodajte, uklonite i preuredite vidžete ovde"</string> <string name="cta_label_to_open_widget_picker" msgid="3874946756976360699">"Dodajte još vidžeta"</string> - <string name="popup_on_dismiss_cta_tile_text" msgid="8292501780996070019">"Dugi pritisak za prilagođavanje vidžeta"</string> + <string name="popup_on_dismiss_cta_tile_text" msgid="8292501780996070019">"Dugo pritisnite za prilagođavanje vidžeta"</string> <string name="button_to_configure_widgets_text" msgid="4191862850185256901">"Prilagodi vidžete"</string> <string name="unlock_reason_to_customize_widgets" msgid="5011909432460546033">"Otključajte da biste prilagodili vidžete"</string> <string name="icon_description_for_disabled_widget" msgid="4693151565003206943">"Ikona aplikacije za onemogućen vidžet"</string> @@ -1393,18 +1392,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikona za skupljanje"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikona za proširivanje"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ili"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Krećite se pomoću tastature"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Saznajte više o tasterskim prečicama"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Krećite se pomoću tačpeda"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Naučite pokrete za tačped"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Krećite se pomoću tastature i tačpeda"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Naučite pokrete za tačped, tasterske prečice i drugo"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Pokret za vraćanje"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Pokret za početnu stranicu"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Taster radnji"</string> @@ -1444,4 +1437,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Sada možete dodatno da zatamnite ekran smanjivanjem nivoa osvetljenosti pri vrhu ekrana. \n\nOvo najbolje funkcioniše kada ste u tamnom okruženju."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Ukloni prečicu za dodatno zatamnjivanje"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Uklonjena je prečica za dodatno zatamnjivanje. Da biste smanjili osvetljenost, koristite uobičajenu traku za osvetljenost."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index 31854f6822c2..435d8339f943 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -105,6 +105,7 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Дадаць у нататку"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Дадаць спасылку"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <string name="backlinks_cross_profile_error" msgid="1355798585727802282">"Спасылкі нельга дадаваць з іншых профіляў"</string> <string name="screenrecord_title" msgid="4257171601439507792">"Запіс экрана"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Апрацоўваецца запіс экрана"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Бягучае апавяшчэнне для сеанса запісу экрана"</string> @@ -292,8 +293,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Экранная застаўка"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Не турбаваць"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Рэжымы"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Няма даступных спалучаных прылад"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Націсніце, каб падключыць або адключыць прыладу"</string> @@ -434,8 +434,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Адкрыць налады"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Іншая прылада"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Уключыць/выключыць агляд"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Рэжымы"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Гатова"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Налады"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Уключана"</string> @@ -1393,18 +1392,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Значок \"Згарнуць\""</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Значок \"Разгарнуць\""</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"або"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Навігацыя з дапамогай клавіятуры"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Азнаёмцеся са спалучэннямі клавіш"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Навігацыя з дапамогай сэнсарнай панэлі"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Азнаёмцеся з жэстамі для сэнсарнай панэлі"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Навігацыя з дапамогай клавіятуры і сэнсарнай панэлі"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Азнаёмцеся з жэстамі для сэнсарнай панэлі, спалучэннямі клавіш і г. д."</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Жэст для вяртання на папярэдні экран"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Жэст для вяртання на галоўны экран"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Клавіша дзеяння"</string> @@ -1444,4 +1437,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Цяпер вы можаце дадаткова зацямніць экран, яшчэ больш панізіўшы ўзровень яркасці праз налады ўверсе экрана.\n\nГэта функцыя працуе лепш за ўсё ў цёмным асяроддзі."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Выдаліць хуткую каманду для дадатковага памяншэння яркасці"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Хуткая каманда для дадатковага памяншэння яркасці выдалена. Каб паменшыць яркасць, выкарыстоўвайце звычайную панэль яркасці."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index 64ecfd3c0243..adbc13ab590f 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Добавяне към бележката"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Включване на връзката"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"Запис на екрана"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Записът на екрана се обработва"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Текущо известие за сесия за записване на екрана"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Скрийнсейвър"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Не безпокойте"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Режими"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Няма налични сдвоени устройства"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Докоснете, за да свържете устройство или да прекъснете връзката му"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Към настройките"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Друго устройство"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Превключване на общия преглед"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Режими"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Готово"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Настройки"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Вкл."</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Икона за свиване"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Икона за разгъване"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"или"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Навигирайте посредством клавиатурата си"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Научете за клавишните комбинации"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Навигирайте посредством сензорния панел"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Научете за жестовете със сензорния панел"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Навигирайте посредством клавиатурата и сензорния панел"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Научете за жестовете със сензорния панел, клавишните комбинации и др."</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Жест за връщане назад"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Жест за преминаване към началния екран"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Клавиш за действия"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Вече можете да затъмнявате екрана допълнително, като намалявате яркостта още повече от лентата в горната му част.\n\nТова е най-полезно, когато сте на тъмно място."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Премахване на прекия път за допълнително затъмняване"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Прекият път за допълнително затъмняване е премахнат. За да намалите яркостта, използвайте обикновената лента за управлението ѝ."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index f62ee9ecaa34..2aa7786774f9 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"নোটে যোগ করুন"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"লিঙ্ক যোগ করুন"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"স্ক্রিন রেকর্ডার"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"স্ক্রিন রেকর্ডিং প্রসেস হচ্ছে"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"স্ক্রিন রেকর্ডিং সেশন চলার বিজ্ঞপ্তি"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"স্ক্রিন সেভার"</string> <string name="ethernet_label" msgid="2203544727007463351">"ইথারনেট"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"বিরক্ত করবে না"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"মোড"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"ব্লুটুথ"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"চেনা কোনও ডিভাইস নেই"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"কোনও ডিভাইস কানেক্ট বা ডিসকানেক্ট করতে ট্যাপ করুন"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"সেটিংস খুলুন"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"অন্য ডিভাইস"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"\'এক নজরে\' বৈশিষ্ট্যটি চালু বা বন্ধ করুন"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"মোড"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"হয়ে গেছে"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"সেটিংস"</string> <string name="zen_mode_on" msgid="9085304934016242591">"চালু আছে"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"আইকন আড়াল করুন"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"আইকন বড় করুন"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"অথবা"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"আপনার কীবোর্ড ব্যবহার করে নেভিগেট করুন"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"কীবোর্ড শর্টকাট সম্পর্কে জানুন"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"আপনার টাচপ্যাড ব্যবহার করে নেভিগেট করুন"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"টাচপ্যাডের জেসচার সম্পর্কে জানুন"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"আপনার কীবোর্ড এবং টাচপ্যাড ব্যবহার করে নেভিগেট করুন"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"টাচপ্যাড জেসচার, কীবোর্ড শর্টকাট এবং আরও অনেক কিছু সম্পর্কে জানুন"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"ফিরে যাওয়ার জেসচার"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"হোমপেজে যাওয়ার জেসচার"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"অ্যাকশন কী"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"আপনি এখন স্ক্রিনের উপর থেকে ব্রাইটনেস লেভেল কমিয়েও, স্ক্রিন অতিরিক্ত কম ব্রাইট করতে পারবেন।\n\nআপনি অন্ধকার পরিবেশে থাকলে এটি সবথেকে ভালো কাজ করে।"</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"\'অতিরিক্ত কম ব্রাইটনেস\' ফিচারের শর্টকাট সরান"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"\'অতিরিক্ত কম ব্রাইটনেস\' ফিচারের শর্টকাট সরানো হয়েছে। আপনার ব্রাইটনেস কম করতে, সাধারণ ব্রাইটনেস বার ব্যবহার করুন।"</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index 51416ef326ef..4802af846eda 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Dodaj u bilješku"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Uključi link"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"Snimač ekrana"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Obrađivanje snimka ekrana"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Obavještenje za sesiju snimanja ekrana je u toku"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Čuvar ekrana"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Ne ometaj"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Načini rada"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Nema dostupnih uparenih uređaja"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Dodirnite da povežete ili prekinete povezanost uređaja"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Otvori Postavke"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Drugi uređaj"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Pregled uključivanja/isključivanja"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Načini rada"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Gotovo"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Postavke"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Uključeno"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikona sužavanja"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikona proširivanja"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ili"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Krećite se pomoću tastature"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Saznajte više o prečicama tastature"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Krećite se pomoću dodirne podloge"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Saznajte više o pokretima na dodirnoj podlozi"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Krećite se pomoću tastature i dodirne podloge"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Saznajte više o pokretima na dodirnoj podlozi, prečicama tastature i drugim opcijama"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Pokret za povratak"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Pokret za povratak na početni ekran"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Tipka radnji"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Sada možete dodatno zatamniti ekran daljnjim smanjenjem nivoa osvijetljenosti s vrha ekrana.\n\nOvo najbolje funkcionira u tamnom okruženju."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Ukloni prečicu za dodatno zatamnjenje"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Prečica za dodatno zatamnjenje je uklonjena. Da smanjite osvijetljenost, koristite običnu traku za osvijetljenost."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 182fe02a371c..10fedd8ce7a4 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Afegeix a una nota"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Inclou l\'enllaç"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"Gravació de pantalla"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Processant gravació de pantalla"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificació en curs d\'una sessió de gravació de la pantalla"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Estalvi de pantalla"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"No molestis"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Modes"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"No hi ha dispositius vinculats disponibles"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Toca per connectar o desconnectar un dispositiu"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Obre Configuració"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Un altre dispositiu"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Activa o desactiva Aplicacions recents"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Modes"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Fet"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Configuració"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Activat"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Replega la icona"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Desplega la icona"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"o"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navega amb el teclat"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Aprèn les tecles de drecera"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navega amb el ratolí tàctil"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Aprèn els gestos del ratolí tàctil"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Navega amb el teclat i el ratolí tàctil"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Aprèn els gestos del ratolí tàctil, les tecles de drecera i més"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Gest Enrere"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Gest Inici"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Tecla d\'acció"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Ara pots atenuar encara més la pantalla abaixant-ne el nivell de brillantor des de la part superior.\n\nFunciona millor si et trobes en un lloc fosc."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Suprimeix la drecera d\'atenuació extra"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"S\'ha suprimit la drecera d\'atenuació extra. Per abaixar la brillantor, utilitza la barra de brillantor normal."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index cebb175e4ae7..f995b294a477 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -105,6 +105,7 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Přidat do poznámky"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Zahrnout odkaz"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <string name="backlinks_cross_profile_error" msgid="1355798585727802282">"Nelze přidat odkazy z jiných profilů"</string> <string name="screenrecord_title" msgid="4257171601439507792">"Nahrávání obrazovky"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Záznam obrazovky se zpracovává"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Trvalé oznámení o relaci nahrávání"</string> @@ -292,8 +293,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Spořič obrazovky"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Nerušit"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Režimy"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Nejsou dostupná žádná spárovaná zařízení"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Klepnutím zařízení připojíte nebo odpojíte"</string> @@ -434,8 +434,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Otevřít nastavení"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Další zařízení"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Přepnout přehled"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Režimy"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Hotovo"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Nastavení"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Zapnuto"</string> @@ -1393,18 +1392,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikona sbalení"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikona rozbalení"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"nebo"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navigujte pomocí klávesnice"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Naučte se klávesové zkratky"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navigujte pomocí touchpadu"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Naučte se gesta touchpadu"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Navigujte pomocí klávesnice a touchpadu"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Naučte se gesta touchpadu, klávesové zkratky a další"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Gesto zpět"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Gesto domů"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Akční klávesa"</string> @@ -1444,4 +1437,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Obrazovku můžete v horní části nastavit jako velmi tmavou tím, že ještě víc snížíte jas.\n\nNejlépe to funguje ve tmavém prostředí."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Odstranit zkratku pro velmi tmavou obrazovku"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Zkratka pro velmi tmavou obrazovku byla odstraněna. Jas můžete snížit pomocí standardního sloupce jasu."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 974083e5ffa8..3b74a6db4bdd 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Føj til note"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Inkluder link"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"Skærmoptagelse"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Behandler skærmoptagelse"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Konstant notifikation om skærmoptagelse"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Pauseskærm"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Forstyr ikke"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Tilstande"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Der er ingen tilgængelige parrede enheder"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Tryk for at oprette eller afbryde forbindelse til en enhed"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Åbn Indstillinger"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Anden enhed"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Slå Oversigt til/fra"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Tilstande"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Udfør"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Indstillinger"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Til"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikon for Skjul"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikon for Udvid"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"eller"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Naviger ved hjælp af dit tastatur"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Se tastaturgenveje"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Naviger ved hjælp af din touchplade"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Se bevægelser på touchpladen"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Naviger ved hjælp af dit tastatur og din touchplade"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Se bevægelser på touchpladen, tastaturgenveje m.m."</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Bevægelse for at gå tilbage"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Bevægelse for at gå til startskærm"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Handlingstast"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Du kan nu dæmpe skærmens belysning ekstra meget ved at reducere lysstyrken endnu mere fra toppen af skærmen.\n\nDette fungerer bedst i mørke omgivelser."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Fjern genvejen til ekstra dæmpet belysning"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Genvejen til ekstra dæmpet belysning er fjernet. Brug den almindelige lysstyrkebjælke til at reducere lysstyrken."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 11dd46e5b11f..fa7ad567e0b9 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Zu Notiz hinzufügen"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Link einschließen"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"Bildschirmaufzeichnung"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Bildschirmaufzeichnung…"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Fortlaufende Benachrichtigung für eine Bildschirmaufzeichnung"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Bildschirmschoner"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Bitte nicht stören"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Modi"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Keine gekoppelten Geräte verfügbar"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Zum Verbinden oder Trennen eines Geräts tippen"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Einstellungen öffnen"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Sonstiges Gerät"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Übersicht ein-/ausblenden"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Modi"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Fertig"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Einstellungen"</string> <string name="zen_mode_on" msgid="9085304934016242591">"An"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Symbol „Minimieren“"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Symbol „Maximieren“"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"oder"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navigation mit der Tastatur"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Informationen zu Tastenkombinationen"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navigation mit dem Touchpad"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Informationen zu Touchpad-Gesten"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Navigation mit Tastatur und Touchpad"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Informationen zu Touchpad-Gesten, Tastenkombinationen und mehr"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Touch-Geste „Zurück“"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Touch-Geste „Startbildschirm“"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Aktionstaste"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Du kannst das Display jetzt extradunkel machen, indem du die Helligkeit vom oberen Displayrand aus noch weiter senkst.\n\nDas funktioniert in dunklen Umgebungen am besten."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Verknüpfung für „Extradunkel“ entfernen"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Verknüpfung für „Extradunkel“ wurde entfernt. Wenn du die Helligkeit reduzieren möchtest, verwende einfach die normale Helligkeitsleiste."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index 433137cb0127..26f1c5666c9c 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Προσθήκη σε σημείωση"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Συμπερίληψη συνδέσμου"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"Εγγραφή οθόνης"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Επεξεργασία εγγραφής οθόνης"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ειδοποίηση σε εξέλιξη για μια περίοδο λειτουργίας εγγραφής οθόνης"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Προφύλαξη οθόνης"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Μην ενοχλείτε"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Λειτουργίες"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Δεν υπάρχουν διαθέσιμες συσκευές σε σύζευξη"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Πατήστε για σύνδεση ή αποσύνδεση μιας συσκευής"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Άνοιγμα Ρυθμίσεων"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Άλλη συσκευή"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Εναλλαγή επισκόπησης"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Λειτουργίες"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Τέλος"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Ρυθμίσεις"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Ενεργό"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Εικονίδιο σύμπτυξης"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Εικονίδιο ανάπτυξης"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ή"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Πλοήγηση με το πληκτρολόγιο"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Μάθετε συντομεύσεις πληκτρολογίου"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Πλοήγηση με την επιφάνεια αφής"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Μάθετε κινήσεις επιφάνειας αφής"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Πλοήγηση με το πληκτρολόγιο και την επιφάνεια αφής"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Μάθετε κινήσεις επιφάνειας αφής, συντομεύσεις πληκτρολογίου και άλλα"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Κίνηση επιστροφής"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Κίνηση μετάβασης στην αρχική οθόνη"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Πλήκτρο ενέργειας"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Τώρα μπορείτε να μειώσετε επιπλέον τη φωτεινότητα της οθόνης, χαμηλώνοντας το επίπεδο φωτεινότητας ακόμα περισσότερο από το επάνω μέρος της οθόνης.\n\nΑυτό λειτουργεί καλύτερα όταν βρίσκεστε σε σκοτεινό περιβάλλον."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Κατάργηση συντόμευσης επιπλέον μείωσης φωτεινότητας"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Η συντόμευση της επιπλέον μείωσης φωτεινότητας καταργήθηκε. Για να χαμηλώσετε τη φωτεινότητα, χρησιμοποιήστε την κανονική γραμμή φωτεινότητας."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index cb9dfe5a8d54..24922ac29c7e 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Add to note"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Include link"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"Screen recorder"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Processing screen recording"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ongoing notification for a screen record session"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Screen saver"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Do Not Disturb"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Modes"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"No paired devices available"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Tap to connect or disconnect a device"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Open settings"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Other device"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Toggle Overview"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Modes"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Done"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Settings"</string> <string name="zen_mode_on" msgid="9085304934016242591">"On"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Collapse icon"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Expand icon"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"or"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navigate using your keyboard"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Learn keyboards shortcuts"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navigate using your touchpad"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Learn touchpad gestures"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Navigate using your keyboard and touchpad"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Learn touchpad gestures, keyboards shortcuts and more"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Back gesture"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Home gesture"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Action key"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"You can now make the screen extra dim by lowering the brightness level even further from the top of your screen.\n\nThis works best when you\'re in a dark environment."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Remove extra dim shortcut"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Extra dim shortcut removed. To lower your brightness, use the regular brightness bar."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index 3d4c31f9f60e..88f175393e0c 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -105,6 +105,7 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Add to note"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Include link"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <string name="backlinks_cross_profile_error" msgid="1355798585727802282">"Links can\'t be added from other profiles"</string> <string name="screenrecord_title" msgid="4257171601439507792">"Screen Recorder"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Processing screen recording"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ongoing notification for a screen record session"</string> @@ -1436,4 +1437,11 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"You can now make the screen extra dim by lowering the brightness level even further from the top of your screen.\n\nThis works best when you\'re in a dark environment."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Remove extra dim shortcut"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Extra dim shortcut removed. To lower your brightness, use the regular brightness bar."</string> + <string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Connectivity"</string> + <string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Accessibility"</string> + <string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Utilities"</string> + <string name="qs_edit_mode_category_privacy" msgid="6577774443194551775">"Privacy"</string> + <string name="qs_edit_mode_category_providedByApps" msgid="8346112074897919019">"Provided by apps"</string> + <string name="qs_edit_mode_category_display" msgid="4749511439121053942">"Display"</string> + <string name="qs_edit_mode_category_unknown" msgid="509314252124053550">"Unknown"</string> </resources> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index cb9dfe5a8d54..24922ac29c7e 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Add to note"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Include link"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"Screen recorder"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Processing screen recording"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ongoing notification for a screen record session"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Screen saver"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Do Not Disturb"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Modes"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"No paired devices available"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Tap to connect or disconnect a device"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Open settings"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Other device"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Toggle Overview"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Modes"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Done"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Settings"</string> <string name="zen_mode_on" msgid="9085304934016242591">"On"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Collapse icon"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Expand icon"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"or"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navigate using your keyboard"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Learn keyboards shortcuts"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navigate using your touchpad"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Learn touchpad gestures"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Navigate using your keyboard and touchpad"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Learn touchpad gestures, keyboards shortcuts and more"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Back gesture"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Home gesture"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Action key"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"You can now make the screen extra dim by lowering the brightness level even further from the top of your screen.\n\nThis works best when you\'re in a dark environment."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Remove extra dim shortcut"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Extra dim shortcut removed. To lower your brightness, use the regular brightness bar."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index cb9dfe5a8d54..24922ac29c7e 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Add to note"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Include link"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"Screen recorder"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Processing screen recording"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ongoing notification for a screen record session"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Screen saver"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Do Not Disturb"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Modes"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"No paired devices available"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Tap to connect or disconnect a device"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Open settings"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Other device"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Toggle Overview"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Modes"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Done"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Settings"</string> <string name="zen_mode_on" msgid="9085304934016242591">"On"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Collapse icon"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Expand icon"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"or"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navigate using your keyboard"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Learn keyboards shortcuts"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navigate using your touchpad"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Learn touchpad gestures"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Navigate using your keyboard and touchpad"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Learn touchpad gestures, keyboards shortcuts and more"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Back gesture"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Home gesture"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Action key"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"You can now make the screen extra dim by lowering the brightness level even further from the top of your screen.\n\nThis works best when you\'re in a dark environment."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Remove extra dim shortcut"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Extra dim shortcut removed. To lower your brightness, use the regular brightness bar."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml index eb94d598bf6e..e8b32060b03f 100644 --- a/packages/SystemUI/res/values-en-rXC/strings.xml +++ b/packages/SystemUI/res/values-en-rXC/strings.xml @@ -105,6 +105,7 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Add to note"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Include link"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <string name="backlinks_cross_profile_error" msgid="1355798585727802282">"Links can\'t be added from other profiles"</string> <string name="screenrecord_title" msgid="4257171601439507792">"Screen Recorder"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Processing screen recording"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ongoing notification for a screen record session"</string> @@ -1436,4 +1437,11 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"You can now make the screen extra dim by lowering the brightness level even further from the top of your screen.\n\nThis works best when you\'re in a dark environment."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Remove extra dim shortcut"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Extra dim shortcut removed. To lower your brightness, use the regular brightness bar."</string> + <string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Connectivity"</string> + <string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Accessibility"</string> + <string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Utilities"</string> + <string name="qs_edit_mode_category_privacy" msgid="6577774443194551775">"Privacy"</string> + <string name="qs_edit_mode_category_providedByApps" msgid="8346112074897919019">"Provided by apps"</string> + <string name="qs_edit_mode_category_display" msgid="4749511439121053942">"Display"</string> + <string name="qs_edit_mode_category_unknown" msgid="509314252124053550">"Unknown"</string> </resources> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 2af8bd128d95..42c35109be8a 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Agregar a la nota"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Incluir vínculo"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"Grabadora de pantalla"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Procesando grabación pantalla"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificación constante para una sesión de grabación de pantalla"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Protector pantalla"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"No interrumpir"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Modos"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"No hay dispositivos sincronizados disponibles"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Presiona para conectar o desconectar un dispositivo"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Abrir Configuración"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Otro dispositivo"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Ocultar o mostrar Recientes"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Modos"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Listo"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Configuración"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Activado"</string> @@ -1444,4 +1444,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Ahora puedes bajar el nivel del brillo desde la parte superior de la pantalla para atenuarla aún más.\n\nEsto funciona mejor si estás en un ambiente oscuro."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Quitar la combinación de teclas de atenuación extra"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Se quitó el atajo de atenuación extra. Para bajar el brillo, usa la barra de brillo normal."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 2e823eda8fc7..6595258bc8e8 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -105,6 +105,7 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Añadir a nota"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Incluir enlace"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <string name="backlinks_cross_profile_error" msgid="1355798585727802282">"No se pueden añadir enlaces de otros perfiles"</string> <string name="screenrecord_title" msgid="4257171601439507792">"Grabación de pantalla"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Procesando grabación de pantalla"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificación continua de una sesión de grabación de la pantalla"</string> @@ -292,8 +293,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Salvapantallas"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"No molestar"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Modos"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"No hay dispositivos vinculados disponibles"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Toca para conectar o desconectar un dispositivo"</string> @@ -434,8 +434,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Abrir Ajustes"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Otro dispositivo"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Mostrar u ocultar aplicaciones recientes"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Modos"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Hecho"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Ajustes"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Activado"</string> @@ -1444,4 +1443,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Ahora puedes atenuar aún más tu pantalla reduciendo el nivel de brillo desde la parte superior.\n\nFunciona mejor cuando estás en un lugar con poca luz."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Eliminar acceso directo a la atenuación extra"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Acceso directo a la atenuación extra eliminado. Para reducir el brillo, usa la barra de brillo normal."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index 09f461f07003..7042ac136845 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Lisa märkmesse"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Kaasa link"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"Ekraanisalvesti"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Ekraanisalvestuse töötlemine"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Pooleli märguanne ekraanikuva salvestamise seansi puhul"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Ekraanisäästja"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Mitte segada"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Režiimid"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Ühtegi seotud seadet pole saadaval"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Puudutage seadme ühendamiseks või ühenduse katkestamiseks"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Ava menüü Seaded"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Muu seade"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Lehe Ülevaade sisse- ja väljalülitamine"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Režiimid"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Valmis"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Seaded"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Sees"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ahendamisikoon"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Laiendamisikoon"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"või"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navigeerige klaviatuuri abil"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Õppige klaviatuuri otseteid"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navigeerige puuteplaadi abil"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Õppige puuteplaadi liigutusi"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Navigeerige klaviatuuri ja puuteplaadi abil"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Õppige puuteplaadi liigutusi, klaviatuuri otseteid ja palju muud"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Tagasiliikumisliigutus"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Avakuvale liikumise liigutus"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Toiminguklahv"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Nüüd saate muuta ekraani eriti tumedaks, vähendades ereduse taset ekraani ülaosast veelgi rohkem.\n\nSee toimib kõige paremini hämaras keskkonnas."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Eemalda funktsiooni „Eriti tume“ otsetee"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Funktsiooni „Eriti tume“ otsetee eemaldati. Kasutage ereduse vähendamiseks tavapärast ereduse reguleerimise riba."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 329b6e2bb0d9..e51e37530751 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Gehitu oharrean"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Sartu esteka"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"Pantaila-grabagailua"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Pantaila-grabaketa prozesatzen"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Pantailaren grabaketa-saioaren jakinarazpen jarraitua"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Pantaila-babeslea"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Ez molestatzeko modua"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Moduak"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetootha"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Ez dago parekatutako gailurik erabilgarri"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Sakatu hau gailu bat konektatu edo deskonektatzeko"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Ireki Ezarpenak"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Beste gailu bat"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Aldatu ikuspegi orokorra"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Moduak"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Eginda"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Ezarpenak"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Aktibatuta"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Tolesteko ikonoa"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Zabaltzeko ikonoa"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"edo"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Nabigatu teklatua erabilita"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Ikasi lasterbideak"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Nabigatu ukipen-panela erabilita"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Ikasi ukipen-paneleko keinuak"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Nabigatu teklatua eta ukipen-panela erabilita"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Ikasi ukipen-paneleko keinuak, lasterbideak eta abar"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Atzera egiteko keinua"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Orri nagusira joateko keinua"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Ekintza-tekla"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Orain, pantaila are ilunago jar dezakezu, pantailaren goialdetik argitasun-maila are gehiago jaitsita.\n\nIngurune ilun batean zaudenean funtzionatzen du ondoen."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Kendu Are ilunago eginbidearen lasterbidea"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Kendu da Are ilunago eginbidearen lasterbidea. Argitasuna murrizteko, erabili argitasun-barra arrunta."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index f845027a38df..13d403b1d274 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -105,6 +105,7 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"افزودن به یادداشت"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"اضافه کردن پیوند"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <string name="backlinks_cross_profile_error" msgid="1355798585727802282">"نمیتوان از نمایههای دیگر پیوند اضافه کرد"</string> <string name="screenrecord_title" msgid="4257171601439507792">"ضبطکن صفحهنمایش"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"درحال پردازش ضبط صفحهنمایش"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"اعلان درحال انجام برای جلسه ضبط صفحهنمایش"</string> @@ -292,8 +293,7 @@ <string name="start_dreams" msgid="9131802557946276718">"محافظ صفحه"</string> <string name="ethernet_label" msgid="2203544727007463351">"اترنت"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"مزاحم نشوید"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"حالتها"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"بلوتوث"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"هیچ دستگاه مرتبط شدهای موجود نیست"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"برای اتصال یا قطع اتصال دستگاه، تکضرب بزنید"</string> @@ -434,8 +434,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"باز کردن تنظیمات"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"دستگاه دیگر"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"تغییر وضعیت نمای کلی"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"حالتها"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"تمام"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"تنظیمات"</string> <string name="zen_mode_on" msgid="9085304934016242591">"روشن"</string> @@ -1393,18 +1392,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"نماد جمع کردن"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"نماد ازهم بازکردن"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"یا"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"پیمایش کردن بااستفاده از صفحهکلید"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"آشنایی با میانبرهای صفحهکلید"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"پیمایش کردن بااستفاده از صفحه لمسی"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"آشنایی با اشارههای صفحه لمسی"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"پیمایش کردن بااستفاده از صفحهکلید و صفحه لمسی"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"آشنایی با اشارههای صفحه لمسی، میانبرهای صفحهکلید، و موارد دیگر"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"اشاره برگشت"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"اشاره صفحه اصلی"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"دکمه کنش"</string> @@ -1444,4 +1437,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"ازاینپس میتوانید با پایینتر آوردن سطح روشنایی از بالای صفحهنمایش، صفحهنمایش را بسیار کمنور کنید.\n\nاین ویژگی زمانی بهترین عملکرد را دارد که در محیطی تاریک باشید."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"حذف میانبر «بسیار کمنور»"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"میانبر «بسیار کمنور» حذف شد. برای کم کردن روشنایی، از نوار معمول روشنایی استفاده کنید."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index b9afcd567242..ab31329cf26c 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Lisää muistiinpanoon"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Lisää linkki"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"Näytön tallentaja"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Näytön tallennusta käsitellään"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Pysyvä ilmoitus näytön tallentamisesta"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Näytönsäästäjä"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Älä häiritse"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Tilat"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Laitepareja ei ole käytettävissä"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Muodosta yhteys laitteeseen tai katkaise yhteys napauttamalla"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Avaa Asetukset"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Muu laite"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Näytä/piilota viimeisimmät"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Tilat"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Valmis"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Asetukset"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Päällä"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Tiivistyskuvake"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Laajennuskuvake"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"tai"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Siirry käyttämällä näppäimistöä"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Opettele pikanäppäimiä"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Siirry käyttämällä kosketuslevyä"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Opettele kosketuslevyn eleitä"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Siirry käyttämällä näppäimistöä ja kosketuslevyä"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Opettele kosketuslevyn eleitä, pikanäppäimiä ja muuta"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Takaisin-ele"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Etusivu-ele"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Toimintonäppäin"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Voit nyt tehdä näytöstä erittäin himmeän vähentämällä kirkkautta vieläkin enemmän näytön yläreunasta.\n\nTämä toimii parhaiten pimeässä ympäristössä."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Poista erittäin himmeä ‑pikakomento"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Erittäin himmeä ‑pikakomento poistettu. Voit vähentää kirkkautta tavallisesta kirkkauspalkista."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index 07e131ed0e71..ecb17f9ca1ed 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Ajouter à une note"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Inclure le lien"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"Enregistreur d\'écran"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Trait. de l\'enregist. d\'écran…"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notification en cours pour une session d\'enregistrement d\'écran"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Écran de veille"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Ne pas déranger"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Modes"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Aucun des appareils associés n\'est disponible"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Touchez pour connecter ou déconnecter un appareil"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Ouvrir les paramètres"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Autre appareil"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Basculer l\'aperçu"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Modes"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"OK"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Paramètres"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Activé"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Icône Réduire"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Icône Développer"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ou"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Naviguer à l\'aide de votre clavier"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Apprenez à utiliser les raccourcis-clavier"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Naviguer à l\'aide de votre pavé tactile"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Apprenez à utiliser les gestes du pavé tactile"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Naviguer à l\'aide de votre clavier et de votre pavé tactile"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Apprenez les gestes du pavé tactile, les raccourcis-clavier et bien plus encore"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Geste de retour"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Geste d\'accès à l\'écran d\'accueil"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Touche d\'action"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Vous pouvez désormais rendre l\'écran encore plus sombre en réduisant davantage le niveau de luminosité à partir du haut de l\'écran.\n\nCela fonctionne mieux lorsque vous êtes dans un environnement sombre."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Retirer le raccourci de réduction supplémentaire de la luminosité"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Le raccourci de réduction supplémentaire de la luminosité à été retiré. Pour réduire la luminosité, utilisez la barre de luminosité habituelle."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 9d3bbd70116a..c023f1b0f42e 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Ajouter à la note"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Inclure le lien"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"Enregistreur d\'écran"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Enregistrement de l\'écran…"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notification en cours pour une session d\'enregistrement de l\'écran"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Économiseur d\'écran"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Ne pas déranger"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Modes"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Aucun appareil associé disponible."</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Appuyez pour connecter ou déconnecter un appareil"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Ouvrir les paramètres"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Autre appareil"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Activer/Désactiver l\'écran Récents"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Modes"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"OK"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Paramètres"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Activé"</string> @@ -498,7 +498,7 @@ <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Ajouter un widget"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"OK"</string> <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Ajouter des widgets"</string> - <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Accéder rapidement aux widgets de vos applis préférées sans déverrouiller votre tablette."</string> + <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Accédez rapidement aux widgets de vos applis préférées sans déverrouiller votre tablette."</string> <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Autoriser n\'importe quel widget sur l\'écran de verrouillage ?"</string> <string name="button_text_to_open_settings" msgid="1987729256950941628">"Ouvrir les paramètres"</string> <string name="work_mode_off_title" msgid="5794818421357835873">"Réactiver les applis pro ?"</string> @@ -1444,4 +1444,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Désormais, vous pouvez rendre l\'écran encore plus sombre en abaissant davantage le niveau de luminosité en haut de l\'écran.\n\nCela fonctionne mieux lorsque vous êtes dans un environnement sombre."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Supprimer le raccourci Luminosité ultra-réduite"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Raccourci Luminosité ultra-réduite supprimé. Pour diminuer la luminosité, utilisez la barre de luminosité habituelle."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index 6281570d84b4..b525bb8f1234 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Engadir a unha nota"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Incluír ligazón"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"Gravadora da pantalla"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Procesando gravación pantalla"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificación de actividade en curso sobre unha sesión de gravación de pantalla"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Protector pantalla"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Non molestar"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Modos"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Non hai dispositivos vinculados dispoñibles"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Toca para conectar ou desconectar un dispositivo"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Abrir Configuración"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Outro dispositivo"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Activar/desactivar Visión xeral"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Modos"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Feito"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Configuración"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Activado"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Icona de contraer"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Icona de despregar"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ou"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navega co teclado"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Aprende a usar os atallos de teclado"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navega co panel táctil"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Aprende a usar os xestos do panel táctil"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Navega co teclado e o panel táctil"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Aprende a usar os xestos do panel táctil, atallos de teclado e moito máis"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Xesto para volver"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Xesto para ir ao inicio"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Tecla de acción"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Agora podes aumentar a atenuación da pantalla: só tes que baixar o nivel de brillo aínda máis desde a parte superior.\n\nEsta opción funciona mellor se estás nun ambiente escuro."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Quitar atallo de atenuación extra"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Quitouse o atallo de atenuación extra. Para reducir o brillo, usa a barra de brillo normal."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index 2be88f2ecfe4..9afbf8e4f857 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -105,6 +105,7 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"નોંધમાં ઉમેરો"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"લિંક શામેલ કરો"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <string name="backlinks_cross_profile_error" msgid="1355798585727802282">"અન્ય પ્રોફાઇલમાંથી લિંક ઉમેરી શકાતી નથી"</string> <string name="screenrecord_title" msgid="4257171601439507792">"સ્ક્રીન રેકોર્ડર"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"સ્ક્રીન રેકૉર્ડિંગ ચાલુ છે"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"સ્ક્રીન રેકોર્ડિંગ સત્ર માટે ચાલુ નોટિફિકેશન"</string> @@ -292,8 +293,7 @@ <string name="start_dreams" msgid="9131802557946276718">"સ્ક્રીન સેવર"</string> <string name="ethernet_label" msgid="2203544727007463351">"ઇથરનેટ"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"ખલેલ પાડશો નહીં"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"મોડ"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"બ્લૂટૂથ"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"કોઈ જોડી કરેલ ઉપકરણો ઉપલબ્ધ નથી"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"કોઈ ડિવાઇસ કનેક્ટ કરવા કે ડિસ્કનેક્ટ કરવા માટે ટૅપ કરો"</string> @@ -434,8 +434,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"સેટિંગ ખોલો"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"અન્ય ડિવાઇસ"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"ઝલકને ટૉગલ કરો"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"મોડ"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"થઈ ગયું"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"સેટિંગ"</string> <string name="zen_mode_on" msgid="9085304934016242591">"ચાલુ"</string> @@ -1393,18 +1392,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"\'નાનું કરો\'નું આઇકન"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"\'મોટું કરો\'નું આઇકન"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"અથવા"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"તમારા કીબોર્ડ વડે નૅવિગેટ કરો"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"કીબોર્ડ શૉર્ટકર્ટ જાણો"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"તમારા ટચપૅડ વડે નૅવિગેટ કરો"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"ટચપૅડના સંકેતો વિશે જાણો"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"તમારા કીબોર્ડ અને ટચપૅડ વડે નૅવિગેટ કરો"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"ટચપૅડના સંકેતો અને કીબોર્ડના શૉર્ટકટ જેવું બીજું ઘણું જાણો"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"પાછળ જવાનો સંકેત"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"હોમ સ્ક્રીન પર જવાનો સંકેત"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"ઍક્શન કી"</string> @@ -1444,4 +1437,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"તમે હવે તમારી સ્ક્રીનના સૌથી ઉપરના ભાગમાંથી બ્રાઇટનેસ લેવલને હજી પણ ઘટાડીને સ્ક્રીનને એક્સ્ટ્રા ડિમ બનાવી શકો છો.\n\nતમે ડાર્ક વાતાવરણમાં હો, ત્યારે આ શ્રેષ્ઠ રીતે કામ કરે છે."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"એક્સ્ટ્રા ડિમ શૉર્ટકટ કાઢી નાખો"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"એક્સ્ટ્રા ડિમ શૉર્ટકટ કાઢી નાખ્યો. તમારી બ્રાઇટનેસ ઘટાડવા માટે, નિયમિત બ્રાઇટનેસ બારનો ઉપયોગ કરો."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 7c267bf2e86c..2b28b7a12522 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -105,6 +105,7 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"नोट में जोड़ें"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"लिंक जोड़ें"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <string name="backlinks_cross_profile_error" msgid="1355798585727802282">"अन्य प्रोफ़ाइलों से लिंक नहीं जोड़े जा सकते"</string> <string name="screenrecord_title" msgid="4257171601439507792">"स्क्रीन रिकॉर्डर"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"स्क्रीन रिकॉर्डिंग को प्रोसेस किया जा रहा है"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"स्क्रीन रिकॉर्ड सेशन के लिए जारी सूचना"</string> @@ -292,8 +293,7 @@ <string name="start_dreams" msgid="9131802557946276718">"स्क्रीन सेवर"</string> <string name="ethernet_label" msgid="2203544727007463351">"ईथरनेट"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"परेशान न करें"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"मोड"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"ब्लूटूथ"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"कोई भी युग्मित डिवाइस उपलब्ध नहीं"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"किसी डिवाइस को कनेक्ट या डिसकनेक्ट करने के लिए टैप करें"</string> @@ -434,8 +434,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"सेटिंग खोलें"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"अन्य डिवाइस"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"खास जानकारी टॉगल करें"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"मोड"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"हो गया"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"सेटिंग"</string> <string name="zen_mode_on" msgid="9085304934016242591">"चालू है"</string> @@ -1393,18 +1392,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"छोटा करने का आइकॉन"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"बड़ा करने का आइकॉन"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"या"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"कीबोर्ड का इस्तेमाल करके नेविगेट करें"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"कीबोर्ड शॉर्टकट के बारे में जानें"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"टचपैड का इस्तेमाल करके नेविगेट करें"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"टचपैड पर हाथ के जेस्चर के बारे में जानें"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"कीबोर्ड और टचपैड का इस्तेमाल करके नेविगेट करें"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"टचपैड पर हाथ के जेस्चर, कीबोर्ड शॉर्टकट वगैरह के बारे में जानें"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"पीछे जाने का जेस्चर"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"होम स्क्रीन पर जाने का जेस्चर"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"ऐक्शन बटन"</string> @@ -1444,4 +1437,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"अब स्क्रीन के सबसे ऊपरी हिस्से से, स्क्रीन की रोशनी सामान्य लेवल से और कम की जा सकती है.\n\nयह सुविधा, अंधेरे वाली जगह पर बेहतर तरीके से काम करती है."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"स्क्रीन की रोशनी को सामान्य लेवल से और कम करने की सुविधा का शॉर्टकट हटाएं"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"स्क्रीन की रोशनी को सामान्य लेवल से और कम करने की सुविधा का शॉर्टकट हटा दिया गया. स्क्रीन की रोशनी कम करने के लिए, ब्राइटनेस बार का इस्तेमाल करें."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index bdf6e13a9d7a..34bccbd6229e 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Dodaj bilješci"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Uključi vezu"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"Snimač zaslona"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Obrada snimanja zaslona"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Tekuća obavijest za sesiju snimanja zaslona"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Čuvar zaslona"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Ne uznemiravaj"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Načini"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Upareni uređaji nisu dostupni"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Dodirnite da biste povezali uređaj ili prekinuli vezu s njim"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Otvori postavke"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Ostali uređaji"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Uključivanje/isključivanje pregleda"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Načini"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Gotovo"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Postavke"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Uključeno"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikona za sažimanje"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikona za proširivanje"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ili"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Krećite se pomoću tipkovnice"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Saznajte više o tipkovnim prečacima"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Krećite se pomoću dodirne podloge"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Saznajte više o pokretima za dodirnu podlogu"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Krećite se pomoću tipkovnice i dodirne podloge"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Saznajte više o pokretima za dodirnu podlogu, tipkovnim prečacima i ostalom"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Pokret za povratak"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Pokret za otvaranje početnog zaslona"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Tipka za radnju"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Zaslon možete dodatno zatamniti daljnjim smanjivanjem razine svjetline na vrhu zaslona.\n\nTo najbolje funkcionira kada ste u tamnom okruženju."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Ukloni prečac za dodatno zatamnjenje"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Prečac za dodatno zatamnjenje je uklonjen. Da biste smanjili svjetlinu, upotrijebite regularnu traku za svjetlinu."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index 773d9baf3a17..cc2f66e1a04a 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Hozzáadás jegyzethez"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Linkkel együtt"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"Képernyőrögzítő"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Képernyőrögzítés feldolgozása"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Folyamatban lévő értesítés képernyőrögzítési munkamenethez"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Képernyővédő"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Ne zavarjanak"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Módok"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Nem áll rendelkezésre párosított eszköz"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Koppintson egy eszköz csatlakoztatásához vagy leválasztásához"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Beállítások megnyitása"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Más eszköz"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Áttekintés be- és kikapcsolása"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Módok"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Kész"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Beállítások"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Be"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Összecsukás ikon"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Kibontás ikon"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"vagy"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navigáció a billentyűzet segítségével"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Billentyűparancsok megismerése"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navigálás az érintőpaddal"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Érintőpad-kézmozdulatok megismerése"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Navigálás a billentyűzet és az érintőpad használatával"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Érintőpad-kézmozdulatok, billentyűparancsok és egyebek megismerése"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Vissza kézmozdulat"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Kezdőképernyő kézmozdulat"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Műveletbillentyű"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"A képernyő tetején mostantól extrasötétre állíthatja a képernyőt, amivel a korábbinál még jobban csökkentheti a fényerőt.\n\nA funkció sötét környezetben használható a legjobban."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Az extrasötét funkció gyorsparancsának eltávolítása"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Eltávolította az extrasötét funkció gyorsparancsát. A fényerő csökkentéséhez használja a fényerő-beállítási sávot."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index 6a64c5d26c8d..c017263b2810 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Ավելացնել նշմանը"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Ներառել հղումը"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"Էկրանի տեսագրում"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Էկրանի տեսագրության մշակում"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Էկրանի տեսագրման աշխատաշրջանի ընթացիկ ծանուցում"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Էկրանապահ"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Չանհանգստացնել"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Ռեժիմներ"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Զուգակցված սարքեր չկան"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Հպեք՝ սարք միացնելու կամ անջատելու համար"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Բացել կարգավորումները"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Այլ սարք"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Միացնել/անջատել համատեսքը"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Ռեժիմներ"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Պատրաստ է"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Կարգավորումներ"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Միացված է"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ծալել պատկերակը"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ծավալել պատկերակը"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"կամ"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Կողմնորոշվեք ձեր ստեղնաշարի օգնությամբ"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Սովորեք օգտագործել ստեղնային դյուրանցումները"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Կողմնորոշվեք ձեր հպահարթակի օգնությամբ"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Սովորեք օգտագործել հպահարթակի ժեստերը"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Կողմնորոշվեք ստեղնաշարի և հպահարթակի օգնությամբ"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Սովորեք օգտագործել հպահարթակի ժեստերը, ստեղնային դյուրանցումները և ավելին"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"«Հետ» ժեստ"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Հիմնական էկրան անցնելու ժեստ"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Գործողության ստեղն"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Էկրանը հավելյալ խամրեցնելու համար բացեք կարգավորումները էկրանի վերևի մասից։\n\nԽորհուրդ ենք տալիս օգտագործել այս գործառույթը, երբ շուրջը մութ է։"</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Հեռացնել հավելյալ խամրեցման դյուրանցումը"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Հավելյալ խամրեցման դյուրանցումը հեռացվեց։ Պայծառության մակարդակը նվազեցնելու համար օգտագործեք պայծառության գոտին։"</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index 8c58012a2124..a3ea9b26c49e 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Tambahkan ke catatan"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Sertakan link"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"Perekam Layar"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Memproses perekaman layar"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notifikasi yang sedang berjalan untuk sesi rekaman layar"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Screensaver"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Jangan Ganggu"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Mode"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Perangkat yang disandingkan tak tersedia"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Ketuk untuk mulai atau berhenti menghubungkan perangkat"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Buka Setelan"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Perangkat lainnya"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Aktifkan Ringkasan"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Mode"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Selesai"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Setelan"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Aktif"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikon ciutkan"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikon luaskan"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"atau"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Menavigasi menggunakan keyboard"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Pelajari pintasan keyboard"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Menavigasi menggunakan touchpad"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Pelajari gestur touchpad"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Menavigasi menggunakan keyboard dan touchpad"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Pelajari gestur touchpad, pintasan keyboard, dan lainnya"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Gestur kembali"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Gestur layar utama"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Tombol tindakan"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Anda kini dapat membuat layar menjadi ekstra redup dengan menurunkan tingkat kecerahan lebih banyak lagi dari bagian atas layar.\n\nFitur ini berfungsi optimal saat Anda berada di tempat yang gelap."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Hapus pintasan ekstra redup"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Pintasan ekstra redup dihapus. Untuk menurunkan kecerahan, gunakan panel kecerahan biasa."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index 6b3b6732d9bc..2468bcc9f2c1 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -105,6 +105,7 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Bæta við glósu"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Hafa tengil með"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <string name="backlinks_cross_profile_error" msgid="1355798585727802282">"Ekki er hægt að bæta við tenglum frá öðrum prófílum"</string> <string name="screenrecord_title" msgid="4257171601439507792">"Skjáupptaka"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Vinnur úr skjáupptöku"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Áframhaldandi tilkynning fyrir skjáupptökulotu"</string> @@ -292,8 +293,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Skjávari"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Ónáðið ekki"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Stillingar"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Engin pöruð tæki til staðar"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Ýttu til að tengja eða aftengja tæki"</string> @@ -434,8 +434,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Opna stillingar"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Annað tæki"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Kveikja/slökkva á yfirliti"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Stillingar"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Lokið"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Stillingar"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Kveikt"</string> @@ -1393,18 +1392,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Minnka tákn"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Stækka tákn"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"eða"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Flettu með því að nota lyklaborðið"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Kynntu þér flýtilykla"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Flettu með því að nota snertiflötinn"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Nánar um bendingar á snertifleti"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Flettu með því að nota lyklaborðið og snertiflötinn"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Kynntu þér bendingar á snertifleti, flýtilykla og fleira"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Bending til að fara til baka"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Bending til að fara á upphafsskjá"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Aðgerðalykill"</string> @@ -1444,4 +1437,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Nú geturðu gert skjáinn mjög dökkan með því að lækka birtustigið enn frekar efst á skjánum.\n\nÞetta virkar best þegar umhverfi þitt er mjög dimmt."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Fjarlægja flýtilykil á mjög dökka stillingu"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Flýtilykill á mjög dökka stillingu fjarlægður. Notaðu hefðbundnu birtustigsstikuna til að lækka birtustigið."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 958d67bdfb36..5ea4486f35af 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Aggiungi alla nota"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Includi link"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"Registrazione dello schermo"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Elaborazione registrazione…"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notifica costante per una sessione di registrazione dello schermo"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Salvaschermo"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Non disturbare"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Modalità"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Nessun dispositivo accoppiato disponibile"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Tocca per connettere o disconnettere un dispositivo"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Apri Impostazioni"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Altro dispositivo"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Attiva/disattiva la panoramica"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Modalità"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Fine"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Impostazioni"</string> <string name="zen_mode_on" msgid="9085304934016242591">"On"</string> @@ -1444,4 +1444,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Ora puoi usare l\'attenuazione extra per lo schermo abbassando il livello di luminosità ancora di più dalla parte superiore della schermata.\n\nQuesta funzionalità opera in modo ottimale quando ti trovi in un ambiente buio."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Rimuovi scorciatoia attenuazione extra"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Scorciatoia attenuazione extra rimossa. Per diminuire la luminosità, usa la normale barra della luminosità."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 1161fa0e9a38..5fd5ca6fcaf3 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"הוספה לפתק"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"הכנסת הקישור"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"מקליט המסך"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"מתבצע עיבוד של הקלטת מסך"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"התראה מתמשכת לסשן הקלטת מסך"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"שומר מסך"</string> <string name="ethernet_label" msgid="2203544727007463351">"אתרנט"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"נא לא להפריע"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"מצבים"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"אין מכשירים מותאמים זמינים"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"אפשר להקיש כדי להתחבר למכשיר או להתנתק ממנו"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"פתיחת ההגדרות"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"מכשיר אחר"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"החלפת מצב של מסכים אחרונים"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"מצבים"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"סיום"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"הגדרות"</string> <string name="zen_mode_on" msgid="9085304934016242591">"מצב מופעל"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"סמל הכיווץ"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"סמל ההרחבה"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"או"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"ניווט באמצעות המקלדת"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"מידע על מקשי קיצור"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"ניווט באמצעות לוח המגע"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"מידע על התנועות בלוח המגע"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"ניווט באמצעות המקלדת ולוח המגע"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"מידע על התנועות בלוח המגע, מקשי קיצור ועוד"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"תנועת חזרה"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"תנועת חזרה למסך הבית"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"מקש הפעולה"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"עכשיו אפשר להפוך את המסך למעומעם במיוחד באמצעות הפחתה נוספת של רמת הבהירות דרך החלק העליון במסך.\n\nהפעולה הזו עובדת הכי טוב בסביבה חשוכה."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"הסרה של קיצור הדרך לתכונה \'מעומעם במיוחד\'"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"קיצור הדרך לתכונה \'מעומעם במיוחד\' הוסר. כדי להפחית את הבהירות, אפשר להשתמש בסרגל הבהירות הרגיל."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index 6436cdd3293c..7897f4826155 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -44,8 +44,8 @@ <string name="usb_device_confirm_prompt" msgid="4091711472439910809">"<xliff:g id="APPLICATION">%1$s</xliff:g> を起動して <xliff:g id="USB_DEVICE">%2$s</xliff:g> を処理しますか?"</string> <string name="usb_device_confirm_prompt_warn" msgid="990208659736311769">"<xliff:g id="APPLICATION">%1$s</xliff:g> を開いて <xliff:g id="USB_DEVICE">%2$s</xliff:g>を利用しますか?\nこのアプリに録音権限は付与されていませんが、この USB デバイスから音声を収集できるようになります。"</string> <string name="usb_accessory_confirm_prompt" msgid="5728408382798643421">"<xliff:g id="APPLICATION">%1$s</xliff:g> を起動して <xliff:g id="USB_ACCESSORY">%2$s</xliff:g> を処理しますか?"</string> - <string name="usb_accessory_uri_prompt" msgid="6756649383432542382">"このUSBアクセサリを扱うアプリはインストールされていません。詳細: <xliff:g id="URL">%1$s</xliff:g>"</string> - <string name="title_usb_accessory" msgid="1236358027511638648">"USBアクセサリ"</string> + <string name="usb_accessory_uri_prompt" msgid="6756649383432542382">"このUSBアクセサリーを扱うアプリはインストールされていません。詳細: <xliff:g id="URL">%1$s</xliff:g>"</string> + <string name="title_usb_accessory" msgid="1236358027511638648">"USBアクセサリー"</string> <string name="label_view" msgid="6815442985276363364">"表示"</string> <string name="always_use_device" msgid="210535878779644679">"<xliff:g id="USB_DEVICE">%2$s</xliff:g> を接続している場合は常に <xliff:g id="APPLICATION">%1$s</xliff:g> を起動する"</string> <string name="always_use_accessory" msgid="1977225429341838444">"<xliff:g id="USB_ACCESSORY">%2$s</xliff:g> を接続している場合は常に <xliff:g id="APPLICATION">%1$s</xliff:g> を起動する"</string> @@ -67,8 +67,8 @@ <string name="wifi_debugging_secondary_user_title" msgid="2493201475880517725">"ワイヤレス デバッグは許可されていません"</string> <string name="wifi_debugging_secondary_user_message" msgid="9085779370142222881">"このデバイスに現在ログインしているユーザーはワイヤレス デバッグを ON にできません。この機能を使用するには、管理者ユーザーに切り替えてください。"</string> <string name="usb_contaminant_title" msgid="894052515034594113">"USB ポート無効"</string> - <string name="usb_contaminant_message" msgid="7730476585174719805">"液体やゴミからデバイスを保護するため、USB ポートは無効になっています。アクセサリの検出は行われません。\n\nUSB ポートを再び安全に使用できるようになりましたらお知らせします。"</string> - <string name="usb_port_enabled" msgid="531823867664717018">"USB ポートが有効になり、充電器やアクセサリを検出できるようになりました"</string> + <string name="usb_contaminant_message" msgid="7730476585174719805">"液体やゴミからデバイスを保護するため、USB ポートは無効になっています。アクセサリーの検出は行われません。\n\nUSB ポートを再び安全に使用できるようになりましたらお知らせします。"</string> + <string name="usb_port_enabled" msgid="531823867664717018">"USB ポートが有効になり、充電器やアクセサリーを検出できるようになりました"</string> <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"USB を有効にする"</string> <string name="learn_more" msgid="4690632085667273811">"詳細"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"スクリーンショット"</string> @@ -105,6 +105,7 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"メモに追加"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"リンクを含める"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <string name="backlinks_cross_profile_error" msgid="1355798585727802282">"他のプロファイルからリンクを追加することはできません"</string> <string name="screenrecord_title" msgid="4257171601439507792">"スクリーン レコーダー"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"画面の録画を処理しています"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"画面の録画セッション中の通知"</string> @@ -292,8 +293,7 @@ <string name="start_dreams" msgid="9131802557946276718">"スクリーン セーバー"</string> <string name="ethernet_label" msgid="2203544727007463351">"イーサネット"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"サイレント モード"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"モード"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"ペア設定されたデバイスがありません"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"タップしてデバイスを接続または接続解除します"</string> @@ -434,8 +434,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"設定を開く"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"その他のデバイス"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"概要を切り替え"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"モード"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"完了"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"設定"</string> <string name="zen_mode_on" msgid="9085304934016242591">"ON"</string> @@ -949,7 +948,7 @@ <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"取り扱いに関する手順をご覧ください"</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"取り扱いに関する手順をご覧ください"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"デバイスを電源から外します"</string> - <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"充電ポートの近くにデバイスを置くと、本体が熱くなります。デバイスが充電器や USB アクセサリに接続されている場合は外してください。ケーブルが熱くなっていることもあるので注意してください。"</string> + <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"充電ポートの近くにデバイスを置くと、本体が熱くなります。デバイスが充電器や USB アクセサリーに接続されている場合は外してください。ケーブルが熱くなっていることもあるので注意してください。"</string> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"取り扱いに関する手順をご覧ください"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"左ショートカット"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"右ショートカット"</string> @@ -1393,18 +1392,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"閉じるアイコン"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"開くアイコン"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"または"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"キーボードを使用して移動する"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"キーボード ショートカットの詳細"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"タッチパッドを使用して移動する"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"タッチパッド操作の詳細"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"キーボードとタッチパッドを使用して移動する"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"タッチパッド操作やキーボード ショートカットなどの詳細"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"「戻る」ジェスチャー"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"「ホーム」ジェスチャー"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"アクションキー"</string> @@ -1444,4 +1437,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"画面の上部で明るさを大幅に低く設定することで、画面の輝度をさらに下げられるようになりました。\n\nこの設定は暗い場所での操作に最適です。"</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"「さらに輝度を下げる」のショートカットを削除する"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"「さらに輝度を下げる」のショートカットを削除しました。明るさを下げるには、通常の明るさのバーを使用してください。"</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index 7d5276053220..5550a63ad9a2 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -105,6 +105,7 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"დაამატეთ შენიშვნა"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"ბმულის დართვა"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <string name="backlinks_cross_profile_error" msgid="1355798585727802282">"სხვა პროფილებიდან ბმულების დამატება შეუძლებელია"</string> <string name="screenrecord_title" msgid="4257171601439507792">"ეკრანის ჩამწერი"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"ეკრანის ჩანაწერი მუშავდება"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"უწყვეტი შეტყობინება ეკრანის ჩაწერის სესიისთვის"</string> @@ -292,8 +293,7 @@ <string name="start_dreams" msgid="9131802557946276718">"ეკრანმზოგი"</string> <string name="ethernet_label" msgid="2203544727007463351">"ეთერნეტი"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"არ შემაწუხოთ"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"რეჟიმები"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"დაწყვილებული მოწყობილობები მიუწვდომელია"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"შეეხეთ მოწყობილობის დასაკავშირებლად ან გასათიშად"</string> @@ -434,8 +434,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"პარამეტრების გახსნა"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"სხვა მოწყობილობა"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"მიმოხილვის გადართვა"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"რეჟიმები"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"მზადაა"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"პარამეტრები"</string> <string name="zen_mode_on" msgid="9085304934016242591">"ჩართული"</string> @@ -1393,18 +1392,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"ხატულის ჩაკეცვა"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"ხატულის გაფართოება"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ან"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"ნავიგაცია კლავიატურის გამოყენებით"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"კლავიატურის მალსახმობების სწავლა"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"ნავიგაცია სენსორული პანელის გამოყენებით"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"სენსორული პანელის ჟესტების სწავლა"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"ნავიგაცია კლავიატურის და სენსორული პანელის გამოყენებით"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"სენსორული პანელის ჟესტების, კლავიატურის მალსახმობების და სხვა ფუნქციების სწავლა"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"უკან დაბრუნების ჟესტი"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"მთავარ ეკრანზე გადასვლის ჟესტი"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"მოქმედების კლავიში"</string> @@ -1444,4 +1437,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"ახლა თქვენ შეგიძლიათ დამატებით დაბინდოთ ეკრანი მის ზედა ნაწილში სიკაშკაშის დონის კიდევ უფრო შემცირების გზით.\n\nეს ყველაზე უკეთ ბნელ გარემოში ყოფნისას მუშაობს."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"დამატებითი დაბინდვის მალსახმობის ამოშლა"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"დამატებითი დაბინდვის მალსახმობი ამოშლილია. სიკაშკაშის შესამცირებლად გამოიყენეთ სიკაშკაშის ჩვეულებრივი პანელი."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index 7b32db1b9d61..d8b454218ac2 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Ескертпеге қосу"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Сілтеме қосу"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"Экран жазғыш"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Экран жазғыш бейнесін өңдеу"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Экранды бейнеге жазудың ағымдағы хабарландыруы"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Скринсейвер"</string> <string name="ethernet_label" msgid="2203544727007463351">"Этернет"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Мазаламау"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Режимдер"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Жұптасқан құрылғылар жоқ"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Құрылғыны жалғау не ажырату үшін түртіңіз."</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Параметрлерді ашу"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Басқа құрылғы"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Шолуды қосу/өшіру"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Режимдер"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Дайын"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Параметрлер"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Қосулы"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Жию белгішесі"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Жаю белгішесі"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"немесе"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Пернетақтамен жұмыс істеңіз"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Перне тіркесімдерін үйреніңіз."</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Сенсорлық тақтамен жұмыс істеңіз"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Сенсорлық тақта қимылдарын үйреніңіз."</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Пернетақтамен және сенсорлық тақтамен жұмыс істеңіз"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Сенсорлық тақта қимылдарын, перне тіркесімдерін және т.б. үйреніңіз."</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Артқа қайтару қимылы"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Негізгі бетке қайтару қимылы"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Әрекет пернесі"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Енді экранның жоғарғы бөлігінде жарықтық деңгейін түсіру арқылы экранды одан сайын қарайтуға болады.\n\nБұл мүмкіндіктің артықшылығын қараңғы жерде көруге болады."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Экранды қарайту жылдам пәрменін өшіру"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Экранды қарайту жылдам пәрмені өшірілді. Жарықтықты азайту үшін әдеттегі жарықтық панелін пайдаланыңыз."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index 81664cabd896..f2fc313a4bb2 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -105,6 +105,7 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"បញ្ចូលទៅក្នុងកំណត់ចំណាំ"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"រួមបញ្ចូលតំណ"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <string name="backlinks_cross_profile_error" msgid="1355798585727802282">"មិនអាចបញ្ចូលតំណពីកម្រងព័ត៌មានផ្សេងទៀតបានទេ"</string> <string name="screenrecord_title" msgid="4257171601439507792">"មុខងារថតវីដេអូអេក្រង់"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"កំពុងដំណើរការការថតអេក្រង់"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"ការជូនដំណឹងដែលកំពុងដំណើរការសម្រាប់រយៈពេលប្រើការថតសកម្មភាពអេក្រង់"</string> @@ -292,8 +293,7 @@ <string name="start_dreams" msgid="9131802557946276718">"ធាតុរក្សាអេក្រង់"</string> <string name="ethernet_label" msgid="2203544727007463351">"អ៊ីសឺរណិត"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"កុំរំខាន"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"មុខងារ"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"ប៊្លូធូស"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"មិនមានឧបករណ៍ផ្គូផ្គងដែលអាចប្រើបាន"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"ចុចដើម្បីភ្ជាប់ ឬផ្ដាច់ឧបករណ៍"</string> @@ -434,8 +434,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"បើកការកំណត់"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"ឧបករណ៍ផ្សេងទៀត"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"បិទ/បើកទិដ្ឋភាពរួម"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"មុខងារ"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"រួចរាល់"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"ការកំណត់"</string> <string name="zen_mode_on" msgid="9085304934016242591">"បើក"</string> @@ -1393,18 +1392,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"រូបតំណាង \"បង្រួម\""</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"រូបតំណាង \"ពង្រីក\""</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ឬ"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"រុករកដោយប្រើក្ដារចុចរបស់អ្នក"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"ស្វែងយល់អំពីផ្លូវកាត់ក្ដារចុច"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"រុករកដោយប្រើផ្ទាំងប៉ះរបស់អ្នក"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"ស្វែងយល់អំពីចលនាផ្ទាំងប៉ះ"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"រុករកដោយប្រើក្ដារចុច និងផ្ទាំងប៉ះរបស់អ្នក"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"ស្វែងយល់អំពីចលនាផ្ទាំងប៉ះ ផ្លូវកាត់ក្ដារចុច និងអ្វីៗជាច្រើនទៀត"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"ចលនាថយក្រោយ"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"ចលនាទៅទំព័រដើម"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"គ្រាប់ចុចសកម្មភាព"</string> @@ -1444,4 +1437,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"ឥឡូវនេះ អ្នកអាចធ្វើឱ្យអេក្រង់ងងឹតខ្លាំងបានដោយបន្ថយកម្រិតពន្លឺបន្ថែមទៀតដោយចូលទៅកាន់ផ្នែកខាងលើនៃអេក្រង់របស់អ្នក។\n\nការធ្វើបែបនេះទទួលបានលទ្ធផលប្រសើរបំផុត ពេលអ្នកស្ថិតនៅកន្លែងងងឹត។"</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"ដកផ្លូវកាត់មុខងារងងឹតខ្លាំងចេញ"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"ផ្លូវកាត់មុខងារងងឹតខ្លាំងត្រូវបានដកចេញ។ ដើម្បីបន្ថយពន្លឺរបស់អ្នក សូមប្រើរបារពន្លឺធម្មតា។"</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index e1b119cee100..6f6333299129 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -74,8 +74,8 @@ <string name="global_action_screenshot" msgid="2760267567509131654">"ಸ್ಕ್ರೀನ್ಶಾಟ್"</string> <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"ಎಕ್ಸ್ಟೆಂಡ್ ಅನ್ಲಾಕ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"ಚಿತ್ರವನ್ನು ಕಳುಹಿಸಲಾಗಿದೆ"</string> - <string name="screenshot_saving_title" msgid="2298349784913287333">"ಸ್ಕ್ರೀನ್ಶಾಟ್ ಉಳಿಸಲಾಗುತ್ತಿದೆ…"</string> - <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್ಗೆ ಸ್ಕ್ರೀನ್ಶಾಟ್ ಉಳಿಸಲಾಗುತ್ತಿದೆ…"</string> + <string name="screenshot_saving_title" msgid="2298349784913287333">"ಸ್ಕ್ರೀನ್ಶಾಟ್ ಸೇವ್ ಮಾಡಲಾಗುತ್ತಿದೆ…"</string> + <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್ಗೆ ಸ್ಕ್ರೀನ್ಶಾಟ್ ಸೇವ್ ಮಾಡಲಾಗುತ್ತಿದೆ…"</string> <string name="screenshot_saving_private_profile" msgid="8934706048497093297">"ಸ್ಕ್ರೀನ್ಶಾಟ್ ಅನ್ನು ಖಾಸಗಿ ಪ್ರೊಫೈಲ್ಗೆ ಸೇವ್ ಮಾಡಲಾಗುತ್ತಿದೆ"</string> <string name="screenshot_saved_title" msgid="8893267638659083153">"ಸ್ಕ್ರೀನ್ಶಾಟ್ ಅನ್ನು ಸೇವ್ ಮಾಡಲಾಗಿದೆ"</string> <string name="screenshot_failed_title" msgid="3259148215671936891">"ಸ್ಕ್ರೀನ್ಶಾಟ್ ಅನ್ನು ಉಳಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string> @@ -105,6 +105,7 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"ಟಿಪ್ಪಣಿಗೆ ಸೇರಿಸಿ"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"ಲಿಂಕ್ ಅನ್ನು ಸೇರಿಸಿ"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <string name="backlinks_cross_profile_error" msgid="1355798585727802282">"ಇತರ ಪ್ರೊಫೈಲ್ಗಳಿಂದ ಲಿಂಕ್ಗಳನ್ನು ಸೇರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ"</string> <string name="screenrecord_title" msgid="4257171601439507792">"ಸ್ಕ್ರೀನ್ ರೆಕಾರ್ಡರ್"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"ಸ್ಕ್ರೀನ್ ರೆಕಾರ್ಡಿಂಗ್ ಆಗುತ್ತಿದೆ"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"ಸ್ಕ್ರೀನ್ ರೆಕಾರ್ಡಿಂಗ್ ಸೆಶನ್ಗಾಗಿ ಚಾಲ್ತಿಯಲ್ಲಿರುವ ನೋಟಿಫಿಕೇಶನ್"</string> @@ -292,8 +293,7 @@ <string name="start_dreams" msgid="9131802557946276718">"ಸ್ಕ್ರೀನ್ ಸೇವರ್"</string> <string name="ethernet_label" msgid="2203544727007463351">"ಇಥರ್ನೆಟ್"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"ಮೋಡ್ಗಳು"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"ಬ್ಲೂಟೂತ್"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"ಯಾವುದೇ ಜೋಡಿಸಲಾದ ಸಾಧನಗಳು ಲಭ್ಯವಿಲ್ಲ"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"ಸಾಧನವನ್ನು ಕನೆಕ್ಟ್ ಅಥವಾ ಡಿಸ್ಕನೆಕ್ಟ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string> @@ -434,8 +434,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ತೆರೆಯಿರಿ"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"ಅನ್ಯ ಸಾಧನ"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"ಟಾಗಲ್ ನ ಅವಲೋಕನ"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"ಮೋಡ್ಗಳು"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"ಮುಗಿದಿದೆ"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"ಸೆಟ್ಟಿಂಗ್ಗಳು"</string> <string name="zen_mode_on" msgid="9085304934016242591">"ಆನ್ ಆಗಿದೆ"</string> @@ -1393,18 +1392,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"ಕುಗ್ಗಿಸುವ ಐಕಾನ್"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"ವಿಸ್ತೃತಗೊಳಿಸುವ ಐಕಾನ್"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ಅಥವಾ"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"ನಿಮ್ಮ ಕೀಬೋರ್ಡ್ ಬಳಸಿ ನ್ಯಾವಿಗೇಟ್ ಮಾಡಿ"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"ಕೀಬೋರ್ಡ್ ಶಾರ್ಟ್ಕಟ್ಗಳನ್ನು ಕಲಿಯಿರಿ"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"ನಿಮ್ಮ ಟಚ್ಪ್ಯಾಡ್ ಬಳಸಿ ನ್ಯಾವಿಗೇಟ್ ಮಾಡಿ"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"ಟಚ್ಪ್ಯಾಡ್ ಗೆಸ್ಚರ್ಗಳನ್ನು ಕಲಿಯಿರಿ"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"ನಿಮ್ಮ ಕೀಬೋರ್ಡ್ ಮತ್ತು ಟಚ್ಪ್ಯಾಡ್ ಬಳಸಿ ನ್ಯಾವಿಗೇಟ್ ಮಾಡಿ"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"ಟಚ್ಪ್ಯಾಡ್ ಗೆಸ್ಚರ್ಗಳು, ಕೀಬೋರ್ಡ್ಗಳ ಶಾರ್ಟ್ಕಟ್ಗಳು ಮತ್ತು ಹೆಚ್ಚಿನದನ್ನು ತಿಳಿಯಿರಿ"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"ಹಿಂಬದಿ ಗೆಸ್ಚರ್"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"ಹೋಮ್ ಗೆಸ್ಚರ್"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"ಆ್ಯಕ್ಷನ್ ಕೀ"</string> @@ -1444,4 +1437,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ ಮೇಲ್ಭಾಗದಿಂದ ಬ್ರೈಟ್ನೆಸ್ ಮಟ್ಟವನ್ನು ಇನ್ನಷ್ಟು ಕಡಿಮೆ ಮಾಡುವ ಮೂಲಕ ನೀವು ಈಗ ಸ್ಕ್ರೀನ್ ಅನ್ನು ಇನ್ನಷ್ಟು ಮಬ್ಬುಗೊಳಿಸಬಹುದು.\n\nನೀವು ಕತ್ತಲೆಯ ವಾತಾವರಣದಲ್ಲಿರುವಾಗ ಇದು ಉತ್ತಮವಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"ಇನ್ನಷ್ಟು ಮಬ್ಬು ಶಾರ್ಟ್ಕಟ್ ಅನ್ನು ತೆಗೆದುಹಾಕಿ"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"ಇನ್ನಷ್ಟು ಮಬ್ಬು ಶಾರ್ಟ್ಕಟ್ ಅನ್ನು ತೆಗೆದುಹಾಕಲಾಗಿದೆ. ನಿಮ್ಮ ಬ್ರೈಟ್ನೆಸ್ ಅನ್ನು ಕಡಿಮೆ ಮಾಡಲು, ಸಾಮಾನ್ಯ ಬ್ರೈಟ್ನೆಸ್ ಬಾರ್ ಬಳಸಿ."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index 27aa785186d9..75bc3b26f61c 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"메모에 추가"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"링크 포함"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g><xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"화면 녹화"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"화면 녹화 처리 중"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"화면 녹화 세션에 관한 지속적인 알림"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"화면 보호기"</string> <string name="ethernet_label" msgid="2203544727007463351">"이더넷"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"방해 금지 모드"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"모드"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"블루투스"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"페어링된 기기가 없습니다"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"기기를 연결 또는 연결 해제하려면 탭하세요"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"설정 열기"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"기타 기기"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"최근 사용 버튼 전환"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"모드"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"완료"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"설정"</string> <string name="zen_mode_on" msgid="9085304934016242591">"사용"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"접기 아이콘"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"확장 아이콘"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"또는"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"키보드를 사용하여 이동"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"단축키 알아보기"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"터치패드를 사용하여 이동"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"터치패드 동작 알아보기"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"키보드와 터치패드를 사용하여 이동"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"터치패드 동작, 단축키 등 알아보기"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"뒤로 동작"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"홈 동작"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"작업 키"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"이제 화면 상단에서 밝기 수준을 더 낮춰 화면을 더 어둡게 만들 수 있습니다\n\n이 기능은 어두운 환경에서 가장 잘 작동합니다."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"\'더 어둡게\' 단축키 삭제"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"\'더 어둡게\' 단축키가 삭제되었습니다. 밝기를 낮추려면 일반 밝기 막대를 사용하세요."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index 306baa7fb3b1..9bf427c0bfb9 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -105,6 +105,7 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Кыска жазууга кошуу"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Шилтеме кошуу"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <string name="backlinks_cross_profile_error" msgid="1355798585727802282">"Башка профилдердеги шилтемелерди кошууга болбойт"</string> <string name="screenrecord_title" msgid="4257171601439507792">"Экрандан видео жаздырып алуу"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Экрандан жаздырылып алынган видео иштетилүүдө"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Экранды жаздыруу сеансы боюнча учурдагы билдирме"</string> @@ -292,8 +293,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Көшөгө"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Тынчымды алба"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Режимдер"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Жупташкан түзмөктөр жок"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Түзмөктү туташтыруу же ажыратуу үчүн таптаңыз"</string> @@ -434,8 +434,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Параметрлерди ачуу"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Башка түзмөк"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Назар режимин өчүрүү/күйгүзүү"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Режимдер"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Бүттү"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Параметрлер"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Күйүк"</string> @@ -1393,18 +1392,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Жыйыштыруу сүрөтчөсү"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Жайып көрсөтүү сүрөтчөсү"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"же"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Нерселерге баскычтоп аркылуу өтүңүз"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Ыкчам баскычтар тууралуу билип алыңыз"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Нерселерге сенсордук такта аркылуу өтүңүз"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Сенсордук тактадагы жаңсоолорду үйрөнүп алыңыз"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Нерселерге баскычтоп жана сенсордук такта аркылуу өтүңүз"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Сенсордук тактадагы жаңсоолор, ыкчам баскычтар жана башкалар жөнүндө билип алыңыз"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Артка кайтуу жаңсоосу"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Башкы бетке өтүү жаңсоосу"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Аракет баскычы"</string> @@ -1444,4 +1437,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Эми экраныңыздын өйдө жагынан жарыктыктын деңгээлин азайтып, экранды кошумча караңгылата аласыз.\n\nМуну караңгы жерде турганыңызда колдонуу сунушталат."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Кошумча караңгылатуу ыкчам баскычын өчүрүү"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Кошумча караңгылатуу ыкчам баскычы өчүрүлдү. Жарыктыкты азайтуу үчүн кадимки жарыктык тилкесин колдонуңуз."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index 75f579c83c76..bc0c22d92373 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -105,6 +105,7 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"ເພີ່ມໃສ່ບັນທຶກ"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"ຮວມລິ້ງ"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <string name="backlinks_cross_profile_error" msgid="1355798585727802282">"ບໍ່ສາມາດເພີ່ມລິ້ງຈາກໂປຣໄຟລ໌ອື່ນໆໄດ້"</string> <string name="screenrecord_title" msgid="4257171601439507792">"ໂປຣແກຣມບັນທຶກໜ້າຈໍ"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"ກຳລັງປະມວນຜົນການບັນທຶກໜ້າຈໍ"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"ການແຈ້ງເຕືອນສຳລັບເຊດຊັນການບັນທຶກໜ້າຈໍໃດໜຶ່ງ"</string> @@ -292,8 +293,7 @@ <string name="start_dreams" msgid="9131802557946276718">"ພາບພັກໜ້າຈໍ"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"ຫ້າມລົບກວນ"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"ໂໝດ"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"ບໍ່ມີອຸປະກອນທີ່ສາມາດຈັບຄູ່ໄດ້"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"ແຕະເພື່ອເຊື່ອມຕໍ່ ຫຼື ຕັດການເຊື່ອມຕໍ່ອຸປະກອນ"</string> @@ -434,8 +434,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"ເປີດການຕັ້ງຄ່າ"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"ອຸປະກອນອື່ນໆ"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"ສະຫຼັບພາບຮວມ"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"ໂໝດ"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"ແລ້ວໆ"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"ການຕັ້ງຄ່າ"</string> <string name="zen_mode_on" msgid="9085304934016242591">"ເປີດ"</string> @@ -1393,18 +1392,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"ໄອຄອນຫຍໍ້ລົງ"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"ໄອຄອນຂະຫຍາຍ"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ຫຼື"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"ນຳທາງໂດຍໃຊ້ແປ້ນພິມຂອງທ່ານ"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"ສຶກສາຄີລັດ"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"ນຳທາງໂດຍໃຊ້ແຜ່ນສຳຜັດຂອງທ່ານ"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"ສຶກສາທ່າທາງຂອງແຜ່ນສຳຜັດ"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"ນຳທາງໂດຍໃຊ້ແປ້ນພິມ ແລະ ແຜ່ນສຳຜັດຂອງທ່ານ"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"ສຶກສາທ່າທາງຂອງແຜ່ນສຳຜັດ, ຄີລັດ ແລະ ອື່ນໆ"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"ທ່າທາງສຳລັບກັບຄືນ"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"ທ່າທາງສຳລັບໜ້າຫຼັກ"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"ປຸ່ມຄຳສັ່ງ"</string> @@ -1444,4 +1437,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"ຕອນນີ້ທ່ານສາມາດເຮັດໃຫ້ໜ້າຈໍມືດລົງເປັນພິເສດໄດ້ໂດຍການຫຼຸດລະດັບຄວາມສະຫວ່າງລົງໃຫ້ຫຼາຍຂຶ້ນຈາກເທິງສຸດຂອງໜ້າຈໍຂອງທ່ານ.\n\nຄຸນສົມບັດນີ້ຈະເຮັດວຽກໄດ້ດີທີ່ສຸດເມື່ອທ່ານຢູ່ໃນສະພາບແວດລ້ອມທີ່ມືດ."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"ລຶບທາງລັດທີ່ຫຼຸດແສງເປັນພິເສດອອກ"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"ລຶບທາງລັດທີ່ຫຼຸດແສງເປັນພິເສດອອກແລ້ວ. ເພື່ອຫຼຸດຄວາມສະຫວ່າງຂອງທ່ານລົງ, ໃຫ້ໃຊ້ແຖບຄວາມສະຫວ່າງປົກກະຕິ."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index 61516fed7111..91f8398c8e16 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Pridėti prie užrašo"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Įtraukti nuorodą"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"„<xliff:g id="APPNAME">%1$s</xliff:g>“ <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"Ekrano vaizdo įrašytuvas"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Apdorojam. ekrano vaizdo įraš."</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Šiuo metu rodomas ekrano įrašymo sesijos pranešimas"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Ekrano užsklanda"</string> <string name="ethernet_label" msgid="2203544727007463351">"Eternetas"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Netrukdymo režimas"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Režimai"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Nėra pasiekiamų susietų įrenginių"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Palieskite, kad prijungtumėte ar atjungtumėte įrenginį"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Atidaryti nustatymus"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Kitas įrenginys"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Perjungti apžvalgą"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Režimai"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Atlikta"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Nustatymai"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Įjungta"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Sutraukimo piktograma"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Išskleidimo piktograma"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"arba"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Naršykite naudodamiesi klaviatūra"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Sužinokite apie sparčiuosius klavišus"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Naršykite naudodamiesi jutikline dalimi"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Sužinokite jutiklinės dalies gestus"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Naršykite naudodamiesi klaviatūra ir jutikline dalimi"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Sužinokite jutiklinės dalies gestus, sparčiuosius klavišus ir kt."</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Grįžimo atgal gestas"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Pagrindinio ekrano gestas"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Veiksmų klavišas"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Dabar galite padaryti ekraną itin blankų, dar labiau sumažindami ryškumo lygį nuo ekrano viršaus.\n\nŠi funkcija geriausiai veikia, kai esate tamsioje aplinkoje."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Pašalinti funkcijos „Itin blanku“ spartųjį klavišą"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Funkcijos „Itin blanku“ spartusis klavišas pašalintas. Jei norite sumažinti ryškumą, naudokite įprastą ryškumo juostą."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 1b48d3f613b5..29af399aaf94 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Pievienot piezīmei"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Iekļaut saiti"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"Ekrāna ierakstītājs"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Ekrāna ieraksta apstrāde"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Aktīvs paziņojums par ekrāna ierakstīšanas sesiju"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Ekrānsaudzētājs"</string> <string name="ethernet_label" msgid="2203544727007463351">"Tīkls Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Režīms “Netraucēt”"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Režīmi"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Nav pieejama neviena pārī savienota ierīce."</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Lai pievienotu vai atvienotu kādu ierīci, pieskarieties."</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Atvērt iestatījumus"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Cita ierīce"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Pārskata pārslēgšana"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Režīmi"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Gatavs"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Iestatījumi"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Ieslēgts"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Sakļaušanas ikona"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Izvēršanas ikona"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"vai"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Pārvietošanās, izmantojot tastatūru"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Uzziniet par īsinājumtaustiņiem."</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Pārvietošanās, izmantojot skārienpaliktni"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Apgūstiet skārienpaliktņa žestus."</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Pārvietošanās, izmantojot tastatūru un skārienpaliktni"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Uzziniet par skārienpaliktņa žestiem, īsinājumtaustiņiem un citām iespējām."</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Žests pāriešanai atpakaļ"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Žests pāriešanai uz sākumu"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Darbību taustiņš"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Tagad varat veikt ekrāna papildu aptumšošanu, vēl vairāk samazinot spilgtumu ekrāna augšdaļā.\n\nTas darbojas vislabāk, ja esat tumšā vietā."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Noņemt papildu aptumšošanas saīsni"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Papildu aptumšošanas saīsne ir noņemta. Lai samazinātu spilgtumu, izmantojiet parasto spilgtuma joslu."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index 1c853df520cb..11fb67c759e0 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Додај во белешка"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Опфати линк"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"Снимач на екран"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Се обработува снимка од екран"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Тековно известување за сесија за снимање на екранот"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Штедач на екран"</string> <string name="ethernet_label" msgid="2203544727007463351">"Етернет"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Не вознемирувај"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Режими"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Нема достапни спарени уреди"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Допрете за да воспоставите или да прекинете врска со уред"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Отворете „Поставки“"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Друг уред"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Вклучи/исклучи преглед"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Режими"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Готово"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Поставки"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Вклучено"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Икона за собирање"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Икона за проширување"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"или"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Движете се со користење на тастатурата"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Научете кратенки од тастатурата"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Движете се со користење на допирната подлога"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Научете движења за допирната подлога"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Движете се со користење на тастатурата и допирната подлога"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Научете движења за допирната подлога, кратенки од тастатурата и друго"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Движење за назад"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Движење за почетен екран"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Копче за дејство"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Отсега може да го затемнувате екранот дополнително со намалување на нивото на осветленост од горниот дел на екранот.\n\nОва функционира најдобро кога сте во темна средина."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Отстрани ја кратенката за „Дополнително затемнување“"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Кратенката за „Дополнително затемнување“ е отстранета. Користете ја стандардната лента за осветленост за да ја намалите осветленоста."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index ef63d675ed42..720275e3a6a4 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -105,6 +105,7 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"കുറിപ്പിലേക്ക് ചേർക്കുക"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"ലിങ്ക് ഉൾപ്പെടുത്തുക"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <string name="backlinks_cross_profile_error" msgid="1355798585727802282">"മറ്റ് പ്രൊഫൈലുകളിൽ നിന്ന് ലിങ്കുകൾ ചേർക്കാനാകില്ല"</string> <string name="screenrecord_title" msgid="4257171601439507792">"സ്ക്രീൻ റെക്കോർഡർ"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"സ്ക്രീൻ റെക്കോർഡിംഗ് പ്രോസസുചെയ്യുന്നു"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"ഒരു സ്ക്രീൻ റെക്കോർഡിംഗ് സെഷനായി നിലവിലുള്ള അറിയിപ്പ്"</string> @@ -292,8 +293,7 @@ <string name="start_dreams" msgid="9131802557946276718">"സ്ക്രീൻ സേവർ"</string> <string name="ethernet_label" msgid="2203544727007463351">"ഇതർനെറ്റ്"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"ശല്യപ്പെടുത്തരുത്"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"മോഡുകൾ"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"ജോടിയാക്കിയ ഉപകരണങ്ങളൊന്നും ലഭ്യമല്ല"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"ഒരു ഉപകരണം കണക്റ്റ് ചെയ്യാനോ വിച്ഛേദിക്കാനോ ടാപ്പ് ചെയ്യുക"</string> @@ -434,8 +434,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"ക്രമീകരണം തുറക്കുക"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"മറ്റ് ഉപകരണം"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"അവലോകനം മാറ്റുക"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"മോഡുകൾ"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"ശരി"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"ക്രമീകരണം"</string> <string name="zen_mode_on" msgid="9085304934016242591">"ഓണാണ്"</string> @@ -1393,18 +1392,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"ചുരുക്കൽ ഐക്കൺ"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"വികസിപ്പിക്കൽ ഐക്കൺ"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"അല്ലെങ്കിൽ"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"നിങ്ങളുടെ കീബോർഡ് ഉപയോഗിച്ച് നാവിഗേറ്റ് ചെയ്യുക"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"കീബോർഡ് കുറുക്കുവഴികൾ മനസ്സിലാക്കുക"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"നിങ്ങളുടെ ടച്ച്പാഡ് ഉപയോഗിച്ച് നാവിഗേറ്റ് ചെയ്യുക"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"ടച്ച്പാഡ് ജെസ്ച്ചറുകൾ മനസ്സിലാക്കുക"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"നിങ്ങളുടെ കീപാഡ്, ടച്ച്പാഡ് എന്നിവ ഉപയോഗിച്ച് നാവിഗേറ്റ് ചെയ്യുക"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"ടച്ച്പാഡ് ജെസ്ച്ചറുകൾ, കീബോർഡ് കുറുക്കുവഴികൾ എന്നിവയും മറ്റും മനസ്സിലാക്കുക"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"\'മടങ്ങുക\' ജെസ്ച്ചർ"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"ഹോം ജെസ്ച്ചർ"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"ആക്ഷൻ കീ"</string> @@ -1444,4 +1437,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"മുകളിൽ നിന്ന് തെളിച്ചം കുറയ്ക്കുന്നതിലൂടെ നിങ്ങൾക്ക് ഇപ്പോൾ സ്ക്രീൻ കൂടുതൽ മങ്ങിക്കാൻ കഴിയും.\n\nനിങ്ങൾ ഇരുണ്ട മുറിയിലായിരിക്കുമ്പോൾ ഇത് മികച്ച രീതിയിൽ പ്രവർത്തിക്കുന്നു."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"കൂടുതൽ ഡിം ചെയ്യൽ കുറുക്കുവഴി നീക്കം ചെയ്യുക"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"കൂടുതൽ ഡിം ചെയ്യാനുള്ള കുറുക്കുവഴി നീക്കം ചെയ്തു. തെളിച്ചം കുറയ്ക്കാൻ, സാധാരണ \'തെളിച്ചം ബാർ\' ഉപയോഗിക്കുക."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index ff8c52be79f8..50a942e4a2c8 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Тэмдэглэлд нэмэх"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Холбоосыг оруулах"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"Дэлгэцийн үйлдэл бичигч"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Дэлгэц бичлэг боловсруулж байна"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Дэлгэц бичих горимын үргэлжилж буй мэдэгдэл"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Дэлгэц амраагч"</string> <string name="ethernet_label" msgid="2203544727007463351">"Этернет"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Бүү саад бол"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Горим"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Хослуулсан төхөөрөмж байхгүй"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Төхөөрөмжийг холбох эсвэл салгахын тулд товшино уу"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Тохиргоог нээх"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Бусад төхөөрөмж"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Тоймыг асаах/унтраах"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Горим"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Болсон"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Тохиргоо"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Асаалттай"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Хураах дүрс тэмдэг"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Дэлгэх дүрс тэмдэг"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"эсвэл"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Гараа ашиглан шилжих"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Товчлуурын шууд холбоосыг мэдэж аваарай"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Мэдрэгч самбараа ашиглан шилжээрэй"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Мэдрэгч самбарын зангааг мэдэж аваарай"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Гар эсвэл мэдрэгч самбараа ашиглан шилжээрэй"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Мэдрэгч самбарын зангаа, товчлуурын шууд холбоос болон бусад зүйлийг мэдэж аваарай"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Буцах зангаа"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Үндсэн нүүрний зангаа"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Тусгай товчлуур"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Та одоо дэлгэцийнхээ дээд талаас гэрэлтүүлгийн түвшнийг бүр илүү багасгаснаар дэлгэцийг хэт бүүдгэр болгох боломжтой.\n\nЭнэ нь таныг харанхуй орчинд байхад хамгийн сайн ажилладаг."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Хэт бүүдгэр онцлогийн товчлолыг хасах"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Хэт бүүдгэр онцлогийн товчлолыг хассан. Гэрэлтүүлгээ багасгахын тулд энгийн гэрэлтүүлгийн самбарыг ашиглана уу."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index 76515d2d4892..75ef6e0394ac 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -105,6 +105,7 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"टीप जोडा"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"लिंकचा समावेश करा"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <string name="backlinks_cross_profile_error" msgid="1355798585727802282">"इतर प्रोफाइलवरून लिंक जोडल्या जाऊ शकत नाहीत"</string> <string name="screenrecord_title" msgid="4257171601439507792">"स्क्रीन रेकॉर्डर"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"स्क्रीन रेकॉर्डिंग प्रोसेस सुरू"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"स्क्रीन रेकॉर्ड सत्रासाठी सुरू असलेली सूचना"</string> @@ -292,8 +293,7 @@ <string name="start_dreams" msgid="9131802557946276718">"स्क्रीन सेव्हर"</string> <string name="ethernet_label" msgid="2203544727007463351">"इथरनेट"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"व्यत्यय आणू नका"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"मोड"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"ब्लूटूथ"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"कोणतेही जोडलेले डिव्हाइसेस उपलब्ध नाहीत"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"डिव्हाइस कनेक्ट किंवा डिस्कनेक्ट करण्यासाठी टॅप करा"</string> @@ -434,8 +434,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"सेटिंग्ज उघडा"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"इतर डिव्हाइस"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"अवलोकन टॉगल करा."</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"मोड"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"पूर्ण झाले"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"सेटिंग्ज"</string> <string name="zen_mode_on" msgid="9085304934016242591">"सुरू आहे"</string> @@ -1393,18 +1392,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"कोलॅप्स करा आयकन"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"विस्तार करा आयकन"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"किंवा"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"तुमचा कीबोर्ड वापरून नेव्हिगेट करा"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"कीबोर्ड शॉर्टकट जाणून घ्या"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"तुमचा टचपॅड वापरून नेव्हिगेट करा"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"टचपॅड जेश्चर जाणून घ्या"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"तुमचा कीबोर्ड आणि टचपॅड वापरून नेव्हिगेट करा"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"टचपॅड जेश्चर, कीबोर्ड शॉर्टकट आणि आणखी बरेच काही जाणून घ्या"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"मागे जा जेश्चर"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"होम जेश्चर"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"अॅक्शन की"</string> @@ -1444,4 +1437,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"तुम्ही आता तुमच्या स्क्रीनच्या सर्वात वरून ब्राइटनेसची पातळी आणखी कमी करून स्क्रीनला आणखी डिम करू शकता.\n\nतुम्ही गडद वातावरणात असता, तेव्हा हे सर्वोत्तम कार्य करते."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"आणखी डिमचा शॉर्टकट काढून टाका"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"आणखी डिमचा शॉर्टकट काढून टाकला आहे. तुमचा ब्राइटनेस कमी करण्यासाठी, नेहमीचा ब्राइटनेस बार वापरा."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index 181b0c7eb1bb..e8213ba5f74c 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -105,6 +105,7 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Tambahkan pada nota"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Sertakan pautan"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <string name="backlinks_cross_profile_error" msgid="1355798585727802282">"Pautan tidak dapat ditambahkan daripada profil lain"</string> <string name="screenrecord_title" msgid="4257171601439507792">"Perakam Skrin"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Memproses rakaman skrin"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Pemberitahuan breterusan untuk sesi rakaman skrin"</string> @@ -1391,18 +1392,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Kuncupkan ikon"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Kembangkan ikon"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"atau"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navigasi menggunakan papan kekunci anda"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Ketahui pintasan papan kekunci"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navigasi menggunakan pad sentuh anda"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Ketahui gerak isyarat pad sentuh"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Navigasi menggunakan papan kekunci dan pad sentuh anda"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Ketahui gerak isyarat pad sentuh, pintasan papan kekunci dan pelbagai lagi"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Gerak isyarat kembali"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Gerak isyarat pergi ke laman utama"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Kekunci tindakan"</string> @@ -1442,4 +1437,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Kini anda boleh menjadikan skrin amat malap dengan merendahkan tahap kecerahan lebih jauh daripada bahagian atas skrin anda.\n\nCiri ini berfungsi paling baik apabila anda berada dalam persekitaran yang gelap."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Alih keluar pintasan amat malap"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Pintasan amat malap dialih keluar. Untuk mengurangkan kecerahan anda, gunakan bar kecerahan biasa."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index afc57ac30166..8abb63da1b3a 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -105,6 +105,7 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"မှတ်စုတွင် ထည့်ရန်"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"လင့်ခ်ထည့်သွင်းရန်"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <string name="backlinks_cross_profile_error" msgid="1355798585727802282">"လင့်ခ်များကို အခြားပရိုဖိုင်များမှ ထည့်၍မရပါ"</string> <string name="screenrecord_title" msgid="4257171601439507792">"ဖန်သားပြင်ရိုက်ကူးစက်"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"စကရင်ရိုက်ကူးမှု အပြီးသတ်နေသည်"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"ဖန်သားပြင် ရိုက်ကူးသည့် စက်ရှင်အတွက် ဆက်တိုက်လာနေသော အကြောင်းကြားချက်"</string> @@ -292,8 +293,7 @@ <string name="start_dreams" msgid="9131802557946276718">"စခရင်နားချိန်ပုံ"</string> <string name="ethernet_label" msgid="2203544727007463351">"အီသာနက်"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"မနှောင့်ယှက်ရ"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"မုဒ်များ"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"ဘလူးတုသ်"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"ချိတ်တွဲထားသည့် ကိရိယာများ မရှိ"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"စက်ကို ချိတ်ဆက်ရန် (သို့) ချိတ်ဆက်မှုဖြုတ်ရန် တို့ပါ"</string> @@ -434,8 +434,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"ဆက်တင်များဖွင့်ရန်"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"အခြားစက်ပစ္စည်း"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"ဖွင့်၊ ပိတ် အနှစ်ချုပ်"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"မုဒ်များ"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"ပြီးပြီ"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"ဆက်တင်များ"</string> <string name="zen_mode_on" msgid="9085304934016242591">"ဖွင့်"</string> @@ -1393,18 +1392,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"လျှော့ပြရန် သင်္ကေတ"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"ပိုပြရန် သင်္ကေတ"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"သို့မဟုတ်"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"သင့်ကီးဘုတ်ကိုသုံး၍ လမ်းညွှန်ခြင်း"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"လက်ကွက်ဖြတ်လမ်းများကို လေ့လာပါ"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"သင့်တာ့ချ်ပက်ကိုသုံး၍ လမ်းညွှန်ခြင်း"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"တာ့ချ်ပက်လက်ဟန်များကို လေ့လာပါ"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"သင်၏ ကီးဘုတ်နှင့် တာ့ချ်ပက်တို့ကိုသုံး၍ လမ်းညွှန်ခြင်း"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"တာ့ချ်ပက်လက်ဟန်များ၊ လက်ကွက်ဖြတ်လမ်းများ စသည်တို့ကို လေ့လာပါ"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"နောက်သို့ လက်ဟန်"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"ပင်မစာမျက်နှာ လက်ဟန်"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"လုပ်ဆောင်ချက်ကီး"</string> @@ -1444,4 +1437,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"သင့်စခရင်ထိပ်ဆုံး၌ပင် တောက်ပမှုအဆင့်လျှော့ချခြင်းဖြင့် စခရင်ကို ပိုမှိန်အောင် လုပ်နိုင်ပါပြီ။\n\nသင်သည် မှောင်သောပတ်ဝန်းကျင်၌ရှိချိန် ၎င်းက အကောင်းဆုံးအလုပ်လုပ်သည်။"</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"ပိုမှိန်ခြင်း ဖြတ်လမ်း ဖယ်ရှားရန်"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"ပိုမှိန်ခြင်း ဖြတ်လမ်းကို ဖယ်ရှားလိုက်ပြီ။ တောက်ပမှုလျှော့ရန် ပုံမှန် တောက်ပမှုဘားကို အသုံးပြုပါ။"</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index d222f314f025..8ccb77618fa1 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Legg til i notat"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Inkluder linken"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"Skjermopptak"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Behandler skjermopptaket"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Vedvarende varsel for et skjermopptak"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Skjermsparer"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Ikke forstyrr"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Moduser"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Ingen sammenkoblede enheter er tilgjengelige"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Trykk for å koble en enhet til eller fra"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Åpne Innstillinger"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Annen enhet"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Slå oversikten av eller på"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Moduser"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Ferdig"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Innstillinger"</string> <string name="zen_mode_on" msgid="9085304934016242591">"På"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Skjul-ikon"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Vis-ikon"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"eller"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Naviger med tastaturet"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Lær deg hurtigtaster"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Naviger med styreflaten"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Lær deg styreflatebevegelser"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Naviger med tastaturet og styreflaten"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Lær deg styreflatebevegelser, hurtigtaster med mer"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Tilbakebevegelse"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Startskjermbevegelse"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Handlingstast"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Nå kan du gjøre skjermen ekstra dimmet ved å redusere lysstyrkenivået enda mer fra toppen av skjermen.\n\nDette fungerer best i mørke omgivelser."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Fjern hurtigtasten for ekstra dimmet"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Hurtigtasten for ekstra dimmet er fjernet. For å redusere lysstyrken kan du bruke den vanlige lysstyrkeraden."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index 8af52a1d3b68..60e99eaf48b6 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -105,6 +105,7 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"नोटमा सेभ गर्नुहोस्"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"लिंक समावेश गर्नुहोस्"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <string name="backlinks_cross_profile_error" msgid="1355798585727802282">"अन्य प्रोफाइलबाट लिंकहरू हाल्न मिल्दैन"</string> <string name="screenrecord_title" msgid="4257171601439507792">"स्क्रिन रेकर्डर"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"स्क्रिन रेकर्डिङको प्रक्रिया अघि बढाइँदै"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"कुनै स्क्रिन रेकर्ड गर्ने सत्रका लागि चलिरहेको सूचना"</string> @@ -292,8 +293,7 @@ <string name="start_dreams" msgid="9131802557946276718">"स्क्रिन सेभर"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"बाधा नपुऱ्याउनुहोस्"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"मोडहरू"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"ब्लुटुथ"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"जोडी उपकरणहरू उपलब्ध छैन"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"कुनै डिभाइस कनेक्ट गर्न वा डिस्कनेक्ट गर्न ट्याप गर्नुहोस्"</string> @@ -434,8 +434,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"सेटिङ खोल्नुहोस्"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"अर्को डिभाइड"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"परिदृश्य टगल गर्नुहोस्"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"मोडहरू"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"सम्पन्न भयो"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"सेटिङ"</string> <string name="zen_mode_on" msgid="9085304934016242591">"अन छ"</string> @@ -1393,18 +1392,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"\"कोल्याप्स गर्नुहोस्\" आइकन"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"\"एक्स्पान्ड गर्नुहोस्\" आइकन"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"वा"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"किबोर्ड प्रयोग गरी नेभिगेट गर्नुहोस्"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"किबोर्डका सर्टकटहरू प्रयोग गर्न सिक्नुहोस्"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"टचप्याड प्रयोग गरी नेभिगेट गर्नुहोस्"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"टचप्याड जेस्चर प्रयोग गर्न सिक्नुहोस्"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"किबोर्ड र टचप्याड प्रयोग गरी नेभिगेट गर्नुहोस्"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"टचप्याड जेस्चर, किबोर्डका सर्टकट र अन्य कुरा प्रयोग गर्न सिक्नुहोस्"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"ब्याक जेस्चर"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"होम जेस्चर"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"एक्सन की"</string> @@ -1444,4 +1437,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"तपाईं अब आफ्नो स्क्रिनको सिरानबाट चमकको स्तर घटाएर आफ्नो स्क्रिन अझै मधुरो बनाउन सक्नुहुन्छ।\n\nतपाईं अँध्यारो ठाउँमा भएका बेला यो सुविधाले अझ राम्रोसँग काम गर्छ।"</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"\"अझै मधुरो\" सर्टकट हटाउनुहोस्"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"\"अझै मधुरो\" सर्टकट हटाइएको छ। स्क्रिनको चमक घटाउन \"रेगुलर ब्राइटनेस बार\" प्रयोग गर्नुहोस्।"</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index 24a483503454..4b43ab173d3a 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -105,6 +105,7 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Toevoegen aan notitie"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Link opnemen"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <string name="backlinks_cross_profile_error" msgid="1355798585727802282">"Je kunt geen links toevoegen vanuit andere profielen"</string> <string name="screenrecord_title" msgid="4257171601439507792">"Schermopname"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Schermopname verwerken"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Doorlopende melding voor een schermopname-sessie"</string> @@ -292,8 +293,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Screensaver"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Niet storen"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Modi"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Geen gekoppelde apparaten beschikbaar"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Tik om een apparaat te verbinden of de verbinding te verbreken"</string> @@ -434,8 +434,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Instellingen openen"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Ander apparaat"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Overzicht aan- of uitzetten"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Modi"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Klaar"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Instellingen"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Aan"</string> @@ -1393,18 +1392,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Icoon voor samenvouwen"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Icoon voor uitvouwen"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"of"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navigeren met je toetsenbord"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Leer sneltoetsen die je kunt gebruiken"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navigeren met je touchpad"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Leer touchpadgebaren die je kunt gebruiken"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Navigeren met je toetsenbord en touchpad"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Leer meer over onder andere touchpadgebaren en sneltoetsen"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Gebaar voor terug"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Gebaar voor startscherm"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Actietoets"</string> @@ -1444,4 +1437,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Je kunt het scherm nu extra dimmen door het helderheidsniveau nog verder te verlagen vanaf de bovenkant van het scherm.\n\nDit werkt het beste als je in een donkere omgeving bent."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Snelkoppeling voor extra dimmen verwijderen"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Snelkoppeling voor extra dimmen verwijderd. Als je de helderheid wilt verlagen, gebruik je de gewone helderheidsbalk."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index 67537c2b9a2d..af4ee77c04ed 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"ନୋଟରେ ଯୋଗ କରନ୍ତୁ"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"ଲିଙ୍କକୁ ଅନ୍ତର୍ଭୁକ୍ତ କରନ୍ତୁ"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"ସ୍କ୍ରିନ ରେକର୍ଡର"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"ସ୍କ୍ରିନ ରେକର୍ଡିଂର ପ୍ରକ୍ରିୟାକରଣ"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"ଏକ ସ୍କ୍ରିନ୍ ରେକର୍ଡ୍ ସେସନ୍ ପାଇଁ ଚାଲୁଥିବା ବିଜ୍ଞପ୍ତି"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"ସ୍କ୍ରିନ୍ ସେଭର୍"</string> <string name="ethernet_label" msgid="2203544727007463351">"ଇଥରନେଟ୍"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"ମୋଡ"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"ବ୍ଲୁଟୁଥ"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"ପେୟାର୍ ହୋଇଥିବା କୌଣସି ଡିଭାଇସ୍ ଉପଲବ୍ଧ ନାହିଁ"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"ଏକ ଡିଭାଇସ କନେକ୍ଟ କିମ୍ବା ଡିସକନେକ୍ଟ କରିବାକୁ ଟାପ କରନ୍ତୁ"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"ସେଟିଂସ ଖୋଲନ୍ତୁ"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"ଅନ୍ୟ ଡିଭାଇସ୍"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"ସଂକ୍ଷିପ୍ତ ବିବରଣୀକୁ ଟୋଗଲ୍ କରନ୍ତୁ"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"ମୋଡ"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"ହୋଇଗଲା"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"ସେଟିଂସ"</string> <string name="zen_mode_on" msgid="9085304934016242591">"ଚାଲୁ ଅଛି"</string> @@ -653,7 +653,7 @@ <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"ଏହି ଆପକୁ ଅନପିନ କରିବାକୁ, \"ବ୍ୟାକ\" ଏବଂ \"ହୋମ\" ବଟନକୁ ସ୍ପର୍ଶ କରି ଦବାଇ ଧରନ୍ତୁ"</string> <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"ଏହି ଆପକୁ ଅନପିନ୍ କରିବାକୁ, ଉପରକୁ ସ୍ୱାଇପ୍ କରି ଧରି ରଖନ୍ତୁ"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"ବୁଝିଗଲି"</string> - <string name="screen_pinning_negative" msgid="6882816864569211666">"ନାହିଁ, ଥାଉ"</string> + <string name="screen_pinning_negative" msgid="6882816864569211666">"ନା, ଧନ୍ୟବାଦ"</string> <string name="screen_pinning_start" msgid="7483998671383371313">"ଆପ୍ ପିନ୍ କରାଯାଇଛି"</string> <string name="screen_pinning_exit" msgid="4553787518387346893">"ଆପ୍ ଅନପିନ୍ କରାଯାଇଛି"</string> <string name="stream_voice_call" msgid="7468348170702375660">"କଲ କରନ୍ତୁ"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"ଆଇକନକୁ ସଙ୍କୁଚିତ କରନ୍ତୁ"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"ଆଇକନକୁ ବିସ୍ତାର କରନ୍ତୁ"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"କିମ୍ବା"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"ଆପଣଙ୍କ କୀବୋର୍ଡ ବ୍ୟବହାର କରି ନାଭିଗେଟ କରନ୍ତୁ"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"କୀବୋର୍ଡ ସର୍ଟକଟଗୁଡ଼ିକ ବିଷୟରେ ଜାଣନ୍ତୁ"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"ଆପଣଙ୍କ ଟଚପେଡ ବ୍ୟବହାର କରି ନାଭିଗେଟ କରନ୍ତୁ"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"ଟଚପେଡର ଜେଶ୍ଚରଗୁଡ଼ିକ ବିଷୟରେ ଜାଣନ୍ତୁ"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"ଆପଣଙ୍କ କୀବୋର୍ଡ ଏବଂ ଟଚପେଡ ବ୍ୟବହାର କରି ନାଭିଗେଟ କରନ୍ତୁ"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"ଟଚପେଡ ଜେଶ୍ଚର, କୀବୋର୍ଡ ସର୍ଟକଟ ଏବଂ ଆହୁରି ଅନେକ କିଛି ବିଷୟରେ ଜାଣନ୍ତୁ"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"ବେକ ଜେଶ୍ଚର"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"ହୋମ ଜେଶ୍ଚର"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"ଆକ୍ସନ କୀ"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"ବର୍ତ୍ତମାନ ଆପଣ ଆପଣଙ୍କ ସ୍କ୍ରିନର ଶୀର୍ଷରୁ ଉଜ୍ଜ୍ୱଳତାର ଲେଭେଲ ହ୍ରାସ କରି ସ୍କ୍ରିନକୁ ଅତିରିକ୍ତ ଡିମ କରିପାରିବେ।\n\nଆପଣ ଏକ ଡାର୍କ ପରିବେଶରେ ଥିଲେ ଏହା ସବୁଠାରୁ ଭଲ କାମ କରେ।"</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"ଅତିରିକ୍ତ ଡିମ ସର୍ଟକଟକୁ କାଢ଼ି ଦିଅନ୍ତୁ"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"ଅତିରିକ୍ତ ଡିମର ସର୍ଟକଟ କାଢ଼ି ଦିଆଯାଇଛି। ଆପଣଙ୍କ ଉଜ୍ଜ୍ୱଳତା ହ୍ରାସ କରିବା ପାଇଁ ନିୟମିତ ଉଜ୍ଜ୍ୱଳତା ବାର ବ୍ୟବହାର କରନ୍ତୁ।"</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index 1927d45ea248..e6b275a5cef0 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"ਨੋਟ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"ਲਿੰਕ ਸ਼ਾਮਲ ਕਰੋ"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"ਸਕ੍ਰੀਨ ਰਿਕਾਰਡਰ"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"ਸਕ੍ਰੀਨ ਰਿਕਾਰਡਿੰਗ ਜਾਰੀ ਹੈ"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"ਕਿਸੇ ਸਕ੍ਰੀਨ ਰਿਕਾਰਡ ਸੈਸ਼ਨ ਲਈ ਚੱਲ ਰਹੀ ਸੂਚਨਾ"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"ਸਕ੍ਰੀਨ ਸੇਵਰ"</string> <string name="ethernet_label" msgid="2203544727007463351">"ਈਥਰਨੈਟ"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"ਮੋਡ"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"ਬਲੂਟੁੱਥ"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"ਕੋਈ ਜੋੜਾਬੱਧ ਕੀਤੀਆਂ ਡੀਵਾਈਸਾਂ ਉਪਲਬਧ ਨਹੀਂ"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"ਡੀਵਾਈਸ ਨੂੰ ਕਨੈਕਟ ਜਾਂ ਡਿਸਕਨੈਕਟ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹੋ"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"ਹੋਰ ਡੀਵਾਈਸ"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"ਰੂਪ-ਰੇਖਾ ਨੂੰ ਟੌਗਲ ਕਰੋ"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"ਮੋਡ"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"ਹੋ ਗਿਆ"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"ਸੈਟਿੰਗਾਂ"</string> <string name="zen_mode_on" msgid="9085304934016242591">"ਚਾਲੂ"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"ਪ੍ਰਤੀਕ ਨੂੰ ਸਮੇਟੋ"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"ਪ੍ਰਤੀਕ ਦਾ ਵਿਸਤਾਰ ਕਰੋ"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ਜਾਂ"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"ਆਪਣੇ ਕੀ-ਬੋਰਡ ਦੀ ਵਰਤੋਂ ਕਰ ਕੇ ਨੈਵੀਗੇਟ ਕਰੋ"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"ਕੀ-ਬੋਰਡ ਸ਼ਾਰਟਕੱਟ ਬਾਰੇ ਜਾਣੋ"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"ਆਪਣੇ ਟੱਚਪੈਡ ਦੀ ਵਰਤੋਂ ਕਰ ਕੇ ਨੈਵੀਗੇਟ ਕਰੋ"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"ਟੱਚਪੈਡ ਇਸ਼ਾਰਿਆਂ ਬਾਰੇ ਜਾਣੋ"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"ਆਪਣੇ ਕੀ-ਬੋਰਡ ਅਤੇ ਟੱਚਪੈਡ ਦੀ ਵਰਤੋਂ ਕਰ ਕੇ ਨੈਵੀਗੇਟ ਕਰੋ"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"ਟੱਚਪੈਡ ਇਸ਼ਾਰੇ, ਕੀ-ਬੋਰਡ ਸ਼ਾਰਟਕੱਟ ਅਤੇ ਹੋਰ ਬਹੁਤ ਕੁਝ ਬਾਰੇ ਜਾਣੋ"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"ਪਿੱਛੇ ਜਾਣ ਦਾ ਇਸ਼ਾਰਾ"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"ਹੋਮ \'ਤੇ ਜਾਣ ਦਾ ਇਸ਼ਾਰਾ"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"ਕਾਰਵਾਈ ਕੁੰਜੀ"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"ਤੁਸੀਂ ਹੁਣ ਆਪਣੀ ਸਕ੍ਰੀਨ ਦੇ ਸਿਖਰ ਤੋਂ ਚਕਮ ਦੇ ਪੱਧਰ ਨੂੰ ਹੋਰ ਵੀ ਘੱਟ ਕਰ ਕੇ ਸਕ੍ਰੀਨ ਦੀ ਚਮਕ ਨੂੰ ਜ਼ਿਆਦਾ ਘੱਟ ਕਰ ਸਕਦੇ ਹੋ।\n\nਇਹ ਉਦੋਂ ਬਿਹਤਰੀਨ ਕੰਮ ਕਰਦੀ ਹੈ, ਜਦੋਂ ਤੁਸੀਂ ਹਨੇਰੇ ਵਿੱਚ ਹੁੰਦੇ ਹੋ।"</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"\'ਜ਼ਿਆਦਾ ਘੱਟ ਚਮਕ\' ਸ਼ਾਰਟਕੱਟ ਹਟਾਓ"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"\'ਜ਼ਿਆਦਾ ਘੱਟ ਚਮਕ\' ਸ਼ਾਰਟਕੱਟ ਹਟਾਇਆ ਗਿਆ। ਆਪਣੀ ਸਕ੍ਰੀਨ ਦੀ ਚਕਮ ਨੂੰ ਘੱਟ ਕਰਨ ਲਈ, ਨਿਯਮਿਤ ਚਮਕ ਪੱਟੀ ਦੀ ਵਰਤੋਂ ਕਰੋ।"</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index 1b27dba60258..0fefcaecbdb6 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Dodaj do notatek"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Dołącz link"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"Nagrywanie ekranu"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Przetwarzam nagrywanie ekranu"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Stałe powiadomienie o sesji rejestrowania zawartości ekranu"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Wygaszacz ekranu"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Nie przeszkadzać"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Tryby"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Brak dostępnych sparowanych urządzeń"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Kliknij, aby podłączyć lub odłączyć urządzenie"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Otwórz Ustawienia"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Inne urządzenie"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Przełącz Przegląd"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Tryby"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Gotowe"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Ustawienia"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Wł."</string> @@ -510,7 +510,7 @@ <string name="accessibility_action_label_remove_widget" msgid="3373779447448758070">"usuń widżet"</string> <string name="accessibility_action_label_place_widget" msgid="1914197458644168978">"umieść wybrany widżet"</string> <string name="communal_widget_picker_title" msgid="1953369090475731663">"Widżety na ekranie blokady"</string> - <string name="communal_widget_picker_description" msgid="490515450110487871">"Każdy zobaczy widżety na ekranie blokady, nawet gdy tablet jest zablokowany."</string> + <string name="communal_widget_picker_description" msgid="490515450110487871">"Widżety są widoczne na ekranie blokady, nawet gdy tablet jest zablokowany."</string> <string name="accessibility_action_label_unselect_widget" msgid="1041811747619468698">"odznacz widżet"</string> <string name="communal_widgets_disclaimer_title" msgid="1150954395585308868">"Widżety na ekranie blokady"</string> <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"Aby otworzyć aplikację za pomocą widżetu, musisz potwierdzić swoją tożsamość. Pamiętaj też, że każdy będzie mógł wyświetlić widżety nawet wtedy, gdy tablet będzie zablokowany. Niektóre widżety mogą nie być przeznaczone do umieszczenia na ekranie blokady i ich dodanie w tym miejscu może być niebezpieczne."</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikona zwijania"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikona rozwijania"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"lub"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Nawiguj za pomocą klawiatury"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Dowiedz się więcej o skrótach klawiszowych"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Nawiguj za pomocą touchpada"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Poznaj gesty na touchpada"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Nawiguj za pomocą klawiatury i touchpada"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Poznaj gesty na touchpada, skróty klawiszowe i inne funkcje"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Gest przejścia wstecz"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Gest przejścia na ekran główny"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Klawisz działania"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Możesz teraz dodatkowo przyciemnić ekran, jeszcze bardziej zmniejszając poziom jasności u góry ekranu.\n\nTa funkcja sprawdza się najlepiej, gdy jesteś w ciemnym otoczeniu."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Usuń skrót do dodatkowego przyciemnienia"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Skrót do dodatkowego przyciemnienia został usunięty. Aby zmniejszyć jasność, użyj standardowego paska jasności."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index d5856af1f6d8..1331ee65a716 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Incluir anotação"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Incluir link"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"Gravador de tela"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Processando gravação de tela"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificação contínua para uma sessão de gravação de tela"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Protetor de tela"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Não perturbe"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Modos"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Não há dispositivos pareados disponíveis"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Toque para conectar ou desconectar um dispositivo"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Abrir as Configurações"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Outro dispositivo"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Alternar Visão geral"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Modos"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Concluído"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Configurações"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Ativado"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ícone \"Fechar\""</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ícone \"Abrir\""</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ou"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navegue usando o teclado"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Aprenda atalhos do teclado"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navegue usando o touchpad"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Aprenda gestos do touchpad"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Navegue usando o teclado e o touchpad"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Aprenda gestos do touchpad, atalhos do teclado e muito mais"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Gesto de volta"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Gesto de início"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Tecla de ação"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Agora, na parte de cima, é possível usar o recurso Escurecer a tela, que diminui ainda mais o nível de brilho.\n\nIsso funciona melhor quando você está em um ambiente escuro."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Remover atalho de Escurecer a tela"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Atalho de Escurecer a tela removido. Use a barra normal para diminuir o brilho."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index 6589b0fdbca7..e811fff9782b 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -105,6 +105,7 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Adicionar a uma nota"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Incluir link"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <string name="backlinks_cross_profile_error" msgid="1355798585727802282">"Não é possível adicionar links de outros perfis"</string> <string name="screenrecord_title" msgid="4257171601439507792">"Gravador de ecrã"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"A processar a gravação de ecrã"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificação persistente de uma sessão de gravação de ecrã"</string> @@ -292,8 +293,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Proteção ecrã"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Não incomodar"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Modos"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Sem dispositivos sincronizados disponíveis"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Toque para associar ou desassociar um dispositivo"</string> @@ -434,8 +434,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Abrir definições"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Outro dispositivo"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Ativar/desativar Vista geral"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Modos"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Concluir"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Definições"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Ativado"</string> @@ -1393,18 +1392,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ícone de reduzir"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ícone de expandir"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ou"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navegue com o teclado"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Aprenda atalhos de teclado"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navegue com o touchpad"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Aprenda gestos do touchpad"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Navegue com o teclado e o touchpad"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Aprenda gestos do touchpad, atalhos de teclado e muito mais"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Gesto para retroceder"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Gesto para aceder ao ecrã principal"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Tecla de ação"</string> @@ -1444,4 +1437,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Agora, pode tornar o ecrã ainda mais escuro reduzindo ainda mais o nível de brilho a partir da parte superior do ecrã.\n\nIsto funciona melhor quando está num ambiente escuro."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Remover atalho do escurecimento extra"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Atalho do escurecimento extra removido. Para reduzir o brilho, use a barra do brilho normal."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index d5856af1f6d8..1331ee65a716 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Incluir anotação"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Incluir link"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"Gravador de tela"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Processando gravação de tela"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificação contínua para uma sessão de gravação de tela"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Protetor de tela"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Não perturbe"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Modos"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Não há dispositivos pareados disponíveis"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Toque para conectar ou desconectar um dispositivo"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Abrir as Configurações"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Outro dispositivo"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Alternar Visão geral"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Modos"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Concluído"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Configurações"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Ativado"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ícone \"Fechar\""</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ícone \"Abrir\""</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ou"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navegue usando o teclado"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Aprenda atalhos do teclado"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navegue usando o touchpad"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Aprenda gestos do touchpad"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Navegue usando o teclado e o touchpad"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Aprenda gestos do touchpad, atalhos do teclado e muito mais"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Gesto de volta"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Gesto de início"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Tecla de ação"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Agora, na parte de cima, é possível usar o recurso Escurecer a tela, que diminui ainda mais o nível de brilho.\n\nIsso funciona melhor quando você está em um ambiente escuro."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Remover atalho de Escurecer a tela"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Atalho de Escurecer a tela removido. Use a barra normal para diminuir o brilho."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index 59136e0b953f..35d00254bd09 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Adaugă în notă"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Include linkul"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"Recorder pentru ecran"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Se procesează înregistrarea"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificare în curs pentru o sesiune de înregistrare a ecranului"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Screensaver"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Nu deranja"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Moduri"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Niciun dispozitiv conectat disponibil"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Atinge pentru a conecta sau deconecta un dispozitiv"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Deschide Setări"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Alt dispozitiv"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Comută secțiunea Recente"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Moduri"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Gata"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Setări"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Activat"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Pictograma de restrângere"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Pictograma de extindere"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"sau"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navighează folosind tastatura"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Învață comenzile rapide de la tastatură"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navighează folosind touchpadul"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Învață gesturi pentru touchpad"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Navighează folosind tastatura și touchpadul"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Învață gesturi pentru touchpad, comenzi rapide de la tastatură și altele"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Gestul Înapoi"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Gestul Ecran de pornire"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Tastă de acțiuni"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Poți reduce suplimentar luminozitatea ecranului dacă scazi nivelul de luminozitate din partea de sus a ecranului.\n\nAcest lucru funcționează cel mai bine într-un mediu întunecat."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Elimină comanda rapidă de luminozitate redusă suplimentar"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"S-a eliminat comanda rapidă de luminozitate redusă suplimentar. Ca să reduci luminozitatea, folosește bara obișnuită de luminozitate."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index de436766ba07..2174dde011c0 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -105,6 +105,7 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Добавить в заметку"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Добавить ссылку"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <string name="backlinks_cross_profile_error" msgid="1355798585727802282">"Нельзя добавлять ссылки из других профилей."</string> <string name="screenrecord_title" msgid="4257171601439507792">"Запись видео с экрана"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Обработка записи с экрана…"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Текущее уведомление для записи видео с экрана"</string> @@ -292,8 +293,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Заставка"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Не беспокоить"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Режимы"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Нет доступных сопряженных устройств"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Нажмите, чтобы подключить или отключить устройство."</string> @@ -301,7 +301,7 @@ <string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Все"</string> <string name="turn_on_bluetooth" msgid="5681370462180289071">"Использовать"</string> <string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"Подключено"</string> - <string name="quick_settings_bluetooth_device_audio_sharing" msgid="1496358082943301670">"Отправка аудио"</string> + <string name="quick_settings_bluetooth_device_audio_sharing" msgid="1496358082943301670">"Передача аудио"</string> <string name="quick_settings_bluetooth_device_audio_sharing_or_switch_active" msgid="3227408556754456024">"Нажмите, чтобы переключить аудио или поделиться им"</string> <string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Сохранено"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"отключить"</string> @@ -434,8 +434,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Открыть настройки"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Другое устройство"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Переключить режим обзора"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Режимы"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Готово"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Настройки"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Включено"</string> @@ -1393,18 +1392,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Значок \"Свернуть\""</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Значок \"Развернуть\""</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"или"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Навигация с помощью клавиатуры"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Узнайте о сочетаниях клавиш."</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Навигация с помощью сенсорной панели"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Узнайте о жестах на сенсорной панели."</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Навигация с помощью клавиатуры и сенсорной панели"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Узнайте о жестах на сенсорной панели, сочетаниях клавиш и многом другом."</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Жест \"назад\""</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Жест \"на главный экран\""</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Клавиша действия"</string> @@ -1444,4 +1437,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Чтобы дополнительно понизить яркость экрана, откройте настройки в его верхней части.\n\nРекомендуем использовать эту функцию, когда вокруг темно."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Удалить быструю команду для дополнительного уменьшения яркости"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Быстрая команда для дополнительного уменьшения яркости удалена. Чтобы изменить уровень яркости, воспользуйтесь стандартным ползунком яркости."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index 8d6cd091d31e..167e9cdeb64e 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"සටහනට එක් කරන්න"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"සබැඳිය ඇතුළත් කරන්න"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"තිර රෙකෝඩරය"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"තිර පටිගත කිරීම සකසමින්"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"තිර පටිගත කිරීමේ සැසියක් සඳහා කෙරෙන දැනුම් දීම"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"තිර සුරැකුම"</string> <string name="ethernet_label" msgid="2203544727007463351">"ඊතර නෙට්"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"බාධා නොකරන්න"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"ප්රකාර"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"බ්ලූටූත්"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"යුගල කළ උපාංග නොතිබේ"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"උපාංගයක් සම්බන්ධ කිරීමට හෝ විසන්ධි කිරීමට තට්ටු කරන්න"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"සැකසීම් විවෘත කරන්න"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"වෙනත් උපාංගය"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"දළ විශ්ලේෂණය ටොගල කරන්න"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"ප්රකාර"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"නිමයි"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"සැකසීම්"</string> <string name="zen_mode_on" msgid="9085304934016242591">"ක්රියාත්මකයි"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"හැකුළුම් නිරූපකය"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"දිගහැරීම් නිරූපකය"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"හෝ"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"ඔබේ යතුරු පුවරුව භාවිතයෙන් සංචාලනය කරන්න"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"යතුරුපුවරු කෙටිමං ඉගෙන ගන්න"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"ඔබේ ස්පර්ශ පෑඩ් භාවිතයෙන් සංචාලනය කරන්න"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"ස්පර්ශක පුවරු අභිනයන් ඉගෙන ගන්න"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"ඔබේ යතුරු පුවරුව සහ ස්පර්ශ පෑඩ් භාවිතයෙන් සංචාලනය කරන්න"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"ස්පර්ශ පෑඩ් අභිනයන්, යතුරුපුවරු කෙටිමං සහ තවත් දේ ඉගෙන ගන්න"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"ආපසු අභිනය"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"නිවෙස් අභිනය"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"ක්රියා යතුර"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"ඔබේ තිරයේ ඉහළ සිට දීප්තියේ මට්ටම තවත් අඩු කිරීමෙන් ඔබට දැන් තිරය තවත් අඳුරු කළ හැක.\n\nඔබ අඳුරු පරිසරයක සිටින විට මෙය වඩාත් හොඳින් ක්රියා කරයි."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"තවත් අඳුරු කෙටිමඟ ඉවත් කරන්න"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"තවත් අඳුරු කෙටිමඟ ඉවත් කරන ලදි. ඔබේ දීප්තිය අඩු කිරීමට, සාමාන්ය දීප්ත තීරුව භාවිත කරන්න."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index 715928540706..dd872c25eeb5 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -105,6 +105,7 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Pridať do poznámky"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Zahrnúť odkaz"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <string name="backlinks_cross_profile_error" msgid="1355798585727802282">"Odkazy z iných profilov sa nedajú pridať"</string> <string name="screenrecord_title" msgid="4257171601439507792">"Rekordér obrazovky"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Spracúva sa záznam obrazovky"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Zobrazuje sa upozornenie týkajúce sa relácie záznamu obrazovky"</string> @@ -292,8 +293,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Šetrič obrazovky"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Režim bez vyrušení"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Režimy"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Nie sú k dispozícii žiadne spárované zariadenia"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Klepnutím pripojíte alebo odpojíte zariadenie"</string> @@ -434,8 +434,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Otvoriť Nastavenia"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Iné zariadenie"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Prepnúť prehľad"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Režimy"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Hotovo"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Nastavenia"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Zapnuté"</string> @@ -1393,18 +1392,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikona zbalenia"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikona rozbalenia"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"alebo"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Prechádzajte pomocou klávesnice"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Naučte sa klávesové skratky"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Prechádzajte pomocou touchpadu"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Naučte sa gestá touchpadu"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Prechádzajte pomocou klávesnice a touchpadu"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Naučte sa gestá touchpadu, klávesové skratky a ďalšie funkcie"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Gesto prechodu späť"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Gesto prechodu domov"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Akčný kláves"</string> @@ -1444,4 +1437,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Teraz môžete obrazovku mimoriadne stmaviť ešte ďalším znížením úrovne jasu v hornej časti obrazovky.\n\nNajlepšie to funguje v tmavom prostredí."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Odstrániť skratku mimoriadneho stmavenia"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Skratka mimoriadneho stmavenia bola odstránená. Ak chcete znížiť jas, použite bežný posúvač jasu."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index f2c466eb5097..01ca4e57162d 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -105,6 +105,7 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Dodaj v zapisek"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Vključi povezavo"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <string name="backlinks_cross_profile_error" msgid="1355798585727802282">"Povezav ni mogoče dodati iz drugih profilov"</string> <string name="screenrecord_title" msgid="4257171601439507792">"Snemalnik zaslona"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Obdelava videoposnetka zaslona"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Nenehno obveščanje o seji snemanja zaslona"</string> @@ -292,8 +293,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Ohranjeval. zaslona"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Ne moti"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Načini"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Na voljo ni nobene seznanjene naprave"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Dotaknite se za vzpostavitev ali prekinitev povezave z napravo"</string> @@ -434,8 +434,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Odpri nastavitve"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Druga naprava"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Vklop/izklop pregleda"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Načini"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Končano"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Nastavitve"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Vklopljeno"</string> @@ -1393,18 +1392,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikona za strnitev"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikona za razširitev"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ali"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Krmarjenje s tipkovnico"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Učenje bližnjičnih tipk"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Krmarjenje s sledilno ploščico"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Učenje potez na sledilni ploščici"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Krmarjenje s tipkovnico in sledilno ploščico"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Učenje potez na sledilni ploščici, bližnjičnih tipk in drugega"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Poteza za pomik nazaj"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Poteza za začetni zaslon"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Gumb za dejanje"</string> @@ -1444,4 +1437,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Zdaj lahko zelo zatemnite zaslon tako, da na vrhu zaslona dodatno zmanjšate raven svetlosti.\n\nTa funkcija najbolje deluje v temnem okolju."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Odstrani bližnjico do funkcije Zelo zatemnjeno"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Bližnjica do funkcije Zelo zatemnjeno je odstranjena. Če želite zmanjšati svetlost, uporabite običajno vrstico za uravnavanje svetlosti."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index 70ea421b85ba..c4f880877ea2 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Shto te shënimi"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Përfshi lidhjen"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"Regjistruesi i ekranit"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Regjistrimi i ekranit po përpunohet"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Njoftim i vazhdueshëm për një seancë regjistrimi të ekranit"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Mbrojtësi i ekranit"</string> <string name="ethernet_label" msgid="2203544727007463351">"Eternet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Mos shqetëso"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Modalitetet"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth-i"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Nuk ofrohet për përdorim asnjë pajisje e çiftuar"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Trokit për të lidhur ose shkëputur një pajisje"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Hap \"Cilësimet\""</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Pajisje tjetër"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Kalo te përmbledhja"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Modalitetet"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"U krye"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Cilësimet"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Aktiv"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikona e palosjes"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikona e zgjerimit"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ose"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navigo duke përdorur tastierën tënde"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Mëso shkurtoret e tastierës"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navigo duke përdorur bllokun me prekje"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Mëso gjestet e bllokut me prekje"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Navigo duke përdorur tastierën dhe bllokun me prekje"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Mëso gjestet e bllokut me prekje, shkurtoret e tastierës etj."</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Gjesti i kthimit prapa"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Gjesti për të shkuar tek ekrani bazë"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Tasti i veprimit"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Tani mund ta bësh ekranin shumë më të zbehtë duke e ulur nivelin e ndriçimit edhe më tej nga kreu i ekranit.\n\nKjo funksionon më mirë kur je në një mjedis të errët."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Hiq shkurtoren e modalitetit \"Shumë më i zbehtë\""</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Shkurtorja e modalitetit \"Shumë më i zbehtë\" u hoq. Për të ulur ndriçimin, përdor shiritin e zakonshëm të ndriçimit."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index 6db372d192da..66a4915ae3be 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -105,6 +105,7 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Додај у белешку"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Уврсти линк"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <string name="backlinks_cross_profile_error" msgid="1355798585727802282">"Не можете да додате линкове са других профила"</string> <string name="screenrecord_title" msgid="4257171601439507792">"Снимач екрана"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Обрађујемо видео снимка екрана"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Обавештење о сесији снимања екрана је активно"</string> @@ -292,8 +293,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Чувар екрана"</string> <string name="ethernet_label" msgid="2203544727007463351">"Етернет"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Не узнемиравај"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Режими"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Није доступан ниједан упарени уређај"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Додирните да бисте повезали уређај или прекинули везу"</string> @@ -434,8 +434,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Отвори Подешавања"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Други уређај"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Укључи/искључи преглед"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Режими"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Готово"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Подешавања"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Укључено"</string> @@ -488,7 +487,7 @@ <string name="cta_tile_button_to_dismiss" msgid="3377597875997861754">"Одбаци"</string> <string name="cta_label_to_edit_widget" msgid="6496885074209203756">"Додајте, уклоните и преуредите виџете овде"</string> <string name="cta_label_to_open_widget_picker" msgid="3874946756976360699">"Додајте још виџета"</string> - <string name="popup_on_dismiss_cta_tile_text" msgid="8292501780996070019">"Дуги притисак за прилагођавање виџета"</string> + <string name="popup_on_dismiss_cta_tile_text" msgid="8292501780996070019">"Дуго притисните за прилагођавање виџета"</string> <string name="button_to_configure_widgets_text" msgid="4191862850185256901">"Прилагоди виџете"</string> <string name="unlock_reason_to_customize_widgets" msgid="5011909432460546033">"Откључајте да бисте прилагодили виџете"</string> <string name="icon_description_for_disabled_widget" msgid="4693151565003206943">"Икона апликације за онемогућен виџет"</string> @@ -1393,18 +1392,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Икона за скупљање"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Икона за проширивање"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"или"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Крећите се помоћу тастатуре"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Сазнајте више о тастерским пречицама"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Крећите се помоћу тачпеда"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Научите покрете за тачпед"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Крећите се помоћу тастатуре и тачпeда"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Научите покрете за тачпед, тастерске пречице и друго"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Покрет за враћање"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Покрет за почетну страницу"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Тастер радњи"</string> @@ -1444,4 +1437,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Сада можете додатно да затамните екран смањивањем нивоа осветљености при врху екрана. \n\nОво најбоље функционише када сте у тамном окружењу."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Уклони пречицу за додатно затамњивање"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Уклоњена је пречица за додатно затамњивање. Да бисте смањили осветљеност, користите уобичајену траку за осветљеност."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index 225e3b3c5007..5ec9e963a15f 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Lägg till i anteckning"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Inkludera länk"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"Skärminspelare"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Behandlar skärminspelning"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Avisering om att skärminspelning pågår"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Skärmsläckare"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Stör ej"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Lägen"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Det finns inga kopplade enheter tillgängliga"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Tryck för att ansluta eller koppla från en enhet"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Öppna Inställningar"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Annan enhet"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Aktivera och inaktivera översikten"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Lägen"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Klar"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Inställningar"</string> <string name="zen_mode_on" msgid="9085304934016242591">"På"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikonen Komprimera"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikonen Utöka"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"eller"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navigera med tangentbordet"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Lär dig kortkommandon"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navigera med styrplattan"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Lär dig rörelser för styrplattan"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Navigera med tangentbordet och styrplattan"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Lär dig rörelser för styrplattan, kortkommandon med mera"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Tillbaka-rörelse"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Rörelse för att öppna startskärmen"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Åtgärdstangent"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Nu kan du göra skärmen extradimmad genom att sänka ljusstyrkan ännu mer från överst på skärmen.\n\nDetta fungerar bäst när omgivningen är mörk."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Ta bort kortkommandot för extradimmat"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Kortkommandot för extradimmat har tagits bort. Använd det vanliga fältet för ljusstyrka om du vill sänka ljusstyrkan."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index 9fa8e558aa42..ababf7010302 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Ongeza kwenye dokezo"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Jumuisha kiungo"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g> <xliff:g id="APPNAME">%1$s</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"Kinasa Skrini"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Inachakata rekodi ya skrini"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Arifa inayoendelea ya kipindi cha kurekodi skrini"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Taswira ya skrini"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Usinisumbue"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Hali"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Hakuna vifaa vilivyooanishwa vinavyopatikana"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Gusa ili uunganishe au utenganishe kifaa"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Fungua Mipangilio"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Kifaa kingine"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Washa Muhtasari"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Hali"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Nimemaliza"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Mipangilio"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Imewashwa"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Kunja aikoni"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Panua aikoni"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"au"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Kusogeza kwa kutumia kibodi yako"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Jifunze kuhusu mikato ya kibodi"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Kusogeza kwa kutumia padi yako ya kugusa"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Jifunze kuhusu miguso ya padi ya kugusa"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Kusogeza kwa kutumia kibodi na padi yako ya kugusa"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Jifunze kuhusu miguso ya padi ya kugusa, mikato ya kibodi na mengineyo"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Ishara ya kurudi nyuma"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Mguso wa kurudi kwenye skrini ya kwanza"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Kitufe cha vitendo"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Sasa unaweza kupunguza mwangaza zaidi kwa kupunguza kabisa kiwango cha mwangaza katika sehemu ya juu ya skrini yako.\n\nMipangilio hii hufanya kazi vyema zaidi ukiwa katika mazingira yenye giza."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Ondoa njia ya mkato ya kipunguza mwangaza zaidi"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Njia ya mkato ya kipunguza mwangaza zaidi imeondolewa. Tumia upau wa kawaida wa mwangaza ili upunguze mwangaza wako."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index 7acd1e85129b..54ab3c337f94 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -105,6 +105,7 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"குறிப்பில் சேர்"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"இணைப்பைச் சேர்"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <string name="backlinks_cross_profile_error" msgid="1355798585727802282">"பிற சுயவிவர்ங்களில் இருந்து இணைப்புகளைச் சேர்க்க முடியாது"</string> <string name="screenrecord_title" msgid="4257171601439507792">"ஸ்கிரீன் ரெக்கார்டர்"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"ஸ்க்ரீன் ரெக்கார்டிங் செயலாக்கப்படுகிறது"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"திரை ரெக்கார்டிங் அமர்விற்கான தொடர் அறிவிப்பு"</string> @@ -292,8 +293,7 @@ <string name="start_dreams" msgid="9131802557946276718">"ஸ்கிரீன் சேவர்"</string> <string name="ethernet_label" msgid="2203544727007463351">"ஈதர்நெட்"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"தொந்தரவு செய்ய வேண்டாம்"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"பயன்முறைகள்"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"புளூடூத்"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"இணைக்கப்பட்ட சாதனங்கள் இல்லை"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"சாதனத்தை இணைக்க/துண்டிக்க தட்டவும்"</string> @@ -434,8 +434,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"அமைப்புகளைத் திற"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"பிற சாதனம்"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"மேலோட்டப் பார்வையை நிலைமாற்று"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"பயன்முறைகள்"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"முடிந்தது"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"அமைப்புகள்"</string> <string name="zen_mode_on" msgid="9085304934016242591">"இயக்கப்பட்டுள்ளது"</string> @@ -1393,18 +1392,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"சுருக்குவதற்கான ஐகான்"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"விரிவாக்குவதற்கான ஐகான்"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"அல்லது"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"கீபோர்டைப் பயன்படுத்திச் செல்லுதல்"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"கீபோர்டு ஷார்ட்கட்கள் குறித்துத் தெரிந்துகொள்ளுங்கள்"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"டச்பேடைப் பயன்படுத்திச் செல்லுதல்"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"டச்பேட் சைகைள் குறித்துத் தெரிந்துகொள்ளுங்கள்"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"உங்கள் டச்பேட் மற்றும் கீபோர்டைப் பயன்படுத்திச் செல்லுதல்"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"டச்பேட் சைகைகள், கீபோர்டு ஷார்ட்கட்கள் மற்றும் பலவற்றைத் தெரிந்துகொள்ளுங்கள்"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"பின்செல்வதற்கான சைகை"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"முகப்பிற்குச் செல்வதற்கான சைகை"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"ஆக்ஷன் பட்டன்"</string> @@ -1444,4 +1437,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"இப்போது உங்கள் திரையின் மேற்பகுதியில் ஒளிர்வு அளவைக் குறைப்பதன் மூலம் திரையை மிகக் குறைவான வெளிச்சத்திற்குக் கொண்டு வரலாம்.\n\nஇருட்டான சூழலில் இருக்கும்போது இது சிறப்பாகச் செயல்படும்."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"மிகக் குறைவான வெளிச்சத்திற்கான ஷார்ட்கட்டை அகற்று"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"மிகக் குறைவான வெளிச்சத்திற்கான ஷார்ட்கட் அகற்றப்பட்டது. உங்கள் ஒளிர்வைக் குறைக்க, வழக்கமான ஒளிர்வுப் பட்டியைப் பயன்படுத்துங்கள்."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index 5cba2efbfc94..2c4109a8fd9e 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -105,6 +105,7 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"గమనికకు జోడించండి"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"లింక్ను చేర్చండి"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <string name="backlinks_cross_profile_error" msgid="1355798585727802282">"ఇతర ప్రొఫైల్స్ నుండి లింక్లు జోడించబడవు"</string> <string name="screenrecord_title" msgid="4257171601439507792">"స్క్రీన్ రికార్డర్"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"స్క్రీన్ రికార్డింగ్ అవుతోంది"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"స్క్రీన్ రికార్డ్ సెషన్ కోసం ఆన్గోయింగ్ నోటిఫికేషన్"</string> @@ -292,8 +293,7 @@ <string name="start_dreams" msgid="9131802557946276718">"స్క్రీన్ సేవర్"</string> <string name="ethernet_label" msgid="2203544727007463351">"ఈథర్నెట్"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"అంతరాయం కలిగించవద్దు"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"మోడ్లు"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"బ్లూటూత్"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"జత చేసిన పరికరాలు ఏవీ అందుబాటులో లేవు"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"పరికరాన్ని కనెక్ట్ చేయడానికి లేదా డిస్కనెక్ట్ చేయడానికి ట్యాప్ చేయండి"</string> @@ -434,8 +434,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"సెట్టింగ్లను తెరవండి"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"ఇతర పరికరం"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"స్థూలదృష్టిని టోగుల్ చేయి"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"మోడ్లు"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"పూర్తయింది"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"సెట్టింగ్లు"</string> <string name="zen_mode_on" msgid="9085304934016242591">"ఆన్లో ఉంది"</string> @@ -1393,18 +1392,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"కుదించండి చిహ్నం"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"విస్తరించండి చిహ్నం"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"లేదా"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"మీ కీబోర్డ్ ఉపయోగించి నావిగేట్ చేయండి"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"కీబోర్డ్ షార్ట్కట్ల గురించి తెలుసుకోండి"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"మీ టచ్ప్యాడ్ని ఉపయోగించి నావిగేట్ చేయండి"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"టచ్ప్యాడ్ సంజ్ఞ గురించి తెలుసుకోండి"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"మీ కీబోర్డ్, టచ్ప్యాడ్ను ఉపయోగించి నావిగేట్ చేయండి"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"టచ్ప్యాడ్ సంజ్ఞలు, కీబోర్డ్ షార్ట్కట్లు, అలాగే మరిన్నింటిని గురించి తెలుసుకోండి"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"వెనుకకు పంపే సంజ్ఞ"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"హోమ్కు పంపే సంజ్ఞ"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"యాక్షన్ కీ"</string> @@ -1444,4 +1437,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"మీరు ఇప్పుడు మీ స్క్రీన్ పైభాగం నుండి బ్రైట్నెస్ స్థాయిని తగ్గించడం ద్వారా కూడా స్క్రీన్ కాంతిని మరింత డిమ్ చేయవచ్చు.\n\nమీరు డార్క్ ఎన్విరాన్మెంట్లో ఉన్నప్పుడు కూడా ఇది బాగా పని చేస్తుంది."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"కాంతిని మరింత డిమ్ చేసే షార్ట్కట్ను తీసివేయండి"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"కాంతిని మరింత డిమ్ చేసే షార్ట్కట్ తీసివేయబడింది. మీ బ్రైట్నెస్ను తగ్గించడానికి, సాధారణ బ్రైట్నెస్ బార్ను ఉపయోగించండి."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index 905ab9834eef..20e730c2df57 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -105,6 +105,7 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"เพิ่มลงในโน้ต"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"รวมลิงก์"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <string name="backlinks_cross_profile_error" msgid="1355798585727802282">"เพิ่มลิงก์จากโปรไฟล์อื่นไม่ได้"</string> <string name="screenrecord_title" msgid="4257171601439507792">"โปรแกรมบันทึกหน้าจอ"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"กำลังประมวลผลการอัดหน้าจอ"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"การแจ้งเตือนต่อเนื่องสำหรับเซสชันการบันทึกหน้าจอ"</string> @@ -292,8 +293,7 @@ <string name="start_dreams" msgid="9131802557946276718">"ภาพพักหน้าจอ"</string> <string name="ethernet_label" msgid="2203544727007463351">"อีเทอร์เน็ต"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"ห้ามรบกวน"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"โหมด"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"บลูทูธ"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"ไม่มีอุปกรณ์ที่จับคู่ที่สามารถใช้ได้"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"แตะเพื่อเชื่อมต่อหรือยกเลิกการเชื่อมต่ออุปกรณ์"</string> @@ -434,8 +434,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"เปิดการตั้งค่า"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"อุปกรณ์อื่น"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"สลับภาพรวม"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"โหมด"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"เสร็จสิ้น"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"การตั้งค่า"</string> <string name="zen_mode_on" msgid="9085304934016242591">"เปิด"</string> @@ -1393,18 +1392,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"ไอคอนยุบ"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"ไอคอนขยาย"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"หรือ"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"ไปยังส่วนต่างๆ โดยใช้แป้นพิมพ์"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"ดูข้อมูลเกี่ยวกับแป้นพิมพ์ลัด"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"ไปยังส่วนต่างๆ โดยใช้ทัชแพด"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"ดูข้อมูลเกี่ยวกับท่าทางสัมผัสของทัชแพด"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"ไปยังส่วนต่างๆ โดยใช้แป้นพิมพ์และทัชแพด"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"ดูข้อมูลเกี่ยวกับท่าทางสัมผัสของทัชแพด แป้นพิมพ์ลัด และอื่นๆ"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"ท่าทางสัมผัสสำหรับย้อนกลับ"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"ท่าทางสัมผัสสำหรับหน้าแรก"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"ปุ่มดำเนินการ"</string> @@ -1444,4 +1437,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"ตอนนี้คุณสามารถหรี่แสงหน้าจอเพิ่มเติมได้โดยลดระดับความสว่างจากด้านบนของหน้าจอมากขึ้น\n\nฟีเจอร์นี้จะทำงานได้ดีเมื่อคุณอยู่ในที่มืด"</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"นำทางลัดหรี่แสงเพิ่มเติมออก"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"นำทางลัดหรี่แสงเพิ่มเติมออกแล้ว หากต้องการลดความสว่าง ให้ใช้แถบความสว่างปกติ"</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index 5e9d7207badf..0bef7436269c 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -105,6 +105,7 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Idagdag sa tala"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Isama ang link"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <string name="backlinks_cross_profile_error" msgid="1355798585727802282">"Hindi maidaragdag ang mga link mula sa ibang profile"</string> <string name="screenrecord_title" msgid="4257171601439507792">"Recorder ng Screen"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Pinoproseso screen recording"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Kasalukuyang notification para sa session ng pag-record ng screen"</string> @@ -1391,18 +1392,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"I-collapse ang icon"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"I-expand ang icon"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"o"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Mag-navigate gamit ang iyong keyboard"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Matuto ng mga keyboard shortcut"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Mag-navigate gamit ang iyong touchpad"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Matuto ng mga galaw sa touchpad"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Mag-navigate gamit ang iyong keyboard at touchpad"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Matuto ng mga galaw sa touchpad, keyboard shortcut, at higit pa"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Galaw para bumalik"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Galaw para sa Home"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Action key"</string> @@ -1442,4 +1437,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Puwede mo nang gawing extra dim ang screen sa pamamagitan ng pagpapababa ng level ng liwanag nang higit pa mula sa itaas ng iyong screen.\n\nPinakamahusay itong gumagana kapag nasa madilim na kapaligiran ka."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Alisin ang shortcut ng extra dim"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Inalis ang shortcut ng extra dim. Para bawasan ang liwanag, gamitin ang karaniwang bar ng liwanag."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index db4940233b45..060ecd1010eb 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Nota ekle"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Bağlantıyı dahil et"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"Ekran Kaydedicisi"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Ekran kaydı işleniyor"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ekran kaydı oturumu için devam eden bildirim"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Ekran koruyucu"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Rahatsız Etmeyin"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Modlar"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Kullanılabilir eşlenmiş cihaz yok"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Cihaz bağlamak veya cihazın bağlantısını kesmek için dokunun"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Ayarlar\'ı aç"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Diğer cihaz"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Genel bakışı aç/kapat"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Modlar"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Bitti"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Ayarlar"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Açık"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Daralt simgesi"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Genişlet simgesi"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"veya"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Klavyenizi kullanarak gezinin"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Klavye kısayollarını öğrenin"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Dokunmatik alanınızı kullanarak gezinin"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Dokunmatik alan hareketlerini öğrenin"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Klavyenizi ve dokunmatik alanınızı kullanarak gezinin"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Dokunmatik alan hareketlerini, klavye kısayollarını ve daha fazlasını öğrenin"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Geri hareketi"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Ana sayfa hareketi"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Eylem tuşu"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Artık ekranınızın üst kısmından parlaklık seviyesini daha da düşürerek ekranı ekstra loş hale getirebilirsiniz.\n\nBu özellik, karanlık ortamdayken en iyi sonucu verir."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Ekstra loş kısayolunu kaldır"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Ekstra loş kısayolu kaldırıldı. Parlaklık seviyesini düşürmek için normal parlaklık çubuğunu kullanın."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 6d881df5d6c6..ae07ae26d0f0 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Додати до примітки"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Додати посилання"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"Запис відео з екрана"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Обробка записування екрана"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Сповіщення про сеанс запису екрана"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Заставка"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Не турбувати"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Режими"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Немає спарених пристроїв"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Натисніть, щоб під’єднати або від’єднати пристрій"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Відкрити налаштування"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Інший пристрій"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Увімкнути або вимкнути огляд"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Режими"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Готово"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Налаштування"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Увімкнено"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Значок згортання"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Значок розгортання"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"або"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Навігація за допомогою клавіатури"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Комбінації клавіш: докладніше"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Навігація за допомогою сенсорної панелі"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Жести для сенсорної панелі: докладніше"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Навігація за допомогою клавіатури й сенсорної панелі"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Жести для сенсорної панелі, комбінації клавіш тощо: докладніше"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Жест \"Назад\""</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Жест переходу на головний екран"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Клавіша дії"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Тепер ви можете зробити екран ще темнішим, додатково зменшуючи рівень яскравості вгорі екрана.\n\nНайкраще ця функція працює, коли ви перебуваєте в темному місці."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Видалити комбінацію клавіш для додаткового зменшення яскравості"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Комбінацію клавіш для додаткового зменшення яскравості видалено. Щоб зменшити яскравість, використовуйте стандартну панель регулювання."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index 628d66094431..5d1f66e364ef 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -105,6 +105,7 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"نوٹ میں شامل کریں"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"لنک شامل کریں"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <string name="backlinks_cross_profile_error" msgid="1355798585727802282">"دوسری پروفائلز سے لنکس شامل نہیں کیے جا سکتے"</string> <string name="screenrecord_title" msgid="4257171601439507792">"اسکرین ریکارڈر"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"سکرین ریکارڈنگ پروسیس ہورہی ہے"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"اسکرین ریکارڈ سیشن کیلئے جاری اطلاع"</string> @@ -292,8 +293,7 @@ <string name="start_dreams" msgid="9131802557946276718">"اسکرین سیور"</string> <string name="ethernet_label" msgid="2203544727007463351">"ایتھرنیٹ"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"ڈسٹرب نہ کریں"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"موڈز"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"بلوٹوتھ"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"کوئی جوڑا بنائے ہوئے آلات دستیاب نہیں ہیں"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"کسی آلے کو منسلک یا غیر منسلک کرنے کے لیے تھپتھپائیں"</string> @@ -434,8 +434,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"ترتیبات کھولیں"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"دوسرا آلہ"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"مجموعی جائزہ ٹوگل کریں"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"موڈز"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"ہو گیا"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"ترتیبات"</string> <string name="zen_mode_on" msgid="9085304934016242591">"آن ہے"</string> @@ -1393,18 +1392,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"آئیکن سکیڑیں"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"آئیکن پھیلائیں"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"یا"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"اپنے کی بورڈ کا استعمال کر کے نیویگیٹ کریں"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"کی بورڈ شارٹ کٹس جانیں"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"اپنے ٹچ پیڈ کا استعمال کر کے نیویگیٹ کریں"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"ٹچ پیڈ کے اشارے کو جانیں"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"اپنے کی بورڈ اور ٹچ پیڈ کا استعمال کر کے نیویگیٹ کریں"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"ٹچ پیڈ کے اشارے، کی بورڈ شارٹ کٹس اور مزید جانیں"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"پیچھے جانے کا اشارہ"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"ہوم کا اشارہ"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"ایکشن کلید"</string> @@ -1444,4 +1437,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"آپ اپنی اسکرین کے اوپری حصے سے چمکیلے پن لیول کو مزید کم کر کے اپنی اسکرین کو اضافی دھندلی بنا سکتے ہیں۔\n\nجب آپ تاریک ماحول میں ہوتے ہیں تو یہ بہتر کام کرتا ہے۔"</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"اضافی دھندلا شارٹ کٹ کو ہٹائیں"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"اضافی دھندلا شارٹ کٹ کو ہٹا دیا گیا۔ اپنا چمکیلا پن کم کرنے کیلئے، ریگولر چمک بار کا استعمال کریں"</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index f0988edc2efd..af35adf0f390 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Qaydga qoʻshish"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Havolani kiritish"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g>, <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"Ekranni yozib olish"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Ekran yozib olinmoqda"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ekrandan yozib olish seansi uchun joriy bildirishnoma"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Ekran lavhasi"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Bezovta qilinmasin"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Rejimlar"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Ulangan qurilmalar topilmadi"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Qurilma ulash yoki uzish uchun tegining"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Sozlamalarni ochish"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Boshqa qurilma"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Umumiy nazar rejimini almashtirish"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Rejimlar"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Tayyor"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Sozlamalar"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Yoniq"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Yigʻish belgisi"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Yoyish belgisi"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"yoki"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Klaviatura yordamida kezing"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Tezkor tugmalar haqida"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Sensorli panel yordamida kezing"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Sensorli panel ishoralari haqida"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Klaviatura va sensorli panel yordamida kezing"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Sensorli panel ishoralari, tezkor tugmalar va boshqalar haqida"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Orqaga qaytish ishorasi"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Asosiy ekran ishorasi"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Amal tugmasi"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Endi yorqinlik darajasini ekranning yuqori qismidan yanada pasaytirish orqali ekranni yanada xiralashtirishingiz mumkin.\n\nBu qorongʻi muhitda eng yaxshi ishlaydi."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Juda xira yorligʻini olib tashlash"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Juda xira yorligʻi olib tashlandi. Yorqinlikni pasaytirish uchun oddiy yorqinlik panelidan foydalaning."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 6ad5db47eafa..b7cd6b0d899f 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Thêm vào ghi chú"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Thêm đường liên kết"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"Trình ghi màn hình"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Đang xử lý video ghi màn hình"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Thông báo đang diễn ra về phiên ghi màn hình"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Trình bảo vệ m.hình"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Không làm phiền"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Chế độ"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Không có thiết bị nào được ghép nối"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Nhấn để kết nối/ngắt kết nối với một thiết bị"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Mở phần Cài đặt"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Thiết bị khác"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Bật/tắt chế độ xem Tổng quan"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Chế độ"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Xong"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Cài đặt"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Đang bật"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Biểu tượng Thu gọn"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Biểu tượng Mở rộng"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"hoặc"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Di chuyển bằng bàn phím"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Tìm hiểu về phím tắt"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Di chuyển bằng bàn di chuột"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Tìm hiểu về cử chỉ trên bàn di chuột"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Di chuyển bằng bàn phím và bàn di chuột"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Tìm hiểu về cử chỉ trên bàn di chuột, phím tắt và nhiều mục khác"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Cử chỉ quay lại"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Cử chỉ chuyển đến màn hình chính"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Phím hành động"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Giờ đây, bạn có thể đặt màn hình ở chế độ siêu tối bằng cách giảm thêm độ sáng từ đầu màn hình.\n\nChế độ này hoạt động hiệu quả nhất khi bạn ở trong một môi trường tối."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Xoá lối tắt của chế độ siêu tối"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Đã xoá lối tắt của chế độ siêu tối. Để giảm độ sáng, hãy dùng thanh độ sáng như thông thường."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 35f8851d9049..a329965d5714 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"添加到备注中"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"包括链接"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"屏幕录制器"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"正在处理屏幕录制视频"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"持续显示屏幕录制会话通知"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"屏保"</string> <string name="ethernet_label" msgid="2203544727007463351">"有线网络"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"勿扰"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"模式"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"蓝牙"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"没有可用的配对设备"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"点按即可连接设备或断开设备连接"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"打开“设置”"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"其他设备"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"切换概览"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"模式"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"完成"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"设置"</string> <string name="zen_mode_on" msgid="9085304934016242591">"已开启"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"收起图标"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"展开图标"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"或"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"使用键盘导航"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"了解键盘快捷键"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"使用触控板导航"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"了解触控板手势"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"使用键盘和触控板进行导航"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"了解触控板手势、键盘快捷键等"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"返回手势"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"主屏幕手势"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"快捷操作按键"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"现在,您可从屏幕顶部进一步调低亮度,将屏幕调成极暗。\n\n此功能在昏暗环境中效果最佳。"</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"移除“极暗”快捷方式"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"已移除“极暗”快捷方式。如要调低亮度,请使用常规亮度条。"</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index 359b3ccb44b2..73bfbe6c2be2 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"新增至筆記"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"加入連結"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"螢幕錄影機"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"正在處理螢幕錄影內容"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"持續顯示錄影畫面工作階段通知"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"螢幕保護程式"</string> <string name="ethernet_label" msgid="2203544727007463351">"以太網"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"請勿騷擾"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"模式"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"藍牙"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"找不到配對的裝置"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"輕按即可連結或解除連結裝置"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"開啟「設定」"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"其他裝置"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"切換概覽"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"模式"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"完成"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"設定"</string> <string name="zen_mode_on" msgid="9085304934016242591">"開啟"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"收合圖示"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"展開圖示"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"或"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"使用鍵盤導覽"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"瞭解鍵盤快速鍵"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"使用觸控板導覽"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"瞭解觸控板手勢"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"使用鍵盤和觸控板導覽"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"瞭解觸控板手勢、鍵盤快速鍵等等"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"返去手勢"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"主畫面手勢"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"快捷操作鍵"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"而家喺螢幕頂部進一步校低亮度,就可以令螢幕變得超暗\n\n呢個功能喺陰暗環境之下嘅效果最好"</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"移除超暗功能快速鍵"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"超暗功能快速鍵已移除。如要降低亮度,請使用一般的亮度列。"</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 63b19d6be73d..46847fcf6599 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"新增至記事本"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"包含連結"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"螢幕錄影器"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"處理螢幕錄影內容"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"持續顯示螢幕畫面錄製工作階段通知"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"螢幕保護程式"</string> <string name="ethernet_label" msgid="2203544727007463351">"乙太網路"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"零打擾"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"模式"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"藍牙"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"找不到配對的裝置"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"輕觸即可連結/取消連結裝置"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"開啟「設定」"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"其他裝置"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"切換總覽"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"模式"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"完成"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"設定"</string> <string name="zen_mode_on" msgid="9085304934016242591">"開啟"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"收合圖示"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"展開圖示"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"或"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"使用鍵盤操作"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"學習鍵盤快速鍵"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"使用觸控板操作"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"學習觸控板手勢"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"使用鍵盤和觸控板操作"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"學習觸控板手勢、鍵盤快速鍵等"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"返回手勢"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"主畫面手勢"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"快捷操作鍵"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"現在只要在螢幕頂端將亮度設定調得更低,就能讓螢幕變得更暗。\n\n這項設定最適合在昏暗環境下使用。"</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"移除「超暗」捷徑"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"「超暗」捷徑已移除。如要調低亮度,請使用一般的亮度列。"</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index 048cb0190221..dbfb926b867c 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -105,6 +105,8 @@ <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Engeza kunothi"</string> <string name="backlinks_include_link" msgid="4562093591148248158">"Faka ilinki"</string> <string name="backlinks_duplicate_label_format" msgid="558445128952827926">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="FREQUENCYCOUNT">(%2$d)</xliff:g>"</string> + <!-- no translation found for backlinks_cross_profile_error (1355798585727802282) --> + <skip /> <string name="screenrecord_title" msgid="4257171601439507792">"Okokuqopha iskrini"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Icubungula okokuqopha iskrini"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Isaziso esiqhubekayo seseshini yokurekhoda isikrini"</string> @@ -292,8 +294,7 @@ <string name="start_dreams" msgid="9131802557946276718">"Isigciniskrini"</string> <string name="ethernet_label" msgid="2203544727007463351">"I-Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Ungaphazamisi"</string> - <!-- no translation found for quick_settings_modes_label (879156359479504244) --> - <skip /> + <string name="quick_settings_modes_label" msgid="879156359479504244">"Amamodi"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"I-Bluetooth"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Awekho amadivayisi abhanqiwe atholakalayo"</string> <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Thepha ukuze uxhumae noma ungaxhumi idivaysi"</string> @@ -434,8 +435,7 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"Vula Amasethingi"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"Enye idivayisi"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Guqula ukubuka konke"</string> - <!-- no translation found for zen_modes_dialog_title (8854640808100096934) --> - <skip /> + <string name="zen_modes_dialog_title" msgid="8854640808100096934">"Amamodi"</string> <string name="zen_modes_dialog_done" msgid="6654130880256438950">"Kwenziwe"</string> <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"Amasethingi"</string> <string name="zen_mode_on" msgid="9085304934016242591">"Vuliwe"</string> @@ -1393,18 +1393,12 @@ <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Goqa isithonjana"</string> <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Nweba isithonjana"</string> <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"noma"</string> - <!-- no translation found for launch_keyboard_tutorial_notification_title (8849933155160522519) --> - <skip /> - <!-- no translation found for launch_keyboard_tutorial_notification_content (2880339951512757918) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_title (2243780062772196901) --> - <skip /> - <!-- no translation found for launch_touchpad_tutorial_notification_content (7931085031240753226) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_title (1940023776496198762) --> - <skip /> - <!-- no translation found for launch_keyboard_touchpad_tutorial_notification_content (1780725168171929365) --> - <skip /> + <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Funa usebenzisa ikhibhodi yakho"</string> + <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Funda izinqamuleli zamakhibhodi"</string> + <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Funa usebenzisa iphedi yokuthinta"</string> + <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Funda ukunyakaza kwephedi lokuthinta"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Funa usebenzisa ikhibhodi yakho nephedi yokuthinta"</string> + <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Funda ukunyakaza kwephedi yokuthinta, izinqamuleli zamakhibhodi, nokuningi"</string> <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Ukunyakazisa umzimba kwangemuva"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Ukunyakazisa umzimba kwasekhaya"</string> <string name="touchpad_tutorial_action_key_button" msgid="3220074511852927267">"Inkinobho yokufinyelela"</string> @@ -1444,4 +1438,18 @@ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="7513137763024327538">"Manje ungenza isikrini sifiphale ngokwengeziwe ngokwehlisa izinga lokukhanya nakakhulu kusukela phezulu kwesikrini sakho.\n\nLokhu kusebenza kahle kakhulu uma usendaweni emnyama."</string> <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="1782147201534669800">"Susa isinqamuleli esifiphele esengeziwe"</string> <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="4070696910424515757">"Isinqamuleli esifiphele ngokwengeziwe sikhishiwe. Ukuze wehlise ukukhanya kwakho, sebenzisa ibha yokukhanya evamile."</string> + <!-- no translation found for qs_edit_mode_category_connectivity (4559726936546032672) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_accessibility (7969091385071475922) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_utilities (8123080090108420095) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_privacy (6577774443194551775) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_providedByApps (8346112074897919019) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_display (4749511439121053942) --> + <skip /> + <!-- no translation found for qs_edit_mode_category_unknown (509314252124053550) --> + <skip /> </resources> diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputViewController.java index 28f1381d94af..b43d8b667756 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputViewController.java @@ -19,10 +19,8 @@ package com.android.keyguard; import static com.android.internal.util.LatencyTracker.ACTION_CHECK_CREDENTIAL; import static com.android.internal.util.LatencyTracker.ACTION_CHECK_CREDENTIAL_UNLOCKED; import static com.android.keyguard.KeyguardAbsKeyInputView.MINIMUM_PASSWORD_LENGTH_BEFORE_REPORT; -import static com.android.systemui.Flags.msdlFeedback; import static com.android.systemui.Flags.notifyPasswordTextViewUserActivityInBackground; -import android.annotation.Nullable; import android.content.res.ColorStateList; import android.os.AsyncTask; import android.os.CountDownTimer; @@ -37,15 +35,13 @@ import com.android.internal.widget.LockscreenCredential; import com.android.keyguard.EmergencyButtonController.EmergencyButtonCallback; import com.android.keyguard.KeyguardAbsKeyInputView.KeyDownListener; import com.android.keyguard.KeyguardSecurityModel.SecurityMode; +import com.android.systemui.bouncer.ui.helper.BouncerHapticPlayer; import com.android.systemui.classifier.FalsingClassifier; import com.android.systemui.classifier.FalsingCollector; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.res.R; import com.android.systemui.user.domain.interactor.SelectedUserInteractor; -import com.google.android.msdl.data.model.MSDLToken; -import com.google.android.msdl.domain.MSDLPlayer; - import java.util.HashMap; import java.util.Map; @@ -62,8 +58,6 @@ public abstract class KeyguardAbsKeyInputViewController<T extends KeyguardAbsKey protected AsyncTask<?, ?, ?> mPendingLockCheck; protected boolean mResumed; protected boolean mLockedOut; - @Nullable - protected MSDLPlayer mMSDLPlayer; private final KeyDownListener mKeyDownListener = (keyCode, keyEvent) -> { // Fingerprint sensor sends a KeyEvent.KEYCODE_UNKNOWN. @@ -91,16 +85,16 @@ public abstract class KeyguardAbsKeyInputViewController<T extends KeyguardAbsKey LatencyTracker latencyTracker, FalsingCollector falsingCollector, EmergencyButtonController emergencyButtonController, FeatureFlags featureFlags, SelectedUserInteractor selectedUserInteractor, - @Nullable MSDLPlayer msdlPlayer, + BouncerHapticPlayer bouncerHapticPlayer, UserActivityNotifier userActivityNotifier) { super(view, securityMode, keyguardSecurityCallback, emergencyButtonController, - messageAreaControllerFactory, featureFlags, selectedUserInteractor); + messageAreaControllerFactory, featureFlags, selectedUserInteractor, + bouncerHapticPlayer); mKeyguardUpdateMonitor = keyguardUpdateMonitor; mLockPatternUtils = lockPatternUtils; mLatencyTracker = latencyTracker; mFalsingCollector = falsingCollector; mEmergencyButtonController = emergencyButtonController; - mMSDLPlayer = msdlPlayer; mUserActivityNotifier = userActivityNotifier; } @@ -191,7 +185,9 @@ public abstract class KeyguardAbsKeyInputViewController<T extends KeyguardAbsKey void onPasswordChecked(int userId, boolean matched, int timeoutMs, boolean isValidPassword) { boolean dismissKeyguard = mSelectedUserInteractor.getSelectedUserId() == userId; if (matched) { - playAuthenticationHaptics(/* unlock= */true); + mBouncerHapticPlayer.playAuthenticationFeedback( + /* authenticationSucceeded = */true + ); getKeyguardSecurityCallback().reportUnlockAttempt(userId, true, 0); if (dismissKeyguard) { mDismissing = true; @@ -199,7 +195,9 @@ public abstract class KeyguardAbsKeyInputViewController<T extends KeyguardAbsKey getKeyguardSecurityCallback().dismiss(true, userId, getSecurityMode()); } } else { - playAuthenticationHaptics(/* unlock= */false); + mBouncerHapticPlayer.playAuthenticationFeedback( + /* authenticationSucceeded = */false + ); mView.resetPasswordText(true /* animate */, false /* announce deletion if no match */); if (isValidPassword) { getKeyguardSecurityCallback().reportUnlockAttempt(userId, false, timeoutMs); @@ -216,18 +214,6 @@ public abstract class KeyguardAbsKeyInputViewController<T extends KeyguardAbsKey } } - private void playAuthenticationHaptics(boolean unlock) { - if (!msdlFeedback() || mMSDLPlayer == null) return; - - MSDLToken token; - if (unlock) { - token = MSDLToken.UNLOCK; - } else { - token = MSDLToken.FAILURE; - } - mMSDLPlayer.playToken(token, mAuthInteractionProperties); - } - protected void startErrorAnimation() { /* no-op */ } protected void verifyPasswordAndUnlock() { diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java index 92e5432ad243..ff788484c819 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java @@ -35,6 +35,7 @@ import com.android.systemui.Flags; import com.android.systemui.bouncer.domain.interactor.BouncerMessageInteractor; import com.android.systemui.bouncer.ui.BouncerMessageView; import com.android.systemui.bouncer.ui.binder.BouncerMessageViewBinder; +import com.android.systemui.bouncer.ui.helper.BouncerHapticPlayer; import com.android.systemui.classifier.FalsingCollector; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.flags.FeatureFlags; @@ -45,9 +46,6 @@ import com.android.systemui.user.domain.interactor.SelectedUserInteractor; import com.android.systemui.util.ViewController; import com.android.systemui.util.concurrency.DelayableExecutor; -import com.google.android.msdl.domain.InteractionProperties; -import com.google.android.msdl.domain.MSDLPlayer; - import javax.inject.Inject; /** Controller for a {@link KeyguardSecurityView}. */ @@ -66,21 +64,22 @@ public abstract class KeyguardInputViewController<T extends KeyguardInputView> private KeyguardSecurityCallback mNullCallback = new KeyguardSecurityCallback() {}; private final FeatureFlags mFeatureFlags; protected final SelectedUserInteractor mSelectedUserInteractor; - protected final InteractionProperties mAuthInteractionProperties = - new AuthInteractionProperties(); + protected final BouncerHapticPlayer mBouncerHapticPlayer; protected KeyguardInputViewController(T view, SecurityMode securityMode, KeyguardSecurityCallback keyguardSecurityCallback, EmergencyButtonController emergencyButtonController, @Nullable KeyguardMessageAreaController.Factory messageAreaControllerFactory, FeatureFlags featureFlags, - SelectedUserInteractor selectedUserInteractor) { + SelectedUserInteractor selectedUserInteractor, + BouncerHapticPlayer bouncerHapticPlayer) { super(view); mSecurityMode = securityMode; mKeyguardSecurityCallback = keyguardSecurityCallback; mEmergencyButtonController = emergencyButtonController; mFeatureFlags = featureFlags; mSelectedUserInteractor = selectedUserInteractor; + mBouncerHapticPlayer = bouncerHapticPlayer; if (messageAreaControllerFactory != null) { try { BouncerKeyguardMessageArea kma = view.requireViewById(R.id.bouncer_message_area); @@ -219,7 +218,7 @@ public abstract class KeyguardInputViewController<T extends KeyguardInputView> private final SelectedUserInteractor mSelectedUserInteractor; private final UiEventLogger mUiEventLogger; private final KeyguardKeyboardInteractor mKeyguardKeyboardInteractor; - private final MSDLPlayer mMSDLPlayer; + private final BouncerHapticPlayer mBouncerHapticPlayer; private final UserActivityNotifier mUserActivityNotifier; @Inject @@ -236,7 +235,7 @@ public abstract class KeyguardInputViewController<T extends KeyguardInputView> FeatureFlags featureFlags, SelectedUserInteractor selectedUserInteractor, UiEventLogger uiEventLogger, KeyguardKeyboardInteractor keyguardKeyboardInteractor, - MSDLPlayer msdlPlayer, + BouncerHapticPlayer bouncerHapticPlayer, UserActivityNotifier userActivityNotifier) { mKeyguardUpdateMonitor = keyguardUpdateMonitor; mLockPatternUtils = lockPatternUtils; @@ -255,7 +254,7 @@ public abstract class KeyguardInputViewController<T extends KeyguardInputView> mSelectedUserInteractor = selectedUserInteractor; mUiEventLogger = uiEventLogger; mKeyguardKeyboardInteractor = keyguardKeyboardInteractor; - mMSDLPlayer = msdlPlayer; + mBouncerHapticPlayer = bouncerHapticPlayer; mUserActivityNotifier = userActivityNotifier; } @@ -272,7 +271,7 @@ public abstract class KeyguardInputViewController<T extends KeyguardInputView> keyguardSecurityCallback, mLatencyTracker, mFalsingCollector, emergencyButtonController, mMessageAreaControllerFactory, mDevicePostureController, mFeatureFlags, mSelectedUserInteractor, - mMSDLPlayer); + mBouncerHapticPlayer); } else if (keyguardInputView instanceof KeyguardPasswordView) { return new KeyguardPasswordViewController((KeyguardPasswordView) keyguardInputView, mKeyguardUpdateMonitor, securityMode, mLockPatternUtils, @@ -280,14 +279,14 @@ public abstract class KeyguardInputViewController<T extends KeyguardInputView> mInputMethodManager, emergencyButtonController, mMainExecutor, mResources, mFalsingCollector, mKeyguardViewController, mDevicePostureController, mFeatureFlags, mSelectedUserInteractor, - mKeyguardKeyboardInteractor, mMSDLPlayer, mUserActivityNotifier); + mKeyguardKeyboardInteractor, mBouncerHapticPlayer, mUserActivityNotifier); } else if (keyguardInputView instanceof KeyguardPINView) { return new KeyguardPinViewController((KeyguardPINView) keyguardInputView, mKeyguardUpdateMonitor, securityMode, mLockPatternUtils, keyguardSecurityCallback, mMessageAreaControllerFactory, mLatencyTracker, mLiftToActivateListener, emergencyButtonController, mFalsingCollector, mDevicePostureController, mFeatureFlags, mSelectedUserInteractor, - mUiEventLogger, mKeyguardKeyboardInteractor, mMSDLPlayer, + mUiEventLogger, mKeyguardKeyboardInteractor, mBouncerHapticPlayer, mUserActivityNotifier); } else if (keyguardInputView instanceof KeyguardSimPinView) { return new KeyguardSimPinViewController((KeyguardSimPinView) keyguardInputView, @@ -295,14 +294,14 @@ public abstract class KeyguardInputViewController<T extends KeyguardInputView> keyguardSecurityCallback, mMessageAreaControllerFactory, mLatencyTracker, mLiftToActivateListener, mTelephonyManager, mFalsingCollector, emergencyButtonController, mFeatureFlags, mSelectedUserInteractor, - mKeyguardKeyboardInteractor, mMSDLPlayer, mUserActivityNotifier); + mKeyguardKeyboardInteractor, mBouncerHapticPlayer, mUserActivityNotifier); } else if (keyguardInputView instanceof KeyguardSimPukView) { return new KeyguardSimPukViewController((KeyguardSimPukView) keyguardInputView, mKeyguardUpdateMonitor, securityMode, mLockPatternUtils, keyguardSecurityCallback, mMessageAreaControllerFactory, mLatencyTracker, mLiftToActivateListener, mTelephonyManager, mFalsingCollector, emergencyButtonController, mFeatureFlags, mSelectedUserInteractor, - mKeyguardKeyboardInteractor, mMSDLPlayer, mUserActivityNotifier + mKeyguardKeyboardInteractor, mBouncerHapticPlayer, mUserActivityNotifier ); } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordViewController.java index 905fa0939a46..4628ed705d00 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordViewController.java @@ -19,7 +19,6 @@ package com.android.keyguard; import static com.android.systemui.flags.Flags.LOCKSCREEN_ENABLE_LANDSCAPE; import static com.android.systemui.util.kotlin.JavaAdapterKt.collectFlow; -import android.annotation.Nullable; import android.content.Context; import android.content.pm.PackageManager; import android.content.res.Resources; @@ -48,6 +47,7 @@ import com.android.internal.widget.LockPatternUtils; import com.android.keyguard.KeyguardSecurityModel.SecurityMode; import com.android.keyguard.domain.interactor.KeyguardKeyboardInteractor; import com.android.systemui.Flags; +import com.android.systemui.bouncer.ui.helper.BouncerHapticPlayer; import com.android.systemui.classifier.FalsingCollector; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.flags.FeatureFlags; @@ -56,8 +56,6 @@ import com.android.systemui.statusbar.policy.DevicePostureController; import com.android.systemui.user.domain.interactor.SelectedUserInteractor; import com.android.systemui.util.concurrency.DelayableExecutor; -import com.google.android.msdl.domain.MSDLPlayer; - import java.util.List; public class KeyguardPasswordViewController @@ -138,12 +136,12 @@ public class KeyguardPasswordViewController FeatureFlags featureFlags, SelectedUserInteractor selectedUserInteractor, KeyguardKeyboardInteractor keyguardKeyboardInteractor, - @Nullable MSDLPlayer msdlPlayer, + BouncerHapticPlayer bouncerHapticPlayer, UserActivityNotifier userActivityNotifier) { super(view, keyguardUpdateMonitor, securityMode, lockPatternUtils, keyguardSecurityCallback, messageAreaControllerFactory, latencyTracker, falsingCollector, - emergencyButtonController, featureFlags, selectedUserInteractor, msdlPlayer, - userActivityNotifier); + emergencyButtonController, featureFlags, selectedUserInteractor, + bouncerHapticPlayer, userActivityNotifier); mKeyguardSecurityCallback = keyguardSecurityCallback; mInputMethodManager = inputMethodManager; mPostureController = postureController; diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java index f74d93e1d88d..7fb66640b29f 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java @@ -36,7 +36,7 @@ import com.android.internal.widget.LockPatternView.Cell; import com.android.internal.widget.LockscreenCredential; import com.android.keyguard.EmergencyButtonController.EmergencyButtonCallback; import com.android.keyguard.KeyguardSecurityModel.SecurityMode; -import com.android.systemui.bouncer.ui.helper.BouncerHapticHelper; +import com.android.systemui.bouncer.ui.helper.BouncerHapticPlayer; import com.android.systemui.classifier.FalsingClassifier; import com.android.systemui.classifier.FalsingCollector; import com.android.systemui.flags.FeatureFlags; @@ -44,8 +44,6 @@ import com.android.systemui.res.R; import com.android.systemui.statusbar.policy.DevicePostureController; import com.android.systemui.user.domain.interactor.SelectedUserInteractor; -import com.google.android.msdl.domain.MSDLPlayer; - import java.util.HashMap; import java.util.List; import java.util.Map; @@ -70,7 +68,6 @@ public class KeyguardPatternViewController private LockPatternView mLockPatternView; private CountDownTimer mCountdownTimer; private AsyncTask<?, ?, ?> mPendingLockCheck; - private MSDLPlayer mMSDLPlayer; private EmergencyButtonCallback mEmergencyButtonCallback = new EmergencyButtonCallback() { @Override @@ -80,7 +77,7 @@ public class KeyguardPatternViewController }; private final LockPatternView.ExternalHapticsPlayer mExternalHapticsPlayer = () -> { - BouncerHapticHelper.INSTANCE.playPatternDotFeedback(mMSDLPlayer, mView); + mBouncerHapticPlayer.playPatternDotFeedback(mView); }; /** @@ -174,9 +171,8 @@ public class KeyguardPatternViewController boolean isValidPattern) { boolean dismissKeyguard = mSelectedUserInteractor.getSelectedUserId() == userId; if (matched) { - BouncerHapticHelper.INSTANCE.playMSDLAuthenticationFeedback( - /* authenticationSucceeded= */true, - /* player =*/mMSDLPlayer + mBouncerHapticPlayer.playAuthenticationFeedback( + /* authenticationSucceeded= */true ); getKeyguardSecurityCallback().reportUnlockAttempt(userId, true, 0); if (dismissKeyguard) { @@ -185,9 +181,8 @@ public class KeyguardPatternViewController getKeyguardSecurityCallback().dismiss(true, userId, SecurityMode.Pattern); } } else { - BouncerHapticHelper.INSTANCE.playMSDLAuthenticationFeedback( - /* authenticationSucceeded= */false, - /* player =*/mMSDLPlayer + mBouncerHapticPlayer.playAuthenticationFeedback( + /* authenticationSucceeded= */false ); mLockPatternView.setDisplayMode(LockPatternView.DisplayMode.Wrong); if (isValidPattern) { @@ -216,9 +211,11 @@ public class KeyguardPatternViewController EmergencyButtonController emergencyButtonController, KeyguardMessageAreaController.Factory messageAreaControllerFactory, DevicePostureController postureController, FeatureFlags featureFlags, - SelectedUserInteractor selectedUserInteractor, MSDLPlayer msdlPlayer) { + SelectedUserInteractor selectedUserInteractor, BouncerHapticPlayer bouncerHapticPlayer + ) { super(view, securityMode, keyguardSecurityCallback, emergencyButtonController, - messageAreaControllerFactory, featureFlags, selectedUserInteractor); + messageAreaControllerFactory, featureFlags, selectedUserInteractor, + bouncerHapticPlayer); mKeyguardUpdateMonitor = keyguardUpdateMonitor; mLockPatternUtils = lockPatternUtils; mLatencyTracker = latencyTracker; @@ -228,7 +225,6 @@ public class KeyguardPatternViewController featureFlags.isEnabled(LOCKSCREEN_ENABLE_LANDSCAPE)); mLockPatternView = mView.findViewById(R.id.lockPatternView); mPostureController = postureController; - mMSDLPlayer = msdlPlayer; } @Override diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputViewController.java index f575cf29f402..d999994a3312 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputViewController.java @@ -16,11 +16,9 @@ package com.android.keyguard; -import static com.android.systemui.Flags.msdlFeedback; import static com.android.systemui.Flags.pinInputFieldStyledFocusState; import static com.android.systemui.util.kotlin.JavaAdapterKt.collectFlow; -import android.annotation.Nullable; import android.graphics.drawable.Drawable; import android.graphics.drawable.GradientDrawable; import android.graphics.drawable.StateListDrawable; @@ -37,14 +35,12 @@ import com.android.internal.widget.LockPatternUtils; import com.android.keyguard.KeyguardSecurityModel.SecurityMode; import com.android.keyguard.domain.interactor.KeyguardKeyboardInteractor; import com.android.systemui.Flags; +import com.android.systemui.bouncer.ui.helper.BouncerHapticPlayer; import com.android.systemui.classifier.FalsingCollector; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.res.R; import com.android.systemui.user.domain.interactor.SelectedUserInteractor; -import com.google.android.msdl.data.model.MSDLToken; -import com.google.android.msdl.domain.MSDLPlayer; - public abstract class KeyguardPinBasedInputViewController<T extends KeyguardPinBasedInputView> extends KeyguardAbsKeyInputViewController<T> { @@ -83,12 +79,12 @@ public abstract class KeyguardPinBasedInputViewController<T extends KeyguardPinB FeatureFlags featureFlags, SelectedUserInteractor selectedUserInteractor, KeyguardKeyboardInteractor keyguardKeyboardInteractor, - @Nullable MSDLPlayer msdlPlayer, + BouncerHapticPlayer bouncerHapticPlayer, UserActivityNotifier userActivityNotifier) { super(view, keyguardUpdateMonitor, securityMode, lockPatternUtils, keyguardSecurityCallback, messageAreaControllerFactory, latencyTracker, falsingCollector, - emergencyButtonController, featureFlags, selectedUserInteractor, msdlPlayer, - userActivityNotifier); + emergencyButtonController, featureFlags, selectedUserInteractor, + bouncerHapticPlayer, userActivityNotifier); mLiftToActivateListener = liftToActivateListener; mFalsingCollector = falsingCollector; mKeyguardKeyboardInteractor = keyguardKeyboardInteractor; @@ -110,16 +106,16 @@ public abstract class KeyguardPinBasedInputViewController<T extends KeyguardPinB return false; }); button.setAnimationEnabled(showAnimations); - button.setMSDLPlayer(mMSDLPlayer); + button.setBouncerHapticHelper(mBouncerHapticPlayer); } mPasswordEntry.setOnKeyListener(mOnKeyListener); mPasswordEntry.setUserActivityListener(this::onUserInput); View deleteButton = mView.findViewById(R.id.delete_button); - if (msdlFeedback()) { + if (mBouncerHapticPlayer.isEnabled()) { deleteButton.setOnTouchListener((View view, MotionEvent event) -> { - if (event.getActionMasked() == MotionEvent.ACTION_DOWN && mMSDLPlayer != null) { - mMSDLPlayer.playToken(MSDLToken.KEYPRESS_DELETE, null); + if (event.getActionMasked() == MotionEvent.ACTION_DOWN) { + mBouncerHapticPlayer.playDeleteKeyPressFeedback(); } return false; }); @@ -137,8 +133,8 @@ public abstract class KeyguardPinBasedInputViewController<T extends KeyguardPinB if (mPasswordEntry.isEnabled()) { mView.resetPasswordText(true /* animate */, true /* announce */); } - if (msdlFeedback() && mMSDLPlayer != null) { - mMSDLPlayer.playToken(MSDLToken.LONG_PRESS, null); + if (mBouncerHapticPlayer.isEnabled()) { + mBouncerHapticPlayer.playDeleteKeyLongPressedFeedback(); } else { mView.doHapticKeyClick(); } @@ -147,7 +143,7 @@ public abstract class KeyguardPinBasedInputViewController<T extends KeyguardPinB View okButton = mView.findViewById(R.id.key_enter); if (okButton != null) { - if (!msdlFeedback()) { + if (!mBouncerHapticPlayer.isEnabled()) { okButton.setOnTouchListener(mActionButtonTouchListener); } okButton.setOnClickListener(v -> { @@ -201,7 +197,7 @@ public abstract class KeyguardPinBasedInputViewController<T extends KeyguardPinB for (NumPadKey button : mView.getButtons()) { button.setOnTouchListener(null); - button.setMSDLPlayer(null); + button.setBouncerHapticHelper(null); } } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java index 3b5bf1a422a3..d3c02e6f6449 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java @@ -18,7 +18,6 @@ package com.android.keyguard; import static com.android.systemui.flags.Flags.LOCKSCREEN_ENABLE_LANDSCAPE; -import android.annotation.Nullable; import android.view.View; import com.android.internal.logging.UiEvent; @@ -27,6 +26,7 @@ import com.android.internal.util.LatencyTracker; import com.android.internal.widget.LockPatternUtils; import com.android.keyguard.KeyguardSecurityModel.SecurityMode; import com.android.keyguard.domain.interactor.KeyguardKeyboardInteractor; +import com.android.systemui.bouncer.ui.helper.BouncerHapticPlayer; import com.android.systemui.classifier.FalsingCollector; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.Flags; @@ -34,8 +34,6 @@ import com.android.systemui.res.R; import com.android.systemui.statusbar.policy.DevicePostureController; import com.android.systemui.user.domain.interactor.SelectedUserInteractor; -import com.google.android.msdl.domain.MSDLPlayer; - public class KeyguardPinViewController extends KeyguardPinBasedInputViewController<KeyguardPINView> { private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; @@ -65,12 +63,12 @@ public class KeyguardPinViewController DevicePostureController postureController, FeatureFlags featureFlags, SelectedUserInteractor selectedUserInteractor, UiEventLogger uiEventLogger, KeyguardKeyboardInteractor keyguardKeyboardInteractor, - @Nullable MSDLPlayer msdlPlayer, + BouncerHapticPlayer bouncerHapticPlayer, UserActivityNotifier userActivityNotifier) { super(view, keyguardUpdateMonitor, securityMode, lockPatternUtils, keyguardSecurityCallback, messageAreaControllerFactory, latencyTracker, liftToActivateListener, emergencyButtonController, falsingCollector, featureFlags, selectedUserInteractor, - keyguardKeyboardInteractor, msdlPlayer, userActivityNotifier); + keyguardKeyboardInteractor, bouncerHapticPlayer, userActivityNotifier); mKeyguardUpdateMonitor = keyguardUpdateMonitor; mPostureController = postureController; mLockPatternUtils = lockPatternUtils; diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinViewController.java index 47fe2b22b5f6..1c1acf83fa12 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinViewController.java @@ -21,7 +21,6 @@ import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID; import static com.android.systemui.util.PluralMessageFormaterKt.icuMessageFormat; import android.annotation.NonNull; -import android.annotation.Nullable; import android.app.AlertDialog; import android.app.AlertDialog.Builder; import android.app.Dialog; @@ -44,13 +43,12 @@ import com.android.internal.util.LatencyTracker; import com.android.internal.widget.LockPatternUtils; import com.android.keyguard.KeyguardSecurityModel.SecurityMode; import com.android.keyguard.domain.interactor.KeyguardKeyboardInteractor; +import com.android.systemui.bouncer.ui.helper.BouncerHapticPlayer; import com.android.systemui.classifier.FalsingCollector; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.res.R; import com.android.systemui.user.domain.interactor.SelectedUserInteractor; -import com.google.android.msdl.domain.MSDLPlayer; - public class KeyguardSimPinViewController extends KeyguardPinBasedInputViewController<KeyguardSimPinView> { public static final String TAG = "KeyguardSimPinView"; @@ -99,12 +97,12 @@ public class KeyguardSimPinViewController EmergencyButtonController emergencyButtonController, FeatureFlags featureFlags, SelectedUserInteractor selectedUserInteractor, KeyguardKeyboardInteractor keyguardKeyboardInteractor, - @Nullable MSDLPlayer msdlPlayer, + BouncerHapticPlayer bouncerHapticPlayer, UserActivityNotifier userActivityNotifier) { super(view, keyguardUpdateMonitor, securityMode, lockPatternUtils, keyguardSecurityCallback, messageAreaControllerFactory, latencyTracker, liftToActivateListener, emergencyButtonController, falsingCollector, featureFlags, selectedUserInteractor, - keyguardKeyboardInteractor, msdlPlayer, userActivityNotifier); + keyguardKeyboardInteractor, bouncerHapticPlayer, userActivityNotifier); mKeyguardUpdateMonitor = keyguardUpdateMonitor; mTelephonyManager = telephonyManager; mSimImageView = mView.findViewById(R.id.keyguard_sim); diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukViewController.java index c688acb8d760..9adc5bae1ada 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukViewController.java @@ -17,7 +17,6 @@ package com.android.keyguard; import android.annotation.NonNull; -import android.annotation.Nullable; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; @@ -39,13 +38,12 @@ import com.android.internal.util.LatencyTracker; import com.android.internal.widget.LockPatternUtils; import com.android.keyguard.KeyguardSecurityModel.SecurityMode; import com.android.keyguard.domain.interactor.KeyguardKeyboardInteractor; +import com.android.systemui.bouncer.ui.helper.BouncerHapticPlayer; import com.android.systemui.classifier.FalsingCollector; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.res.R; import com.android.systemui.user.domain.interactor.SelectedUserInteractor; -import com.google.android.msdl.domain.MSDLPlayer; - public class KeyguardSimPukViewController extends KeyguardPinBasedInputViewController<KeyguardSimPukView> { private static final boolean DEBUG = KeyguardConstants.DEBUG; @@ -96,12 +94,12 @@ public class KeyguardSimPukViewController EmergencyButtonController emergencyButtonController, FeatureFlags featureFlags, SelectedUserInteractor selectedUserInteractor, KeyguardKeyboardInteractor keyguardKeyboardInteractor, - @Nullable MSDLPlayer msdlPlayer, + BouncerHapticPlayer bouncerHapticPlayer, UserActivityNotifier userActivityNotifier) { super(view, keyguardUpdateMonitor, securityMode, lockPatternUtils, keyguardSecurityCallback, messageAreaControllerFactory, latencyTracker, liftToActivateListener, emergencyButtonController, falsingCollector, featureFlags, selectedUserInteractor, - keyguardKeyboardInteractor, msdlPlayer, userActivityNotifier); + keyguardKeyboardInteractor, bouncerHapticPlayer, userActivityNotifier); mKeyguardUpdateMonitor = keyguardUpdateMonitor; mTelephonyManager = telephonyManager; mSimImageView = mView.findViewById(R.id.keyguard_sim); diff --git a/packages/SystemUI/src/com/android/keyguard/NumPadKey.java b/packages/SystemUI/src/com/android/keyguard/NumPadKey.java index 4fb80de2d4ec..7fe4ec852045 100644 --- a/packages/SystemUI/src/com/android/keyguard/NumPadKey.java +++ b/packages/SystemUI/src/com/android/keyguard/NumPadKey.java @@ -15,7 +15,6 @@ */ package com.android.keyguard; -import static com.android.systemui.Flags.msdlFeedback; import static com.android.systemui.bouncer.shared.constants.KeyguardBouncerConstants.ColorId.NUM_PAD_KEY; import android.content.Context; @@ -37,11 +36,9 @@ import android.widget.TextView; import androidx.annotation.Nullable; import com.android.settingslib.Utils; +import com.android.systemui.bouncer.ui.helper.BouncerHapticPlayer; import com.android.systemui.res.R; -import com.google.android.msdl.data.model.MSDLToken; -import com.google.android.msdl.domain.MSDLPlayer; - /** * Viewgroup for the bouncer numpad button, specifically for digits. */ @@ -62,7 +59,7 @@ public class NumPadKey extends ViewGroup implements NumPadAnimationListener { private NumPadAnimator mAnimator; private int mOrientation; @Nullable - private MSDLPlayer mMSDLPlayer; + private BouncerHapticPlayer mBouncerHapticPlayer; private View.OnClickListener mListener = new View.OnClickListener() { @Override @@ -227,8 +224,8 @@ public class NumPadKey extends ViewGroup implements NumPadAnimationListener { // Cause a VIRTUAL_KEY vibration public void doHapticKeyClick() { - if (msdlFeedback() && mMSDLPlayer != null) { - mMSDLPlayer.playToken(MSDLToken.KEYPRESS_STANDARD, null); + if (mBouncerHapticPlayer != null && mBouncerHapticPlayer.isEnabled()) { + mBouncerHapticPlayer.playNumpadKeyFeedback(); } else { performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); @@ -255,7 +252,7 @@ public class NumPadKey extends ViewGroup implements NumPadAnimationListener { info.setTextEntryKey(true); } - public void setMSDLPlayer(@Nullable MSDLPlayer player) { - mMSDLPlayer = player; + public void setBouncerHapticHelper(@Nullable BouncerHapticPlayer bouncerHapticPlayer) { + mBouncerHapticPlayer = bouncerHapticPlayer; } } diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/extradim/ExtraDimDialogManager.kt b/packages/SystemUI/src/com/android/systemui/accessibility/extradim/ExtraDimDialogManager.kt index e1297d32504b..60d80efe6426 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/extradim/ExtraDimDialogManager.kt +++ b/packages/SystemUI/src/com/android/systemui/accessibility/extradim/ExtraDimDialogManager.kt @@ -15,7 +15,9 @@ */ package com.android.systemui.accessibility.extradim -import androidx.annotation.VisibleForTesting +import com.android.systemui.animation.DialogCuj +import com.android.systemui.animation.DialogTransitionAnimator +import com.android.systemui.animation.Expandable import com.android.systemui.dagger.SysUISingleton import com.android.systemui.plugins.ActivityStarter import com.android.systemui.statusbar.phone.SystemUIDialog @@ -28,25 +30,35 @@ class ExtraDimDialogManager @Inject constructor( private val extraDimDialogDelegateProvider: Provider<ExtraDimDialogDelegate>, - private val mActivityStarter: ActivityStarter + private val mActivityStarter: ActivityStarter, + private val dialogTransitionAnimator: DialogTransitionAnimator, ) { private var dialog: SystemUIDialog? = null - @VisibleForTesting(otherwise = VisibleForTesting.PROTECTED) - fun dismissKeyguardIfNeededAndShowDialog() { + @JvmOverloads + fun dismissKeyguardIfNeededAndShowDialog(expandable: Expandable? = null) { mActivityStarter.executeRunnableDismissingKeyguard( - { showRemoveExtraDimShortcutsDialog() }, + { showRemoveExtraDimShortcutsDialog(expandable) }, /* cancelAction= */ null, /* dismissShade= */ false, /* afterKeyguardGone= */ true, - /* deferred= */ false + /* deferred= */ false, ) } /** Show the dialog for removing all Extra Dim shortcuts. */ - private fun showRemoveExtraDimShortcutsDialog() { + private fun showRemoveExtraDimShortcutsDialog(expandable: Expandable?) { dialog?.dismiss() - dialog = extraDimDialogDelegateProvider.get().createDialog() - dialog!!.show() + val dialog2 = extraDimDialogDelegateProvider.get().createDialog() + dialog = dialog2 + + val controller = + expandable?.dialogTransitionController( + DialogCuj(com.android.internal.jank.Cuj.CUJ_SHADE_DIALOG_OPEN) + ) + + controller?.let { + dialogTransitionAnimator.show(dialog2, it, animateBackgroundBoundsChange = true) + } ?: dialog2.show() } } diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/ui/helper/BouncerHapticHelper.kt b/packages/SystemUI/src/com/android/systemui/bouncer/ui/helper/BouncerHapticPlayer.kt index 1faacff996ca..19e7537007bf 100644 --- a/packages/SystemUI/src/com/android/systemui/bouncer/ui/helper/BouncerHapticHelper.kt +++ b/packages/SystemUI/src/com/android/systemui/bouncer/ui/helper/BouncerHapticPlayer.kt @@ -23,25 +23,28 @@ import com.android.systemui.Flags //noinspection CleanArchitectureDependencyViolation: Data layer only referenced for this enum class import com.google.android.msdl.data.model.MSDLToken import com.google.android.msdl.domain.MSDLPlayer +import javax.inject.Inject -/** A helper object to deliver haptic feedback in bouncer interactions. */ -object BouncerHapticHelper { +/** + * A helper class to deliver haptic feedback in bouncer interactions. + * + * @param[msdlPlayer] The [MSDLPlayer] used to deliver MSDL feedback. + */ +class BouncerHapticPlayer @Inject constructor(private val msdlPlayer: dagger.Lazy<MSDLPlayer>) { + + private val authInteractionProperties by + lazy(LazyThreadSafetyMode.NONE) { AuthInteractionProperties() } - private val authInteractionProperties = AuthInteractionProperties() + val isEnabled: Boolean + get() = Flags.msdlFeedback() /** * Deliver MSDL feedback as a result of authenticating through a bouncer. * * @param[authenticationSucceeded] Whether the authentication was successful or not. - * @param[player] The [MSDLPlayer] that delivers the correct feedback. */ - fun playMSDLAuthenticationFeedback( - authenticationSucceeded: Boolean, - player: MSDLPlayer?, - ) { - if (player == null || !Flags.msdlFeedback()) { - return - } + fun playAuthenticationFeedback(authenticationSucceeded: Boolean) { + if (!isEnabled) return val token = if (authenticationSucceeded) { @@ -49,7 +52,7 @@ object BouncerHapticHelper { } else { MSDLToken.FAILURE } - player.playToken(token, authInteractionProperties) + msdlPlayer.get().playToken(token, authInteractionProperties) } /** @@ -57,17 +60,29 @@ object BouncerHapticHelper { * MSDL feedback using a [MSDLPlayer], or fallback to a default haptic feedback using the * [View.performHapticFeedback] API and a [View]. * - * @param[player] [MSDLPlayer] for MSDL feedback. * @param[view] A [View] for default haptic feedback using [View.performHapticFeedback] */ - fun playPatternDotFeedback(player: MSDLPlayer?, view: View?) { - if (player == null || !Flags.msdlFeedback()) { + fun playPatternDotFeedback(view: View?) { + if (!isEnabled) { view?.performHapticFeedback( HapticFeedbackConstants.VIRTUAL_KEY, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING, ) } else { - player.playToken(MSDLToken.DRAG_INDICATOR) + msdlPlayer.get().playToken(MSDLToken.DRAG_INDICATOR) } } + + /** Deliver MSDL feedback when the delete key of the pin bouncer is pressed */ + fun playDeleteKeyPressFeedback() = msdlPlayer.get().playToken(MSDLToken.KEYPRESS_DELETE) + + /** + * Deliver MSDL feedback when the delete key of the pin bouncer is long-pressed + * + * @return whether MSDL feedback is allowed to play. + */ + fun playDeleteKeyLongPressedFeedback() = msdlPlayer.get().playToken(MSDLToken.LONG_PRESS) + + /** Deliver MSDL feedback when a numpad key is pressed on the pin bouncer */ + fun playNumpadKeyFeedback() = msdlPlayer.get().playToken(MSDLToken.KEYPRESS_STANDARD) } diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PinBouncerViewModel.kt b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PinBouncerViewModel.kt index df6ca9bf0511..da29c6230cd8 100644 --- a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PinBouncerViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PinBouncerViewModel.kt @@ -31,6 +31,7 @@ import com.android.keyguard.PinShapeAdapter import com.android.systemui.authentication.shared.model.AuthenticationMethodModel import com.android.systemui.bouncer.domain.interactor.BouncerInteractor import com.android.systemui.bouncer.domain.interactor.SimBouncerInteractor +import com.android.systemui.bouncer.shared.flag.ComposeBouncerFlags import com.android.systemui.res.R import dagger.assisted.Assisted import dagger.assisted.AssistedFactory @@ -265,6 +266,15 @@ constructor( } } + /** Notifies that the user has pressed down on a digit button. */ + fun onDigitButtonDown() { + if (ComposeBouncerFlags.isOnlyComposeBouncerEnabled()) { + // Current PIN bouncer informs FalsingInteractor#avoidGesture() upon every Pin button + // touch. + super.onDown() + } + } + @AssistedFactory interface Factory { fun create( diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorFake.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorFake.java index dcd419512498..a62600d65d4b 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorFake.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorFake.java @@ -25,6 +25,7 @@ import javax.inject.Inject; public class FalsingCollectorFake implements FalsingCollector { public KeyEvent lastKeyEvent = null; + public boolean avoidGestureInvoked = false; @Override public void init() { @@ -87,6 +88,16 @@ public class FalsingCollectorFake implements FalsingCollector { @Override public void avoidGesture() { + avoidGestureInvoked = true; + } + + /** + * @return whether {@link #avoidGesture()} was invoked. + */ + public boolean wasLastGestureAvoided() { + boolean wasLastGestureAvoided = avoidGestureInvoked; + avoidGestureInvoked = false; + return wasLastGestureAvoided; } @Override diff --git a/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalSceneInteractor.kt b/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalSceneInteractor.kt index ac496f01a39d..3826fb40ea3d 100644 --- a/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalSceneInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalSceneInteractor.kt @@ -24,11 +24,14 @@ import com.android.systemui.communal.data.repository.CommunalSceneRepository import com.android.systemui.communal.domain.model.CommunalTransitionProgressModel import com.android.systemui.communal.shared.log.CommunalSceneLogger import com.android.systemui.communal.shared.model.CommunalScenes -import com.android.systemui.communal.shared.model.CommunalTransitionKeys +import com.android.systemui.communal.shared.model.CommunalScenes.toSceneContainerSceneKey import com.android.systemui.communal.shared.model.EditModeState import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.keyguard.shared.model.KeyguardState +import com.android.systemui.scene.domain.interactor.SceneInteractor +import com.android.systemui.scene.shared.flag.SceneContainerFlag +import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.util.kotlin.BooleanFlowOperators.allOf import com.android.systemui.util.kotlin.pairwiseBy import javax.inject.Inject @@ -45,6 +48,7 @@ import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.stateIn @OptIn(ExperimentalCoroutinesApi::class) @@ -55,6 +59,7 @@ constructor( @Application private val applicationScope: CoroutineScope, private val repository: CommunalSceneRepository, private val logger: CommunalSceneLogger, + private val sceneInteractor: SceneInteractor, ) { private val _isLaunchingWidget = MutableStateFlow(false) @@ -72,8 +77,14 @@ constructor( private val onSceneAboutToChangeListener = mutableSetOf<OnSceneAboutToChangeListener>() - /** Registers a listener which is called when the scene is about to change. */ + /** + * Registers a listener which is called when the scene is about to change. + * + * This API is for legacy communal container scenes, and should not be used when + * [SceneContainerFlag] is enabled. + */ fun registerSceneStateProcessor(processor: OnSceneAboutToChangeListener) { + SceneContainerFlag.assertInLegacyMode() onSceneAboutToChangeListener.add(processor) } @@ -87,6 +98,15 @@ constructor( transitionKey: TransitionKey? = null, keyguardState: KeyguardState? = null, ) { + if (SceneContainerFlag.isEnabled) { + return sceneInteractor.changeScene( + toScene = newScene.toSceneContainerSceneKey(), + loggingReason = loggingReason, + transitionKey = transitionKey, + sceneState = keyguardState, + ) + } + applicationScope.launch("$TAG#changeScene") { if (currentScene.value == newScene) return@launch logger.logSceneChangeRequested( @@ -107,6 +127,13 @@ constructor( delayMillis: Long = 0, keyguardState: KeyguardState? = null ) { + if (SceneContainerFlag.isEnabled) { + return sceneInteractor.snapToScene( + toScene = newScene.toSceneContainerSceneKey(), + loggingReason = loggingReason, + ) + } + applicationScope.launch("$TAG#snapToScene") { delay(delayMillis) if (currentScene.value == newScene) return@launch @@ -125,37 +152,27 @@ constructor( onSceneAboutToChangeListener.forEach { it.onSceneAboutToChange(newScene, keyguardState) } } - /** Changes to Blank scene when starting an activity after dismissing keyguard. */ - fun changeSceneForActivityStartOnDismissKeyguard() { - // skip if we're starting edit mode activity, as it will be handled later by changeScene - // with transition key [CommunalTransitionKeys.ToEditMode]. - if (_editModeState.value == EditModeState.STARTING) { - return - } - changeScene( - CommunalScenes.Blank, - "activity start dismissing keyguard", - CommunalTransitionKeys.SimpleFade, - ) - } - /** * Target scene as requested by the underlying [SceneTransitionLayout] or through [changeScene]. */ val currentScene: StateFlow<SceneKey> = - repository.currentScene - .pairwiseBy(initialValue = repository.currentScene.value) { from, to -> - logger.logSceneChangeCommitted( - from = from, - to = to, + if (SceneContainerFlag.isEnabled) { + sceneInteractor.currentScene + } else { + repository.currentScene + .pairwiseBy(initialValue = repository.currentScene.value) { from, to -> + logger.logSceneChangeCommitted( + from = from, + to = to, + ) + to + } + .stateIn( + scope = applicationScope, + started = SharingStarted.Eagerly, + initialValue = repository.currentScene.value, ) - to - } - .stateIn( - scope = applicationScope, - started = SharingStarted.Eagerly, - initialValue = repository.currentScene.value, - ) + } private val _editModeState = MutableStateFlow<EditModeState?>(null) /** @@ -170,13 +187,17 @@ constructor( /** Transition state of the hub mode. */ val transitionState: StateFlow<ObservableTransitionState> = - repository.transitionState - .onEach { logger.logSceneTransition(it) } - .stateIn( - scope = applicationScope, - started = SharingStarted.Eagerly, - initialValue = repository.transitionState.value, - ) + if (SceneContainerFlag.isEnabled) { + sceneInteractor.transitionState + } else { + repository.transitionState + .onEach { logger.logSceneTransition(it) } + .stateIn( + scope = applicationScope, + started = SharingStarted.Eagerly, + initialValue = repository.transitionState.value, + ) + } /** * Updates the transition state of the hub [SceneTransitionLayout]. @@ -184,10 +205,19 @@ constructor( * Note that you must call is with `null` when the UI is done or risk a memory leak. */ fun setTransitionState(transitionState: Flow<ObservableTransitionState>?) { - repository.setTransitionState(transitionState) + if (SceneContainerFlag.isEnabled) { + sceneInteractor.setTransitionState(transitionState) + } else { + repository.setTransitionState(transitionState) + } } - /** Returns a flow that tracks the progress of transitions to the given scene from 0-1. */ + /** + * Returns a flow that tracks the progress of transitions to the given scene from 0-1. + * + * This API is for legacy communal container scenes, and should not be used when + * [SceneContainerFlag] is enabled. + */ fun transitionProgressToScene(targetScene: SceneKey) = transitionState .flatMapLatest { state -> @@ -209,6 +239,7 @@ constructor( } } .distinctUntilChanged() + .onStart { SceneContainerFlag.assertInLegacyMode() } /** * Flow that emits a boolean if the communal UI is fully visible and not in transition. @@ -219,7 +250,10 @@ constructor( val isIdleOnCommunal: StateFlow<Boolean> = transitionState .map { - it is ObservableTransitionState.Idle && it.currentScene == CommunalScenes.Communal + it is ObservableTransitionState.Idle && + (it.currentScene == + if (SceneContainerFlag.isEnabled) Scenes.Communal + else CommunalScenes.Communal) } .stateIn( scope = applicationScope, @@ -239,7 +273,13 @@ constructor( val isCommunalVisible: StateFlow<Boolean> = transitionState .map { - !(it is ObservableTransitionState.Idle && it.currentScene == CommunalScenes.Blank) + if (SceneContainerFlag.isEnabled) + it is ObservableTransitionState.Idle && it.currentScene == Scenes.Communal || + (it is ObservableTransitionState.Transition && + (it.fromContent == Scenes.Communal || it.toContent == Scenes.Communal)) + else + !(it is ObservableTransitionState.Idle && + it.currentScene == CommunalScenes.Blank) } .stateIn( scope = applicationScope, diff --git a/packages/SystemUI/src/com/android/systemui/communal/shared/model/CommunalScenes.kt b/packages/SystemUI/src/com/android/systemui/communal/shared/model/CommunalScenes.kt index d5a56c1e9ee0..e562dfcbbc74 100644 --- a/packages/SystemUI/src/com/android/systemui/communal/shared/model/CommunalScenes.kt +++ b/packages/SystemUI/src/com/android/systemui/communal/shared/model/CommunalScenes.kt @@ -17,6 +17,8 @@ package com.android.systemui.communal.shared.model import com.android.compose.animation.scene.SceneKey +import com.android.systemui.scene.shared.flag.SceneContainerFlag +import com.android.systemui.scene.shared.model.Scenes /** Definition of the possible scenes for the communal UI. */ object CommunalScenes { @@ -27,4 +29,30 @@ object CommunalScenes { @JvmField val Communal = SceneKey("communal") @JvmField val Default = Blank + + private fun SceneKey.isCommunalScene(): Boolean { + return this == Blank || this == Communal + } + + /** + * Maps a legacy communal scene to a scene in the scene container. + * + * The rules are simple: + * - A legacy communal scene maps to a communal scene in the Scene Transition Framework (STF). + * - A legacy blank scene means that the communal scene layout does not render anything so + * whatever is beneath the layout is shown. That usually means lockscreen or dream, both of + * which are represented by the lockscreen scene in STF (but different keyguard states in + * KTF). + */ + fun SceneKey.toSceneContainerSceneKey(): SceneKey { + if (!isCommunalScene() || !SceneContainerFlag.isEnabled) { + return this + } + + return when (this) { + Communal -> Scenes.Communal + Blank -> Scenes.Lockscreen + else -> throw Throwable("Unrecognized communal scene: $this") + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/communal/widgets/EditWidgetsActivity.kt b/packages/SystemUI/src/com/android/systemui/communal/widgets/EditWidgetsActivity.kt index d84dc209196e..13b4aa9b55cb 100644 --- a/packages/SystemUI/src/com/android/systemui/communal/widgets/EditWidgetsActivity.kt +++ b/packages/SystemUI/src/com/android/systemui/communal/widgets/EditWidgetsActivity.kt @@ -50,6 +50,7 @@ import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.log.LogBuffer import com.android.systemui.log.core.Logger import com.android.systemui.log.dagger.CommunalLog +import com.android.systemui.scene.shared.flag.SceneContainerFlag import javax.inject.Inject import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch @@ -244,15 +245,18 @@ constructor( private fun listenForTransitionAndChangeScene() { lifecycleScope.launch { communalViewModel.canShowEditMode.collect { - communalViewModel.changeScene( - scene = CommunalScenes.Blank, - loggingReason = "edit mode opening", - transitionKey = CommunalTransitionKeys.ToEditMode, - keyguardState = KeyguardState.GONE, - ) - // wait till transitioned to Blank scene, then animate in communal content in - // edit mode - communalViewModel.currentScene.first { it == CommunalScenes.Blank } + if (!SceneContainerFlag.isEnabled) { + communalViewModel.changeScene( + scene = CommunalScenes.Blank, + loggingReason = "edit mode opening", + transitionKey = CommunalTransitionKeys.ToEditMode, + keyguardState = KeyguardState.GONE, + ) + // wait till transitioned to Blank scene, then animate in communal content in + // edit mode + communalViewModel.currentScene.first { it == CommunalScenes.Blank } + } + communalViewModel.setEditModeState(EditModeState.SHOWING) // Inform the ActivityController that we are now fully visible. diff --git a/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryInteractor.kt b/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryInteractor.kt index 7018f9dc8556..dbd7f0739f6c 100644 --- a/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryInteractor.kt @@ -24,8 +24,11 @@ import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.deviceentry.data.repository.DeviceEntryRepository import com.android.systemui.keyguard.DismissCallbackRegistry +import com.android.systemui.scene.data.model.asIterable +import com.android.systemui.scene.domain.interactor.SceneBackInteractor import com.android.systemui.scene.domain.interactor.SceneInteractor import com.android.systemui.scene.shared.model.Scenes +import com.android.systemui.util.kotlin.pairwise import com.android.systemui.utils.coroutines.flow.mapLatestConflated import javax.inject.Inject import kotlinx.coroutines.CoroutineScope @@ -34,6 +37,7 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map @@ -59,6 +63,7 @@ constructor( private val deviceUnlockedInteractor: DeviceUnlockedInteractor, private val alternateBouncerInteractor: AlternateBouncerInteractor, private val dismissCallbackRegistry: DismissCallbackRegistry, + sceneBackInteractor: SceneBackInteractor, ) { /** * Whether the device is unlocked. @@ -86,19 +91,40 @@ constructor( * Note: This does not imply that the lockscreen is visible or not. */ val isDeviceEntered: StateFlow<Boolean> = - sceneInteractor.currentScene - .filter { currentScene -> - currentScene == Scenes.Gone || currentScene == Scenes.Lockscreen - } - .mapLatestConflated { scene -> - if (scene == Scenes.Gone) { - // Make sure device unlock status is definitely unlocked before we consider the - // device "entered". - deviceUnlockedInteractor.deviceUnlockStatus.first { it.isUnlocked } - true - } else { - false - } + combine( + // This flow emits true when the currentScene switches to Gone for the first time + // after having been on Lockscreen. + sceneInteractor.currentScene + .filter { currentScene -> + currentScene == Scenes.Gone || currentScene == Scenes.Lockscreen + } + .mapLatestConflated { scene -> + if (scene == Scenes.Gone) { + // Make sure device unlock status is definitely unlocked before we + // consider the device "entered". + deviceUnlockedInteractor.deviceUnlockStatus.first { it.isUnlocked } + true + } else { + false + } + }, + // This flow emits true only if the bottom of the navigation back stack has been + // switched from Lockscreen to Gone. In other words, only if the device was unlocked + // while visiting at least one scene "above" the Lockscreen scene. + sceneBackInteractor.backStack + // The bottom of the back stack, which is Lockscreen, Gone, or null if empty. + .map { it.asIterable().lastOrNull() } + // Filter out cases where the stack changes but the bottom remains unchanged. + .distinctUntilChanged() + // Detect changes of the bottom of the stack, start with null, so the first + // update emits a value and the logic doesn't need to wait for a second value + // before emitting something. + .pairwise(initialValue = null) + // Replacing a bottom of the stack that was Lockscreen with Gone constitutes a + // "device entered" event. + .map { (from, to) -> from == Scenes.Lockscreen && to == Scenes.Gone }, + ) { enteredDirectly, enteredOnBackStack -> + enteredOnBackStack || enteredDirectly } .stateIn( scope = applicationScope, @@ -129,7 +155,7 @@ constructor( }, isLockscreenEnabled, deviceUnlockedInteractor.deviceUnlockStatus, - isDeviceEntered + isDeviceEntered, ) { isNoneAuthMethod, isLockscreenEnabled, deviceUnlockStatus, isDeviceEntered -> val isSwipeAuthMethod = isNoneAuthMethod && isLockscreenEnabled (isSwipeAuthMethod || @@ -155,9 +181,7 @@ constructor( * canceled */ @JvmOverloads - fun attemptDeviceEntry( - callback: IKeyguardDismissCallback? = null, - ) { + fun attemptDeviceEntry(callback: IKeyguardDismissCallback? = null) { callback?.let { dismissCallbackRegistry.addCallback(it) } // TODO (b/307768356), diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/composable/ShortcutHelper.kt b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/composable/ShortcutHelper.kt index dcca12f29287..beec34881636 100644 --- a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/composable/ShortcutHelper.kt +++ b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/composable/ShortcutHelper.kt @@ -736,14 +736,13 @@ private fun CategoryItemTwoPane( val interactionSource = remember { MutableInteractionSource() } val isFocused by interactionSource.collectIsFocusedAsState() - Surface( + SelectableShortcutSurface( selected = selected, onClick = onClick, modifier = Modifier.semantics { role = Role.Tab } .heightIn(min = 64.dp) .fillMaxWidth() - .focusable(interactionSource = interactionSource) .outlineFocusModifier( isFocused = isFocused, focusColor = MaterialTheme.colorScheme.secondary, @@ -752,6 +751,7 @@ private fun CategoryItemTwoPane( ), shape = RoundedCornerShape(28.dp), color = colors.containerColor(selected).value, + interactionSource = interactionSource ) { Row(Modifier.padding(horizontal = 24.dp), verticalAlignment = Alignment.CenterVertically) { ShortcutCategoryIcon( @@ -860,14 +860,12 @@ private fun ShortcutsSearchBar(onQueryChange: (String) -> Unit) { private fun KeyboardSettings(horizontalPadding: Dp, verticalPadding: Dp, onClick: () -> Unit) { val interactionSource = remember { MutableInteractionSource() } val isFocused by interactionSource.collectIsFocusedAsState() - Surface( + ClickableShortcutSurface( onClick = onClick, shape = RoundedCornerShape(24.dp), color = Color.Transparent, - modifier = - Modifier.semantics { role = Role.Button } - .fillMaxWidth() - .focusable(interactionSource = interactionSource) + modifier = Modifier.semantics { role = Role.Button }.fillMaxWidth(), + interactionSource = interactionSource ) { Row( modifier = diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/composable/Surfaces.kt b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/composable/Surfaces.kt new file mode 100644 index 000000000000..3ba3bd8fdc2f --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/composable/Surfaces.kt @@ -0,0 +1,199 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.keyboard.shortcut.ui.composable + +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.selection.selectable +import androidx.compose.material3.ColorScheme +import androidx.compose.material3.LocalAbsoluteTonalElevation +import androidx.compose.material3.LocalContentColor +import androidx.compose.material3.LocalTonalElevationEnabled +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.contentColorFor +import androidx.compose.material3.minimumInteractiveComponentSize +import androidx.compose.material3.surfaceColorAtElevation +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.NonRestartableComposable +import androidx.compose.runtime.Stable +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.RectangleShape +import androidx.compose.ui.graphics.Shape +import androidx.compose.ui.graphics.graphicsLayer +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import com.android.compose.modifiers.thenIf + +/** + * A selectable surface with no default focus/hover indications. + * + * This composable is similar to [androidx.compose.material3.Surface], but removes default + * focus/hover states to enable custom implementations. + */ +@Composable +@NonRestartableComposable +fun SelectableShortcutSurface( + selected: Boolean, + onClick: () -> Unit, + modifier: Modifier = Modifier, + enabled: Boolean = true, + shape: Shape = RectangleShape, + color: Color = MaterialTheme.colorScheme.surface, + contentColor: Color = contentColorFor(color), + tonalElevation: Dp = 0.dp, + shadowElevation: Dp = 0.dp, + border: BorderStroke? = null, + interactionSource: MutableInteractionSource? = null, + content: @Composable () -> Unit +) { + @Suppress("NAME_SHADOWING") + val interactionSource = interactionSource ?: remember { MutableInteractionSource() } + val absoluteElevation = LocalAbsoluteTonalElevation.current + tonalElevation + CompositionLocalProvider( + LocalContentColor provides contentColor, + LocalAbsoluteTonalElevation provides absoluteElevation + ) { + Box( + modifier = + modifier + .minimumInteractiveComponentSize() + .surface( + shape = shape, + backgroundColor = + surfaceColorAtElevation(color = color, elevation = absoluteElevation), + border = border, + shadowElevation = with(LocalDensity.current) { shadowElevation.toPx() } + ) + .selectable( + selected = selected, + interactionSource = interactionSource, + indication = null, + enabled = enabled, + onClick = onClick + ), + propagateMinConstraints = true + ) { + content() + } + } +} + +/** + * A clickable surface with no default focus/hover indications. + * + * This composable is similar to [androidx.compose.material3.Surface], but removes default + * focus/hover states to enable custom implementations. + */ +@Composable +@NonRestartableComposable +fun ClickableShortcutSurface( + onClick: () -> Unit, + modifier: Modifier = Modifier, + enabled: Boolean = true, + shape: Shape = RectangleShape, + color: Color = MaterialTheme.colorScheme.surface, + contentColor: Color = contentColorFor(color), + tonalElevation: Dp = 0.dp, + shadowElevation: Dp = 0.dp, + border: BorderStroke? = null, + interactionSource: MutableInteractionSource? = null, + content: @Composable () -> Unit +) { + @Suppress("NAME_SHADOWING") + val interactionSource = interactionSource ?: remember { MutableInteractionSource() } + val absoluteElevation = LocalAbsoluteTonalElevation.current + tonalElevation + CompositionLocalProvider( + LocalContentColor provides contentColor, + LocalAbsoluteTonalElevation provides absoluteElevation + ) { + Box( + modifier = + modifier + .minimumInteractiveComponentSize() + .surface( + shape = shape, + backgroundColor = + surfaceColorAtElevation(color = color, elevation = absoluteElevation), + border = border, + shadowElevation = with(LocalDensity.current) { shadowElevation.toPx() } + ) + .clickable( + interactionSource = interactionSource, + indication = null, + enabled = enabled, + onClick = onClick + ), + propagateMinConstraints = true + ) { + content() + } + } +} + +@Composable +private fun surfaceColorAtElevation(color: Color, elevation: Dp): Color { + return MaterialTheme.colorScheme.applyTonalElevation(color, elevation) +} + +@Composable +internal fun ColorScheme.applyTonalElevation(backgroundColor: Color, elevation: Dp): Color { + val tonalElevationEnabled = LocalTonalElevationEnabled.current + return if (backgroundColor == surface && tonalElevationEnabled) { + surfaceColorAtElevation(elevation) + } else { + backgroundColor + } +} + +/** + * Applies surface-related modifiers to a composable. + * + * This function adds background, border, and shadow effects to a composable. Also ensure the + * composable is clipped to the given shape. + * + * @param shape The shape to apply to the composable's background, border, and clipping. + * @param backgroundColor The background color to apply to the composable. + * @param border An optional border to draw around the composable. + * @param shadowElevation The size of the shadow below the surface. To prevent shadow creep, only + * apply shadow elevation when absolutely necessary, such as when the surface requires visual + * separation from a patterned background. Note that It will not affect z index of the Surface. If + * you want to change the drawing order you can use `Modifier.zIndex`. + * @return The modified Modifier instance with surface-related modifiers applied. + */ +@Stable +private fun Modifier.surface( + shape: Shape, + backgroundColor: Color, + border: BorderStroke?, + shadowElevation: Float, +): Modifier { + return this.thenIf(shadowElevation > 0f) { + Modifier.graphicsLayer(shadowElevation = shadowElevation, shape = shape, clip = false) + } + .thenIf(border != null) { Modifier.border(border!!, shape) } + .background(color = backgroundColor, shape = shape) + .clip(shape) +} diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt index f6f0cc58be71..e444092bd175 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt @@ -39,6 +39,7 @@ import com.android.systemui.keyguard.shared.model.Edge import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.KeyguardState.AOD import com.android.systemui.keyguard.shared.model.KeyguardState.DOZING +import com.android.systemui.keyguard.shared.model.KeyguardState.GLANCEABLE_HUB import com.android.systemui.keyguard.shared.model.KeyguardState.GONE import com.android.systemui.keyguard.shared.model.KeyguardState.LOCKSCREEN import com.android.systemui.keyguard.shared.model.KeyguardState.OCCLUDED @@ -167,10 +168,7 @@ constructor( * but not vice-versa. Also accounts for [isDreamingWithOverlay] */ val isDreaming: StateFlow<Boolean> = - merge( - repository.isDreaming, - repository.isDreamingWithOverlay, - ) + merge(repository.isDreaming, repository.isDreamingWithOverlay) .stateIn( scope = applicationScope, started = SharingStarted.Eagerly, @@ -242,7 +240,7 @@ constructor( .map { it == 1f } .onStart { emit(false) } .distinctUntilChanged(), - repository.topClippingBounds + repository.topClippingBounds, ) { isGone, topClippingBounds -> if (!isGone) { emit(topClippingBounds) @@ -287,11 +285,10 @@ constructor( /** Whether camera is launched over keyguard. */ val isSecureCameraActive: Flow<Boolean> by lazy { - combine( + combine(isKeyguardVisible, primaryBouncerShowing, onCameraLaunchDetected) { isKeyguardVisible, - primaryBouncerShowing, - onCameraLaunchDetected, - ) { isKeyguardVisible, isPrimaryBouncerShowing, cameraLaunchEvent -> + isPrimaryBouncerShowing, + cameraLaunchEvent -> when { isKeyguardVisible -> false isPrimaryBouncerShowing -> false @@ -328,15 +325,17 @@ constructor( keyguardTransitionInteractor.currentKeyguardState, keyguardTransitionInteractor.transitionState, isKeyguardDismissible, + keyguardTransitionInteractor.isFinishedIn(Scenes.Communal, GLANCEABLE_HUB), ) - .filter { (_, _, _, step, _) -> !step.transitionState.isTransitioning() } + .filter { (_, _, _, step, _, _) -> !step.transitionState.isTransitioning() } .transform { ( legacyShadeExpansion, statusBarState, currentKeyguardState, step, - isKeyguardDismissible) -> + isKeyguardDismissible, + onGlanceableHub) -> if ( statusBarState == StatusBarState.KEYGUARD && isKeyguardDismissible && @@ -344,7 +343,9 @@ constructor( legacyShadeExpansion != 1f ) { emit(MathUtils.constrainedMap(0f, 1f, 0.95f, 1f, legacyShadeExpansion)) - } else if (legacyShadeExpansion == 0f || legacyShadeExpansion == 1f) { + } else if ( + (legacyShadeExpansion == 0f || legacyShadeExpansion == 1f) && !onGlanceableHub + ) { // Resets alpha state emit(1f) } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenUserActionsViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenUserActionsViewModel.kt index dd47678e5b36..ecae0797dbc6 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenUserActionsViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenUserActionsViewModel.kt @@ -21,17 +21,19 @@ package com.android.systemui.keyguard.ui.viewmodel import com.android.compose.animation.scene.Edge import com.android.compose.animation.scene.Swipe import com.android.compose.animation.scene.SwipeDirection +import com.android.compose.animation.scene.TransitionKey import com.android.compose.animation.scene.UserAction import com.android.compose.animation.scene.UserActionResult import com.android.systemui.communal.domain.interactor.CommunalInteractor import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor +import com.android.systemui.scene.shared.model.Overlays import com.android.systemui.scene.shared.model.SceneFamilies import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.scene.shared.model.TransitionKeys.ToSplitShade +import com.android.systemui.scene.ui.viewmodel.SceneContainerEdge import com.android.systemui.scene.ui.viewmodel.UserActionsViewModel import com.android.systemui.shade.domain.interactor.ShadeInteractor import com.android.systemui.shade.shared.model.ShadeMode -import com.android.systemui.util.kotlin.filterValuesNotNull import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -52,71 +54,67 @@ constructor( shadeInteractor.isShadeTouchable .flatMapLatest { isShadeTouchable -> if (!isShadeTouchable) { - flowOf(emptyMap()) - } else { - combine( - deviceEntryInteractor.isUnlocked, - communalInteractor.isCommunalAvailable, - shadeInteractor.shadeMode, - ) { isDeviceUnlocked, isCommunalAvailable, shadeMode -> - val notifShadeSceneKey = - UserActionResult( - toScene = SceneFamilies.NotifShade, - transitionKey = - ToSplitShade.takeIf { shadeMode is ShadeMode.Split }, - ) - - mapOf( - Swipe.Left to - UserActionResult(Scenes.Communal).takeIf { - isCommunalAvailable - }, - Swipe.Up to if (isDeviceUnlocked) Scenes.Gone else Scenes.Bouncer, + return@flatMapLatest flowOf(emptyMap()) + } - // Swiping down from the top edge goes to QS (or shade if in split - // shade mode). - swipeDownFromTop(pointerCount = 1) to - if (shadeMode is ShadeMode.Single) { - UserActionResult(Scenes.QuickSettings) - } else { - notifShadeSceneKey - }, + combine( + deviceEntryInteractor.isUnlocked, + communalInteractor.isCommunalAvailable, + shadeInteractor.shadeMode, + ) { isDeviceUnlocked, isCommunalAvailable, shadeMode -> + buildList { + if (isCommunalAvailable) { + add(Swipe.Left to Scenes.Communal) + } - // TODO(b/338577208): Remove once we add Dual Shade invocation zones - swipeDownFromTop(pointerCount = 2) to - UserActionResult( - toScene = SceneFamilies.QuickSettings, - transitionKey = - ToSplitShade.takeIf { shadeMode is ShadeMode.Split } - ), + add(Swipe.Up to if (isDeviceUnlocked) Scenes.Gone else Scenes.Bouncer) - // Swiping down, not from the edge, always navigates to the notif - // shade scene. - swipeDown(pointerCount = 1) to notifShadeSceneKey, - swipeDown(pointerCount = 2) to notifShadeSceneKey, + addAll( + when (shadeMode) { + ShadeMode.Single -> fullscreenShadeActions() + ShadeMode.Split -> + fullscreenShadeActions(transitionKey = ToSplitShade) + ShadeMode.Dual -> dualShadeActions() + } ) - .filterValuesNotNull() - } + } + .associate { it } } } .collect { setActions(it) } } - private fun swipeDownFromTop(pointerCount: Int): Swipe { - return Swipe( - SwipeDirection.Down, - fromSource = Edge.Top, - pointerCount = pointerCount, + private fun fullscreenShadeActions( + transitionKey: TransitionKey? = null + ): Array<Pair<UserAction, UserActionResult>> { + val notifShadeSceneKey = UserActionResult(SceneFamilies.NotifShade, transitionKey) + val qsShadeSceneKey = UserActionResult(SceneFamilies.QuickSettings, transitionKey) + return arrayOf( + // Swiping down, not from the edge, always goes to shade. + Swipe.Down to notifShadeSceneKey, + swipeDown(pointerCount = 2) to notifShadeSceneKey, + // Swiping down from the top edge goes to QS. + swipeDownFromTop(pointerCount = 1) to qsShadeSceneKey, + swipeDownFromTop(pointerCount = 2) to qsShadeSceneKey, ) } - private fun swipeDown(pointerCount: Int): Swipe { - return Swipe( - SwipeDirection.Down, - pointerCount = pointerCount, + private fun dualShadeActions(): Array<Pair<UserAction, UserActionResult>> { + return arrayOf( + Swipe.Down to Overlays.NotificationsShade, + Swipe(direction = SwipeDirection.Down, fromSource = SceneContainerEdge.TopRight) to + Overlays.QuickSettingsShade, ) } + private fun swipeDownFromTop(pointerCount: Int): Swipe { + return Swipe(SwipeDirection.Down, fromSource = Edge.Top, pointerCount = pointerCount) + } + + private fun swipeDown(pointerCount: Int): Swipe { + return Swipe(SwipeDirection.Down, pointerCount = pointerCount) + } + @AssistedFactory interface Factory { fun create(): LockscreenUserActionsViewModel diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselController.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselController.kt index bf9ef8c5d24e..8505a784d302 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselController.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselController.kt @@ -1202,13 +1202,17 @@ constructor( commonViewModels.forEach { viewModel -> when (viewModel) { is MediaCommonViewModel.MediaControl -> { - controllerById[viewModel.instanceId.toString()]?.mediaViewHolder?.let { - mediaContent.addView(it.player) + controllerById[viewModel.instanceId.toString()]?.let { + it.widthInSceneContainerPx = widthInSceneContainerPx + it.heightInSceneContainerPx = heightInSceneContainerPx + mediaContent.addView(it.mediaViewHolder?.player) } } is MediaCommonViewModel.MediaRecommendations -> { - controllerById[viewModel.key]?.recommendationViewHolder?.let { - mediaContent.addView(it.recommendations) + controllerById[viewModel.key]?.let { + it.widthInSceneContainerPx = widthInSceneContainerPx + it.heightInSceneContainerPx = heightInSceneContainerPx + mediaContent.addView(it.recommendationViewHolder?.recommendations) } } } diff --git a/packages/SystemUI/src/com/android/systemui/model/SceneContainerPlugin.kt b/packages/SystemUI/src/com/android/systemui/model/SceneContainerPlugin.kt index 7d2a1e178dfc..db5a545c3f71 100644 --- a/packages/SystemUI/src/com/android/systemui/model/SceneContainerPlugin.kt +++ b/packages/SystemUI/src/com/android/systemui/model/SceneContainerPlugin.kt @@ -88,15 +88,11 @@ constructor( when { it.invisibleDueToOcclusion -> false it.scene == Scenes.Lockscreen -> true - it.scene == Scenes.NotificationsShade -> true it.scene == Scenes.Shade -> true else -> false } }, - SYSUI_STATE_QUICK_SETTINGS_EXPANDED to - { - it.scene == Scenes.QuickSettingsShade || it.scene == Scenes.QuickSettings - }, + SYSUI_STATE_QUICK_SETTINGS_EXPANDED to { it.scene == Scenes.QuickSettings }, SYSUI_STATE_BOUNCER_SHOWING to { it.scene == Scenes.Bouncer }, SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING to { @@ -106,12 +102,9 @@ constructor( { it.scene == Scenes.Lockscreen && it.invisibleDueToOcclusion }, - SYSUI_STATE_COMMUNAL_HUB_SHOWING to { it.scene == Scenes.Communal } + SYSUI_STATE_COMMUNAL_HUB_SHOWING to { it.scene == Scenes.Communal }, ) } - data class SceneContainerPluginState( - val scene: SceneKey, - val invisibleDueToOcclusion: Boolean, - ) + data class SceneContainerPluginState(val scene: SceneKey, val invisibleDueToOcclusion: Boolean) } diff --git a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java index 4018320f2195..ca7b06a16a72 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java +++ b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java @@ -14,7 +14,10 @@ import android.content.Context; import android.content.res.Configuration; import android.os.Bundle; import android.util.AttributeSet; +import android.view.InputDevice; +import android.view.KeyEvent; import android.view.LayoutInflater; +import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.accessibility.AccessibilityEvent; @@ -191,6 +194,34 @@ public class PagedTileLayout extends ViewPager implements QSTileLayout { } @Override + public boolean onGenericMotionEvent(MotionEvent event) { + if ((event.getSource() & InputDevice.SOURCE_CLASS_POINTER) != 0 + && event.getAction() == MotionEvent.ACTION_SCROLL) { + // Handle mouse (or ext. device) by swiping the page depending on the scroll + final float vscroll; + final float hscroll; + if ((event.getMetaState() & KeyEvent.META_SHIFT_ON) != 0) { + vscroll = 0; + hscroll = event.getAxisValue(MotionEvent.AXIS_VSCROLL); + } else { + vscroll = -event.getAxisValue(MotionEvent.AXIS_VSCROLL); + hscroll = event.getAxisValue(MotionEvent.AXIS_HSCROLL); + } + if (hscroll != 0 || vscroll != 0) { + boolean isForwardScroll = + isLayoutRtl() ? (hscroll < 0 || vscroll < 0) : (hscroll > 0 || vscroll > 0); + int swipeDirection = isForwardScroll ? RIGHT : LEFT; + if (mScroller.isFinished()) { + scrollByX(getDeltaXForPageScrolling(swipeDirection), + SINGLE_PAGE_SCROLL_DURATION_MILLIS); + } + return true; + } + } + return super.onGenericMotionEvent(event); + } + + @Override public void setCurrentItem(int item, boolean smoothScroll) { if (isLayoutRtl()) { item = mPages.size() - 1 - item; diff --git a/packages/SystemUI/src/com/android/systemui/qs/ReduceBrightColorsController.java b/packages/SystemUI/src/com/android/systemui/qs/ReduceBrightColorsController.java index cf1dca3cbb23..893ef7e00579 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/ReduceBrightColorsController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/ReduceBrightColorsController.java @@ -29,12 +29,6 @@ public interface ReduceBrightColorsController extends /** Sets the activation state of Reduce Bright Colors */ void setReduceBrightColorsActivated(boolean activated); - /** Sets whether Reduce Bright Colors is enabled */ - void setReduceBrightColorsFeatureAvailable(boolean enabled); - - /** Gets whether Reduce Bright Colors is enabled */ - boolean isReduceBrightColorsFeatureAvailable(); - /** Gets whether Reduce Bright Colors is being transitioned to Even Dimmer */ boolean isInUpgradeMode(Resources resources); /** @@ -48,12 +42,5 @@ public interface ReduceBrightColorsController extends */ default void onActivated(boolean activated) { } - /** - * Listener invoked when the feature enabled state changes. - * - * @param enabled {@code true} if Reduce Bright Colors feature is enabled. - */ - default void onFeatureEnabledChanged(boolean enabled) { - } } }
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/qs/ReduceBrightColorsControllerImpl.java b/packages/SystemUI/src/com/android/systemui/qs/ReduceBrightColorsControllerImpl.java index 4d6cf78610d9..ca6e40d8cbd5 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/ReduceBrightColorsControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/qs/ReduceBrightColorsControllerImpl.java @@ -48,7 +48,6 @@ public class ReduceBrightColorsControllerImpl implements private final ContentObserver mContentObserver; private final SecureSettings mSecureSettings; private final ArrayList<ReduceBrightColorsController.Listener> mListeners = new ArrayList<>(); - private boolean mAvailable = true; @Inject public ReduceBrightColorsControllerImpl(UserTracker userTracker, @@ -77,7 +76,6 @@ public class ReduceBrightColorsControllerImpl implements mCurrentUserTrackerCallback = new UserTracker.Callback() { @Override public void onUserChanged(int newUser, Context userContext) { - mAvailable = true; synchronized (mListeners) { if (mListeners.size() > 0) { if (com.android.systemui.Flags.registerContentObserversAsync()) { @@ -141,17 +139,6 @@ public class ReduceBrightColorsControllerImpl implements mManager.setReduceBrightColorsActivated(activated); } - @Override - public void setReduceBrightColorsFeatureAvailable(boolean enabled) { - mAvailable = enabled; - dispatchOnEnabledChanged(enabled); - mAvailable = true; - } - - @Override - public boolean isReduceBrightColorsFeatureAvailable() { - return mAvailable; - } @Override public boolean isInUpgradeMode(Resources resources) { @@ -166,11 +153,4 @@ public class ReduceBrightColorsControllerImpl implements l.onActivated(activated); } } - - private void dispatchOnEnabledChanged(boolean enabled) { - ArrayList<Listener> copy = new ArrayList<>(mListeners); - for (Listener l : copy) { - l.onFeatureEnabledChanged(enabled); - } - } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/autoaddable/ReduceBrightColorsAutoAddable.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/autoaddable/ReduceBrightColorsAutoAddable.kt index 4d823ab216f0..bde682074780 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/autoaddable/ReduceBrightColorsAutoAddable.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/autoaddable/ReduceBrightColorsAutoAddable.kt @@ -42,7 +42,7 @@ constructor( ) : CallbackControllerAutoAddable< ReduceBrightColorsController.Listener, - ReduceBrightColorsController + ReduceBrightColorsController, >(controller) { override val spec: TileSpec @@ -55,12 +55,6 @@ constructor( sendAdd() } } - - override fun onFeatureEnabledChanged(enabled: Boolean) { - if (!enabled) { - available = false - } - } } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/ReduceBrightColorsTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/ReduceBrightColorsTile.java index af5b31180159..d624d989f42a 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/ReduceBrightColorsTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/ReduceBrightColorsTile.java @@ -29,6 +29,7 @@ import androidx.annotation.Nullable; import com.android.internal.R; import com.android.internal.logging.MetricsLogger; +import com.android.systemui.accessibility.extradim.ExtraDimDialogManager; import com.android.systemui.animation.Expandable; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; @@ -55,6 +56,7 @@ public class ReduceBrightColorsTile extends QSTileImpl<QSTile.BooleanState> private final ReduceBrightColorsController mReduceBrightColorsController; private boolean mIsListening; private final boolean mInUpgradeMode; + private final ExtraDimDialogManager mExtraDimDialogManager; @Inject public ReduceBrightColorsTile( @@ -68,12 +70,14 @@ public class ReduceBrightColorsTile extends QSTileImpl<QSTile.BooleanState> MetricsLogger metricsLogger, StatusBarStateController statusBarStateController, ActivityStarter activityStarter, - QSLogger qsLogger + QSLogger qsLogger, + ExtraDimDialogManager extraDimDialogManager ) { super(host, uiEventLogger, backgroundLooper, mainHandler, falsingManager, metricsLogger, statusBarStateController, activityStarter, qsLogger); mReduceBrightColorsController = reduceBrightColorsController; mReduceBrightColorsController.observe(getLifecycle(), this); + mExtraDimDialogManager = extraDimDialogManager; mInUpgradeMode = reduceBrightColorsController.isInUpgradeMode(mContext.getResources()); mIsAvailable = isAvailable || mInUpgradeMode; @@ -102,19 +106,24 @@ public class ReduceBrightColorsTile extends QSTileImpl<QSTile.BooleanState> private boolean goToEvenDimmer() { if (mInUpgradeMode) { - mHost.removeTile(getTileSpec()); - mIsAvailable = false; return true; } return false; } @Override - protected void handleClick(@Nullable Expandable expandable) { + protected void handleLongClick(@Nullable Expandable expandable) { + if (goToEvenDimmer()) { + mExtraDimDialogManager.dismissKeyguardIfNeededAndShowDialog(expandable); + } else { + super.handleLongClick(expandable); + } + } + @Override + protected void handleClick(@Nullable Expandable expandable) { if (goToEvenDimmer()) { - mActivityStarter.postStartActivityDismissingKeyguard( - new Intent(Settings.ACTION_DISPLAY_SETTINGS), 0); + mExtraDimDialogManager.dismissKeyguardIfNeededAndShowDialog(expandable); } else { mReduceBrightColorsController.setReduceBrightColorsActivated(!mState.value); } @@ -146,9 +155,4 @@ public class ReduceBrightColorsTile extends QSTileImpl<QSTile.BooleanState> public void onActivated(boolean activated) { refreshState(); } - - @Override - public void onFeatureEnabledChanged(boolean enabled) { - refreshState(); - } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/reducebrightness/domain/interactor/ReduceBrightColorsTileDataInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/reducebrightness/domain/interactor/ReduceBrightColorsTileDataInteractor.kt index 00b1e41461f5..536c5f1d17cf 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/reducebrightness/domain/interactor/ReduceBrightColorsTileDataInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/reducebrightness/domain/interactor/ReduceBrightColorsTileDataInteractor.kt @@ -23,13 +23,13 @@ import com.android.systemui.qs.dagger.QSFlagsModule.RBC_AVAILABLE import com.android.systemui.qs.tiles.base.interactor.DataUpdateTrigger import com.android.systemui.qs.tiles.base.interactor.QSTileDataInteractor import com.android.systemui.qs.tiles.impl.reducebrightness.domain.model.ReduceBrightColorsTileModel -import com.android.systemui.util.kotlin.isAvailable import com.android.systemui.util.kotlin.isEnabled import javax.inject.Inject import javax.inject.Named import kotlin.coroutines.CoroutineContext import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map @@ -44,7 +44,7 @@ constructor( override fun tileData( user: UserHandle, - triggers: Flow<DataUpdateTrigger> + triggers: Flow<DataUpdateTrigger>, ): Flow<ReduceBrightColorsTileModel> { return reduceBrightColorsController .isEnabled() @@ -53,6 +53,5 @@ constructor( .flowOn(bgCoroutineContext) } - override fun availability(user: UserHandle): Flow<Boolean> = - reduceBrightColorsController.isAvailable() + override fun availability(user: UserHandle): Flow<Boolean> = flowOf(isAvailable) } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/reducebrightness/domain/interactor/ReduceBrightColorsTileUserActionInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/reducebrightness/domain/interactor/ReduceBrightColorsTileUserActionInteractor.kt index de49e70587ca..15c9901d10c2 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/reducebrightness/domain/interactor/ReduceBrightColorsTileUserActionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/reducebrightness/domain/interactor/ReduceBrightColorsTileUserActionInteractor.kt @@ -19,6 +19,7 @@ package com.android.systemui.qs.tiles.impl.reducebrightness.domain.interactor import android.content.Intent import android.content.res.Resources import android.provider.Settings +import com.android.systemui.accessibility.extradim.ExtraDimDialogManager import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.qs.ReduceBrightColorsController import com.android.systemui.qs.tiles.base.actions.QSTileIntentUserInputHandler @@ -35,6 +36,7 @@ constructor( @Main private val resources: Resources, private val qsTileIntentUserActionHandler: QSTileIntentUserInputHandler, private val reduceBrightColorsController: ReduceBrightColorsController, + private val extraDimDialogManager: ExtraDimDialogManager, ) : QSTileUserActionInteractor<ReduceBrightColorsTileModel> { val isInUpgradeMode: Boolean = reduceBrightColorsController.isInUpgradeMode(resources) @@ -44,12 +46,9 @@ constructor( when (action) { is QSTileUserAction.Click -> { if (isInUpgradeMode) { - reduceBrightColorsController.setReduceBrightColorsFeatureAvailable(false) - qsTileIntentUserActionHandler.handle( - action.expandable, - Intent(Settings.ACTION_DISPLAY_SETTINGS) + extraDimDialogManager.dismissKeyguardIfNeededAndShowDialog( + action.expandable ) - // TODO(b/349458355): show dialog return@with } reduceBrightColorsController.setReduceBrightColorsActivated( @@ -58,17 +57,14 @@ constructor( } is QSTileUserAction.LongClick -> { if (isInUpgradeMode) { - reduceBrightColorsController.setReduceBrightColorsFeatureAvailable(false) - qsTileIntentUserActionHandler.handle( - action.expandable, - Intent(Settings.ACTION_DISPLAY_SETTINGS) + extraDimDialogManager.dismissKeyguardIfNeededAndShowDialog( + action.expandable ) - // TODO(b/349458355): show dialog return@with } qsTileIntentUserActionHandler.handle( action.expandable, - Intent(Settings.ACTION_REDUCE_BRIGHT_COLORS_SETTINGS) + Intent(Settings.ACTION_REDUCE_BRIGHT_COLORS_SETTINGS), ) } is QSTileUserAction.ToggleClick -> {} diff --git a/packages/SystemUI/src/com/android/systemui/scene/KeyguardlessSceneContainerFrameworkModule.kt b/packages/SystemUI/src/com/android/systemui/scene/KeyguardlessSceneContainerFrameworkModule.kt index 834db98263f5..1aa982fd32f3 100644 --- a/packages/SystemUI/src/com/android/systemui/scene/KeyguardlessSceneContainerFrameworkModule.kt +++ b/packages/SystemUI/src/com/android/systemui/scene/KeyguardlessSceneContainerFrameworkModule.kt @@ -58,7 +58,7 @@ import dagger.multibindings.IntoMap HomeSceneFamilyResolverModule::class, NotifShadeSceneFamilyResolverModule::class, QuickSettingsSceneFamilyResolverModule::class, - ], + ] ) interface KeyguardlessSceneContainerFrameworkModule { @@ -100,8 +100,6 @@ interface KeyguardlessSceneContainerFrameworkModule { listOfNotNull( Scenes.Gone, Scenes.QuickSettings.takeUnless { DualShade.isEnabled }, - Scenes.QuickSettingsShade.takeIf { DualShade.isEnabled }, - Scenes.NotificationsShade.takeIf { DualShade.isEnabled }, Scenes.Shade.takeUnless { DualShade.isEnabled }, ), initialSceneKey = Scenes.Gone, @@ -113,13 +111,11 @@ interface KeyguardlessSceneContainerFrameworkModule { navigationDistances = mapOf( Scenes.Gone to 0, - Scenes.NotificationsShade to 1.takeIf { DualShade.isEnabled }, Scenes.Shade to 1.takeUnless { DualShade.isEnabled }, - Scenes.QuickSettingsShade to 2.takeIf { DualShade.isEnabled }, Scenes.QuickSettings to 2.takeUnless { DualShade.isEnabled }, ) .filterValues { it != null } - .mapValues { checkNotNull(it.value) } + .mapValues { checkNotNull(it.value) }, ) } @@ -129,7 +125,7 @@ interface KeyguardlessSceneContainerFrameworkModule { topEdgeSplitFraction = shadeInteractor::getTopEdgeSplitFraction, // TODO(b/338577208): This should be 60dp at the top in the dual-shade UI. Better to // replace this constant with dynamic window insets. - edgeSize = 40.dp + edgeSize = 40.dp, ) } } diff --git a/packages/SystemUI/src/com/android/systemui/scene/SceneContainerFrameworkModule.kt b/packages/SystemUI/src/com/android/systemui/scene/SceneContainerFrameworkModule.kt index a4c7d00d0e80..7f0cf86bee02 100644 --- a/packages/SystemUI/src/com/android/systemui/scene/SceneContainerFrameworkModule.kt +++ b/packages/SystemUI/src/com/android/systemui/scene/SceneContainerFrameworkModule.kt @@ -62,7 +62,7 @@ import dagger.multibindings.IntoMap HomeSceneFamilyResolverModule::class, NotifShadeSceneFamilyResolverModule::class, QuickSettingsSceneFamilyResolverModule::class, - ], + ] ) interface SceneContainerFrameworkModule { @@ -107,8 +107,6 @@ interface SceneContainerFrameworkModule { Scenes.Lockscreen, Scenes.Bouncer, Scenes.QuickSettings.takeUnless { DualShade.isEnabled }, - Scenes.QuickSettingsShade.takeIf { DualShade.isEnabled }, - Scenes.NotificationsShade.takeIf { DualShade.isEnabled }, Scenes.Shade.takeUnless { DualShade.isEnabled }, ), initialSceneKey = Scenes.Lockscreen, @@ -122,14 +120,12 @@ interface SceneContainerFrameworkModule { Scenes.Gone to 0, Scenes.Lockscreen to 0, Scenes.Communal to 1, - Scenes.NotificationsShade to 2.takeIf { DualShade.isEnabled }, Scenes.Shade to 2.takeUnless { DualShade.isEnabled }, - Scenes.QuickSettingsShade to 3.takeIf { DualShade.isEnabled }, Scenes.QuickSettings to 3.takeUnless { DualShade.isEnabled }, Scenes.Bouncer to 4, ) .filterValues { it != null } - .mapValues { checkNotNull(it.value) } + .mapValues { checkNotNull(it.value) }, ) } @@ -139,7 +135,7 @@ interface SceneContainerFrameworkModule { topEdgeSplitFraction = shadeInteractor::getTopEdgeSplitFraction, // TODO(b/338577208): This should be 60dp at the top in the dual-shade UI. Better to // replace this constant with dynamic window insets. - edgeSize = 40.dp + edgeSize = 40.dp, ) } } diff --git a/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneBackInteractor.kt b/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneBackInteractor.kt index 2d40845df802..afb72f03b28d 100644 --- a/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneBackInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneBackInteractor.kt @@ -71,6 +71,12 @@ constructor( logger.logSceneBackStack(backStack.value.asIterable()) } + /** Applies the given [transform] to the back stack. */ + fun updateBackStack(transform: (SceneStack) -> SceneStack) { + _backStack.update { stack -> transform(stack) } + logger.logSceneBackStack(backStack.value.asIterable()) + } + private fun stackOperation(from: SceneKey, to: SceneKey, stack: SceneStack): StackOperation? { val fromDistance = checkNotNull(sceneContainerConfig.navigationDistances[from]) { diff --git a/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneContainerOcclusionInteractor.kt b/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneContainerOcclusionInteractor.kt index 04620d6982d2..429b47bcfba1 100644 --- a/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneContainerOcclusionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneContainerOcclusionInteractor.kt @@ -137,9 +137,7 @@ constructor( Scenes.Communal -> true Scenes.Gone -> true Scenes.Lockscreen -> true - Scenes.NotificationsShade -> false Scenes.QuickSettings -> false - Scenes.QuickSettingsShade -> false Scenes.Shade -> false else -> error("SceneKey \"$this\" doesn't have a mapping for canBeOccluded!") } diff --git a/packages/SystemUI/src/com/android/systemui/scene/domain/startable/SceneContainerStartable.kt b/packages/SystemUI/src/com/android/systemui/scene/domain/startable/SceneContainerStartable.kt index 98907b037d85..b11d8ed9ee3d 100644 --- a/packages/SystemUI/src/com/android/systemui/scene/domain/startable/SceneContainerStartable.kt +++ b/packages/SystemUI/src/com/android/systemui/scene/domain/startable/SceneContainerStartable.kt @@ -45,7 +45,6 @@ import com.android.systemui.deviceentry.shared.model.DeviceUnlockSource import com.android.systemui.keyguard.DismissCallbackRegistry import com.android.systemui.keyguard.domain.interactor.KeyguardEnabledInteractor import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor -import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor import com.android.systemui.keyguard.domain.interactor.WindowManagerLockscreenVisibilityInteractor import com.android.systemui.model.SceneContainerPlugin import com.android.systemui.model.SysUiState @@ -55,6 +54,7 @@ import com.android.systemui.plugins.FalsingManager.FalsingBeliefListener import com.android.systemui.power.domain.interactor.PowerInteractor import com.android.systemui.power.shared.model.WakeSleepReason import com.android.systemui.scene.data.model.asIterable +import com.android.systemui.scene.data.model.sceneStackOf import com.android.systemui.scene.domain.interactor.SceneBackInteractor import com.android.systemui.scene.domain.interactor.SceneContainerOcclusionInteractor import com.android.systemui.scene.domain.interactor.SceneInteractor @@ -118,7 +118,6 @@ constructor( private val deviceUnlockedInteractor: DeviceUnlockedInteractor, private val bouncerInteractor: BouncerInteractor, private val keyguardInteractor: KeyguardInteractor, - private val keyguardTransitionInteractor: KeyguardTransitionInteractor, private val sysUiState: SysUiState, @DisplayId private val displayId: Int, private val sceneLogger: SceneLogger, @@ -205,7 +204,7 @@ constructor( is ObservableTransitionState.Transition -> state.fromContent }.let { it == Scenes.Shade || it == Scenes.QuickSettings } } - .distinctUntilChanged() + .distinctUntilChanged(), ) { inBackStack, isCurrentScene -> inBackStack || isCurrentScene } @@ -248,8 +247,7 @@ constructor( visibilityForTransitionState, isHeadsUpOrAnimatingAway, invisibleDueToOcclusion, - isAlternateBouncerVisible, - -> + isAlternateBouncerVisible -> when { isHeadsUpOrAnimatingAway -> true to "showing a HUN" isAlternateBouncerVisible -> true to "showing alternate bouncer" @@ -322,7 +320,7 @@ constructor( switchToScene( // TODO(b/336581871): add sceneState? targetSceneKey = Scenes.Bouncer, - loggingReason = "Need to authenticate locked SIM card." + loggingReason = "Need to authenticate locked SIM card.", ) } unlockStatus.isUnlocked && @@ -332,7 +330,7 @@ constructor( targetSceneKey = Scenes.Gone, loggingReason = "All SIM cards unlocked and device already unlocked and " + - "lockscreen doesn't require a swipe to dismiss." + "lockscreen doesn't require a swipe to dismiss.", ) } else -> { @@ -341,7 +339,7 @@ constructor( targetSceneKey = Scenes.Lockscreen, loggingReason = "All SIM cards unlocked and device still locked" + - " or lockscreen still requires a swipe to dismiss." + " or lockscreen still requires a swipe to dismiss.", ) } } @@ -363,10 +361,7 @@ constructor( when (val transitionState = sceneInteractor.transitionState.value) { is ObservableTransitionState.Idle -> setOf(transitionState.currentScene) is ObservableTransitionState.Transition -> - setOf( - transitionState.fromContent, - transitionState.toContent, - ) + setOf(transitionState.fromContent, transitionState.toContent) } val isOnLockscreen = renderedScenes.contains(Scenes.Lockscreen) val isAlternateBouncerVisible = alternateBouncerInteractor.isVisibleState() @@ -423,7 +418,20 @@ constructor( " didn't need to be left open" } else { val prevScene = previousScene.value - (prevScene ?: Scenes.Gone) to + val targetScene = prevScene ?: Scenes.Gone + if (targetScene != Scenes.Gone) { + sceneBackInteractor.updateBackStack { stack -> + val list = stack.asIterable().toMutableList() + check(list.last() == Scenes.Lockscreen) { + "The bottommost/last SceneKey of the back stack isn't" + + " the Lockscreen scene like expected. The back" + + " stack is $stack." + } + list[list.size - 1] = Scenes.Gone + sceneStackOf(*list.toTypedArray()) + } + } + targetScene to "device was unlocked with primary bouncer showing," + " from sceneKey=$prevScene" } @@ -451,10 +459,7 @@ constructor( } } .collect { (targetSceneKey, loggingReason) -> - switchToScene( - targetSceneKey = targetSceneKey, - loggingReason = loggingReason, - ) + switchToScene(targetSceneKey = targetSceneKey, loggingReason = loggingReason) } } } @@ -718,7 +723,6 @@ constructor( Scenes.Lockscreen -> true Scenes.Bouncer -> false Scenes.Shade -> false - Scenes.NotificationsShade -> false else -> null } } @@ -812,7 +816,7 @@ constructor( private fun switchToScene( targetSceneKey: SceneKey, loggingReason: String, - sceneState: Any? = null + sceneState: Any? = null, ) { sceneInteractor.changeScene( toScene = targetSceneKey, @@ -831,10 +835,9 @@ constructor( private fun notifyKeyguardDismissCancelledCallbacks() { applicationScope.launch { - combine( - deviceEntryInteractor.isUnlocked, - sceneInteractor.currentScene.pairwise(), - ) { isUnlocked, (from, to) -> + combine(deviceEntryInteractor.isUnlocked, sceneInteractor.currentScene.pairwise()) { + isUnlocked, + (from, to) -> when { from != Scenes.Bouncer -> false to != Scenes.Gone && !isUnlocked -> true diff --git a/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/GoneUserActionsViewModel.kt b/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/GoneUserActionsViewModel.kt index ea4122a563ab..7bf2b63c7140 100644 --- a/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/GoneUserActionsViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/GoneUserActionsViewModel.kt @@ -19,52 +19,49 @@ package com.android.systemui.scene.ui.viewmodel import com.android.compose.animation.scene.Edge import com.android.compose.animation.scene.Swipe import com.android.compose.animation.scene.SwipeDirection +import com.android.compose.animation.scene.TransitionKey import com.android.compose.animation.scene.UserAction import com.android.compose.animation.scene.UserActionResult -import com.android.systemui.scene.shared.model.SceneFamilies +import com.android.systemui.scene.shared.model.Overlays +import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.scene.shared.model.TransitionKeys.ToSplitShade import com.android.systemui.shade.domain.interactor.ShadeInteractor import com.android.systemui.shade.shared.model.ShadeMode import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject -import kotlinx.coroutines.flow.map class GoneUserActionsViewModel @AssistedInject -constructor( - private val shadeInteractor: ShadeInteractor, -) : UserActionsViewModel() { +constructor(private val shadeInteractor: ShadeInteractor) : UserActionsViewModel() { override suspend fun hydrateActions(setActions: (Map<UserAction, UserActionResult>) -> Unit) { - shadeInteractor.shadeMode - .map { shadeMode -> - buildMap<UserAction, UserActionResult> { - if ( - shadeMode is ShadeMode.Single || - // TODO(b/338577208): Remove this once we add Dual Shade invocation - // zones. - shadeMode is ShadeMode.Dual - ) { - put( - Swipe( - pointerCount = 2, - fromSource = Edge.Top, - direction = SwipeDirection.Down, - ), - UserActionResult(SceneFamilies.QuickSettings) - ) - } - - put( - Swipe.Down, - UserActionResult( - SceneFamilies.NotifShade, - ToSplitShade.takeIf { shadeMode is ShadeMode.Split } - ) - ) + shadeInteractor.shadeMode.collect { shadeMode -> + setActions( + when (shadeMode) { + ShadeMode.Single -> fullscreenShadeActions() + ShadeMode.Split -> fullscreenShadeActions(transitionKey = ToSplitShade) + ShadeMode.Dual -> dualShadeActions() } - } - .collect { setActions(it) } + ) + } + } + + private fun fullscreenShadeActions( + transitionKey: TransitionKey? = null + ): Map<UserAction, UserActionResult> { + return mapOf( + Swipe.Down to UserActionResult(Scenes.Shade, transitionKey), + Swipe(direction = SwipeDirection.Down, pointerCount = 2, fromSource = Edge.Top) to + UserActionResult(Scenes.Shade, transitionKey), + ) + } + + private fun dualShadeActions(): Map<UserAction, UserActionResult> { + return mapOf( + Swipe.Down to Overlays.NotificationsShade, + Swipe(direction = SwipeDirection.Down, fromSource = SceneContainerEdge.TopRight) to + Overlays.QuickSettingsShade, + ) } @AssistedFactory diff --git a/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModel.kt b/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModel.kt index 54823945a827..c451704aa0f8 100644 --- a/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModel.kt @@ -77,7 +77,7 @@ constructor( source = shadeInteractor.shadeMode.map { if (it is ShadeMode.Dual) splitEdgeDetector else DefaultEdgeDetector - } + }, ) override suspend fun onActivated(): Nothing { @@ -163,10 +163,8 @@ constructor( when (toScene) { Scenes.Bouncer -> Classifier.BOUNCER_UNLOCK Scenes.Gone -> Classifier.UNLOCK - Scenes.NotificationsShade -> Classifier.NOTIFICATION_DRAG_DOWN Scenes.Shade -> Classifier.NOTIFICATION_DRAG_DOWN Scenes.QuickSettings -> Classifier.QUICK_SETTINGS - Scenes.QuickSettingsShade -> Classifier.QUICK_SETTINGS else -> null } @@ -200,7 +198,7 @@ constructor( * resolution target. */ fun resolveSceneFamilies( - actionResultMap: Map<UserAction, UserActionResult>, + actionResultMap: Map<UserAction, UserActionResult> ): Map<UserAction, UserActionResult> { return actionResultMap.mapValues { (_, actionResult) -> when (actionResult) { @@ -259,7 +257,7 @@ constructor( @AssistedFactory interface Factory { fun create( - motionEventHandlerReceiver: (MotionEventHandler?) -> Unit, + motionEventHandlerReceiver: (MotionEventHandler?) -> Unit ): SceneContainerViewModel } } diff --git a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSliderController.java b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSliderController.java index 083cee73f591..75165cb5610e 100644 --- a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSliderController.java +++ b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSliderController.java @@ -16,8 +16,6 @@ package com.android.systemui.settings.brightness; -import static com.android.systemui.Flags.hapticBrightnessSlider; - import android.content.Context; import android.content.Intent; import android.view.LayoutInflater; @@ -317,9 +315,7 @@ public class BrightnessSliderController extends ViewController<BrightnessSliderV SeekbarHapticPlugin plugin = new SeekbarHapticPlugin( mVibratorHelper, mSystemClock); - if (hapticBrightnessSlider()) { - HapticSliderViewBinder.bind(viewRoot, plugin); - } + HapticSliderViewBinder.bind(viewRoot, plugin); return new BrightnessSliderController( root, mFalsingManager, mUiEventLogger, plugin, mActivityStarter); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java index 3422c67d50bd..7f5551274d55 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java @@ -723,9 +723,7 @@ public class StatusBarStateControllerImpl implements Scenes.Bouncer, StatusBarState.KEYGUARD, Scenes.Communal, StatusBarState.KEYGUARD, Scenes.Shade, StatusBarState.SHADE_LOCKED, - Scenes.NotificationsShade, StatusBarState.SHADE_LOCKED, Scenes.QuickSettings, StatusBarState.SHADE_LOCKED, - Scenes.QuickSettingsShade, StatusBarState.SHADE_LOCKED, Scenes.Gone, StatusBarState.SHADE ); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/chips/shared/StatusBarRonChips.kt b/packages/SystemUI/src/com/android/systemui/statusbar/chips/shared/StatusBarRonChips.kt new file mode 100644 index 000000000000..4c0c4617658a --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/chips/shared/StatusBarRonChips.kt @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.shared + +import com.android.systemui.Flags +import com.android.systemui.flags.FlagToken +import com.android.systemui.flags.RefactorFlagUtils + +/** Helper for reading or using the status bar ron chips flag state. */ +@Suppress("NOTHING_TO_INLINE") +object StatusBarRonChips { + /** The aconfig flag name */ + const val FLAG_NAME = Flags.FLAG_STATUS_BAR_RON_CHIPS + + /** A token used for dependency declaration */ + val token: FlagToken + get() = FlagToken(FLAG_NAME, isEnabled) + + /** Is the refactor enabled */ + @JvmStatic + inline val isEnabled + get() = Flags.statusBarRonChips() + + /** + * Called to ensure code is only run when the flag is enabled. This protects users from the + * unintended behaviors caused by accidentally running new logic, while also crashing on an eng + * build to ensure that the refactor author catches issues in testing. + */ + @JvmStatic + inline fun isUnexpectedlyInLegacyMode() = + RefactorFlagUtils.isUnexpectedlyInLegacyMode(isEnabled, FLAG_NAME) + + /** + * Called to ensure code is only run when the flag is disabled. This will throw an exception if + * the flag is 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) + + /** + * Called to ensure code is only run when the flag is disabled. This will throw an exception if + * the flag is enabled to ensure that the refactor author catches issues in testing. + */ + @JvmStatic + inline fun assertInLegacyMode() = RefactorFlagUtils.assertInLegacyMode(isEnabled, FLAG_NAME) +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/model/MultipleOngoingActivityChipsModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/model/MultipleOngoingActivityChipsModel.kt new file mode 100644 index 000000000000..d2555b0fe4a9 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/model/MultipleOngoingActivityChipsModel.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.chips.ui.model + +/** Models multiple active ongoing activity chips at once. */ +data class MultipleOngoingActivityChipsModel( + /** The primary chip to show. This will *always* be shown. */ + val primary: OngoingActivityChipModel = OngoingActivityChipModel.Hidden(), + /** + * The secondary chip to show. If there's not enough room in the status bar, this chip will + * *not* be shown. + */ + val secondary: OngoingActivityChipModel = OngoingActivityChipModel.Hidden(), +) { + init { + if ( + primary is OngoingActivityChipModel.Hidden && + secondary is OngoingActivityChipModel.Shown + ) { + throw IllegalArgumentException("`secondary` cannot be Shown if `primary` is Hidden") + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/viewmodel/OngoingActivityChipsViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/viewmodel/OngoingActivityChipsViewModel.kt index 199eb0613a0c..24c1b879f429 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/viewmodel/OngoingActivityChipsViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/viewmodel/OngoingActivityChipsViewModel.kt @@ -16,6 +16,7 @@ package com.android.systemui.statusbar.chips.ui.viewmodel +import com.android.systemui.Flags import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.log.LogBuffer @@ -27,6 +28,7 @@ import com.android.systemui.statusbar.chips.ron.demo.ui.viewmodel.DemoRonChipVie import com.android.systemui.statusbar.chips.ron.shared.StatusBarRonChips import com.android.systemui.statusbar.chips.screenrecord.ui.viewmodel.ScreenRecordChipViewModel import com.android.systemui.statusbar.chips.sharetoapp.ui.viewmodel.ShareToAppChipViewModel +import com.android.systemui.statusbar.chips.ui.model.MultipleOngoingActivityChipsModel import com.android.systemui.statusbar.chips.ui.model.OngoingActivityChipModel import com.android.systemui.util.kotlin.pairwise import javax.inject.Inject @@ -87,68 +89,58 @@ constructor( ) : InternalChipModel } - private val internalChip: Flow<InternalChipModel> = + private data class ChipBundle( + val screenRecord: OngoingActivityChipModel = OngoingActivityChipModel.Hidden(), + val shareToApp: OngoingActivityChipModel = OngoingActivityChipModel.Hidden(), + val castToOtherDevice: OngoingActivityChipModel = OngoingActivityChipModel.Hidden(), + val call: OngoingActivityChipModel = OngoingActivityChipModel.Hidden(), + val demoRon: OngoingActivityChipModel = OngoingActivityChipModel.Hidden(), + ) + + /** Bundles all the incoming chips into one object to easily pass to various flows. */ + private val incomingChipBundle = combine( - screenRecordChipViewModel.chip, - shareToAppChipViewModel.chip, - castToOtherDeviceChipViewModel.chip, - callChipViewModel.chip, - demoRonChipViewModel.chip, - ) { screenRecord, shareToApp, castToOtherDevice, call, demoRon -> - logger.log( - TAG, - LogLevel.INFO, - { - str1 = screenRecord.logName - str2 = shareToApp.logName - str3 = castToOtherDevice.logName - }, - { "Chips: ScreenRecord=$str1 > ShareToApp=$str2 > CastToOther=$str3..." }, - ) - logger.log( - TAG, - LogLevel.INFO, - { - str1 = call.logName - str2 = demoRon.logName - }, - { "... > Call=$str1 > DemoRon=$str2" } - ) - // This `when` statement shows the priority order of the chips. - when { - // Screen recording also activates the media projection APIs, so whenever the - // screen recording chip is active, the media projection chip would also be - // active. We want the screen-recording-specific chip shown in this case, so we - // give the screen recording chip priority. See b/296461748. - screenRecord is OngoingActivityChipModel.Shown -> - InternalChipModel.Shown(ChipType.ScreenRecord, screenRecord) - shareToApp is OngoingActivityChipModel.Shown -> - InternalChipModel.Shown(ChipType.ShareToApp, shareToApp) - castToOtherDevice is OngoingActivityChipModel.Shown -> - InternalChipModel.Shown(ChipType.CastToOtherDevice, castToOtherDevice) - call is OngoingActivityChipModel.Shown -> - InternalChipModel.Shown(ChipType.Call, call) - demoRon is OngoingActivityChipModel.Shown -> { - StatusBarRonChips.assertInNewMode() - InternalChipModel.Shown(ChipType.DemoRon, demoRon) - } - else -> { - // We should only get here if all chip types are hidden - check(screenRecord is OngoingActivityChipModel.Hidden) - check(shareToApp is OngoingActivityChipModel.Hidden) - check(castToOtherDevice is OngoingActivityChipModel.Hidden) - check(call is OngoingActivityChipModel.Hidden) - check(demoRon is OngoingActivityChipModel.Hidden) - InternalChipModel.Hidden( - screenRecord = screenRecord, - shareToApp = shareToApp, - castToOtherDevice = castToOtherDevice, - call = call, - demoRon = demoRon, - ) - } + screenRecordChipViewModel.chip, + shareToAppChipViewModel.chip, + castToOtherDeviceChipViewModel.chip, + callChipViewModel.chip, + demoRonChipViewModel.chip, + ) { screenRecord, shareToApp, castToOtherDevice, call, demoRon -> + logger.log( + TAG, + LogLevel.INFO, + { + str1 = screenRecord.logName + str2 = shareToApp.logName + str3 = castToOtherDevice.logName + }, + { "Chips: ScreenRecord=$str1 > ShareToApp=$str2 > CastToOther=$str3..." }, + ) + logger.log( + TAG, + LogLevel.INFO, + { + str1 = call.logName + str2 = demoRon.logName + }, + { "... > Call=$str1 > DemoRon=$str2" } + ) + ChipBundle( + screenRecord = screenRecord, + shareToApp = shareToApp, + castToOtherDevice = castToOtherDevice, + call = call, + demoRon = demoRon, + ) } - } + // Some of the chips could have timers in them and we don't want the start time + // for those timers to get reset for any reason. So, as soon as any subscriber has + // requested the chip information, we maintain it forever by using + // [SharingStarted.Lazily]. See b/347726238. + .stateIn(scope, SharingStarted.Lazily, ChipBundle()) + + private val internalChip: Flow<InternalChipModel> = + incomingChipBundle.map { bundle -> pickMostImportantChip(bundle).mostImportantChip } /** * A flow modeling the primary chip that should be shown in the status bar after accounting for @@ -160,37 +152,188 @@ constructor( val primaryChip: StateFlow<OngoingActivityChipModel> = internalChip .pairwise(initialValue = DEFAULT_INTERNAL_HIDDEN_MODEL) - .map { (old, new) -> - if (old is InternalChipModel.Shown && new is InternalChipModel.Hidden) { - // If we're transitioning from showing the chip to hiding the chip, different - // chips require different animation behaviors. For example, the screen share - // chips shouldn't animate if the user stopped the screen share from the dialog - // (see b/353249803#comment4), but the call chip should always animate. - // - // This `when` block makes sure that when we're transitioning from Shown to - // Hidden, we check what chip type was previously showing and we use that chip - // type's hide animation behavior. - when (old.type) { - ChipType.ScreenRecord -> new.screenRecord - ChipType.ShareToApp -> new.shareToApp - ChipType.CastToOtherDevice -> new.castToOtherDevice - ChipType.Call -> new.call - ChipType.DemoRon -> new.demoRon - } - } else if (new is InternalChipModel.Shown) { - // If we have a chip to show, always show it. - new.model - } else { - // In the Hidden -> Hidden transition, it shouldn't matter which hidden model we - // choose because no animation should happen regardless. - OngoingActivityChipModel.Hidden() + .map { (old, new) -> createOutputModel(old, new) } + .stateIn(scope, SharingStarted.Lazily, OngoingActivityChipModel.Hidden()) + + /** + * Equivalent to [MultipleOngoingActivityChipsModel] but using the internal models to do some + * state tracking before we get the final output. + */ + private data class InternalMultipleOngoingActivityChipsModel( + val primary: InternalChipModel, + val secondary: InternalChipModel, + ) + + private val internalChips: Flow<InternalMultipleOngoingActivityChipsModel> = + incomingChipBundle.map { bundle -> + // First: Find the most important chip. + val primaryChipResult = pickMostImportantChip(bundle) + val primaryChip = primaryChipResult.mostImportantChip + if (primaryChip is InternalChipModel.Hidden) { + // If the primary chip is hidden, the secondary chip will also be hidden, so just + // pass the same Hidden model for both. + InternalMultipleOngoingActivityChipsModel(primaryChip, primaryChip) + } else { + // Then: Find the next most important chip. + val secondaryChip = + pickMostImportantChip(primaryChipResult.remainingChips).mostImportantChip + InternalMultipleOngoingActivityChipsModel(primaryChip, secondaryChip) + } + } + + /** + * A flow modeling the primary chip that should be shown in the status bar after accounting for + * possibly multiple ongoing activities and animation requirements. + * + * [com.android.systemui.statusbar.phone.fragment.CollapsedStatusBarFragment] is responsible for + * actually displaying the chip. + */ + val chips: StateFlow<MultipleOngoingActivityChipsModel> = + if (!Flags.statusBarRonChips()) { + // Multiple chips are only allowed with RONs. If the flag isn't on, use just the + // primary chip. + primaryChip + .map { + MultipleOngoingActivityChipsModel( + primary = it, + secondary = OngoingActivityChipModel.Hidden(), + ) } + .stateIn( + scope, + SharingStarted.Lazily, + MultipleOngoingActivityChipsModel(), + ) + } else { + internalChips + .pairwise(initialValue = DEFAULT_MULTIPLE_INTERNAL_HIDDEN_MODEL) + .map { (old, new) -> + val correctPrimary = createOutputModel(old.primary, new.primary) + val correctSecondary = createOutputModel(old.secondary, new.secondary) + MultipleOngoingActivityChipsModel(correctPrimary, correctSecondary) + } + .stateIn( + scope, + SharingStarted.Lazily, + MultipleOngoingActivityChipsModel(), + ) + } + + /** A data class representing the return result of [pickMostImportantChip]. */ + private data class MostImportantChipResult( + val mostImportantChip: InternalChipModel, + val remainingChips: ChipBundle, + ) + + /** + * Finds the most important chip from the given [bundle]. + * + * This function returns that most important chip, and it also returns any remaining chips that + * still want to be shown after filtering out the most important chip. + */ + private fun pickMostImportantChip(bundle: ChipBundle): MostImportantChipResult { + // This `when` statement shows the priority order of the chips. + return when { + bundle.screenRecord is OngoingActivityChipModel.Shown -> + MostImportantChipResult( + mostImportantChip = + InternalChipModel.Shown(ChipType.ScreenRecord, bundle.screenRecord), + remainingChips = + bundle.copy( + screenRecord = OngoingActivityChipModel.Hidden(), + // Screen recording also activates the media projection APIs, which + // means that whenever the screen recording chip is active, the + // share-to-app chip would also be active. (Screen recording is a + // special case of share-to-app, where the app receiving the share is + // specifically System UI.) + // We want only the screen-recording-specific chip to be shown in this + // case. If we did have screen recording as the primary chip, we need to + // suppress the share-to-app chip to make sure they don't both show. + // See b/296461748. + shareToApp = OngoingActivityChipModel.Hidden(), + ) + ) + bundle.shareToApp is OngoingActivityChipModel.Shown -> + MostImportantChipResult( + mostImportantChip = + InternalChipModel.Shown(ChipType.ShareToApp, bundle.shareToApp), + remainingChips = bundle.copy(shareToApp = OngoingActivityChipModel.Hidden()), + ) + bundle.castToOtherDevice is OngoingActivityChipModel.Shown -> + MostImportantChipResult( + mostImportantChip = + InternalChipModel.Shown( + ChipType.CastToOtherDevice, + bundle.castToOtherDevice, + ), + remainingChips = + bundle.copy(castToOtherDevice = OngoingActivityChipModel.Hidden()), + ) + bundle.call is OngoingActivityChipModel.Shown -> + MostImportantChipResult( + mostImportantChip = InternalChipModel.Shown(ChipType.Call, bundle.call), + remainingChips = bundle.copy(call = OngoingActivityChipModel.Hidden()), + ) + bundle.demoRon is OngoingActivityChipModel.Shown -> { + StatusBarRonChips.assertInNewMode() + MostImportantChipResult( + mostImportantChip = InternalChipModel.Shown(ChipType.DemoRon, bundle.demoRon), + remainingChips = bundle.copy(demoRon = OngoingActivityChipModel.Hidden()), + ) } - // Some of the chips could have timers in them and we don't want the start time - // for those timers to get reset for any reason. So, as soon as any subscriber has - // requested the chip information, we maintain it forever by using - // [SharingStarted.Lazily]. See b/347726238. - .stateIn(scope, SharingStarted.Lazily, OngoingActivityChipModel.Hidden()) + else -> { + // We should only get here if all chip types are hidden + check(bundle.screenRecord is OngoingActivityChipModel.Hidden) + check(bundle.shareToApp is OngoingActivityChipModel.Hidden) + check(bundle.castToOtherDevice is OngoingActivityChipModel.Hidden) + check(bundle.call is OngoingActivityChipModel.Hidden) + check(bundle.demoRon is OngoingActivityChipModel.Hidden) + MostImportantChipResult( + mostImportantChip = + InternalChipModel.Hidden( + screenRecord = bundle.screenRecord, + shareToApp = bundle.shareToApp, + castToOtherDevice = bundle.castToOtherDevice, + call = bundle.call, + demoRon = bundle.demoRon, + ), + // All the chips are already hidden, so no need to filter anything out of the + // bundle. + remainingChips = bundle, + ) + } + } + } + + private fun createOutputModel( + old: InternalChipModel, + new: InternalChipModel, + ): OngoingActivityChipModel { + return if (old is InternalChipModel.Shown && new is InternalChipModel.Hidden) { + // If we're transitioning from showing the chip to hiding the chip, different + // chips require different animation behaviors. For example, the screen share + // chips shouldn't animate if the user stopped the screen share from the dialog + // (see b/353249803#comment4), but the call chip should always animate. + // + // This `when` block makes sure that when we're transitioning from Shown to + // Hidden, we check what chip type was previously showing and we use that chip + // type's hide animation behavior. + return when (old.type) { + ChipType.ScreenRecord -> new.screenRecord + ChipType.ShareToApp -> new.shareToApp + ChipType.CastToOtherDevice -> new.castToOtherDevice + ChipType.Call -> new.call + ChipType.DemoRon -> new.demoRon + } + } else if (new is InternalChipModel.Shown) { + // If we have a chip to show, always show it. + new.model + } else { + // In the Hidden -> Hidden transition, it shouldn't matter which hidden model we + // choose because no animation should happen regardless. + OngoingActivityChipModel.Hidden() + } + } companion object { private const val TAG = "ChipsViewModel" @@ -203,5 +346,11 @@ constructor( call = OngoingActivityChipModel.Hidden(), demoRon = OngoingActivityChipModel.Hidden(), ) + + private val DEFAULT_MULTIPLE_INTERNAL_HIDDEN_MODEL = + InternalMultipleOngoingActivityChipsModel( + primary = DEFAULT_INTERNAL_HIDDEN_MODEL, + secondary = DEFAULT_INTERNAL_HIDDEN_MODEL, + ) } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/SharedNotificationContainerBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/SharedNotificationContainerBinder.kt index aa1911e4cd2a..5ae5a3213954 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/SharedNotificationContainerBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/SharedNotificationContainerBinder.kt @@ -62,7 +62,6 @@ constructor( viewModel: SharedNotificationContainerViewModel, ): DisposableHandle { val disposables = DisposableHandles() - disposables += view.repeatWhenAttached { repeatOnLifecycle(Lifecycle.State.CREATED) { @@ -87,10 +86,7 @@ constructor( } val burnInParams = MutableStateFlow(BurnInParameters()) - val viewState = - ViewStateAccessor( - alpha = { controller.getAlpha() }, - ) + val viewState = ViewStateAccessor(alpha = { controller.getAlpha() }) /* * For animation sensitive coroutines, immediately run just like applicationScope does @@ -108,7 +104,7 @@ constructor( addUpdateListener { animation -> controller.setMaxAlphaForKeyguard( animation.animatedFraction, - "SharedNotificationContainerVB (collapseFadeIn)" + "SharedNotificationContainerVB (collapseFadeIn)", ) } start() @@ -153,7 +149,7 @@ constructor( launch { viewModel.translationX.collect { x -> controller.translationX = x } } launch { - viewModel.keyguardAlpha(viewState).collect { + viewModel.keyguardAlpha(viewState, this).collect { controller.setMaxAlphaForKeyguard(it, "SharedNotificationContainerVB") } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModel.kt index aed00d8cd5be..e34eb61c5cbd 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModel.kt @@ -20,7 +20,6 @@ package com.android.systemui.statusbar.notification.stack.ui.viewmodel import androidx.annotation.VisibleForTesting -import com.android.compose.animation.scene.SceneKey import com.android.systemui.common.shared.model.NotificationContainerBounds import com.android.systemui.communal.domain.interactor.CommunalSceneInteractor import com.android.systemui.dagger.SysUISingleton @@ -29,7 +28,6 @@ import com.android.systemui.dump.DumpManager import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor import com.android.systemui.keyguard.shared.model.Edge -import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.KeyguardState.ALTERNATE_BOUNCER import com.android.systemui.keyguard.shared.model.KeyguardState.AOD import com.android.systemui.keyguard.shared.model.KeyguardState.DOZING @@ -41,7 +39,6 @@ import com.android.systemui.keyguard.shared.model.KeyguardState.OCCLUDED import com.android.systemui.keyguard.shared.model.KeyguardState.PRIMARY_BOUNCER import com.android.systemui.keyguard.shared.model.StatusBarState.SHADE import com.android.systemui.keyguard.shared.model.StatusBarState.SHADE_LOCKED -import com.android.systemui.keyguard.shared.model.TransitionState.RUNNING import com.android.systemui.keyguard.ui.viewmodel.AlternateBouncerToGoneTransitionViewModel import com.android.systemui.keyguard.ui.viewmodel.AodBurnInViewModel import com.android.systemui.keyguard.ui.viewmodel.AodToGoneTransitionViewModel @@ -73,7 +70,6 @@ import com.android.systemui.shade.domain.interactor.ShadeInteractor import com.android.systemui.statusbar.notification.stack.domain.interactor.NotificationStackAppearanceInteractor import com.android.systemui.statusbar.notification.stack.domain.interactor.SharedNotificationContainerInteractor import com.android.systemui.unfold.domain.interactor.UnfoldTransitionInteractor -import com.android.systemui.util.kotlin.BooleanFlowOperators.allOf import com.android.systemui.util.kotlin.BooleanFlowOperators.anyOf import com.android.systemui.util.kotlin.FlowDumperImpl import com.android.systemui.util.kotlin.Utils.Companion.sample as sampleCombine @@ -166,10 +162,9 @@ constructor( * before the other. */ private val isShadeLocked: Flow<Boolean> = - combine( - keyguardInteractor.statusBarState.map { it == SHADE_LOCKED }, - isAnyExpanded, - ) { isShadeLocked, isAnyExpanded -> + combine(keyguardInteractor.statusBarState.map { it == SHADE_LOCKED }, isAnyExpanded) { + isShadeLocked, + isAnyExpanded -> isShadeLocked && isAnyExpanded } .stateIn( @@ -220,23 +215,20 @@ constructor( keyguardTransitionInteractor.isFinishedIn(ALTERNATE_BOUNCER), keyguardTransitionInteractor.isFinishedIn( scene = Scenes.Bouncer, - stateWithoutSceneContainer = PRIMARY_BOUNCER + stateWithoutSceneContainer = PRIMARY_BOUNCER, ), keyguardTransitionInteractor.transitionValue(LOCKSCREEN).map { it > 0f }, ) .stateIn( scope = applicationScope, started = SharingStarted.Eagerly, - initialValue = false + initialValue = false, ) .dumpValue("isOnLockscreen") /** Are we purely on the keyguard without the shade/qs? */ val isOnLockscreenWithoutShade: Flow<Boolean> = - combine( - isOnLockscreen, - isAnyExpanded, - ) { isKeyguard, isAnyExpanded -> + combine(isOnLockscreen, isAnyExpanded) { isKeyguard, isAnyExpanded -> isKeyguard && !isAnyExpanded } .stateIn( @@ -251,16 +243,16 @@ constructor( combine( keyguardTransitionInteractor.isFinishedIn( scene = Scenes.Communal, - stateWithoutSceneContainer = GLANCEABLE_HUB + stateWithoutSceneContainer = GLANCEABLE_HUB, ), anyOf( keyguardTransitionInteractor.isInTransition( edge = Edge.create(to = Scenes.Communal), - edgeWithoutSceneContainer = Edge.create(to = GLANCEABLE_HUB) + edgeWithoutSceneContainer = Edge.create(to = GLANCEABLE_HUB), ), keyguardTransitionInteractor.isInTransition( edge = Edge.create(from = Scenes.Communal), - edgeWithoutSceneContainer = Edge.create(from = GLANCEABLE_HUB) + edgeWithoutSceneContainer = Edge.create(from = GLANCEABLE_HUB), ), ), ) { isOnGlanceableHub, transitioningToOrFromHub -> @@ -271,10 +263,7 @@ constructor( /** Are we purely on the glanceable hub without the shade/qs? */ val isOnGlanceableHubWithoutShade: Flow<Boolean> = - combine( - isOnGlanceableHub, - isAnyExpanded, - ) { isGlanceableHub, isAnyExpanded -> + combine(isOnGlanceableHub, isAnyExpanded) { isGlanceableHub, isAnyExpanded -> isGlanceableHub && !isAnyExpanded } .stateIn( @@ -286,10 +275,9 @@ constructor( /** Are we on the dream without the shade/qs? */ private val isDreamingWithoutShade: Flow<Boolean> = - combine( - keyguardTransitionInteractor.isFinishedIn(DREAMING), - isAnyExpanded, - ) { isDreaming, isAnyExpanded -> + combine(keyguardTransitionInteractor.isFinishedIn(DREAMING), isAnyExpanded) { + isDreaming, + isAnyExpanded -> isDreaming && !isAnyExpanded } .stateIn( @@ -310,7 +298,7 @@ constructor( keyguardTransitionInteractor.isInTransition( edge = Edge.create(from = LOCKSCREEN, to = AOD) ), - ::Pair + ::Pair, ) .transformWhile { (isOnLockscreenWithoutShade, aodTransitionIsRunning) -> // Wait until the AOD transition is complete before terminating @@ -375,7 +363,7 @@ constructor( keyguardTransitionInteractor.isInTransition, shadeInteractor.qsExpansion, ) - .onStart { emit(Triple(0f, false, 0f)) } + .onStart { emit(Triple(0f, false, 0f)) }, ) { onLockscreen, bounds, paddingTop, (top, isInTransitionToAnyState, qsExpansion) -> if (onLockscreen) { bounds.copy(top = bounds.top - paddingTop) @@ -383,10 +371,7 @@ constructor( // When QS expansion > 0, it should directly set the top padding so do not // animate it val animate = qsExpansion == 0f && !isInTransitionToAnyState - bounds.copy( - top = top, - isAnimated = animate, - ) + bounds.copy(top = top, isAnimated = animate) } } .stateIn( @@ -404,10 +389,9 @@ constructor( private val alphaForShadeAndQsExpansion: Flow<Float> = interactor.configurationBasedDimensions .flatMapLatest { configurationBasedDimensions -> - combineTransform( - shadeInteractor.shadeExpansion, - shadeInteractor.qsExpansion, - ) { shadeExpansion, qsExpansion -> + combineTransform(shadeInteractor.shadeExpansion, shadeInteractor.qsExpansion) { + shadeExpansion, + qsExpansion -> if (shadeExpansion > 0f || qsExpansion > 0f) { if (configurationBasedDimensions.useSplitShade) { emit(1f) @@ -424,47 +408,6 @@ constructor( .onStart { emit(1f) } .dumpWhileCollecting("alphaForShadeAndQsExpansion") - private val isTransitioningToHiddenKeyguard: Flow<Boolean> = - flow { - while (currentCoroutineContext().isActive) { - emit(false) - // Ensure states are inactive to start - allOf(isNotOnState(OCCLUDED), isNotOnState(GONE, Scenes.Gone)).first { it } - // Wait for a qualifying transition to begin - anyOf( - transitionToIsRunning(Edge.create(to = OCCLUDED)), - transitionToIsRunning( - edge = Edge.create(to = Scenes.Gone), - edgeWithoutSceneContainer = Edge.create(to = GONE) - ) - ) - .first { it } - emit(true) - // Now await the signal that SHADE state has been reached or the transition was - // reversed. Until SHADE state has been replaced it is the only source of when - // it is considered safe to reset alpha to 1f for HUNs. - combine( - keyguardInteractor.statusBarState, - allOf(isNotOnState(OCCLUDED), isNotOnState(GONE, Scenes.Gone)) - ) { statusBarState, stateIsReversed -> - statusBarState == SHADE || stateIsReversed - } - .first { it } - } - } - .dumpWhileCollecting("isTransitioningToHiddenKeyguard") - - private fun isNotOnState(stateWithoutSceneContainer: KeyguardState, scene: SceneKey? = null) = - keyguardTransitionInteractor - .transitionValue(scene = scene, stateWithoutSceneContainer = stateWithoutSceneContainer) - .map { it == 0f } - - private fun transitionToIsRunning(edge: Edge, edgeWithoutSceneContainer: Edge? = null) = - keyguardTransitionInteractor - .transition(edge = edge, edgeWithoutSceneContainer = edgeWithoutSceneContainer) - .map { it.value > 0f && it.transitionState == RUNNING } - .onStart { emit(false) } - val panelAlpha = keyguardInteractor.panelAlpha private fun bouncerToGoneNotificationAlpha(viewState: ViewStateAccessor): Flow<Float> = @@ -478,49 +421,72 @@ constructor( } .dumpWhileCollecting("bouncerToGoneNotificationAlpha") - fun keyguardAlpha(viewState: ViewStateAccessor): Flow<Float> { - // All transition view models are mututally exclusive, and safe to merge - val alphaTransitions = - merge( - keyguardInteractor.dismissAlpha.dumpWhileCollecting( - "keyguardInteractor.dismissAlpha" + private fun alphaForTransitions(viewState: ViewStateAccessor): Flow<Float> { + return merge( + keyguardInteractor.dismissAlpha.dumpWhileCollecting("keyguardInteractor.dismissAlpha"), + // All transition view models are mututally exclusive, and safe to merge + bouncerToGoneNotificationAlpha(viewState), + aodToGoneTransitionViewModel.notificationAlpha(viewState), + aodToLockscreenTransitionViewModel.notificationAlpha, + aodToOccludedTransitionViewModel.lockscreenAlpha(viewState), + dozingToLockscreenTransitionViewModel.lockscreenAlpha, + dozingToOccludedTransitionViewModel.lockscreenAlpha(viewState), + dreamingToLockscreenTransitionViewModel.lockscreenAlpha, + goneToAodTransitionViewModel.notificationAlpha, + goneToDreamingTransitionViewModel.lockscreenAlpha, + goneToDozingTransitionViewModel.notificationAlpha, + goneToLockscreenTransitionViewModel.lockscreenAlpha, + lockscreenToDreamingTransitionViewModel.lockscreenAlpha, + lockscreenToGoneTransitionViewModel.notificationAlpha(viewState), + lockscreenToOccludedTransitionViewModel.lockscreenAlpha, + lockscreenToPrimaryBouncerTransitionViewModel.lockscreenAlpha, + occludedToAodTransitionViewModel.lockscreenAlpha, + occludedToGoneTransitionViewModel.notificationAlpha(viewState), + occludedToLockscreenTransitionViewModel.lockscreenAlpha, + primaryBouncerToLockscreenTransitionViewModel.lockscreenAlpha(viewState), + glanceableHubToLockscreenTransitionViewModel.keyguardAlpha, + lockscreenToGlanceableHubTransitionViewModel.keyguardAlpha, + ) + } + + fun keyguardAlpha(viewState: ViewStateAccessor, scope: CoroutineScope): Flow<Float> { + // Transitions are not (yet) authoritative for NSSL; they still rely on StatusBarState to + // help determine when the device has fully moved to GONE or OCCLUDED state. Once SHADE + // state has been set, let shade alpha take over + val isKeyguardNotVisible = + combine( + anyOf( + keyguardTransitionInteractor.transitionValue(OCCLUDED).map { it == 1f }, + keyguardTransitionInteractor + .transitionValue(scene = Scenes.Gone, stateWithoutSceneContainer = GONE) + .map { it == 1f }, ), - bouncerToGoneNotificationAlpha(viewState), - aodToGoneTransitionViewModel.notificationAlpha(viewState), - aodToLockscreenTransitionViewModel.notificationAlpha, - aodToOccludedTransitionViewModel.lockscreenAlpha(viewState), - dozingToLockscreenTransitionViewModel.lockscreenAlpha, - dozingToOccludedTransitionViewModel.lockscreenAlpha(viewState), - dreamingToLockscreenTransitionViewModel.lockscreenAlpha, - goneToAodTransitionViewModel.notificationAlpha, - goneToDreamingTransitionViewModel.lockscreenAlpha, - goneToDozingTransitionViewModel.notificationAlpha, - goneToLockscreenTransitionViewModel.lockscreenAlpha, - lockscreenToDreamingTransitionViewModel.lockscreenAlpha, - lockscreenToGoneTransitionViewModel.notificationAlpha(viewState), - lockscreenToOccludedTransitionViewModel.lockscreenAlpha, - lockscreenToPrimaryBouncerTransitionViewModel.lockscreenAlpha, - occludedToAodTransitionViewModel.lockscreenAlpha, - occludedToGoneTransitionViewModel.notificationAlpha(viewState), - occludedToLockscreenTransitionViewModel.lockscreenAlpha, - primaryBouncerToLockscreenTransitionViewModel.lockscreenAlpha(viewState), - glanceableHubToLockscreenTransitionViewModel.keyguardAlpha, - lockscreenToGlanceableHubTransitionViewModel.keyguardAlpha, - ) + keyguardInteractor.statusBarState, + ) { isKeyguardNotVisibleInState, statusBarState -> + isKeyguardNotVisibleInState && statusBarState == SHADE + } - return merge( - alphaTransitions, - // These remaining cases handle alpha changes within an existing state, such as - // shade expansion or swipe to dismiss - combineTransform( - isTransitioningToHiddenKeyguard, - alphaForShadeAndQsExpansion, - ) { isTransitioningToHiddenKeyguard, alphaForShadeAndQsExpansion -> - if (!isTransitioningToHiddenKeyguard) { - emit(alphaForShadeAndQsExpansion) - } - }, - ) + // This needs to continue collecting the current value so that when it is selected in the + // flatMapLatest below, the last value gets emitted, to avoid the randomness of `merge`. + val alphaForTransitionsAndShade = + merge(alphaForTransitions(viewState), alphaForShadeAndQsExpansion) + .stateIn( + // Use view-level scope instead of ApplicationScope, to prevent collection that + // never stops + scope = scope, + started = SharingStarted.Eagerly, + initialValue = 1f, + ) + .dumpValue("alphaForTransitionsAndShade") + + return isKeyguardNotVisible + .flatMapLatest { isKeyguardNotVisible -> + if (isKeyguardNotVisible) { + alphaForShadeAndQsExpansion + } else { + alphaForTransitionsAndShade + } + } .distinctUntilChanged() .dumpWhileCollecting("keyguardAlpha") } @@ -543,9 +509,8 @@ constructor( ) // Manually emit on start because [notificationAlpha] only starts emitting // when transitions start. - .onStart { emit(1f) } - ) { isOnGlanceableHubWithoutShade, isOnLockscreen, isDreamingWithoutShade, alpha, - -> + .onStart { emit(1f) }, + ) { isOnGlanceableHubWithoutShade, isOnLockscreen, isDreamingWithoutShade, alpha -> if ((isOnGlanceableHubWithoutShade || isDreamingWithoutShade) && !isOnLockscreen) { // Notifications should not be visible on the glanceable hub. // TODO(b/321075734): implement a way to actually set the notifications to @@ -580,7 +545,7 @@ constructor( merge( keyguardInteractor.keyguardTranslationY, occludedToLockscreenTransitionViewModel.lockscreenTranslationY, - ) + ), ) { burnInY, isOnLockscreenWithoutShade, translationY -> if (isOnLockscreenWithoutShade) { burnInY + translationY @@ -604,7 +569,7 @@ constructor( unfoldTransitionInteractor.unfoldTranslationX(isOnStartSide = false) } else { emptyFlow() - } + }, ) .dumpWhileCollecting("translationX") @@ -634,7 +599,7 @@ constructor( primaryBouncerToGoneTransitionViewModel.showAllNotifications, alternateBouncerToGoneTransitionViewModel.showAllNotifications, ) - .onStart { emit(false) } + .onStart { emit(false) }, ) { isOnLockscreen, statusBarState, showAllNotifications -> statusBarState == SHADE_LOCKED || !isOnLockscreen || showAllNotifications } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ActivityStarterInternalImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ActivityStarterInternalImpl.kt index d4ef42c687e5..5b37468c9da6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ActivityStarterInternalImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ActivityStarterInternalImpl.kt @@ -470,9 +470,6 @@ constructor( if (dismissShade) { shadeControllerLazy.get().collapseShadeForActivityStart() } - if (Flags.communalHub()) { - communalSceneInteractor.changeSceneForActivityStartOnDismissKeyguard() - } return deferred } 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 4a0fdeebe82b..659cee3023a1 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 @@ -55,6 +55,7 @@ import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.OperatorNameView; import com.android.systemui.statusbar.OperatorNameViewController; import com.android.systemui.statusbar.StatusBarState; +import com.android.systemui.statusbar.chips.shared.StatusBarRonChips; import com.android.systemui.statusbar.disableflags.DisableFlagsLogger.DisableState; import com.android.systemui.statusbar.events.SystemStatusAnimationCallback; import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler; @@ -122,6 +123,7 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue private LinearLayout mEndSideContent; private View mClockView; private View mPrimaryOngoingActivityChip; + private View mSecondaryOngoingActivityChip; private View mNotificationIconAreaInner; // Visibilities come in from external system callers via disable flags, but we also sometimes // modify the visibilities internally. We need to store both so that we don't accidentally @@ -212,9 +214,16 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue private boolean mHomeStatusBarAllowedByScene = true; /** - * True if there's an active ongoing activity that should be showing a chip and false otherwise. + * True if there's a primary active ongoing activity that should be showing a chip and false + * otherwise. */ - private boolean mHasOngoingActivity; + private boolean mHasPrimaryOngoingActivity; + + /** + * True if there's a secondary active ongoing activity that should be showing a chip and false + * otherwise. + */ + private boolean mHasSecondaryOngoingActivity; /** * Listener that updates {@link #mWaitingForWindowStateChangeAfterCameraLaunch} when it receives @@ -355,6 +364,8 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue mEndSideAlphaController = new MultiSourceMinAlphaController(mEndSideContent); mClockView = mStatusBar.findViewById(R.id.clock); mPrimaryOngoingActivityChip = mStatusBar.findViewById(R.id.ongoing_activity_chip_primary); + mSecondaryOngoingActivityChip = + mStatusBar.findViewById(R.id.ongoing_activity_chip_secondary); showEndSideContent(false); showClock(false); initOperatorName(); @@ -508,8 +519,11 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue @Override public void onOngoingActivityStatusChanged( - boolean hasOngoingActivity, boolean shouldAnimate) { - mHasOngoingActivity = hasOngoingActivity; + boolean hasPrimaryOngoingActivity, + boolean hasSecondaryOngoingActivity, + boolean shouldAnimate) { + mHasPrimaryOngoingActivity = hasPrimaryOngoingActivity; + mHasSecondaryOngoingActivity = hasSecondaryOngoingActivity; updateStatusBarVisibilities(shouldAnimate); } @@ -554,7 +568,7 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue boolean notifsChanged = newModel.getShowNotificationIcons() != previousModel.getShowNotificationIcons(); boolean ongoingActivityChanged = - newModel.getShowOngoingActivityChip() != previousModel.getShowOngoingActivityChip(); + newModel.isOngoingActivityStatusDifferentFrom(previousModel); if (notifsChanged || ongoingActivityChanged) { updateNotificationIconAreaAndOngoingActivityChip(animate); } @@ -597,21 +611,26 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue boolean showClock = externalModel.getShowClock() && !headsUpVisible; - boolean showOngoingActivityChip; + boolean showPrimaryOngoingActivityChip; if (Flags.statusBarScreenSharingChips()) { // If this flag is on, the ongoing activity status comes from - // CollapsedStatusBarViewBinder, which updates the mHasOngoingActivity variable. - showOngoingActivityChip = mHasOngoingActivity; + // CollapsedStatusBarViewBinder, which updates the mHasPrimaryOngoingActivity variable. + showPrimaryOngoingActivityChip = mHasPrimaryOngoingActivity; } else { // If this flag is off, the only ongoing activity is the ongoing call, and we pull it // from the controller directly. - showOngoingActivityChip = mOngoingCallController.hasOngoingCall(); + showPrimaryOngoingActivityChip = mOngoingCallController.hasOngoingCall(); } + boolean showSecondaryOngoingActivityChip = + Flags.statusBarScreenSharingChips() + && StatusBarRonChips.isEnabled() + && mHasSecondaryOngoingActivity; return new StatusBarVisibilityModel( showClock, externalModel.getShowNotificationIcons(), - showOngoingActivityChip && !headsUpVisible, + showPrimaryOngoingActivityChip && !headsUpVisible, + showSecondaryOngoingActivityChip && !headsUpVisible, externalModel.getShowSystemInfo()); } @@ -622,7 +641,7 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue private void updateNotificationIconAreaAndOngoingActivityChip(boolean animate) { StatusBarVisibilityModel visibilityModel = mLastModifiedVisibility; boolean disableNotifications = !visibilityModel.getShowNotificationIcons(); - boolean hasOngoingActivity = visibilityModel.getShowOngoingActivityChip(); + boolean hasOngoingActivity = visibilityModel.getShowPrimaryOngoingActivityChip(); // Hide notifications if the disable flag is set or we have an ongoing activity. if (disableNotifications || hasOngoingActivity) { @@ -634,12 +653,24 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue // Show the ongoing activity chip only if there is an ongoing activity *and* notification // icons are allowed. (The ongoing activity chip occupies the same area as the notification, // icons so if the icons are disabled then the activity chip should be, too.) - boolean showOngoingActivityChip = hasOngoingActivity && !disableNotifications; - if (showOngoingActivityChip) { + boolean showPrimaryOngoingActivityChip = + visibilityModel.getShowPrimaryOngoingActivityChip() && !disableNotifications; + if (showPrimaryOngoingActivityChip) { showPrimaryOngoingActivityChip(animate); } else { hidePrimaryOngoingActivityChip(animate); } + + boolean showSecondaryOngoingActivityChip = + // Secondary chips are only supported when RONs are enabled. + StatusBarRonChips.isEnabled() + && visibilityModel.getShowSecondaryOngoingActivityChip() + && !disableNotifications; + if (showSecondaryOngoingActivityChip) { + showSecondaryOngoingActivityChip(animate); + } else { + hideSecondaryOngoingActivityChip(animate); + } } private boolean shouldHideStatusBar() { @@ -745,6 +776,15 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue animateShow(mPrimaryOngoingActivityChip, animate); } + private void hideSecondaryOngoingActivityChip(boolean animate) { + animateHiddenState(mSecondaryOngoingActivityChip, View.GONE, animate); + } + + private void showSecondaryOngoingActivityChip(boolean animate) { + StatusBarRonChips.assertInNewMode(); + animateShow(mSecondaryOngoingActivityChip, animate); + } + /** * If panel is expanded/expanding it usually means QS shade is opening, so * don't set the clock GONE otherwise it'll mess up the animation. @@ -850,6 +890,7 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue private void initOngoingCallChip() { mOngoingCallController.addCallback(mOngoingCallListener); + // TODO(b/364653005): Do we also need to set the secondary activity chip? mOngoingCallController.setChipView(mPrimaryOngoingActivityChip); } @@ -908,7 +949,8 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue @Override public void dump(PrintWriter printWriter, String[] args) { IndentingPrintWriter pw = new IndentingPrintWriter(printWriter, /* singleIndent= */" "); - pw.println("mHasOngoingActivity=" + mHasOngoingActivity); + pw.println("mHasPrimaryOngoingActivity=" + mHasPrimaryOngoingActivity); + pw.println("mHasSecondaryOngoingActivity=" + mHasSecondaryOngoingActivity); pw.println("mAnimationsEnabled=" + mAnimationsEnabled); StatusBarFragmentComponent component = mStatusBarFragmentComponent; if (component == null) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentLogger.kt index 0a19023d9e8c..deef88635f27 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentLogger.kt @@ -16,16 +16,18 @@ package com.android.systemui.statusbar.phone.fragment -import com.android.systemui.log.dagger.CollapsedSbFragmentLog import com.android.systemui.log.LogBuffer import com.android.systemui.log.core.LogLevel +import com.android.systemui.log.dagger.CollapsedSbFragmentLog import com.android.systemui.statusbar.disableflags.DisableFlagsLogger import javax.inject.Inject /** Used by [CollapsedStatusBarFragment] to log messages to a [LogBuffer]. */ -class CollapsedStatusBarFragmentLogger @Inject constructor( - @CollapsedSbFragmentLog private val buffer: LogBuffer, - private val disableFlagsLogger: DisableFlagsLogger, +class CollapsedStatusBarFragmentLogger +@Inject +constructor( + @CollapsedSbFragmentLog private val buffer: LogBuffer, + private val disableFlagsLogger: DisableFlagsLogger, ) { /** @@ -38,17 +40,17 @@ class CollapsedStatusBarFragmentLogger @Inject constructor( new: DisableFlagsLogger.DisableState, ) { buffer.log( - TAG, - LogLevel.INFO, - { - int1 = new.disable1 - int2 = new.disable2 - }, - { - disableFlagsLogger.getDisableFlagsString( - DisableFlagsLogger.DisableState(int1, int2), - ) - } + TAG, + LogLevel.INFO, + { + int1 = new.disable1 + int2 = new.disable2 + }, + { + disableFlagsLogger.getDisableFlagsString( + DisableFlagsLogger.DisableState(int1, int2), + ) + } ) } @@ -59,13 +61,16 @@ class CollapsedStatusBarFragmentLogger @Inject constructor( { bool1 = model.showClock bool2 = model.showNotificationIcons - bool3 = model.showOngoingActivityChip + bool3 = model.showPrimaryOngoingActivityChip + int1 = if (model.showSecondaryOngoingActivityChip) 1 else 0 bool4 = model.showSystemInfo }, - { "New visibilities calculated internally. " + + { + "New visibilities calculated internally. " + "showClock=$bool1 " + "showNotificationIcons=$bool2 " + - "showOngoingActivityChip=$bool3 " + + "showPrimaryOngoingActivityChip=$bool3 " + + "showSecondaryOngoingActivityChip=${if (int1 == 1) "true" else "false"}" + "showSystemInfo=$bool4" } ) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/StatusBarVisibilityModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/StatusBarVisibilityModel.kt index 9255e6323d31..e9e9a4ef6625 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/StatusBarVisibilityModel.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/StatusBarVisibilityModel.kt @@ -26,9 +26,15 @@ import android.app.StatusBarManager.DISABLE_SYSTEM_INFO data class StatusBarVisibilityModel( val showClock: Boolean, val showNotificationIcons: Boolean, - val showOngoingActivityChip: Boolean, + val showPrimaryOngoingActivityChip: Boolean, + val showSecondaryOngoingActivityChip: Boolean, val showSystemInfo: Boolean, ) { + fun isOngoingActivityStatusDifferentFrom(other: StatusBarVisibilityModel): Boolean { + return this.showPrimaryOngoingActivityChip != other.showPrimaryOngoingActivityChip || + this.showSecondaryOngoingActivityChip != other.showSecondaryOngoingActivityChip + } + companion object { /** Creates the default model. */ @JvmStatic @@ -42,7 +48,8 @@ data class StatusBarVisibilityModel( return StatusBarVisibilityModel( showClock = false, showNotificationIcons = false, - showOngoingActivityChip = false, + showPrimaryOngoingActivityChip = false, + showSecondaryOngoingActivityChip = false, showSystemInfo = false, ) } @@ -59,7 +66,8 @@ data class StatusBarVisibilityModel( showNotificationIcons = (disabled1 and DISABLE_NOTIFICATION_ICONS) == 0, // TODO(b/279899176): [CollapsedStatusBarFragment] always overwrites this with the // value of [OngoingCallController]. Do we need to process the flag here? - showOngoingActivityChip = (disabled1 and DISABLE_ONGOING_CALL_CHIP) == 0, + showPrimaryOngoingActivityChip = (disabled1 and DISABLE_ONGOING_CALL_CHIP) == 0, + showSecondaryOngoingActivityChip = (disabled1 and DISABLE_ONGOING_CALL_CHIP) == 0, showSystemInfo = (disabled1 and DISABLE_SYSTEM_INFO) == 0 && (disabled2 and DISABLE2_SYSTEM_ICONS) == 0 diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/binder/CollapsedStatusBarViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/binder/CollapsedStatusBarViewBinder.kt index 87d0e6420128..49eabba5c2b0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/binder/CollapsedStatusBarViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/binder/CollapsedStatusBarViewBinder.kt @@ -80,7 +80,7 @@ class CollapsedStatusBarViewBinderImpl @Inject constructor() : CollapsedStatusBa } } - if (Flags.statusBarScreenSharingChips()) { + if (Flags.statusBarScreenSharingChips() && !Flags.statusBarRonChips()) { val primaryChipView: View = view.requireViewById(R.id.ongoing_activity_chip_primary) launch { @@ -89,12 +89,14 @@ class CollapsedStatusBarViewBinderImpl @Inject constructor() : CollapsedStatusBa when (primaryChipModel) { is OngoingActivityChipModel.Shown -> listener.onOngoingActivityStatusChanged( - hasOngoingActivity = true, + hasPrimaryOngoingActivity = true, + hasSecondaryOngoingActivity = false, shouldAnimate = true, ) is OngoingActivityChipModel.Hidden -> listener.onOngoingActivityStatusChanged( - hasOngoingActivity = false, + hasPrimaryOngoingActivity = false, + hasSecondaryOngoingActivity = false, shouldAnimate = primaryChipModel.shouldAnimate, ) } @@ -102,6 +104,29 @@ class CollapsedStatusBarViewBinderImpl @Inject constructor() : CollapsedStatusBa } } + if (Flags.statusBarScreenSharingChips() && Flags.statusBarRonChips()) { + val primaryChipView: View = + view.requireViewById(R.id.ongoing_activity_chip_primary) + val secondaryChipView: View = + view.requireViewById(R.id.ongoing_activity_chip_secondary) + launch { + viewModel.ongoingActivityChips.collect { chips -> + OngoingActivityChipBinder.bind(chips.primary, primaryChipView) + // TODO(b/364653005): Don't show the secondary chip if there isn't + // enough space for it. + OngoingActivityChipBinder.bind(chips.secondary, secondaryChipView) + listener.onOngoingActivityStatusChanged( + hasPrimaryOngoingActivity = + chips.primary is OngoingActivityChipModel.Shown, + hasSecondaryOngoingActivity = + chips.secondary is OngoingActivityChipModel.Shown, + // TODO(b/364653005): Figure out the animation story here. + shouldAnimate = true, + ) + } + } + } + if (SceneContainerFlag.isEnabled) { launch { viewModel.isHomeStatusBarAllowedByScene.collect { @@ -161,7 +186,11 @@ interface StatusBarVisibilityChangeListener { * @param shouldAnimate true if the chip should animate in/out, and false if the chip should * immediately appear/disappear. */ - fun onOngoingActivityStatusChanged(hasOngoingActivity: Boolean, shouldAnimate: Boolean) + fun onOngoingActivityStatusChanged( + hasPrimaryOngoingActivity: Boolean, + hasSecondaryOngoingActivity: Boolean, + shouldAnimate: Boolean, + ) /** * Called when the scene state has changed such that the home status bar is newly allowed or no diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/CollapsedStatusBarViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/CollapsedStatusBarViewModel.kt index 547423156eb8..9cce2b8fb72b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/CollapsedStatusBarViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/CollapsedStatusBarViewModel.kt @@ -27,6 +27,7 @@ import com.android.systemui.keyguard.shared.model.TransitionState import com.android.systemui.scene.domain.interactor.SceneContainerOcclusionInteractor import com.android.systemui.scene.domain.interactor.SceneInteractor import com.android.systemui.scene.shared.model.Scenes +import com.android.systemui.statusbar.chips.ui.model.MultipleOngoingActivityChipsModel import com.android.systemui.statusbar.chips.ui.model.OngoingActivityChipModel import com.android.systemui.statusbar.chips.ui.viewmodel.OngoingActivityChipsViewModel import com.android.systemui.statusbar.notification.domain.interactor.ActiveNotificationsInteractor @@ -71,6 +72,12 @@ interface CollapsedStatusBarViewModel { val primaryOngoingActivityChip: StateFlow<OngoingActivityChipModel> /** + * The multiple ongoing activity chips that should be shown on the left-hand side of the status + * bar. + */ + val ongoingActivityChips: StateFlow<MultipleOngoingActivityChipsModel> + + /** * 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. */ @@ -113,6 +120,8 @@ constructor( override val primaryOngoingActivityChip = ongoingActivityChipsViewModel.primaryChip + override val ongoingActivityChips = ongoingActivityChipsViewModel.chips + override val isHomeStatusBarAllowedByScene: StateFlow<Boolean> = combine( sceneInteractor.currentScene, diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/BackGestureMonitor.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/BackGestureMonitor.kt index e3666ce66d5c..084da2c59776 100644 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/BackGestureMonitor.kt +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/BackGestureMonitor.kt @@ -23,7 +23,7 @@ class BackGestureMonitor( override val gestureDistanceThresholdPx: Int, override val gestureStateChangedCallback: (GestureState) -> Unit ) : - TouchpadGestureMonitor by ThreeFingerGestureMonitor( + TouchpadGestureMonitor by ThreeFingerDistanceBasedGestureMonitor( gestureDistanceThresholdPx = gestureDistanceThresholdPx, gestureStateChangedCallback = gestureStateChangedCallback, donePredicate = diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/HomeGestureMonitor.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/HomeGestureMonitor.kt index a410f991182e..a9aa5c897573 100644 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/HomeGestureMonitor.kt +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/HomeGestureMonitor.kt @@ -21,7 +21,7 @@ class HomeGestureMonitor( override val gestureDistanceThresholdPx: Int, override val gestureStateChangedCallback: (GestureState) -> Unit ) : - TouchpadGestureMonitor by ThreeFingerGestureMonitor( + TouchpadGestureMonitor by ThreeFingerDistanceBasedGestureMonitor( gestureDistanceThresholdPx = gestureDistanceThresholdPx, gestureStateChangedCallback = gestureStateChangedCallback, donePredicate = diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/RecentAppsGestureMonitor.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/RecentAppsGestureMonitor.kt new file mode 100644 index 000000000000..58282393d4a6 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/RecentAppsGestureMonitor.kt @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.view.MotionEvent +import androidx.compose.ui.input.pointer.util.VelocityTracker1D +import kotlin.math.abs + +/** + * Monitors recent apps gesture completion. That is - using three fingers on touchpad - swipe up + * over some distance threshold and then slow down gesture before fingers are lifted. Implementation + * is based on [com.android.quickstep.util.TriggerSwipeUpTouchTracker] + */ +class RecentAppsGestureMonitor( + override val gestureDistanceThresholdPx: Int, + override val gestureStateChangedCallback: (GestureState) -> Unit, + private val velocityThresholdPxPerMs: Float, + private val velocityTracker: VelocityTracker1D = VelocityTracker1D(isDataDifferential = false), +) : TouchpadGestureMonitor { + + private var xStart = 0f + private var yStart = 0f + + override fun processTouchpadEvent(event: MotionEvent) { + val action = event.actionMasked + velocityTracker.addDataPoint(event.eventTime, event.y) + when (action) { + MotionEvent.ACTION_DOWN -> { + if (isThreeFingerTouchpadSwipe(event)) { + xStart = event.x + yStart = event.y + gestureStateChangedCallback(GestureState.IN_PROGRESS) + } + } + MotionEvent.ACTION_UP -> { + if (isThreeFingerTouchpadSwipe(event) && isRecentAppsGesture(event)) { + gestureStateChangedCallback(GestureState.FINISHED) + } else { + gestureStateChangedCallback(GestureState.NOT_STARTED) + } + velocityTracker.resetTracking() + } + MotionEvent.ACTION_CANCEL -> { + velocityTracker.resetTracking() + } + } + } + + private fun isRecentAppsGesture(event: MotionEvent): Boolean { + // below is trying to mirror behavior of TriggerSwipeUpTouchTracker#onGestureEnd. + // We're diving velocity by 1000, to have the same unit of measure: pixels/ms. + val swipeDistance = yStart - event.y + val velocity = velocityTracker.calculateVelocity() / 1000 + return swipeDistance >= gestureDistanceThresholdPx && + abs(velocity) <= velocityThresholdPxPerMs + } +} diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/ThreeFingerGestureMonitor.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/ThreeFingerDistanceBasedGestureMonitor.kt index 377977ce0d74..9bf0fe96624f 100644 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/ThreeFingerGestureMonitor.kt +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/ThreeFingerDistanceBasedGestureMonitor.kt @@ -25,8 +25,12 @@ interface GestureDonePredicate { fun wasGestureDone(startX: Float, startY: Float, endX: Float, endY: Float): Boolean } -/** Common implementation for all three-finger gesture monitors */ -class ThreeFingerGestureMonitor( +/** + * Common implementation for three-finger gesture monitors that are only distance-based. E.g. recent + * apps gesture is not only distance-based because it requires going over threshold distance and + * slowing down the movement. + */ +class ThreeFingerDistanceBasedGestureMonitor( override val gestureDistanceThresholdPx: Int, override val gestureStateChangedCallback: (GestureState) -> Unit, private val donePredicate: GestureDonePredicate diff --git a/packages/SystemUI/src/com/android/systemui/util/kotlin/ReduceBrightColorsControllerExt.kt b/packages/SystemUI/src/com/android/systemui/util/kotlin/ReduceBrightColorsControllerExt.kt index e6e2a0767012..ee00e8b04ef1 100644 --- a/packages/SystemUI/src/com/android/systemui/util/kotlin/ReduceBrightColorsControllerExt.kt +++ b/packages/SystemUI/src/com/android/systemui/util/kotlin/ReduceBrightColorsControllerExt.kt @@ -35,17 +35,3 @@ fun ReduceBrightColorsController.isEnabled(): Flow<Boolean> { } .onStart { emit(isReduceBrightColorsActivated) } } - -fun ReduceBrightColorsController.isAvailable(): Flow<Boolean> { - return conflatedCallbackFlow { - val callback = - object : ReduceBrightColorsController.Listener { - override fun onFeatureEnabledChanged(enabled: Boolean) { - trySend(enabled) - } - } - addCallback(callback) - awaitClose { removeCallback(callback) } - } - .onStart { emit(isReduceBrightColorsFeatureAvailable) } -} diff --git a/packages/SystemUI/src/com/android/systemui/util/ui/AnimatedValue.kt b/packages/SystemUI/src/com/android/systemui/util/ui/AnimatedValue.kt index 1112d6f4f25c..a5c8af588667 100644 --- a/packages/SystemUI/src/com/android/systemui/util/ui/AnimatedValue.kt +++ b/packages/SystemUI/src/com/android/systemui/util/ui/AnimatedValue.kt @@ -26,7 +26,7 @@ import kotlinx.coroutines.flow.transformLatest /** * A state comprised of a [value] of type [T] paired with a boolean indicating whether or not the - * [value] [isAnimating] in the UI. + * value [isAnimating][isAnimating] in the UI. */ sealed interface AnimatedValue<out T> { diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java index d9e72bf592a0..030a20ab8c56 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java @@ -391,11 +391,7 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa } public void notifyVisible(boolean visible) { - if (Flags.useVolumeController()) { - mVolumeControllerAdapter.notifyVolumeControllerVisible(visible); - } else { - mWorker.obtainMessage(W.NOTIFY_VISIBLE, visible ? 1 : 0, 0).sendToTarget(); - } + mWorker.obtainMessage(W.NOTIFY_VISIBLE, visible ? 1 : 0, 0).sendToTarget(); } public void userActivity() { @@ -457,7 +453,11 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa } private void onNotifyVisibleW(boolean visible) { - mAudio.notifyVolumeControllerVisible(mVolumeController, visible); + if (Flags.useVolumeController()) { + mVolumeControllerAdapter.notifyVolumeControllerVisible(visible); + } else { + mAudio.notifyVolumeControllerVisible(mVolumeController, visible); + } if (!visible) { if (updateActiveStreamW(-1)) { mCallbacks.onStateChanged(mState); diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java index 7786453814e0..db4f9ef13bd6 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java @@ -1991,7 +1991,7 @@ public class VolumeDialogImpl implements VolumeDialog, Dumpable, : R.drawable.ic_volume_media_bt; } } else if (isStreamMuted(ss)) { - iconRes = (ss.muted && isTv()) ? R.drawable.ic_volume_media_off : row.iconMuteRes; + iconRes = row.iconMuteRes; } else { iconRes = mShowLowMediaVolumeIcon && ss.level * 2 < (ss.levelMax + ss.levelMin) ? R.drawable.ic_volume_media_low : row.iconRes; diff --git a/packages/SystemUI/tests/Android.bp b/packages/SystemUI/tests/Android.bp index f601387d0910..3e7596ccabf0 100644 --- a/packages/SystemUI/tests/Android.bp +++ b/packages/SystemUI/tests/Android.bp @@ -35,9 +35,9 @@ android_test { "libstaticjvmtiagent", ], libs: [ - "android.test.runner", + "android.test.runner.stubs.system", "telephony-common", - "android.test.base", + "android.test.base.stubs.system", ], aaptflags: [ "--extra-packages com.android.systemui", diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardAbsKeyInputViewControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardAbsKeyInputViewControllerTest.java index c0d8be322cd6..4bb01ec1e1df 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardAbsKeyInputViewControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardAbsKeyInputViewControllerTest.java @@ -43,6 +43,7 @@ import com.android.keyguard.KeyguardAbsKeyInputView.KeyDownListener; import com.android.keyguard.KeyguardSecurityModel.SecurityMode; import com.android.systemui.Flags; import com.android.systemui.SysuiTestCase; +import com.android.systemui.bouncer.ui.helper.BouncerHapticPlayer; import com.android.systemui.classifier.FalsingCollector; import com.android.systemui.classifier.FalsingCollectorFake; import com.android.systemui.flags.FakeFeatureFlags; @@ -96,6 +97,8 @@ public class KeyguardAbsKeyInputViewControllerTest extends SysuiTestCase { private UserActivityNotifier mUserActivityNotifier; private KeyguardAbsKeyInputViewController mKeyguardAbsKeyInputViewController; private KosmosJavaAdapter mKosmosJavaAdapter = new KosmosJavaAdapter(this); + private final BouncerHapticPlayer mBouncerHapticPlayer = + mKosmosJavaAdapter.getBouncerHapticHelper(); private final FakeMSDLPlayer mMSDLPlayer = mKosmosJavaAdapter.getMsdlPlayer(); @Before @@ -119,8 +122,8 @@ public class KeyguardAbsKeyInputViewControllerTest extends SysuiTestCase { return new KeyguardAbsKeyInputViewController(mAbsKeyInputView, mKeyguardUpdateMonitor, mSecurityMode, mLockPatternUtils, mKeyguardSecurityCallback, mKeyguardMessageAreaControllerFactory, mLatencyTracker, mFalsingCollector, - mEmergencyButtonController, mFeatureFlags, mSelectedUserInteractor, mMSDLPlayer, - mUserActivityNotifier) { + mEmergencyButtonController, mFeatureFlags, mSelectedUserInteractor, + mBouncerHapticPlayer, mUserActivityNotifier) { @Override void resetState() { } diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPinViewControllerTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPinViewControllerTest.kt index 873bc2c92431..2c1dacdfae73 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPinViewControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPinViewControllerTest.kt @@ -35,11 +35,13 @@ import com.android.systemui.classifier.FalsingCollector import com.android.systemui.classifier.FalsingCollectorFake import com.android.systemui.flags.FeatureFlags import com.android.systemui.flags.Flags +import com.android.systemui.haptics.msdl.bouncerHapticPlayer import com.android.systemui.keyboard.data.repository.FakeKeyboardRepository import com.android.systemui.res.R import com.android.systemui.statusbar.policy.DevicePostureController import com.android.systemui.statusbar.policy.DevicePostureController.DEVICE_POSTURE_HALF_OPENED import com.android.systemui.statusbar.policy.DevicePostureController.DEVICE_POSTURE_OPENED +import com.android.systemui.testKosmos import com.android.systemui.user.domain.interactor.SelectedUserInteractor import com.android.systemui.util.mockito.whenever import com.google.common.truth.Truth.assertThat @@ -107,6 +109,8 @@ class KeyguardPinViewControllerTest : SysuiTestCase() { @Captor lateinit var postureCallbackCaptor: ArgumentCaptor<DevicePostureController.Callback> + private val kosmos = testKosmos() + @Before fun setup() { MockitoAnnotations.initMocks(this) @@ -151,8 +155,8 @@ class KeyguardPinViewControllerTest : SysuiTestCase() { mSelectedUserInteractor, uiEventLogger, keyguardKeyboardInteractor, - null, - mUserActivityNotifier + kosmos.bouncerHapticPlayer, + mUserActivityNotifier, ) } diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSimPinViewControllerTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSimPinViewControllerTest.kt index f141a4926149..9cd52153eff6 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSimPinViewControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSimPinViewControllerTest.kt @@ -28,8 +28,10 @@ import com.android.systemui.Flags import com.android.systemui.SysuiTestCase import com.android.systemui.classifier.FalsingCollector import com.android.systemui.flags.FakeFeatureFlags +import com.android.systemui.haptics.msdl.bouncerHapticPlayer import com.android.systemui.keyboard.data.repository.FakeKeyboardRepository import com.android.systemui.res.R +import com.android.systemui.testKosmos import com.android.systemui.user.domain.interactor.SelectedUserInteractor import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.mock @@ -73,6 +75,8 @@ class KeyguardSimPinViewControllerTest : SysuiTestCase() { private val updateMonitorCallbackArgumentCaptor = ArgumentCaptor.forClass(KeyguardUpdateMonitorCallback::class.java) + private val kosmos = testKosmos() + @Before fun setup() { MockitoAnnotations.initMocks(this) @@ -103,8 +107,8 @@ class KeyguardSimPinViewControllerTest : SysuiTestCase() { fakeFeatureFlags, mSelectedUserInteractor, keyguardKeyboardInteractor, - null, - mUserActivityNotifier + kosmos.bouncerHapticPlayer, + mUserActivityNotifier, ) underTest.init() underTest.onViewAttached() @@ -162,14 +166,14 @@ class KeyguardSimPinViewControllerTest : SysuiTestCase() { updateMonitorCallbackArgumentCaptor.value.onSimStateChanged( /* subId= */ 0, /* slotId= */ 0, - TelephonyManager.SIM_STATE_PIN_REQUIRED + TelephonyManager.SIM_STATE_PIN_REQUIRED, ) verify(keyguardSecurityCallback, never()).showCurrentSecurityScreen() updateMonitorCallbackArgumentCaptor.value.onSimStateChanged( /* subId= */ 0, /* slotId= */ 0, - TelephonyManager.SIM_STATE_PUK_REQUIRED + TelephonyManager.SIM_STATE_PUK_REQUIRED, ) verify(keyguardSecurityCallback).showCurrentSecurityScreen() diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSimPukViewControllerTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSimPukViewControllerTest.kt index a03c8391fa0f..3c229975eef5 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSimPukViewControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSimPukViewControllerTest.kt @@ -29,8 +29,10 @@ import com.android.systemui.Flags import com.android.systemui.SysuiTestCase import com.android.systemui.classifier.FalsingCollector import com.android.systemui.flags.FakeFeatureFlags +import com.android.systemui.haptics.msdl.bouncerHapticPlayer import com.android.systemui.keyboard.data.repository.FakeKeyboardRepository import com.android.systemui.res.R +import com.android.systemui.testKosmos import com.android.systemui.user.domain.interactor.SelectedUserInteractor import com.android.systemui.util.mockito.any import org.junit.Before @@ -65,6 +67,8 @@ class KeyguardSimPukViewControllerTest : SysuiTestCase() { KeyguardMessageAreaController<BouncerKeyguardMessageArea> @Mock private lateinit var mUserActivityNotifier: UserActivityNotifier + private val kosmos = testKosmos() + @Before fun setup() { MockitoAnnotations.initMocks(this) @@ -98,8 +102,8 @@ class KeyguardSimPukViewControllerTest : SysuiTestCase() { fakeFeatureFlags, mSelectedUserInteractor, keyguardKeyboardInteractor, - null, - mUserActivityNotifier + kosmos.bouncerHapticPlayer, + mUserActivityNotifier, ) underTest.init() } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissActionInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissActionInteractorTest.kt index bea415cbb934..1981a2d612e4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissActionInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissActionInteractorTest.kt @@ -226,11 +226,7 @@ class KeyguardDismissActionInteractorTest : SysuiTestCase() { assertThat(resetDismissAction).isNull() kosmos.setSceneTransition( - Transition( - from = Scenes.Bouncer, - to = Scenes.NotificationsShade, - progress = flowOf(1f), - ) + Transition(from = Scenes.Bouncer, to = Scenes.Shade, progress = flowOf(1f)) ) assertThat(resetDismissAction).isNull() } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ReduceBrightColorsTileTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ReduceBrightColorsTileTest.java index d6bde27dfb62..1aff45bf581d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ReduceBrightColorsTileTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ReduceBrightColorsTileTest.java @@ -18,6 +18,8 @@ package com.android.systemui.qs.tiles; import static junit.framework.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -25,6 +27,7 @@ import static org.mockito.Mockito.when; import android.os.Handler; import android.platform.test.annotations.RequiresFlagsDisabled; +import android.platform.test.annotations.RequiresFlagsEnabled; import android.service.quicksettings.Tile; import android.testing.TestableLooper; @@ -35,6 +38,7 @@ import com.android.internal.R; import com.android.internal.logging.MetricsLogger; import com.android.server.display.feature.flags.Flags; import com.android.systemui.SysuiTestCase; +import com.android.systemui.accessibility.extradim.ExtraDimDialogManager; import com.android.systemui.classifier.FalsingManagerFake; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.qs.QSTile; @@ -74,6 +78,8 @@ public class ReduceBrightColorsTileTest extends SysuiTestCase { private ReduceBrightColorsController mReduceBrightColorsController; @Mock private QsEventLogger mUiEventLogger; + @Mock + private ExtraDimDialogManager mExtraDimDialogManager; private TestableLooper mTestableLooper; private ReduceBrightColorsTile mTile; @@ -97,7 +103,8 @@ public class ReduceBrightColorsTileTest extends SysuiTestCase { mMetricsLogger, mStatusBarStateController, mActivityStarter, - mQSLogger + mQSLogger, + mExtraDimDialogManager ); mTile.initialize(); @@ -148,6 +155,78 @@ public class ReduceBrightColorsTileTest extends SysuiTestCase { } @Test + @RequiresFlagsEnabled(Flags.FLAG_EVEN_DIMMER) + public void testDialogueShownOnClick() { + when(mReduceBrightColorsController.isReduceBrightColorsActivated()).thenReturn(true); + when(mReduceBrightColorsController.isInUpgradeMode(mContext.getResources())) + .thenReturn(true); + mTile = new ReduceBrightColorsTile( + true, + mReduceBrightColorsController, + mHost, + mUiEventLogger, + mTestableLooper.getLooper(), + new Handler(mTestableLooper.getLooper()), + new FalsingManagerFake(), + mMetricsLogger, + mStatusBarStateController, + mActivityStarter, + mQSLogger, + mExtraDimDialogManager + ); + + mTile.initialize(); + mTestableLooper.processAllMessages(); + + // Validity check + assertEquals(Tile.STATE_ACTIVE, mTile.getState().state); + mTile.handleClick(null /* view */); + + verify(mExtraDimDialogManager, times(1)) + .dismissKeyguardIfNeededAndShowDialog(any()); + verify(mReduceBrightColorsController, times(0)) + .setReduceBrightColorsActivated(anyBoolean()); + mTile.destroy(); + mTestableLooper.processAllMessages(); + } + + @Test + @RequiresFlagsEnabled(Flags.FLAG_EVEN_DIMMER) + public void testDialogueShownOnLongClick() { + when(mReduceBrightColorsController.isReduceBrightColorsActivated()).thenReturn(true); + when(mReduceBrightColorsController.isInUpgradeMode(mContext.getResources())) + .thenReturn(true); + mTile = new ReduceBrightColorsTile( + true, + mReduceBrightColorsController, + mHost, + mUiEventLogger, + mTestableLooper.getLooper(), + new Handler(mTestableLooper.getLooper()), + new FalsingManagerFake(), + mMetricsLogger, + mStatusBarStateController, + mActivityStarter, + mQSLogger, + mExtraDimDialogManager + ); + + mTile.initialize(); + mTestableLooper.processAllMessages(); + + // Validity check + assertEquals(Tile.STATE_ACTIVE, mTile.getState().state); + mTile.handleLongClick(null /* view */); + + verify(mExtraDimDialogManager, times(1)) + .dismissKeyguardIfNeededAndShowDialog(any()); + verify(mReduceBrightColorsController, times(0)) + .setReduceBrightColorsActivated(anyBoolean()); + mTile.destroy(); + mTestableLooper.processAllMessages(); + } + + @Test public void testIcon_whenTileEnabled_isOnState() { when(mReduceBrightColorsController.isReduceBrightColorsActivated()).thenReturn(true); mTile.refreshState(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/chips/ui/viewmodel/OngoingActivityChipsViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/chips/ui/viewmodel/OngoingActivityChipsViewModelTest.kt index f528ebbd9e63..26ce7b956fde 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/chips/ui/viewmodel/OngoingActivityChipsViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/chips/ui/viewmodel/OngoingActivityChipsViewModelTest.kt @@ -19,8 +19,9 @@ package com.android.systemui.statusbar.chips.ui.viewmodel import android.content.DialogInterface import android.content.packageManager import android.content.pm.PackageManager +import android.graphics.Bitmap import android.graphics.drawable.BitmapDrawable -import android.platform.test.annotations.EnableFlags +import android.platform.test.annotations.DisableFlags import android.view.View import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest @@ -39,11 +40,9 @@ import com.android.systemui.screenrecord.data.model.ScreenRecordModel import com.android.systemui.screenrecord.data.repository.screenRecordRepository import com.android.systemui.statusbar.chips.mediaprojection.domain.interactor.MediaProjectionChipInteractorTest.Companion.NORMAL_PACKAGE import com.android.systemui.statusbar.chips.mediaprojection.domain.interactor.MediaProjectionChipInteractorTest.Companion.setUpPackageManagerForMediaProjection -import com.android.systemui.statusbar.chips.ron.demo.ui.viewmodel.DemoRonChipViewModelTest.Companion.addDemoRonChip import com.android.systemui.statusbar.chips.ron.demo.ui.viewmodel.demoRonChipViewModel import com.android.systemui.statusbar.chips.ui.model.OngoingActivityChipModel import com.android.systemui.statusbar.chips.ui.view.ChipBackgroundContainer -import com.android.systemui.statusbar.commandline.commandRegistry import com.android.systemui.statusbar.phone.SystemUIDialog import com.android.systemui.statusbar.phone.mockSystemUIDialogFactory import com.android.systemui.statusbar.phone.ongoingcall.data.repository.ongoingCallRepository @@ -51,8 +50,6 @@ import com.android.systemui.statusbar.phone.ongoingcall.shared.model.OngoingCall import com.android.systemui.statusbar.phone.ongoingcall.shared.model.inCallModel import com.android.systemui.util.time.fakeSystemClock import com.google.common.truth.Truth.assertThat -import java.io.PrintWriter -import java.io.StringWriter import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach @@ -69,21 +66,22 @@ import org.mockito.kotlin.mock import org.mockito.kotlin.verify import org.mockito.kotlin.whenever +/** + * Tests for [OngoingActivityChipsViewModel] when the [FLAG_STATUS_BAR_RON_CHIPS] flag is disabled. + */ @SmallTest @RunWith(AndroidJUnit4::class) @OptIn(ExperimentalCoroutinesApi::class) +@DisableFlags(FLAG_STATUS_BAR_RON_CHIPS) class OngoingActivityChipsViewModelTest : SysuiTestCase() { private val kosmos = Kosmos().also { it.testCase = this } private val testScope = kosmos.testScope private val systemClock = kosmos.fakeSystemClock - private val commandRegistry = kosmos.commandRegistry private val screenRecordState = kosmos.screenRecordRepository.screenRecordState private val mediaProjectionState = kosmos.fakeMediaProjectionRepository.mediaProjectionState private val callRepo = kosmos.ongoingCallRepository - private val pw = PrintWriter(StringWriter()) - private val mockSystemUIDialog = mock<SystemUIDialog>() private val chipBackgroundView = mock<ChipBackgroundContainer>() private val chipView = @@ -102,8 +100,12 @@ class OngoingActivityChipsViewModelTest : SysuiTestCase() { fun setUp() { setUpPackageManagerForMediaProjection(kosmos) kosmos.demoRonChipViewModel.start() - whenever(kosmos.packageManager.getApplicationIcon(any<String>())) - .thenReturn(BitmapDrawable()) + val icon = + BitmapDrawable( + context.resources, + Bitmap.createBitmap(/* width= */ 100, /* height= */ 100, Bitmap.Config.ARGB_8888) + ) + whenever(kosmos.packageManager.getApplicationIcon(any<String>())).thenReturn(icon) } @Test @@ -183,24 +185,16 @@ class OngoingActivityChipsViewModelTest : SysuiTestCase() { } @Test - @EnableFlags(FLAG_STATUS_BAR_RON_CHIPS) fun primaryChip_higherPriorityChipAdded_lowerPriorityChipReplaced() = testScope.runTest { // Start with just the lowest priority chip shown - addDemoRonChip(commandRegistry, pw) + callRepo.setOngoingCallState(inCallModel(startTimeMs = 34)) // And everything else hidden - callRepo.setOngoingCallState(OngoingCallModel.NoCall) mediaProjectionState.value = MediaProjectionState.NotProjecting screenRecordState.value = ScreenRecordModel.DoingNothing val latest by collectLastValue(underTest.primaryChip) - assertIsDemoRonChip(latest) - - // WHEN the higher priority call chip is added - callRepo.setOngoingCallState(inCallModel(startTimeMs = 34)) - - // THEN the higher priority call chip is used assertIsCallChip(latest) // WHEN the higher priority media projection chip is added @@ -222,7 +216,6 @@ class OngoingActivityChipsViewModelTest : SysuiTestCase() { } @Test - @EnableFlags(FLAG_STATUS_BAR_RON_CHIPS) fun primaryChip_highestPriorityChipRemoved_showsNextPriorityChip() = testScope.runTest { // WHEN all chips are active @@ -230,7 +223,6 @@ class OngoingActivityChipsViewModelTest : SysuiTestCase() { mediaProjectionState.value = MediaProjectionState.Projecting.EntireScreen(NORMAL_PACKAGE) callRepo.setOngoingCallState(inCallModel(startTimeMs = 34)) - addDemoRonChip(commandRegistry, pw) val latest by collectLastValue(underTest.primaryChip) @@ -248,12 +240,6 @@ class OngoingActivityChipsViewModelTest : SysuiTestCase() { // THEN the lower priority call is used assertIsCallChip(latest) - - // WHEN the higher priority call is removed - callRepo.setOngoingCallState(OngoingCallModel.NoCall) - - // THEN the lower priority demo RON is used - assertIsDemoRonChip(latest) } /** Regression test for b/347726238. */ @@ -390,11 +376,5 @@ class OngoingActivityChipsViewModelTest : SysuiTestCase() { .impl as Icon.Resource assertThat(icon.res).isEqualTo(com.android.internal.R.drawable.ic_phone) } - - fun assertIsDemoRonChip(latest: OngoingActivityChipModel?) { - assertThat(latest).isInstanceOf(OngoingActivityChipModel.Shown::class.java) - assertThat((latest as OngoingActivityChipModel.Shown).icon) - .isInstanceOf(OngoingActivityChipModel.ChipIcon.FullColorAppIcon::class.java) - } } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/chips/ui/viewmodel/OngoingActivityChipsWithRonsViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/chips/ui/viewmodel/OngoingActivityChipsWithRonsViewModelTest.kt new file mode 100644 index 000000000000..631120b39805 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/chips/ui/viewmodel/OngoingActivityChipsWithRonsViewModelTest.kt @@ -0,0 +1,534 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.viewmodel + +import android.content.DialogInterface +import android.content.packageManager +import android.graphics.Bitmap +import android.graphics.drawable.BitmapDrawable +import android.platform.test.annotations.EnableFlags +import android.view.View +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest +import com.android.systemui.Flags.FLAG_STATUS_BAR_RON_CHIPS +import com.android.systemui.SysuiTestCase +import com.android.systemui.coroutines.collectLastValue +import com.android.systemui.kosmos.testScope +import com.android.systemui.mediaprojection.data.model.MediaProjectionState +import com.android.systemui.mediaprojection.data.repository.fakeMediaProjectionRepository +import com.android.systemui.mediaprojection.taskswitcher.FakeActivityTaskManager.Companion.createTask +import com.android.systemui.res.R +import com.android.systemui.screenrecord.data.model.ScreenRecordModel +import com.android.systemui.screenrecord.data.repository.screenRecordRepository +import com.android.systemui.statusbar.chips.mediaprojection.domain.interactor.MediaProjectionChipInteractorTest.Companion.NORMAL_PACKAGE +import com.android.systemui.statusbar.chips.mediaprojection.domain.interactor.MediaProjectionChipInteractorTest.Companion.setUpPackageManagerForMediaProjection +import com.android.systemui.statusbar.chips.ron.demo.ui.viewmodel.DemoRonChipViewModelTest.Companion.addDemoRonChip +import com.android.systemui.statusbar.chips.ron.demo.ui.viewmodel.demoRonChipViewModel +import com.android.systemui.statusbar.chips.ui.model.MultipleOngoingActivityChipsModel +import com.android.systemui.statusbar.chips.ui.model.OngoingActivityChipModel +import com.android.systemui.statusbar.chips.ui.view.ChipBackgroundContainer +import com.android.systemui.statusbar.chips.ui.viewmodel.OngoingActivityChipsViewModelTest.Companion.assertIsCallChip +import com.android.systemui.statusbar.chips.ui.viewmodel.OngoingActivityChipsViewModelTest.Companion.assertIsScreenRecordChip +import com.android.systemui.statusbar.chips.ui.viewmodel.OngoingActivityChipsViewModelTest.Companion.assertIsShareToAppChip +import com.android.systemui.statusbar.chips.ui.viewmodel.OngoingActivityChipsViewModelTest.Companion.getStopActionFromDialog +import com.android.systemui.statusbar.commandline.commandRegistry +import com.android.systemui.statusbar.phone.SystemUIDialog +import com.android.systemui.statusbar.phone.ongoingcall.data.repository.ongoingCallRepository +import com.android.systemui.statusbar.phone.ongoingcall.shared.model.OngoingCallModel +import com.android.systemui.statusbar.phone.ongoingcall.shared.model.inCallModel +import com.android.systemui.testKosmos +import com.android.systemui.util.time.fakeSystemClock +import com.google.common.truth.Truth.assertThat +import java.io.PrintWriter +import java.io.StringWriter +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.test.runCurrent +import kotlinx.coroutines.test.runTest +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.kotlin.any +import org.mockito.kotlin.mock +import org.mockito.kotlin.whenever + +/** + * Tests for [OngoingActivityChipsViewModel] when the [FLAG_STATUS_BAR_RON_CHIPS] flag is enabled. + */ +@SmallTest +@RunWith(AndroidJUnit4::class) +@OptIn(ExperimentalCoroutinesApi::class) +@EnableFlags(FLAG_STATUS_BAR_RON_CHIPS) +class OngoingActivityChipsWithRonsViewModelTest : SysuiTestCase() { + private val kosmos = testKosmos() + private val testScope = kosmos.testScope + private val systemClock = kosmos.fakeSystemClock + private val commandRegistry = kosmos.commandRegistry + + private val screenRecordState = kosmos.screenRecordRepository.screenRecordState + private val mediaProjectionState = kosmos.fakeMediaProjectionRepository.mediaProjectionState + private val callRepo = kosmos.ongoingCallRepository + + private val pw = PrintWriter(StringWriter()) + + private val mockSystemUIDialog = mock<SystemUIDialog>() + private val chipBackgroundView = mock<ChipBackgroundContainer>() + private val chipView = + mock<View>().apply { + whenever( + this.requireViewById<ChipBackgroundContainer>( + R.id.ongoing_activity_chip_background + ) + ) + .thenReturn(chipBackgroundView) + } + + private val underTest = kosmos.ongoingActivityChipsViewModel + + @Before + fun setUp() { + setUpPackageManagerForMediaProjection(kosmos) + kosmos.demoRonChipViewModel.start() + val icon = + BitmapDrawable( + context.resources, + Bitmap.createBitmap(/* width= */ 100, /* height= */ 100, Bitmap.Config.ARGB_8888) + ) + whenever(kosmos.packageManager.getApplicationIcon(any<String>())).thenReturn(icon) + } + + // Even though the `primaryChip` flow isn't used when the RONs flag is on, still test that the + // flow has the right behavior to verify that we don't break any existing functionality. + + @Test + fun primaryChip_allHidden_hidden() = + testScope.runTest { + screenRecordState.value = ScreenRecordModel.DoingNothing + mediaProjectionState.value = MediaProjectionState.NotProjecting + callRepo.setOngoingCallState(OngoingCallModel.NoCall) + + val latest by collectLastValue(underTest.primaryChip) + + assertThat(latest).isInstanceOf(OngoingActivityChipModel.Hidden::class.java) + } + + @Test + fun chips_allHidden_bothPrimaryAndSecondaryHidden() = + testScope.runTest { + screenRecordState.value = ScreenRecordModel.DoingNothing + mediaProjectionState.value = MediaProjectionState.NotProjecting + callRepo.setOngoingCallState(OngoingCallModel.NoCall) + + val latest by collectLastValue(underTest.chips) + + assertThat(latest!!.primary).isInstanceOf(OngoingActivityChipModel.Hidden::class.java) + assertThat(latest!!.secondary).isInstanceOf(OngoingActivityChipModel.Hidden::class.java) + } + + @Test + fun primaryChip_screenRecordShow_restHidden_screenRecordShown() = + testScope.runTest { + screenRecordState.value = ScreenRecordModel.Recording + mediaProjectionState.value = MediaProjectionState.NotProjecting + callRepo.setOngoingCallState(OngoingCallModel.NoCall) + + val latest by collectLastValue(underTest.primaryChip) + + assertIsScreenRecordChip(latest) + } + + @Test + fun chips_screenRecordShow_restHidden_primaryIsScreenRecordSecondaryIsHidden() = + testScope.runTest { + screenRecordState.value = ScreenRecordModel.Recording + mediaProjectionState.value = MediaProjectionState.NotProjecting + callRepo.setOngoingCallState(OngoingCallModel.NoCall) + + val latest by collectLastValue(underTest.chips) + + assertIsScreenRecordChip(latest!!.primary) + assertThat(latest!!.secondary).isInstanceOf(OngoingActivityChipModel.Hidden::class.java) + } + + @Test + fun primaryChip_screenRecordShowAndCallShow_screenRecordShown() = + testScope.runTest { + screenRecordState.value = ScreenRecordModel.Recording + callRepo.setOngoingCallState(inCallModel(startTimeMs = 34)) + + val latest by collectLastValue(underTest.primaryChip) + + assertIsScreenRecordChip(latest) + } + + @Test + fun chips_screenRecordShowAndCallShow_primaryIsScreenRecordSecondaryIsCall() = + testScope.runTest { + screenRecordState.value = ScreenRecordModel.Recording + callRepo.setOngoingCallState(inCallModel(startTimeMs = 34)) + + val latest by collectLastValue(underTest.chips) + + assertIsScreenRecordChip(latest!!.primary) + assertIsCallChip(latest!!.secondary) + } + + @Test + fun primaryChip_screenRecordShowAndShareToAppShow_screenRecordShown() = + testScope.runTest { + screenRecordState.value = ScreenRecordModel.Recording + mediaProjectionState.value = + MediaProjectionState.Projecting.EntireScreen(NORMAL_PACKAGE) + callRepo.setOngoingCallState(OngoingCallModel.NoCall) + + val latest by collectLastValue(underTest.primaryChip) + + assertIsScreenRecordChip(latest) + } + + @Test + fun chips_screenRecordShowAndShareToAppShow_primaryIsScreenRecordSecondaryIsHidden() = + testScope.runTest { + screenRecordState.value = ScreenRecordModel.Recording + mediaProjectionState.value = + MediaProjectionState.Projecting.EntireScreen(NORMAL_PACKAGE) + callRepo.setOngoingCallState(OngoingCallModel.NoCall) + + val latest by collectLastValue(underTest.chips) + + assertIsScreenRecordChip(latest!!.primary) + // Even though share-to-app is active, we suppress it because this share-to-app is + // represented by screen record being active. See b/296461748. + assertThat(latest!!.secondary).isInstanceOf(OngoingActivityChipModel.Hidden::class.java) + } + + @Test + fun primaryChip_shareToAppShowAndCallShow_shareToAppShown() = + testScope.runTest { + screenRecordState.value = ScreenRecordModel.DoingNothing + mediaProjectionState.value = + MediaProjectionState.Projecting.EntireScreen(NORMAL_PACKAGE) + callRepo.setOngoingCallState(inCallModel(startTimeMs = 34)) + + val latest by collectLastValue(underTest.primaryChip) + + assertIsShareToAppChip(latest) + } + + @Test + fun chips_shareToAppShowAndCallShow_primaryIsShareToAppSecondaryIsCall() = + testScope.runTest { + screenRecordState.value = ScreenRecordModel.DoingNothing + mediaProjectionState.value = + MediaProjectionState.Projecting.EntireScreen(NORMAL_PACKAGE) + callRepo.setOngoingCallState(inCallModel(startTimeMs = 34)) + + val latest by collectLastValue(underTest.chips) + + assertIsShareToAppChip(latest!!.primary) + assertIsCallChip(latest!!.secondary) + } + + @Test + fun chips_threeActiveChips_topTwoShown() = + testScope.runTest { + screenRecordState.value = ScreenRecordModel.Recording + callRepo.setOngoingCallState(inCallModel(startTimeMs = 34)) + addDemoRonChip(commandRegistry, pw) + + val latest by collectLastValue(underTest.chips) + + assertIsScreenRecordChip(latest!!.primary) + assertIsCallChip(latest!!.secondary) + // Demo RON chip is dropped + } + + @Test + fun primaryChip_onlyCallShown_callShown() = + testScope.runTest { + screenRecordState.value = ScreenRecordModel.DoingNothing + // MediaProjection covers both share-to-app and cast-to-other-device + mediaProjectionState.value = MediaProjectionState.NotProjecting + + callRepo.setOngoingCallState(inCallModel(startTimeMs = 34)) + + val latest by collectLastValue(underTest.primaryChip) + + assertIsCallChip(latest) + } + + @Test + fun chips_onlyCallShown_primaryIsCallSecondaryIsHidden() = + testScope.runTest { + screenRecordState.value = ScreenRecordModel.DoingNothing + // MediaProjection covers both share-to-app and cast-to-other-device + mediaProjectionState.value = MediaProjectionState.NotProjecting + + callRepo.setOngoingCallState(inCallModel(startTimeMs = 34)) + + val latest by collectLastValue(underTest.chips) + + assertIsCallChip(latest!!.primary) + assertThat(latest!!.secondary).isInstanceOf(OngoingActivityChipModel.Hidden::class.java) + } + + @Test + fun primaryChip_higherPriorityChipAdded_lowerPriorityChipReplaced() = + testScope.runTest { + // Start with just the lowest priority chip shown + addDemoRonChip(commandRegistry, pw) + // And everything else hidden + callRepo.setOngoingCallState(OngoingCallModel.NoCall) + mediaProjectionState.value = MediaProjectionState.NotProjecting + screenRecordState.value = ScreenRecordModel.DoingNothing + + val latest by collectLastValue(underTest.primaryChip) + + assertIsDemoRonChip(latest) + + // WHEN the higher priority call chip is added + callRepo.setOngoingCallState(inCallModel(startTimeMs = 34)) + + // THEN the higher priority call chip is used + assertIsCallChip(latest) + + // WHEN the higher priority media projection chip is added + mediaProjectionState.value = + MediaProjectionState.Projecting.SingleTask( + NORMAL_PACKAGE, + hostDeviceName = null, + createTask(taskId = 1), + ) + + // THEN the higher priority media projection chip is used + assertIsShareToAppChip(latest) + + // WHEN the higher priority screen record chip is added + screenRecordState.value = ScreenRecordModel.Recording + + // THEN the higher priority screen record chip is used + assertIsScreenRecordChip(latest) + } + + @Test + fun primaryChip_highestPriorityChipRemoved_showsNextPriorityChip() = + testScope.runTest { + // WHEN all chips are active + screenRecordState.value = ScreenRecordModel.Recording + mediaProjectionState.value = + MediaProjectionState.Projecting.EntireScreen(NORMAL_PACKAGE) + callRepo.setOngoingCallState(inCallModel(startTimeMs = 34)) + addDemoRonChip(commandRegistry, pw) + + val latest by collectLastValue(underTest.primaryChip) + + // THEN the highest priority screen record is used + assertIsScreenRecordChip(latest) + + // WHEN the higher priority screen record is removed + screenRecordState.value = ScreenRecordModel.DoingNothing + + // THEN the lower priority media projection is used + assertIsShareToAppChip(latest) + + // WHEN the higher priority media projection is removed + mediaProjectionState.value = MediaProjectionState.NotProjecting + + // THEN the lower priority call is used + assertIsCallChip(latest) + + // WHEN the higher priority call is removed + callRepo.setOngoingCallState(OngoingCallModel.NoCall) + + // THEN the lower priority demo RON is used + assertIsDemoRonChip(latest) + } + + @Test + fun chips_movesChipsAroundAccordingToPriority() = + testScope.runTest { + // Start with just the lowest priority chip shown + addDemoRonChip(commandRegistry, pw) + // And everything else hidden + callRepo.setOngoingCallState(OngoingCallModel.NoCall) + mediaProjectionState.value = MediaProjectionState.NotProjecting + screenRecordState.value = ScreenRecordModel.DoingNothing + + val latest by collectLastValue(underTest.chips) + + assertIsDemoRonChip(latest!!.primary) + assertThat(latest!!.secondary).isInstanceOf(OngoingActivityChipModel.Hidden::class.java) + + // WHEN the higher priority call chip is added + callRepo.setOngoingCallState(inCallModel(startTimeMs = 34)) + + // THEN the higher priority call chip is used as primary and demo ron is demoted to + // secondary + assertIsCallChip(latest!!.primary) + assertIsDemoRonChip(latest!!.secondary) + + // WHEN the higher priority media projection chip is added + mediaProjectionState.value = + MediaProjectionState.Projecting.SingleTask( + NORMAL_PACKAGE, + hostDeviceName = null, + createTask(taskId = 1), + ) + + // THEN the higher priority media projection chip is used as primary and call is demoted + // to secondary (and demo RON is dropped altogether) + assertIsShareToAppChip(latest!!.primary) + assertIsCallChip(latest!!.secondary) + + // WHEN the higher priority screen record chip is added + screenRecordState.value = ScreenRecordModel.Recording + + // THEN the higher priority screen record chip is used + assertIsScreenRecordChip(latest!!.primary) + + // WHEN screen record and call is dropped + screenRecordState.value = ScreenRecordModel.DoingNothing + callRepo.setOngoingCallState(OngoingCallModel.NoCall) + + // THEN media projection and demo RON remain + assertIsShareToAppChip(latest!!.primary) + assertIsDemoRonChip(latest!!.secondary) + + // WHEN media projection is dropped + mediaProjectionState.value = MediaProjectionState.NotProjecting + + // THEN demo RON is promoted to primary + assertIsDemoRonChip(latest!!.primary) + assertThat(latest!!.secondary).isInstanceOf(OngoingActivityChipModel.Hidden::class.java) + } + + /** Regression test for b/347726238. */ + @Test + fun primaryChip_timerDoesNotResetAfterSubscribersRestart() = + testScope.runTest { + var latest: OngoingActivityChipModel? = null + + val job1 = underTest.primaryChip.onEach { latest = it }.launchIn(this) + + // Start a chip with a timer + systemClock.setElapsedRealtime(1234) + screenRecordState.value = ScreenRecordModel.Recording + + runCurrent() + + assertThat((latest as OngoingActivityChipModel.Shown.Timer).startTimeMs).isEqualTo(1234) + + // Stop subscribing to the chip flow + job1.cancel() + + // Let time pass + systemClock.setElapsedRealtime(5678) + + // WHEN we re-subscribe to the chip flow + val job2 = underTest.primaryChip.onEach { latest = it }.launchIn(this) + + runCurrent() + + // THEN the old start time is still used + assertThat((latest as OngoingActivityChipModel.Shown.Timer).startTimeMs).isEqualTo(1234) + + job2.cancel() + } + + /** Regression test for b/347726238. */ + @Test + fun chips_timerDoesNotResetAfterSubscribersRestart() = + testScope.runTest { + var latest: MultipleOngoingActivityChipsModel? = null + + val job1 = underTest.chips.onEach { latest = it }.launchIn(this) + + // Start a chip with a timer + systemClock.setElapsedRealtime(1234) + screenRecordState.value = ScreenRecordModel.Recording + + runCurrent() + + val primaryChip = latest!!.primary as OngoingActivityChipModel.Shown.Timer + assertThat(primaryChip.startTimeMs).isEqualTo(1234) + + // Stop subscribing to the chip flow + job1.cancel() + + // Let time pass + systemClock.setElapsedRealtime(5678) + + // WHEN we re-subscribe to the chip flow + val job2 = underTest.chips.onEach { latest = it }.launchIn(this) + + runCurrent() + + // THEN the old start time is still used + val newPrimaryChip = latest!!.primary as OngoingActivityChipModel.Shown.Timer + assertThat(newPrimaryChip.startTimeMs).isEqualTo(1234) + + job2.cancel() + } + + @Test + fun primaryChip_screenRecordStoppedViaDialog_chipHiddenWithoutAnimation() = + testScope.runTest { + screenRecordState.value = ScreenRecordModel.Recording + mediaProjectionState.value = MediaProjectionState.NotProjecting + callRepo.setOngoingCallState(OngoingCallModel.NoCall) + + val latest by collectLastValue(underTest.primaryChip) + + assertIsScreenRecordChip(latest) + + // WHEN screen record gets stopped via dialog + val dialogStopAction = + getStopActionFromDialog(latest, chipView, mockSystemUIDialog, kosmos) + dialogStopAction.onClick(mock<DialogInterface>(), 0) + + // THEN the chip is immediately hidden with no animation + assertThat(latest).isEqualTo(OngoingActivityChipModel.Hidden(shouldAnimate = false)) + } + + @Test + fun primaryChip_projectionStoppedViaDialog_chipHiddenWithoutAnimation() = + testScope.runTest { + mediaProjectionState.value = + MediaProjectionState.Projecting.EntireScreen(NORMAL_PACKAGE) + screenRecordState.value = ScreenRecordModel.DoingNothing + callRepo.setOngoingCallState(OngoingCallModel.NoCall) + + val latest by collectLastValue(underTest.primaryChip) + + assertIsShareToAppChip(latest) + + // WHEN media projection gets stopped via dialog + val dialogStopAction = + getStopActionFromDialog(latest, chipView, mockSystemUIDialog, kosmos) + dialogStopAction.onClick(mock<DialogInterface>(), 0) + + // THEN the chip is immediately hidden with no animation + assertThat(latest).isEqualTo(OngoingActivityChipModel.Hidden(shouldAnimate = false)) + } + + private fun assertIsDemoRonChip(latest: OngoingActivityChipModel?) { + assertThat(latest).isInstanceOf(OngoingActivityChipModel.Shown::class.java) + assertThat((latest as OngoingActivityChipModel.Shown).icon) + .isInstanceOf(OngoingActivityChipModel.ChipIcon.FullColorAppIcon::class.java) + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentLoggerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentLoggerTest.kt index 219b16f1e0ef..d7fb12944965 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentLoggerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentLoggerTest.kt @@ -34,12 +34,13 @@ import org.mockito.Mockito.mock @RunWith(AndroidJUnit4::class) class CollapsedStatusBarFragmentLoggerTest : SysuiTestCase() { - private val buffer = LogBufferFactory(DumpManager(), mock(LogcatEchoTracker::class.java)) - .create("buffer", 10) - private val disableFlagsLogger = DisableFlagsLogger( + private val buffer = + LogBufferFactory(DumpManager(), mock(LogcatEchoTracker::class.java)).create("buffer", 10) + private val disableFlagsLogger = + DisableFlagsLogger( listOf(DisableFlagsLogger.DisableFlag(0b001, 'A', 'a')), listOf(DisableFlagsLogger.DisableFlag(0b001, 'B', 'b')) - ) + ) private val logger = CollapsedStatusBarFragmentLogger(buffer, disableFlagsLogger) @Test @@ -66,7 +67,8 @@ class CollapsedStatusBarFragmentLoggerTest : SysuiTestCase() { StatusBarVisibilityModel( showClock = false, showNotificationIcons = true, - showOngoingActivityChip = false, + showPrimaryOngoingActivityChip = false, + showSecondaryOngoingActivityChip = false, showSystemInfo = true, ) ) @@ -77,7 +79,8 @@ class CollapsedStatusBarFragmentLoggerTest : SysuiTestCase() { assertThat(actualString).contains("showClock=false") assertThat(actualString).contains("showNotificationIcons=true") - assertThat(actualString).contains("showOngoingActivityChip=false") + assertThat(actualString).contains("showPrimaryOngoingActivityChip=false") + assertThat(actualString).contains("showSecondaryOngoingActivityChip=false") assertThat(actualString).contains("showSystemInfo=true") } } 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 6e337efd68af..135fab877d57 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 @@ -16,6 +16,7 @@ package com.android.systemui.statusbar.phone.fragment; import static android.view.Display.DEFAULT_DISPLAY; +import static com.android.systemui.Flags.FLAG_STATUS_BAR_RON_CHIPS; import static com.android.systemui.Flags.FLAG_STATUS_BAR_SCREEN_SHARING_CHIPS; import static com.android.systemui.shade.ShadeExpansionStateManagerKt.STATE_CLOSED; import static com.android.systemui.shade.ShadeExpansionStateManagerKt.STATE_OPEN; @@ -526,7 +527,9 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest { // WHEN there's *no* ongoing activity via new callback mCollapsedStatusBarViewBinder.getListener().onOngoingActivityStatusChanged( - /* hasOngoingActivity= */ false, /* shouldAnimate= */ false); + /* hasPrimaryOngoingActivity= */ false, + /* hasSecondaryOngoingActivity= */ false, + /* shouldAnimate= */ false); // THEN the old callback value is used, so the view is shown assertEquals(View.VISIBLE, getPrimaryOngoingActivityChipView().getVisibility()); @@ -535,12 +538,15 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest { when(mOngoingCallController.hasOngoingCall()).thenReturn(false); fragment.disable(DEFAULT_DISPLAY, 0, 0, false); - // WHEN there *is* an ongoing activity via new callback + // WHEN there *are* ongoing activities via new callback mCollapsedStatusBarViewBinder.getListener().onOngoingActivityStatusChanged( - /* hasOngoingActivity= */ true, /* shouldAnimate= */ false); + /* hasPrimaryOngoingActivity= */ true, + /* hasSecondaryOngoingActivity= */ true, + /* shouldAnimate= */ false); - // THEN the old callback value is used, so the view is hidden + // THEN the old callback value is used, so the views are hidden assertEquals(View.GONE, getPrimaryOngoingActivityChipView().getVisibility()); + assertEquals(View.GONE, getSecondaryOngoingActivityChipView().getVisibility()); } @Test @@ -553,18 +559,22 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest { // listener, but I'm unable to get the fragment to get attached so that the binder starts // listening to flows. mCollapsedStatusBarViewBinder.getListener().onOngoingActivityStatusChanged( - /* hasOngoingActivity= */ false, /* shouldAnimate= */ false); + /* hasPrimaryOngoingActivity= */ false, + /* hasSecondaryOngoingActivity= */ false, + /* shouldAnimate= */ false); assertEquals(View.GONE, getPrimaryOngoingActivityChipView().getVisibility()); } @Test @EnableFlags(FLAG_STATUS_BAR_SCREEN_SHARING_CHIPS) - public void hasOngoingActivity_chipDisplayedAndNotificationIconsHidden() { + public void hasPrimaryOngoingActivity_primaryChipDisplayedAndNotificationIconsHidden() { resumeAndGetFragment(); mCollapsedStatusBarViewBinder.getListener().onOngoingActivityStatusChanged( - /* hasOngoingActivity= */ true, /* shouldAnimate= */ false); + /* hasPrimaryOngoingActivity= */ true, + /* hasSecondaryOngoingActivity= */ false, + /* shouldAnimate= */ false); assertEquals(View.VISIBLE, getPrimaryOngoingActivityChipView().getVisibility()); assertEquals(View.INVISIBLE, getNotificationAreaView().getVisibility()); @@ -572,11 +582,42 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest { @Test @EnableFlags(FLAG_STATUS_BAR_SCREEN_SHARING_CHIPS) - public void hasOngoingActivityButNotificationIconsDisabled_chipHidden() { + @DisableFlags(FLAG_STATUS_BAR_RON_CHIPS) + public void hasSecondaryOngoingActivity_butRonsFlagOff_secondaryChipHidden() { + resumeAndGetFragment(); + + mCollapsedStatusBarViewBinder.getListener().onOngoingActivityStatusChanged( + /* hasPrimaryOngoingActivity= */ true, + /* hasSecondaryOngoingActivity= */ true, + /* shouldAnimate= */ false); + + assertEquals(View.GONE, getSecondaryOngoingActivityChipView().getVisibility()); + } + + @Test + @EnableFlags({FLAG_STATUS_BAR_SCREEN_SHARING_CHIPS, FLAG_STATUS_BAR_RON_CHIPS}) + public void hasSecondaryOngoingActivity_flagOn_secondaryChipShownAndNotificationIconsHidden() { + resumeAndGetFragment(); + + mCollapsedStatusBarViewBinder.getListener().onOngoingActivityStatusChanged( + /* hasPrimaryOngoingActivity= */ true, + /* hasSecondaryOngoingActivity= */ true, + /* shouldAnimate= */ false); + + assertEquals(View.VISIBLE, getSecondaryOngoingActivityChipView().getVisibility()); + assertEquals(View.INVISIBLE, getNotificationAreaView().getVisibility()); + } + + @Test + @EnableFlags(FLAG_STATUS_BAR_SCREEN_SHARING_CHIPS) + @DisableFlags(FLAG_STATUS_BAR_RON_CHIPS) + public void hasOngoingActivityButNotificationIconsDisabled_chipHidden_ronsFlagOff() { CollapsedStatusBarFragment fragment = resumeAndGetFragment(); mCollapsedStatusBarViewBinder.getListener().onOngoingActivityStatusChanged( - /* hasOngoingActivity= */ true, /* shouldAnimate= */ false); + /* hasPrimaryOngoingActivity= */ true, + /* hasSecondaryOngoingActivity= */ false, + /* shouldAnimate= */ false); fragment.disable(DEFAULT_DISPLAY, StatusBarManager.DISABLE_NOTIFICATION_ICONS, 0, false); @@ -585,12 +626,32 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest { } @Test + @EnableFlags({FLAG_STATUS_BAR_SCREEN_SHARING_CHIPS, FLAG_STATUS_BAR_RON_CHIPS}) + public void hasOngoingActivitiesButNotificationIconsDisabled_chipsHidden_ronsFlagOn() { + CollapsedStatusBarFragment fragment = resumeAndGetFragment(); + + mCollapsedStatusBarViewBinder.getListener().onOngoingActivityStatusChanged( + /* hasPrimaryOngoingActivity= */ true, + /* hasSecondaryOngoingActivity= */ true, + /* shouldAnimate= */ false); + + fragment.disable(DEFAULT_DISPLAY, + StatusBarManager.DISABLE_NOTIFICATION_ICONS, 0, false); + + assertEquals(View.GONE, getPrimaryOngoingActivityChipView().getVisibility()); + assertEquals(View.GONE, getSecondaryOngoingActivityChipView().getVisibility()); + } + + @Test @EnableFlags(FLAG_STATUS_BAR_SCREEN_SHARING_CHIPS) - public void hasOngoingActivityButAlsoHun_chipHidden() { + @DisableFlags(FLAG_STATUS_BAR_RON_CHIPS) + public void hasOngoingActivityButAlsoHun_chipHidden_ronsFlagOff() { CollapsedStatusBarFragment fragment = resumeAndGetFragment(); mCollapsedStatusBarViewBinder.getListener().onOngoingActivityStatusChanged( - /* hasOngoingActivity= */ true, /* shouldAnimate= */ false); + /* hasPrimaryOngoingActivity= */ true, + /* hasSecondaryOngoingActivity= */ false, + /* shouldAnimate= */ false); when(mHeadsUpAppearanceController.shouldBeVisible()).thenReturn(true); fragment.disable(DEFAULT_DISPLAY, 0, 0, false); @@ -599,33 +660,120 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest { } @Test + @EnableFlags({FLAG_STATUS_BAR_SCREEN_SHARING_CHIPS, FLAG_STATUS_BAR_RON_CHIPS}) + public void hasOngoingActivitiesButAlsoHun_chipsHidden_ronsFlagOn() { + CollapsedStatusBarFragment fragment = resumeAndGetFragment(); + + mCollapsedStatusBarViewBinder.getListener().onOngoingActivityStatusChanged( + /* hasPrimaryOngoingActivity= */ true, + /* hasSecondaryOngoingActivity= */ true, + /* shouldAnimate= */ false); + when(mHeadsUpAppearanceController.shouldBeVisible()).thenReturn(true); + + fragment.disable(DEFAULT_DISPLAY, 0, 0, false); + + assertEquals(View.GONE, getPrimaryOngoingActivityChipView().getVisibility()); + assertEquals(View.GONE, getSecondaryOngoingActivityChipView().getVisibility()); + } + + @Test @EnableFlags(FLAG_STATUS_BAR_SCREEN_SHARING_CHIPS) - public void ongoingActivityEnded_chipHidden() { + @DisableFlags(FLAG_STATUS_BAR_RON_CHIPS) + public void primaryOngoingActivityEnded_chipHidden_ronsFlagOff() { + resumeAndGetFragment(); + + // Ongoing activity started + mCollapsedStatusBarViewBinder.getListener().onOngoingActivityStatusChanged( + /* hasPrimaryOngoingActivity= */ true, + /* hasSecondaryOngoingActivity= */ false, + /* shouldAnimate= */ false); + + assertEquals(View.VISIBLE, getPrimaryOngoingActivityChipView().getVisibility()); + + // Ongoing activity ended + mCollapsedStatusBarViewBinder.getListener().onOngoingActivityStatusChanged( + /* hasPrimaryOngoingActivity= */ false, + /* hasSecondaryOngoingActivity= */ false, + /* shouldAnimate= */ false); + + assertEquals(View.GONE, getPrimaryOngoingActivityChipView().getVisibility()); + } + + @Test + @EnableFlags({FLAG_STATUS_BAR_SCREEN_SHARING_CHIPS, FLAG_STATUS_BAR_RON_CHIPS}) + public void primaryOngoingActivityEnded_chipHidden_ronsFlagOn() { resumeAndGetFragment(); // Ongoing activity started mCollapsedStatusBarViewBinder.getListener().onOngoingActivityStatusChanged( - /* hasOngoingActivity= */ true, /* shouldAnimate= */ false); + /* hasPrimaryOngoingActivity= */ true, + /* hasSecondaryOngoingActivity= */ false, + /* shouldAnimate= */ false); assertEquals(View.VISIBLE, getPrimaryOngoingActivityChipView().getVisibility()); // Ongoing activity ended mCollapsedStatusBarViewBinder.getListener().onOngoingActivityStatusChanged( - /* hasOngoingActivity= */ false, /* shouldAnimate= */ false); + /* hasPrimaryOngoingActivity= */ false, + /* hasSecondaryOngoingActivity= */ false, + /* shouldAnimate= */ false); assertEquals(View.GONE, getPrimaryOngoingActivityChipView().getVisibility()); } @Test + @EnableFlags({FLAG_STATUS_BAR_SCREEN_SHARING_CHIPS, FLAG_STATUS_BAR_RON_CHIPS}) + public void secondaryOngoingActivityEnded_chipHidden() { + resumeAndGetFragment(); + + // Secondary ongoing activity started + mCollapsedStatusBarViewBinder.getListener().onOngoingActivityStatusChanged( + /* hasPrimaryOngoingActivity= */ true, + /* hasSecondaryOngoingActivity= */ true, + /* shouldAnimate= */ false); + + assertEquals(View.VISIBLE, getSecondaryOngoingActivityChipView().getVisibility()); + + // Ongoing activity ended + mCollapsedStatusBarViewBinder.getListener().onOngoingActivityStatusChanged( + /* hasPrimaryOngoingActivity= */ true, + /* hasSecondaryOngoingActivity= */ false, + /* shouldAnimate= */ false); + + assertEquals(View.GONE, getSecondaryOngoingActivityChipView().getVisibility()); + } + + @Test @EnableFlags(FLAG_STATUS_BAR_SCREEN_SHARING_CHIPS) - public void hasOngoingActivity_hidesNotifsWithoutAnimation() { + @DisableFlags(FLAG_STATUS_BAR_RON_CHIPS) + public void hasOngoingActivity_hidesNotifsWithoutAnimation_ronsFlagOff() { CollapsedStatusBarFragment fragment = resumeAndGetFragment(); // Enable animations for testing so that we can verify we still aren't animating fragment.enableAnimationsForTesting(); - // Ongoing call started + // Ongoing activity started mCollapsedStatusBarViewBinder.getListener().onOngoingActivityStatusChanged( - /* hasOngoingActivity= */ true, /* shouldAnimate= */ false); + /* hasPrimaryOngoingActivity= */ true, + /* hasSecondaryOngoingActivity= */ false, + /* shouldAnimate= */ false); + + // Notification area is hidden without delay + assertEquals(0f, getNotificationAreaView().getAlpha(), 0.01); + assertEquals(View.INVISIBLE, getNotificationAreaView().getVisibility()); + } + + @Test + @EnableFlags({FLAG_STATUS_BAR_SCREEN_SHARING_CHIPS, FLAG_STATUS_BAR_RON_CHIPS}) + public void hasOngoingActivity_hidesNotifsWithoutAnimation_ronsFlagOn() { + CollapsedStatusBarFragment fragment = resumeAndGetFragment(); + // Enable animations for testing so that we can verify we still aren't animating + fragment.enableAnimationsForTesting(); + + // Ongoing activity started + mCollapsedStatusBarViewBinder.getListener().onOngoingActivityStatusChanged( + /* hasPrimaryOngoingActivity= */ true, + /* hasSecondaryOngoingActivity= */ false, + /* shouldAnimate= */ false); // Notification area is hidden without delay assertEquals(0f, getNotificationAreaView().getAlpha(), 0.01); @@ -634,7 +782,8 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest { @Test @EnableFlags(FLAG_STATUS_BAR_SCREEN_SHARING_CHIPS) - public void screenSharingChipsEnabled_ignoresOngoingCallController() { + @DisableFlags(FLAG_STATUS_BAR_RON_CHIPS) + public void screenSharingChipsEnabled_ignoresOngoingCallController_ronsFlagOff() { CollapsedStatusBarFragment fragment = resumeAndGetFragment(); // WHEN there *is* an ongoing call via old callback @@ -643,7 +792,9 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest { // WHEN there's *no* ongoing activity via new callback mCollapsedStatusBarViewBinder.getListener().onOngoingActivityStatusChanged( - /* hasOngoingActivity= */ false, /* shouldAnimate= */ false); + /* hasPrimaryOngoingActivity= */ false, + /* hasSecondaryOngoingActivity= */ false, + /* shouldAnimate= */ false); // THEN the new callback value is used, so the view is hidden assertEquals(View.GONE, getPrimaryOngoingActivityChipView().getVisibility()); @@ -652,15 +803,50 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest { when(mOngoingCallController.hasOngoingCall()).thenReturn(false); fragment.disable(DEFAULT_DISPLAY, 0, 0, false); - // WHEN there *is* an ongoing activity via new callback + // WHEN there *are* ongoing activities via new callback mCollapsedStatusBarViewBinder.getListener().onOngoingActivityStatusChanged( - /* hasOngoingActivity= */ true, /* shouldAnimate= */ false); + /* hasPrimaryOngoingActivity= */ true, + /* hasSecondaryOngoingActivity= */ false, + /* shouldAnimate= */ false); - // THEN the new callback value is used, so the view is shown + // THEN the new callback value is used, so the views are shown assertEquals(View.VISIBLE, getPrimaryOngoingActivityChipView().getVisibility()); } @Test + @EnableFlags({FLAG_STATUS_BAR_SCREEN_SHARING_CHIPS, FLAG_STATUS_BAR_RON_CHIPS}) + public void screenSharingChipsEnabled_ignoresOngoingCallController_ronsFlagOn() { + CollapsedStatusBarFragment fragment = resumeAndGetFragment(); + + // WHEN there *is* an ongoing call via old callback + when(mOngoingCallController.hasOngoingCall()).thenReturn(true); + fragment.disable(DEFAULT_DISPLAY, 0, 0, true); + + // WHEN there's *no* ongoing activity via new callback + mCollapsedStatusBarViewBinder.getListener().onOngoingActivityStatusChanged( + /* hasPrimaryOngoingActivity= */ false, + /* hasSecondaryOngoingActivity= */ false, + /* shouldAnimate= */ false); + + // THEN the new callback value is used, so the view is hidden + assertEquals(View.GONE, getPrimaryOngoingActivityChipView().getVisibility()); + + // WHEN there's *no* ongoing call via old callback + when(mOngoingCallController.hasOngoingCall()).thenReturn(false); + fragment.disable(DEFAULT_DISPLAY, 0, 0, false); + + // WHEN there *are* ongoing activities via new callback + mCollapsedStatusBarViewBinder.getListener().onOngoingActivityStatusChanged( + /* hasPrimaryOngoingActivity= */ true, + /* hasSecondaryOngoingActivity= */ true, + /* shouldAnimate= */ false); + + // THEN the new callback value is used, so the views are shown + assertEquals(View.VISIBLE, getPrimaryOngoingActivityChipView().getVisibility()); + assertEquals(View.VISIBLE, getSecondaryOngoingActivityChipView().getVisibility()); + } + + @Test @EnableSceneContainer public void isHomeStatusBarAllowedByScene_false_everythingHidden() { resumeAndGetFragment(); @@ -1010,4 +1196,8 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest { private View getPrimaryOngoingActivityChipView() { return mFragment.getView().findViewById(R.id.ongoing_activity_chip_primary); } + + private View getSecondaryOngoingActivityChipView() { + return mFragment.getView().findViewById(R.id.ongoing_activity_chip_secondary); + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/StatusBarVisibilityModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/StatusBarVisibilityModelTest.kt index 9f6f51a28764..d47a90364a43 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/StatusBarVisibilityModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/StatusBarVisibilityModelTest.kt @@ -39,7 +39,8 @@ class StatusBarVisibilityModelTest : SysuiTestCase() { StatusBarVisibilityModel( showClock = true, showNotificationIcons = true, - showOngoingActivityChip = true, + showPrimaryOngoingActivityChip = true, + showSecondaryOngoingActivityChip = true, showSystemInfo = true, ) @@ -75,17 +76,19 @@ class StatusBarVisibilityModelTest : SysuiTestCase() { } @Test - fun createModelFromFlags_ongoingCallChipNotDisabled_showOngoingActivityChipTrue() { + fun createModelFromFlags_ongoingCallChipNotDisabled_showOngoingActivityChipsTrue() { val result = createModelFromFlags(disabled1 = 0, disabled2 = 0) - assertThat(result.showOngoingActivityChip).isTrue() + assertThat(result.showPrimaryOngoingActivityChip).isTrue() + assertThat(result.showSecondaryOngoingActivityChip).isTrue() } @Test - fun createModelFromFlags_ongoingCallChipDisabled_showOngoingActivityChipFalse() { + fun createModelFromFlags_ongoingCallChipDisabled_showOngoingActivityChipsFalse() { val result = createModelFromFlags(disabled1 = DISABLE_ONGOING_CALL_CHIP, disabled2 = 0) - assertThat(result.showOngoingActivityChip).isFalse() + assertThat(result.showPrimaryOngoingActivityChip).isFalse() + assertThat(result.showSecondaryOngoingActivityChip).isFalse() } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/FakeCollapsedStatusBarViewModel.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/FakeCollapsedStatusBarViewModel.kt index e71f5217095c..4834d367d4be 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/FakeCollapsedStatusBarViewModel.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/FakeCollapsedStatusBarViewModel.kt @@ -16,6 +16,7 @@ package com.android.systemui.statusbar.pipeline.shared.ui.viewmodel +import com.android.systemui.statusbar.chips.ui.model.MultipleOngoingActivityChipsModel import com.android.systemui.statusbar.chips.ui.model.OngoingActivityChipModel import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow @@ -31,6 +32,8 @@ class FakeCollapsedStatusBarViewModel : CollapsedStatusBarViewModel { override val primaryOngoingActivityChip: MutableStateFlow<OngoingActivityChipModel> = MutableStateFlow(OngoingActivityChipModel.Hidden()) + override val ongoingActivityChips = MutableStateFlow(MultipleOngoingActivityChipsModel()) + override val isHomeStatusBarAllowedByScene = MutableStateFlow(false) override fun areNotificationsLightsOut(displayId: Int): Flow<Boolean> = areNotificationLightsOut diff --git a/packages/SystemUI/tests/src/com/android/systemui/touchpad/tutorial/ui/gesture/RecentAppsGestureMonitorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/touchpad/tutorial/ui/gesture/RecentAppsGestureMonitorTest.kt new file mode 100644 index 000000000000..cafebb9fd79e --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/touchpad/tutorial/ui/gesture/RecentAppsGestureMonitorTest.kt @@ -0,0 +1,112 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.touchpad.tutorial.ui.gesture + +import android.view.MotionEvent +import androidx.compose.ui.input.pointer.util.VelocityTracker1D +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.GestureState.FINISHED +import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.IN_PROGRESS +import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.NOT_STARTED +import com.android.systemui.touchpad.tutorial.ui.gesture.MultiFingerGesture.Companion.SWIPE_DISTANCE +import com.google.common.truth.Truth.assertThat +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.mock +import org.mockito.kotlin.whenever + +@SmallTest +@RunWith(AndroidJUnit4::class) +class RecentAppsGestureMonitorTest : SysuiTestCase() { + + companion object { + const val THRESHOLD_VELOCITY_PX_PER_MS = 0.1f + // multiply by 1000 to get px per ms instead of px per s which is unit used by velocity + // tracker + const val SLOW = THRESHOLD_VELOCITY_PX_PER_MS * 1000 - 1 + const val FAST = THRESHOLD_VELOCITY_PX_PER_MS * 1000 + 1 + } + + private var gestureState = NOT_STARTED + private val velocityTracker = + mock<VelocityTracker1D> { + // by default return correct speed for the gesture - as if pointer is slowing down + on { calculateVelocity() } doReturn SLOW + } + private val gestureMonitor = + RecentAppsGestureMonitor( + gestureDistanceThresholdPx = SWIPE_DISTANCE.toInt(), + gestureStateChangedCallback = { gestureState = it }, + velocityThresholdPxPerMs = THRESHOLD_VELOCITY_PX_PER_MS, + velocityTracker = velocityTracker + ) + + @Test + fun triggersGestureFinishedForThreeFingerGestureUp() { + assertStateAfterEvents(events = ThreeFingerGesture.swipeUp(), expectedState = FINISHED) + } + + @Test + fun doesntTriggerGestureFinished_onGestureSpeedTooHigh() { + whenever(velocityTracker.calculateVelocity()).thenReturn(FAST) + assertStateAfterEvents(events = ThreeFingerGesture.swipeUp(), expectedState = NOT_STARTED) + } + + @Test + fun triggersGestureProgressForThreeFingerGestureStarted() { + assertStateAfterEvents( + events = ThreeFingerGesture.startEvents(x = 0f, y = 0f), + expectedState = IN_PROGRESS + ) + } + + @Test + fun doesntTriggerGestureFinished_onGestureDistanceTooShort() { + assertStateAfterEvents( + events = ThreeFingerGesture.swipeUp(distancePx = SWIPE_DISTANCE / 2), + expectedState = NOT_STARTED + ) + } + + @Test + fun doesntTriggerGestureFinished_onThreeFingersSwipeInOtherDirections() { + assertStateAfterEvents(events = ThreeFingerGesture.swipeDown(), expectedState = NOT_STARTED) + assertStateAfterEvents(events = ThreeFingerGesture.swipeLeft(), expectedState = NOT_STARTED) + assertStateAfterEvents( + events = ThreeFingerGesture.swipeRight(), + expectedState = NOT_STARTED + ) + } + + @Test + fun doesntTriggerGestureFinished_onTwoFingersSwipe() { + assertStateAfterEvents(events = TwoFingerGesture.swipeUp(), expectedState = NOT_STARTED) + } + + @Test + fun doesntTriggerGestureFinished_onFourFingersSwipe() { + assertStateAfterEvents(events = FourFingerGesture.swipeUp(), expectedState = NOT_STARTED) + } + + private fun assertStateAfterEvents(events: List<MotionEvent>, expectedState: GestureState) { + events.forEach { gestureMonitor.processTouchpadEvent(it) } + assertThat(gestureState).isEqualTo(expectedState) + } +} diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/accessibility/FakeReduceBrightColorsController.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/accessibility/FakeReduceBrightColorsController.kt index e02042d26d45..ab745efe97c6 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/accessibility/FakeReduceBrightColorsController.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/accessibility/FakeReduceBrightColorsController.kt @@ -47,14 +47,6 @@ class FakeReduceBrightColorsController : ReduceBrightColorsController { } } - override fun setReduceBrightColorsFeatureAvailable(enabled: Boolean) { - // do nothing - } - - override fun isReduceBrightColorsFeatureAvailable(): Boolean { - return true - } - override fun isInUpgradeMode(resources: Resources?): Boolean { if (resources != null) { return Flags.evenDimmer() && diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/classifier/FalsingCollectorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/classifier/FalsingCollectorKosmos.kt index d31491d22435..25c4bbb75aec 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/classifier/FalsingCollectorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/classifier/FalsingCollectorKosmos.kt @@ -18,4 +18,6 @@ package com.android.systemui.classifier import com.android.systemui.kosmos.Kosmos -var Kosmos.falsingCollector by Kosmos.Fixture<FalsingCollector> { FalsingCollectorFake() } +var Kosmos.fakeFalsingCollector by Kosmos.Fixture { FalsingCollectorFake() } + +var Kosmos.falsingCollector by Kosmos.Fixture<FalsingCollector> { fakeFalsingCollector } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/communal/domain/interactor/CommunalSceneInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/communal/domain/interactor/CommunalSceneInteractorKosmos.kt index 2ab82214e497..209d1636e380 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/communal/domain/interactor/CommunalSceneInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/communal/domain/interactor/CommunalSceneInteractorKosmos.kt @@ -20,6 +20,7 @@ import com.android.systemui.communal.data.repository.communalSceneRepository import com.android.systemui.communal.shared.log.communalSceneLogger import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.applicationCoroutineScope +import com.android.systemui.scene.domain.interactor.sceneInteractor val Kosmos.communalSceneInteractor: CommunalSceneInteractor by Kosmos.Fixture { @@ -27,5 +28,6 @@ val Kosmos.communalSceneInteractor: CommunalSceneInteractor by applicationScope = applicationCoroutineScope, repository = communalSceneRepository, logger = communalSceneLogger, + sceneInteractor = sceneInteractor, ) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryInteractorKosmos.kt index 13116e7fd46f..096022ce1507 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryInteractorKosmos.kt @@ -22,6 +22,7 @@ import com.android.systemui.deviceentry.data.repository.deviceEntryRepository import com.android.systemui.keyguard.dismissCallbackRegistry import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.applicationCoroutineScope +import com.android.systemui.scene.domain.interactor.sceneBackInteractor import com.android.systemui.scene.domain.interactor.sceneInteractor import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -36,5 +37,6 @@ val Kosmos.deviceEntryInteractor by deviceUnlockedInteractor = deviceUnlockedInteractor, alternateBouncerInteractor = alternateBouncerInteractor, dismissCallbackRegistry = dismissCallbackRegistry, + sceneBackInteractor = sceneBackInteractor, ) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/haptics/msdl/BouncerHapticHelperKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/haptics/msdl/BouncerHapticHelperKosmos.kt new file mode 100644 index 000000000000..94982edcd5f3 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/haptics/msdl/BouncerHapticHelperKosmos.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.haptics.msdl + +import com.android.systemui.bouncer.ui.helper.BouncerHapticPlayer +import com.android.systemui.kosmos.Kosmos +import com.google.android.msdl.domain.MSDLPlayer +import dagger.Lazy + +val Kosmos.bouncerHapticPlayer: BouncerHapticPlayer by + Kosmos.Fixture { + val lazyPlayer = Lazy<MSDLPlayer> { fakeMSDLPlayer } + BouncerHapticPlayer(lazyPlayer) + } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorFactory.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorFactory.kt index f5232ce8a200..9593dfbbce29 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorFactory.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorFactory.kt @@ -36,6 +36,7 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.test.TestScope +import org.mockito.kotlin.any /** * Simply put, I got tired of adding a constructor argument and then having to tweak dozens of @@ -66,6 +67,7 @@ object KeyguardInteractorFactory { mock<KeyguardTransitionInteractor>().also { whenever(it.currentKeyguardState).thenReturn(currentKeyguardStateFlow) whenever(it.transitionState).thenReturn(transitionStateFlow) + whenever(it.isFinishedIn(any(), any())).thenReturn(MutableStateFlow(false)) } val configurationDimensionFlow = MutableSharedFlow<ConfigurationBasedDimensions>() configurationDimensionFlow.tryEmit( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/KosmosJavaAdapter.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/KosmosJavaAdapter.kt index c60305e85b22..f97f30383398 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/KosmosJavaAdapter.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/KosmosJavaAdapter.kt @@ -36,6 +36,7 @@ import com.android.systemui.deviceentry.domain.interactor.deviceEntryInteractor import com.android.systemui.deviceentry.domain.interactor.deviceEntryUdfpsInteractor import com.android.systemui.deviceentry.domain.interactor.deviceUnlockedInteractor import com.android.systemui.globalactions.domain.interactor.globalActionsInteractor +import com.android.systemui.haptics.msdl.bouncerHapticPlayer import com.android.systemui.haptics.msdl.fakeMSDLPlayer import com.android.systemui.haptics.qs.qsLongPressEffect import com.android.systemui.jank.interactionJankMonitor @@ -158,4 +159,5 @@ class KosmosJavaAdapter() { val sceneContainerOcclusionInteractor by lazy { kosmos.sceneContainerOcclusionInteractor } val msdlPlayer by lazy { kosmos.fakeMSDLPlayer } val shadeModeInteractor by lazy { kosmos.shadeModeInteractor } + val bouncerHapticHelper by lazy { kosmos.bouncerHapticPlayer } } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/scene/domain/startable/SceneContainerStartableKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/scene/domain/startable/SceneContainerStartableKosmos.kt index 9a5698cfb8ca..4228c3c0b110 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/scene/domain/startable/SceneContainerStartableKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/scene/domain/startable/SceneContainerStartableKosmos.kt @@ -32,13 +32,11 @@ import com.android.systemui.haptics.vibratorHelper import com.android.systemui.keyguard.dismissCallbackRegistry import com.android.systemui.keyguard.domain.interactor.keyguardEnabledInteractor import com.android.systemui.keyguard.domain.interactor.keyguardInteractor -import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor import com.android.systemui.keyguard.domain.interactor.windowManagerLockscreenVisibilityInteractor import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture import com.android.systemui.kosmos.testScope import com.android.systemui.model.sysUiState -import com.android.systemui.plugins.statusbar.statusBarStateController import com.android.systemui.power.domain.interactor.powerInteractor import com.android.systemui.scene.domain.interactor.sceneBackInteractor import com.android.systemui.scene.domain.interactor.sceneContainerOcclusionInteractor @@ -62,7 +60,6 @@ val Kosmos.sceneContainerStartable by Fixture { deviceUnlockedInteractor = deviceUnlockedInteractor, bouncerInteractor = bouncerInteractor, keyguardInteractor = keyguardInteractor, - keyguardTransitionInteractor = keyguardTransitionInteractor, sysUiState = sysUiState, displayId = displayTracker.defaultDisplayId, sceneLogger = sceneLogger, diff --git a/packages/VpnDialogs/tests/Android.bp b/packages/VpnDialogs/tests/Android.bp index 68639bd1c4fe..409282efb714 100644 --- a/packages/VpnDialogs/tests/Android.bp +++ b/packages/VpnDialogs/tests/Android.bp @@ -22,8 +22,8 @@ android_test { // (e.g. VpnManager#prepareVpn()). certificate: "platform", libs: [ - "android.test.runner", - "android.test.base", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", ], static_libs: [ "androidx.test.core", diff --git a/packages/WAPPushManager/tests/Android.bp b/packages/WAPPushManager/tests/Android.bp index 0a179383fab6..973100248a2b 100644 --- a/packages/WAPPushManager/tests/Android.bp +++ b/packages/WAPPushManager/tests/Android.bp @@ -26,9 +26,9 @@ package { android_test { name: "WAPPushManagerTests", libs: [ - "android.test.runner", + "android.test.runner.stubs.system", "telephony-common", - "android.test.base", + "android.test.base.stubs.system", ], static_libs: ["junit"], // Include all test java files. diff --git a/packages/WallpaperBackup/Android.bp b/packages/WallpaperBackup/Android.bp index 18f783146c72..b8e0d427f3d8 100644 --- a/packages/WallpaperBackup/Android.bp +++ b/packages/WallpaperBackup/Android.bp @@ -42,8 +42,8 @@ android_test { "test/src/**/*.java", ], libs: [ - "android.test.base", - "android.test.runner", + "android.test.base.stubs.system", + "android.test.runner.stubs.system", ], static_libs: [ "androidx.test.core", diff --git a/packages/overlays/tests/Android.bp b/packages/overlays/tests/Android.bp index 0244c0fe0533..8bbe60059d45 100644 --- a/packages/overlays/tests/Android.bp +++ b/packages/overlays/tests/Android.bp @@ -26,8 +26,8 @@ android_test { certificate: "platform", srcs: ["src/**/*.java"], libs: [ - "android.test.runner", - "android.test.base", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", ], platform_apis: true, static_libs: [ diff --git a/ravenwood/Android.bp b/ravenwood/Android.bp index 8ff99e4af30d..3c65f378f33d 100644 --- a/ravenwood/Android.bp +++ b/ravenwood/Android.bp @@ -159,7 +159,7 @@ java_library { "ravenwood-runtime-common", ], libs: [ - "android.test.mock", + "android.test.mock.impl", "framework-minus-apex.ravenwood", "ravenwood-framework", "services.core.ravenwood", @@ -168,7 +168,6 @@ java_library { "ravenwood-helper-framework-runtime", "ravenwood-helper-libcore-runtime", ], - sdk_version: "core_current", visibility: ["//frameworks/base"], jarjar_rules: ":ravenwood-services-jarjar-rules", } diff --git a/ravenwood/mockito/Android.bp b/ravenwood/mockito/Android.bp index 95c7394b19f3..d91537bbc334 100644 --- a/ravenwood/mockito/Android.bp +++ b/ravenwood/mockito/Android.bp @@ -21,9 +21,9 @@ android_ravenwood_test { "truth", ], libs: [ - "android.test.mock", - "android.test.base", - "android.test.runner", + "android.test.mock.stubs.system", + "android.test.base.stubs.system", + "android.test.runner.stubs.system", ], auto_gen_config: true, } @@ -48,9 +48,9 @@ android_test { "mockito-target-extended-minus-junit4", ], libs: [ - "android.test.mock", - "android.test.base", - "android.test.runner", + "android.test.mock.stubs.system", + "android.test.base.stubs.system", + "android.test.runner.stubs.system", ], jni_libs: [ // Required by mockito diff --git a/sax/tests/saxtests/Android.bp b/sax/tests/saxtests/Android.bp index 446ee9394179..29c742f47868 100644 --- a/sax/tests/saxtests/Android.bp +++ b/sax/tests/saxtests/Android.bp @@ -12,8 +12,8 @@ android_test { // Include all test java files. srcs: ["src/**/*.java"], libs: [ - "android.test.runner", - "android.test.base", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", ], static_libs: [ "junit", diff --git a/services/appfunctions/java/com/android/server/appfunctions/AppFunctionExecutors.java b/services/appfunctions/java/com/android/server/appfunctions/AppFunctionExecutors.java new file mode 100644 index 000000000000..c3b7087a44c3 --- /dev/null +++ b/services/appfunctions/java/com/android/server/appfunctions/AppFunctionExecutors.java @@ -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.server.appfunctions; + +import java.util.concurrent.Executor; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** Executors for App function operations. */ +public final class AppFunctionExecutors { + + /** Executor for operations that do not need to block. */ + public static final Executor THREAD_POOL_EXECUTOR = + new ThreadPoolExecutor( + /* corePoolSize= */ Runtime.getRuntime().availableProcessors(), + /* maxConcurrency= */ Runtime.getRuntime().availableProcessors(), + /* keepAliveTime= */ 0L, + /* unit= */ TimeUnit.SECONDS, + /* workQueue= */ new LinkedBlockingQueue<>()); + + private AppFunctionExecutors() {} +} diff --git a/services/appfunctions/java/com/android/server/appfunctions/AppFunctionManagerServiceImpl.java b/services/appfunctions/java/com/android/server/appfunctions/AppFunctionManagerServiceImpl.java index f04bd9f8ccc0..f83269f86cd2 100644 --- a/services/appfunctions/java/com/android/server/appfunctions/AppFunctionManagerServiceImpl.java +++ b/services/appfunctions/java/com/android/server/appfunctions/AppFunctionManagerServiceImpl.java @@ -16,6 +16,8 @@ package com.android.server.appfunctions; +import static com.android.server.appfunctions.AppFunctionExecutors.THREAD_POOL_EXECUTOR; + import android.annotation.NonNull; import android.app.appfunctions.ExecuteAppFunctionAidlRequest; import android.app.appfunctions.ExecuteAppFunctionResponse; @@ -51,14 +53,7 @@ public class AppFunctionManagerServiceImpl extends IAppFunctionManager.Stub { public AppFunctionManagerServiceImpl(@NonNull Context context) { this( new RemoteServiceCallerImpl<>( - context, - IAppFunctionService.Stub::asInterface, - new ThreadPoolExecutor( - /* corePoolSize= */ Runtime.getRuntime().availableProcessors(), - /* maxConcurrency= */ Runtime.getRuntime().availableProcessors(), - /* keepAliveTime= */ 0L, - /* unit= */ TimeUnit.SECONDS, - /* workQueue= */ new LinkedBlockingQueue<>())), + context, IAppFunctionService.Stub::asInterface, THREAD_POOL_EXECUTOR), new CallerValidatorImpl(context), new ServiceHelperImpl(context), new ServiceConfigImpl()); @@ -124,39 +119,47 @@ public class AppFunctionManagerServiceImpl extends IAppFunctionManager.Stub { return; } - if (!mCallerValidator.verifyCallerCanExecuteAppFunction( - validatedCallingPackage, targetPackageName)) { - safeExecuteAppFunctionCallback.onResult( - ExecuteAppFunctionResponse.newFailure( - ExecuteAppFunctionResponse.RESULT_DENIED, - "Caller does not have permission to execute the appfunction", - /* extras= */ null)); - return; - } - - Intent serviceIntent = - mInternalServiceHelper.resolveAppFunctionService(targetPackageName, targetUser); - if (serviceIntent == null) { - safeExecuteAppFunctionCallback.onResult( - ExecuteAppFunctionResponse.newFailure( - ExecuteAppFunctionResponse.RESULT_INTERNAL_ERROR, - "Cannot find the target service.", - /* extras= */ null)); - return; - } - - final long token = Binder.clearCallingIdentity(); - try { - bindAppFunctionServiceUnchecked( - requestInternal, - serviceIntent, - targetUser, - safeExecuteAppFunctionCallback, - /* bindFlags= */ Context.BIND_AUTO_CREATE, - /* timeoutInMillis= */ mServiceConfig.getExecuteAppFunctionTimeoutMillis()); - } finally { - Binder.restoreCallingIdentity(token); - } + mCallerValidator + .verifyCallerCanExecuteAppFunction( + validatedCallingPackage, + targetPackageName, + requestInternal.getClientRequest().getFunctionIdentifier()) + .thenAccept( + canExecute -> { + if (!canExecute) { + safeExecuteAppFunctionCallback.onResult( + ExecuteAppFunctionResponse.newFailure( + ExecuteAppFunctionResponse.RESULT_DENIED, + "Caller does not have permission to execute the" + + " appfunction", + /* extras= */ null)); + return; + } + Intent serviceIntent = + mInternalServiceHelper.resolveAppFunctionService( + targetPackageName, targetUser); + if (serviceIntent == null) { + safeExecuteAppFunctionCallback.onResult( + ExecuteAppFunctionResponse.newFailure( + ExecuteAppFunctionResponse.RESULT_INTERNAL_ERROR, + "Cannot find the target service.", + /* extras= */ null)); + return; + } + final long token = Binder.clearCallingIdentity(); + try { + bindAppFunctionServiceUnchecked( + requestInternal, + serviceIntent, + targetUser, + safeExecuteAppFunctionCallback, + /* bindFlags= */ Context.BIND_AUTO_CREATE, + /* timeoutInMillis= */ mServiceConfig + .getExecuteAppFunctionTimeoutMillis()); + } finally { + Binder.restoreCallingIdentity(token); + } + }); } private void bindAppFunctionServiceUnchecked( diff --git a/services/appfunctions/java/com/android/server/appfunctions/CallerValidator.java b/services/appfunctions/java/com/android/server/appfunctions/CallerValidator.java index ca43dfaf87ac..e7a861e0a0dc 100644 --- a/services/appfunctions/java/com/android/server/appfunctions/CallerValidator.java +++ b/services/appfunctions/java/com/android/server/appfunctions/CallerValidator.java @@ -21,6 +21,7 @@ import android.annotation.NonNull; import android.os.UserHandle; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.infra.AndroidFuture; /** * Interface for validating that the caller has the correct privilege to call an AppFunctionManager @@ -65,10 +66,13 @@ public interface CallerValidator { * * @param callerPackageName The calling package (as previously validated). * @param targetPackageName The package that owns the app function to execute. + * @param functionId The id of the app function to execute. * @return Whether the caller can execute the specified app function. */ - boolean verifyCallerCanExecuteAppFunction( - @NonNull String callerPackageName, @NonNull String targetPackageName); + AndroidFuture<Boolean> verifyCallerCanExecuteAppFunction( + @NonNull String callerPackageName, + @NonNull String targetPackageName, + @NonNull String functionId); /** * Checks if the user is organization managed. diff --git a/services/appfunctions/java/com/android/server/appfunctions/CallerValidatorImpl.java b/services/appfunctions/java/com/android/server/appfunctions/CallerValidatorImpl.java index 618a5aedd9bb..99984384f455 100644 --- a/services/appfunctions/java/com/android/server/appfunctions/CallerValidatorImpl.java +++ b/services/appfunctions/java/com/android/server/appfunctions/CallerValidatorImpl.java @@ -16,19 +16,30 @@ package com.android.server.appfunctions; +import static android.app.appfunctions.AppFunctionStaticMetadataHelper.APP_FUNCTION_STATIC_METADATA_DB; +import static android.app.appfunctions.AppFunctionStaticMetadataHelper.APP_FUNCTION_STATIC_NAMESPACE; +import static android.app.appfunctions.AppFunctionStaticMetadataHelper.STATIC_PROPERTY_RESTRICT_CALLERS_WITH_EXECUTE_APP_FUNCTIONS; +import static android.app.appfunctions.AppFunctionStaticMetadataHelper.getDocumentIdForAppFunction; +import static com.android.server.appfunctions.AppFunctionExecutors.THREAD_POOL_EXECUTOR; + import android.Manifest; import android.annotation.BinderThread; import android.annotation.NonNull; import android.annotation.RequiresPermission; import android.app.admin.DevicePolicyManager; +import android.app.appsearch.AppSearchBatchResult; +import android.app.appsearch.AppSearchManager; +import android.app.appsearch.AppSearchManager.SearchContext; +import android.app.appsearch.GenericDocument; +import android.app.appsearch.GetByDocumentIdRequest; import android.content.Context; import android.content.pm.PackageManager; import android.os.Binder; import android.os.Process; import android.os.UserHandle; import android.os.UserManager; - import java.util.Objects; +import com.android.internal.infra.AndroidFuture; /* Validates that caller has the correct privilege to call an AppFunctionManager Api. */ class CallerValidatorImpl implements CallerValidator { @@ -76,11 +87,12 @@ class CallerValidatorImpl implements CallerValidator { Manifest.permission.EXECUTE_APP_FUNCTIONS }, conditional = true) - // TODO(b/360864791): Add and honor apps that opt-out from EXECUTE_APP_FUNCTIONS caller. - public boolean verifyCallerCanExecuteAppFunction( - @NonNull String callerPackageName, @NonNull String targetPackageName) { + public AndroidFuture<Boolean> verifyCallerCanExecuteAppFunction( + @NonNull String callerPackageName, + @NonNull String targetPackageName, + @NonNull String functionId) { if (callerPackageName.equals(targetPackageName)) { - return true; + return AndroidFuture.completedFuture(true); } int pid = Binder.getCallingPid(); @@ -89,10 +101,56 @@ class CallerValidatorImpl implements CallerValidator { mContext.checkPermission( Manifest.permission.EXECUTE_APP_FUNCTIONS_TRUSTED, pid, uid) == PackageManager.PERMISSION_GRANTED; + + if (hasTrustedExecutionPermission) { + return AndroidFuture.completedFuture(true); + } + boolean hasExecutionPermission = mContext.checkPermission(Manifest.permission.EXECUTE_APP_FUNCTIONS, pid, uid) == PackageManager.PERMISSION_GRANTED; - return hasExecutionPermission || hasTrustedExecutionPermission; + + final long token = Binder.clearCallingIdentity(); + try { + FutureAppSearchSession futureAppSearchSession = + new FutureAppSearchSessionImpl( + mContext.getSystemService(AppSearchManager.class), + THREAD_POOL_EXECUTOR, + new SearchContext.Builder(APP_FUNCTION_STATIC_METADATA_DB).build()); + + String documentId = getDocumentIdForAppFunction(targetPackageName, functionId); + + return futureAppSearchSession + .getByDocumentId( + new GetByDocumentIdRequest.Builder(APP_FUNCTION_STATIC_NAMESPACE) + .addIds(documentId) + .build()) + .thenApply( + batchResult -> + getGenericDocumentFromBatchResult(batchResult, documentId)) + .thenApply( + CallerValidatorImpl::getRestrictCallersWithExecuteAppFunctionsProperty) + .thenApply( + restrictCallersWithExecuteAppFunctions -> + !restrictCallersWithExecuteAppFunctions + && hasExecutionPermission); + } finally { + Binder.restoreCallingIdentity(token); + } + } + + private static GenericDocument getGenericDocumentFromBatchResult( + AppSearchBatchResult<String, GenericDocument> result, String documentId) { + if (result.isSuccess()) { + return result.getSuccesses().get(documentId); + } + throw new IllegalArgumentException("No document in the result for id: " + documentId); + } + + private static boolean getRestrictCallersWithExecuteAppFunctionsProperty( + GenericDocument genericDocument) { + return genericDocument.getPropertyBoolean( + STATIC_PROPERTY_RESTRICT_CALLERS_WITH_EXECUTE_APP_FUNCTIONS); } @Override diff --git a/services/appfunctions/java/com/android/server/appfunctions/FutureAppSearchSession.java b/services/appfunctions/java/com/android/server/appfunctions/FutureAppSearchSession.java index 39aa27ae794e..b1c25c4f3c61 100644 --- a/services/appfunctions/java/com/android/server/appfunctions/FutureAppSearchSession.java +++ b/services/appfunctions/java/com/android/server/appfunctions/FutureAppSearchSession.java @@ -18,11 +18,8 @@ package com.android.server.appfunctions; import android.annotation.NonNull; import android.app.appsearch.AppSearchBatchResult; -import android.app.appsearch.AppSearchManager; -import android.app.appsearch.AppSearchManager.SearchContext; 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.GetSchemaResponse; @@ -33,7 +30,6 @@ import android.app.appsearch.SearchResults; import android.app.appsearch.SearchSpec; import android.app.appsearch.SetSchemaRequest; import android.app.appsearch.SetSchemaResponse; -import android.util.Slog; import com.android.internal.infra.AndroidFuture; @@ -44,28 +40,11 @@ import java.util.Objects; import java.util.concurrent.Executor; /** A future API wrapper of {@link AppSearchSession} APIs. */ -public class FutureAppSearchSession implements Closeable { - private static final String TAG = FutureAppSearchSession.class.getSimpleName(); - private final Executor mExecutor; - private final AndroidFuture<AppSearchResult<AppSearchSession>> mSettableSessionFuture; - - public FutureAppSearchSession( - @NonNull AppSearchManager appSearchManager, - @NonNull Executor executor, - @NonNull SearchContext appSearchContext) { - Objects.requireNonNull(appSearchManager); - Objects.requireNonNull(executor); - Objects.requireNonNull(appSearchContext); - - mExecutor = executor; - mSettableSessionFuture = new AndroidFuture<>(); - appSearchManager.createSearchSession( - appSearchContext, mExecutor, mSettableSessionFuture::complete); - } +public interface FutureAppSearchSession extends Closeable { /** Converts a failed app search result codes into an exception. */ @NonNull - public static Exception failedResultToException(@NonNull AppSearchResult<?> appSearchResult) { + static Exception failedResultToException(@NonNull AppSearchResult<?> appSearchResult) { return switch (appSearchResult.getResultCode()) { case AppSearchResult.RESULT_INVALID_ARGUMENT -> new IllegalArgumentException(appSearchResult.getErrorMessage()); @@ -77,114 +56,39 @@ public class FutureAppSearchSession implements Closeable { }; } - private AndroidFuture<AppSearchSession> getSessionAsync() { - return mSettableSessionFuture.thenApply( - result -> { - if (result.isSuccess()) { - return result.getResultValue(); - } else { - throw new RuntimeException(failedResultToException(result)); - } - }); - } - - /** Gets the schema for a given app search session. */ - public AndroidFuture<GetSchemaResponse> getSchema() { - return getSessionAsync() - .thenCompose( - session -> { - AndroidFuture<AppSearchResult<GetSchemaResponse>> - settableSchemaResponse = new AndroidFuture<>(); - session.getSchema(mExecutor, settableSchemaResponse::complete); - return settableSchemaResponse.thenApply( - result -> { - if (result.isSuccess()) { - return result.getResultValue(); - } else { - throw new RuntimeException( - failedResultToException(result)); - } - }); - }); - } - - /** Sets the schema for a given app search session. */ - public AndroidFuture<SetSchemaResponse> setSchema(@NonNull SetSchemaRequest setSchemaRequest) { - return getSessionAsync() - .thenCompose( - session -> { - AndroidFuture<AppSearchResult<SetSchemaResponse>> - settableSchemaResponse = new AndroidFuture<>(); - session.setSchema( - setSchemaRequest, - mExecutor, - mExecutor, - settableSchemaResponse::complete); - return settableSchemaResponse.thenApply( - result -> { - if (result.isSuccess()) { - return result.getResultValue(); - } else { - throw new RuntimeException( - failedResultToException(result)); - } - }); - }); - } + /** + * Sets the schema that represents the organizational structure of data within the AppSearch + * database. + */ + AndroidFuture<SetSchemaResponse> setSchema(@NonNull SetSchemaRequest setSchemaRequest); - /** Indexes documents into the AppSearchSession database. */ - public AndroidFuture<AppSearchBatchResult<String, Void>> put( - @NonNull PutDocumentsRequest putDocumentsRequest) { - return getSessionAsync() - .thenCompose( - session -> { - AndroidFuture<AppSearchBatchResult<String, Void>> batchResultFuture = - new AndroidFuture<>(); + /** Retrieves the schema most recently successfully provided to {@code setSchema}. */ + AndroidFuture<GetSchemaResponse> getSchema(); - session.put( - putDocumentsRequest, mExecutor, batchResultFuture::complete); - return batchResultFuture; - }); - } + /** Indexes documents into the {@link AppSearchSession} database. */ + AndroidFuture<AppSearchBatchResult<String, Void>> put( + @NonNull PutDocumentsRequest putDocumentsRequest); - /** Removes documents from the AppSearchSession database. */ - public AndroidFuture<AppSearchBatchResult<String, Void>> remove( - @NonNull RemoveByDocumentIdRequest removeRequest) { - return getSessionAsync() - .thenCompose( - session -> { - AndroidFuture<AppSearchBatchResult<String, Void>> - settableBatchResultFuture = new AndroidFuture<>(); - session.remove( - removeRequest, - mExecutor, - new BatchResultCallbackAdapter<>(settableBatchResultFuture)); - return settableBatchResultFuture; - }); - } + /** Removes {@link GenericDocument} from the index by Query. */ + AndroidFuture<AppSearchBatchResult<String, Void>> remove( + @NonNull RemoveByDocumentIdRequest removeRequest); /** - * Retrieves documents from the open AppSearchSession that match a given query string and type - * of search provided. + * Gets {@link GenericDocument} objects by document IDs in a namespace from the {@link + * AppSearchSession} database. */ - public AndroidFuture<FutureSearchResults> search( - @NonNull String queryExpression, @NonNull SearchSpec searchSpec) { - return getSessionAsync() - .thenApply(session -> session.search(queryExpression, searchSpec)) - .thenApply(result -> new FutureSearchResults(result, mExecutor)); - } + AndroidFuture<AppSearchBatchResult<String, GenericDocument>> getByDocumentId( + GetByDocumentIdRequest getRequest); - @Override - public void close() throws IOException { - try { - getSessionAsync().get().close(); - } catch (Exception ex) { - Slog.e(TAG, "Failed to close app search session", ex); - } - } + /** + * Retrieves documents from the open {@link AppSearchSession} that match a given query string + * and type of search provided. + */ + AndroidFuture<FutureSearchResults> search( + @NonNull String queryExpression, @NonNull SearchSpec searchSpec); /** A future API wrapper of {@link android.app.appsearch.SearchResults}. */ - public static class FutureSearchResults { + class FutureSearchResults { private final SearchResults mSearchResults; private final Executor mExecutor; @@ -209,56 +113,4 @@ public class FutureAppSearchSession implements Closeable { }); } } - - /** A future API to retrieve a document by its id from the local AppSearch session. */ - public AndroidFuture<GenericDocument> getByDocumentId( - @NonNull String documentId, @NonNull String namespace) { - Objects.requireNonNull(documentId); - Objects.requireNonNull(namespace); - - GetByDocumentIdRequest request = - new GetByDocumentIdRequest.Builder(namespace).addIds(documentId).build(); - return getSessionAsync() - .thenCompose( - session -> { - AndroidFuture<AppSearchBatchResult<String, GenericDocument>> - batchResultFuture = new AndroidFuture<>(); - session.getByDocumentId( - request, - mExecutor, - new BatchResultCallbackAdapter<>(batchResultFuture)); - - return batchResultFuture.thenApply( - batchResult -> - getGenericDocumentFromBatchResult( - batchResult, documentId)); - }); - } - - private static GenericDocument getGenericDocumentFromBatchResult( - AppSearchBatchResult<String, GenericDocument> result, String documentId) { - if (result.isSuccess()) { - return result.getSuccesses().get(documentId); - } - throw new IllegalArgumentException("No document in the result for id: " + documentId); - } - - private static final class BatchResultCallbackAdapter<K, V> - implements BatchResultCallback<K, V> { - private final AndroidFuture<AppSearchBatchResult<K, V>> mFuture; - - BatchResultCallbackAdapter(AndroidFuture<AppSearchBatchResult<K, V>> future) { - mFuture = future; - } - - @Override - public void onResult(@NonNull AppSearchBatchResult<K, V> result) { - mFuture.complete(result); - } - - @Override - public void onSystemError(Throwable t) { - mFuture.completeExceptionally(t); - } - } } diff --git a/services/appfunctions/java/com/android/server/appfunctions/FutureAppSearchSessionImpl.java b/services/appfunctions/java/com/android/server/appfunctions/FutureAppSearchSessionImpl.java new file mode 100644 index 000000000000..e78f390a4825 --- /dev/null +++ b/services/appfunctions/java/com/android/server/appfunctions/FutureAppSearchSessionImpl.java @@ -0,0 +1,203 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.appfunctions; + +import static com.android.server.appfunctions.FutureAppSearchSession.failedResultToException; + +import android.annotation.NonNull; +import android.app.appsearch.AppSearchBatchResult; +import android.app.appsearch.AppSearchManager; +import android.app.appsearch.AppSearchManager.SearchContext; +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.GetSchemaResponse; +import android.app.appsearch.PutDocumentsRequest; +import android.app.appsearch.RemoveByDocumentIdRequest; +import android.app.appsearch.SearchSpec; +import android.app.appsearch.SetSchemaRequest; +import android.app.appsearch.SetSchemaResponse; + +import com.android.internal.infra.AndroidFuture; + +import java.io.IOException; +import java.util.Objects; +import java.util.concurrent.Executor; + +/** Implementation of {@link FutureAppSearchSession} */ +public class FutureAppSearchSessionImpl implements FutureAppSearchSession { + + private static final String TAG = FutureAppSearchSession.class.getSimpleName(); + private final Executor mExecutor; + private final AndroidFuture<AppSearchResult<AppSearchSession>> mSettableSessionFuture; + + public FutureAppSearchSessionImpl( + @NonNull AppSearchManager appSearchManager, + @NonNull Executor executor, + @NonNull SearchContext appSearchContext) { + Objects.requireNonNull(appSearchManager); + Objects.requireNonNull(executor); + Objects.requireNonNull(appSearchContext); + + mExecutor = executor; + mSettableSessionFuture = new AndroidFuture<>(); + appSearchManager.createSearchSession( + appSearchContext, mExecutor, mSettableSessionFuture::complete); + } + + private AndroidFuture<AppSearchSession> getSessionAsync() { + return mSettableSessionFuture.thenApply( + result -> { + if (result.isSuccess()) { + return result.getResultValue(); + } else { + throw new RuntimeException(failedResultToException(result)); + } + }); + } + + @Override + public AndroidFuture<SetSchemaResponse> setSchema(@NonNull SetSchemaRequest setSchemaRequest) { + Objects.requireNonNull(setSchemaRequest); + + return getSessionAsync() + .thenCompose( + session -> { + AndroidFuture<AppSearchResult<SetSchemaResponse>> + settableSchemaResponse = new AndroidFuture<>(); + session.setSchema( + setSchemaRequest, + mExecutor, + mExecutor, + settableSchemaResponse::complete); + return settableSchemaResponse.thenApply( + result -> { + if (result.isSuccess()) { + return result.getResultValue(); + } else { + throw new RuntimeException( + failedResultToException(result)); + } + }); + }); + } + + @Override + public AndroidFuture<GetSchemaResponse> getSchema() { + return getSessionAsync() + .thenCompose( + session -> { + AndroidFuture<AppSearchResult<GetSchemaResponse>> + settableSchemaResponse = new AndroidFuture<>(); + session.getSchema(mExecutor, settableSchemaResponse::complete); + return settableSchemaResponse.thenApply( + result -> { + if (result.isSuccess()) { + return result.getResultValue(); + } else { + throw new RuntimeException( + failedResultToException(result)); + } + }); + }); + } + + @Override + public AndroidFuture<AppSearchBatchResult<String, Void>> put( + @NonNull PutDocumentsRequest putDocumentsRequest) { + Objects.requireNonNull(putDocumentsRequest); + + return getSessionAsync() + .thenCompose( + session -> { + AndroidFuture<AppSearchBatchResult<String, Void>> batchResultFuture = + new AndroidFuture<>(); + + session.put( + putDocumentsRequest, mExecutor, batchResultFuture::complete); + return batchResultFuture; + }); + } + + @Override + public AndroidFuture<AppSearchBatchResult<String, Void>> remove( + @NonNull RemoveByDocumentIdRequest removeRequest) { + Objects.requireNonNull(removeRequest); + + return getSessionAsync() + .thenCompose( + session -> { + AndroidFuture<AppSearchBatchResult<String, Void>> + settableBatchResultFuture = new AndroidFuture<>(); + session.remove( + removeRequest, + mExecutor, + new BatchResultCallbackAdapter<>(settableBatchResultFuture)); + return settableBatchResultFuture; + }); + } + + @Override + public AndroidFuture<AppSearchBatchResult<String, GenericDocument>> getByDocumentId( + @NonNull GetByDocumentIdRequest getRequest) { + Objects.requireNonNull(getRequest); + + return getSessionAsync() + .thenCompose( + session -> { + AndroidFuture<AppSearchBatchResult<String, GenericDocument>> + batchResultFuture = new AndroidFuture<>(); + session.getByDocumentId( + getRequest, + mExecutor, + new BatchResultCallbackAdapter<>(batchResultFuture)); + return batchResultFuture; + }); + } + + @Override + public AndroidFuture<FutureSearchResults> search( + @NonNull String queryExpression, @NonNull SearchSpec searchSpec) { + return getSessionAsync() + .thenApply(session -> session.search(queryExpression, searchSpec)) + .thenApply(result -> new FutureSearchResults(result, mExecutor)); + } + + @Override + public void close() throws IOException {} + + private static final class BatchResultCallbackAdapter<K, V> + implements BatchResultCallback<K, V> { + private final AndroidFuture<AppSearchBatchResult<K, V>> mFuture; + + BatchResultCallbackAdapter(AndroidFuture<AppSearchBatchResult<K, V>> future) { + mFuture = future; + } + + @Override + public void onResult(@NonNull AppSearchBatchResult<K, V> result) { + mFuture.complete(result); + } + + @Override + public void onSystemError(Throwable t) { + mFuture.completeExceptionally(t); + } + } +} diff --git a/services/core/java/com/android/server/TEST_MAPPING b/services/core/java/com/android/server/TEST_MAPPING index 556fae31fd8f..30f3fd2f83a5 100644 --- a/services/core/java/com/android/server/TEST_MAPPING +++ b/services/core/java/com/android/server/TEST_MAPPING @@ -78,24 +78,11 @@ "file_patterns": ["StorageManagerService\\.java"] }, { - "name": "FrameworksServicesTests", - "options": [ - { - "include-filter": "com.android.server.BinaryTransparencyServiceTest" - } - ], + "name": "FrameworksServicesTests_binary_transparency", "file_patterns": ["BinaryTransparencyService\\.java"] }, { - "name": "FrameworksServicesTests", - "options": [ - { - "include-filter": "com.android.server.PinnerServiceTest" - }, - { - "exclude-annotation": "org.junit.Ignore" - } - ], + "name": "FrameworksServicesTests_pinner_service", "file_patterns": ["PinnerService\\.java"] }, { @@ -176,15 +163,7 @@ "name": "CtsPackageManagerTestCases" }, { - "name": "FrameworksServicesTests", - "options": [ - { - "include-filter": "com.android.server.PinnerServiceTest" - }, - { - "exclude-annotation": "org.junit.Ignore" - } - ], + "name": "FrameworksServicesTests_pinner_service", "file_patterns": ["PinnerService\\.java"] }, { diff --git a/services/core/java/com/android/server/am/TEST_MAPPING b/services/core/java/com/android/server/am/TEST_MAPPING index 6e8eb7d76108..ab5e2d04cecd 100644 --- a/services/core/java/com/android/server/am/TEST_MAPPING +++ b/services/core/java/com/android/server/am/TEST_MAPPING @@ -94,12 +94,7 @@ ], "postsubmit": [ { - "name": "FrameworksServicesTests", - "options": [ - { - "include-filter": "com.android.server.am." - } - ] + "name": "FrameworksServicesTests_android_server_am" }, { "name": "CtsAppDataIsolationHostTestCases" diff --git a/services/core/java/com/android/server/hdmi/TEST_MAPPING b/services/core/java/com/android/server/hdmi/TEST_MAPPING index 1c85c7f1233c..d116087d5e1c 100644 --- a/services/core/java/com/android/server/hdmi/TEST_MAPPING +++ b/services/core/java/com/android/server/hdmi/TEST_MAPPING @@ -6,15 +6,7 @@ ], "postsubmit": [ { - "name": "FrameworksServicesTests", - "options": [ - { - "include-filter": "com.android.server.hdmi" - }, - { - "exclude-annotation": "org.junit.Ignore" - } - ] + "name": "FrameworksServicesTests_android_server_hdmi" } ], // Postsubmit tests for TV devices diff --git a/services/core/java/com/android/server/power/TEST_MAPPING b/services/core/java/com/android/server/power/TEST_MAPPING index 4ce01d21903f..935a238bcee7 100644 --- a/services/core/java/com/android/server/power/TEST_MAPPING +++ b/services/core/java/com/android/server/power/TEST_MAPPING @@ -30,10 +30,7 @@ ] }, { - "name": "FrameworksServicesTests", - "options": [ - {"include-filter": "com.android.server.power"} - ] + "name": "FrameworksServicesTests_android_server_power" }, { "name": "PowerServiceTests", 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 f6c3d8ef1249..1346a294b7d8 100644 --- a/services/core/java/com/android/server/power/hint/HintManagerService.java +++ b/services/core/java/com/android/server/power/hint/HintManagerService.java @@ -160,6 +160,8 @@ public final class HintManagerService extends SystemService { private static final String PROPERTY_SF_ENABLE_CPU_HINT = "debug.sf.enable_adpf_cpu_hint"; private static final String PROPERTY_HWUI_ENABLE_HINT_MANAGER = "debug.hwui.use_hint_manager"; + private Boolean mFMQUsesIntegratedEventFlag = false; + @VisibleForTesting final IHintManager.Stub mService = new BinderService(); public HintManagerService(Context context) { @@ -1032,7 +1034,7 @@ public final class HintManagerService extends SystemService { @Override public IHintSession createHintSessionWithConfig(@NonNull IBinder token, @NonNull int[] tids, long durationNanos, @SessionTag int tag, - @Nullable SessionConfig config) { + SessionConfig config) { if (!isHalSupported()) { throw new UnsupportedOperationException("PowerHAL is not supported!"); } @@ -1070,7 +1072,7 @@ public final class HintManagerService extends SystemService { default -> tag = SessionTag.APP; } } - + config.id = -1; Long halSessionPtr = null; if (mConfigCreationSupport.get()) { try { @@ -1109,7 +1111,7 @@ public final class HintManagerService extends SystemService { } } - final long sessionId = config != null ? config.id : halSessionPtr; + final long sessionId = config.id != -1 ? config.id : halSessionPtr; logPerformanceHintSessionAtom( callingUid, sessionId, durationNanos, tids, tag); @@ -1144,14 +1146,23 @@ public final class HintManagerService extends SystemService { } @Override - public ChannelConfig getSessionChannel(IBinder token) { - if (mPowerHalVersion < 5 || !adpfUseFmqChannel()) { + public @Nullable ChannelConfig getSessionChannel(IBinder token) { + if (mPowerHalVersion < 5 || !adpfUseFmqChannel() + || mFMQUsesIntegratedEventFlag) { return null; } java.util.Objects.requireNonNull(token); final int callingTgid = Process.getThreadGroupLeader(Binder.getCallingPid()); final int callingUid = Binder.getCallingUid(); ChannelItem item = getOrCreateMappedChannelItem(callingTgid, callingUid, token); + // FMQ V1 requires a separate event flag to be passed, and the default no-op + // implmenentation in PowerHAL does not return such a shared flag. This helps + // avoid using the FMQ on a default impl that does not support it. + if (item.getConfig().eventFlagDescriptor == null) { + mFMQUsesIntegratedEventFlag = true; + closeSessionChannel(); + return null; + } return item.getConfig(); }; @@ -1270,8 +1281,14 @@ public final class HintManagerService extends SystemService { @VisibleForTesting boolean updateHintAllowedByProcState(boolean allowed) { synchronized (this) { - if (allowed && !mUpdateAllowedByProcState && !mShouldForcePause) resume(); - if (!allowed && mUpdateAllowedByProcState) pause(); + if (allowed && !mUpdateAllowedByProcState && !mShouldForcePause) { + Slogf.e(TAG, "ADPF IS GETTING RESUMED? UID: " + mUid + " TAG: " + mTag); + resume(); + } + if (!allowed && mUpdateAllowedByProcState) { + Slogf.e(TAG, "ADPF IS GETTING PAUSED? UID: " + mUid + " TAG: " + mTag); + pause(); + } mUpdateAllowedByProcState = allowed; return mUpdateAllowedByProcState; } diff --git a/services/core/java/com/android/server/rollback/WatchdogRollbackLogger.java b/services/core/java/com/android/server/rollback/WatchdogRollbackLogger.java index d763199ee019..79560ce27919 100644 --- a/services/core/java/com/android/server/rollback/WatchdogRollbackLogger.java +++ b/services/core/java/com/android/server/rollback/WatchdogRollbackLogger.java @@ -16,6 +16,7 @@ package com.android.server.rollback; +import static com.android.server.crashrecovery.CrashRecoveryUtils.logCrashRecoveryEvent; import static com.android.server.crashrecovery.proto.CrashRecoveryStatsLog.WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_REASON__REASON_APP_CRASH; import static com.android.server.crashrecovery.proto.CrashRecoveryStatsLog.WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_REASON__REASON_APP_NOT_RESPONDING; import static com.android.server.crashrecovery.proto.CrashRecoveryStatsLog.WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_REASON__REASON_BOOT_LOOPING; @@ -39,7 +40,7 @@ import android.content.rollback.PackageRollbackInfo; import android.content.rollback.RollbackInfo; import android.os.SystemProperties; import android.text.TextUtils; -import android.util.ArraySet; +import android.util.Log; import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; @@ -47,7 +48,6 @@ import com.android.server.PackageWatchdog; import com.android.server.crashrecovery.proto.CrashRecoveryStatsLog; import java.util.List; -import java.util.Set; /** * This class handles the logic for logging Watchdog-triggered rollback events. @@ -101,22 +101,6 @@ public final class WatchdogRollbackLogger { return loggingParent; } - - /** - * Gets the set of parent packages for a given set of failed package names. In the case that - * multiple sessions have failed, we want to log failure for each of the parent packages. - * Even if multiple failed packages have the same parent, we only log the parent package once. - */ - private static Set<VersionedPackage> getLogPackages(Context context, - @NonNull List<String> failedPackageNames) { - Set<VersionedPackage> parentPackages = new ArraySet<>(); - for (String failedPackageName: failedPackageNames) { - parentPackages.add(getLogPackage(context, new VersionedPackage(failedPackageName, 0))); - } - return parentPackages; - } - - static void logRollbackStatusOnBoot(Context context, int rollbackId, String logPackageName, List<RollbackInfo> recentlyCommittedRollbacks) { PackageInstaller packageInstaller = context.getPackageManager().getPackageInstaller(); @@ -174,10 +158,11 @@ public final class WatchdogRollbackLogger { */ public static void logEvent(@Nullable VersionedPackage logPackage, int type, int rollbackReason, @NonNull String failingPackageName) { - Slog.i(TAG, "Watchdog event occurred with type: " + rollbackTypeToString(type) + String logMsg = "Watchdog event occurred with type: " + rollbackTypeToString(type) + " logPackage: " + logPackage + " rollbackReason: " + rollbackReasonToString(rollbackReason) - + " failedPackageName: " + failingPackageName); + + " failedPackageName: " + failingPackageName; + Slog.i(TAG, logMsg); if (logPackage != null) { CrashRecoveryStatsLog.write( CrashRecoveryStatsLog.WATCHDOG_ROLLBACK_OCCURRED, @@ -200,33 +185,19 @@ public final class WatchdogRollbackLogger { new byte[]{}); } - logTestProperties(logPackage, type, rollbackReason, failingPackageName); + logTestProperties(logMsg); } /** * Writes properties which will be used by rollback tests to check if particular rollback * events have occurred. - * - * persist.sys.rollbacktest.enabled: true if rollback tests are running - * persist.sys.rollbacktest.EVENT_TYPE: true if a particular rollback event has occurred - * ex: persist.sys.rollbacktest.ROLLBACK_INITIATE is true if ROLLBACK_INITIATE has happened - * persist.sys.rollbacktest.EVENT_TYPE.logPackage: the package to associate the rollback with - * persist.sys.rollbacktest.EVENT_TYPE.rollbackReason: the reason Watchdog triggered a rollback - * persist.sys.rollbacktest.EVENT_TYPE.failedPackageName: the failing package or process which - * triggered the rollback */ - private static void logTestProperties(@Nullable VersionedPackage logPackage, int type, - int rollbackReason, @NonNull String failingPackageName) { + private static void logTestProperties(String logMsg) { // This property should be on only during the tests - final String prefix = "persist.sys.rollbacktest."; - if (!SystemProperties.getBoolean(prefix + "enabled", false)) { + if (!SystemProperties.getBoolean("persist.sys.rollbacktest.enabled", false)) { return; } - String key = prefix + rollbackTypeToString(type); - SystemProperties.set(key, String.valueOf(true)); - SystemProperties.set(key + ".logPackage", logPackage != null ? logPackage.toString() : ""); - SystemProperties.set(key + ".rollbackReason", rollbackReasonToString(rollbackReason)); - SystemProperties.set(key + ".failedPackageName", failingPackageName); + logCrashRecoveryEvent(Log.DEBUG, logMsg); } @VisibleForTesting diff --git a/services/core/java/com/android/server/sensorprivacy/SensorPrivacyService.java b/services/core/java/com/android/server/sensorprivacy/SensorPrivacyService.java index 06a2565da75a..81217014bafe 100644 --- a/services/core/java/com/android/server/sensorprivacy/SensorPrivacyService.java +++ b/services/core/java/com/android/server/sensorprivacy/SensorPrivacyService.java @@ -51,6 +51,7 @@ import static android.hardware.SensorPrivacyManager.StateTypes.ENABLED_EXCEPT_AL import static android.hardware.SensorPrivacyManager.TOGGLE_TYPE_HARDWARE; import static android.hardware.SensorPrivacyManager.TOGGLE_TYPE_SOFTWARE; import static android.os.UserHandle.USER_NULL; +import static android.os.UserHandle.getCallingUserId; import static android.service.SensorPrivacyIndividualEnabledSensorProto.UNKNOWN; import static com.android.internal.util.FrameworkStatsLog.PRIVACY_SENSOR_TOGGLE_INTERACTION; @@ -187,6 +188,7 @@ public final class SensorPrivacyService extends SystemService { private final TelephonyManager mTelephonyManager; private final PackageManagerInternal mPackageManagerInternal; private final NotificationManager mNotificationManager; + private final UserManager mUserManager; private CameraPrivacyLightController mCameraPrivacyLightController; @@ -214,6 +216,7 @@ public final class SensorPrivacyService extends SystemService { mTelephonyManager = context.getSystemService(TelephonyManager.class); mPackageManagerInternal = getLocalService(PackageManagerInternal.class); mNotificationManager = mContext.getSystemService(NotificationManager.class); + mUserManager = context.getSystemService(UserManager.class); mSensorPrivacyServiceImpl = new SensorPrivacyServiceImpl(); for (String entry : SystemConfig.getInstance().getCameraPrivacyAllowlist()) { mCameraPrivacyAllowlist.add(entry); @@ -379,14 +382,23 @@ public final class SensorPrivacyService extends SystemService { public void onUserRestrictionsChanged(int userId, Bundle newRestrictions, Bundle prevRestrictions) { // Reset sensor privacy when restriction is added + // Note: isValidCallingUser needs to be called before resetting sensor privacy + // because DISALLOW_CAMERA_TOGGLE and DISALLOW_MICROPHONE_TOGGLE are applied on + // visible background users in Automotive's Multi Display configuration but we don't + // allow sensor privacy to be set on a visible background user. if (!prevRestrictions.getBoolean(UserManager.DISALLOW_CAMERA_TOGGLE) && newRestrictions.getBoolean(UserManager.DISALLOW_CAMERA_TOGGLE)) { - setToggleSensorPrivacyUnchecked(TOGGLE_TYPE_SOFTWARE, userId, OTHER, CAMERA, false); + if (isValidCallingUser(userId)) { + setToggleSensorPrivacyUnchecked(TOGGLE_TYPE_SOFTWARE, userId, OTHER, CAMERA, + false); + } } if (!prevRestrictions.getBoolean(UserManager.DISALLOW_MICROPHONE_TOGGLE) && newRestrictions.getBoolean(UserManager.DISALLOW_MICROPHONE_TOGGLE)) { - setToggleSensorPrivacyUnchecked(TOGGLE_TYPE_SOFTWARE, userId, OTHER, MICROPHONE, - false); + if (isValidCallingUser(userId)) { + setToggleSensorPrivacyUnchecked(TOGGLE_TYPE_SOFTWARE, userId, OTHER, MICROPHONE, + false); + } } } @@ -779,6 +791,10 @@ public final class SensorPrivacyService extends SystemService { @Override public void setSensorPrivacy(boolean enable) { enforceManageSensorPrivacyPermission(); + + // Enforce valid calling user on devices that enable visible background users. + enforceValidCallingUser(getCallingUserId()); + mSensorPrivacyStateController.setAllSensorState(enable); } @@ -795,11 +811,15 @@ public final class SensorPrivacyService extends SystemService { + " enable=" + enable + ")"); } + enforceManageSensorPrivacyPermission(); if (userId == UserHandle.USER_CURRENT) { userId = mCurrentUser; } + // Enforce valid calling user on devices that enable visible background users. + enforceValidCallingUser(userId); + if (!canChangeToggleSensorPrivacy(userId, sensor)) { return; } @@ -831,6 +851,9 @@ public final class SensorPrivacyService extends SystemService { userId = mCurrentUser; } + // Enforce valid calling user on devices that enable visible background users. + enforceValidCallingUser(userId); + if (!canChangeToggleSensorPrivacy(userId, sensor)) { return; } @@ -1151,6 +1174,42 @@ public final class SensorPrivacyService extends SystemService { }); } + // This method enforces valid calling user on devices that enable visible background users. + // Only system user or current user or the user that belongs to the same profile group + // as the current user is permitted to toggle sensor privacy. + // Visible background users are not permitted to toggle sensor privacy. + private void enforceValidCallingUser(@UserIdInt int userId) { + if (!isValidCallingUser(userId)) { + throw new SecurityException("User " + userId + + " is not permitted to toggle sensor privacy"); + } + } + + private boolean isValidCallingUser(@UserIdInt int userId) { + // Check whether visible background users are enabled. + // Visible background users are non current but can have UI access. + // The main use case for visible background users is the passenger in Automotive's + // Multi-Display configuration. + if (!UserManager.isVisibleBackgroundUsersEnabled()) { + return true; + } + + if (userId == UserHandle.USER_SYSTEM || userId == mCurrentUser) { + return true; + } + + final long ident = Binder.clearCallingIdentity(); + try { + if (mUserManager.isSameProfileGroup(userId, mCurrentUser)) { + return true; + } + } finally { + Binder.restoreCallingIdentity(ident); + } + + return false; + } + /** * Enforces the caller contains the necessary permission to change the state of sensor * privacy. diff --git a/services/core/java/com/android/server/wm/ActivityClientController.java b/services/core/java/com/android/server/wm/ActivityClientController.java index e27b2beb3d5a..c1e859ddcccf 100644 --- a/services/core/java/com/android/server/wm/ActivityClientController.java +++ b/services/core/java/com/android/server/wm/ActivityClientController.java @@ -864,8 +864,9 @@ class ActivityClientController extends IActivityClientController.Stub { if (transition != null) { if (changed) { // Always set as scene transition because it expects to be a jump-cut. - transition.setOverrideAnimation(TransitionInfo.AnimationOptions - .makeSceneTransitionAnimOptions(), null, null); + transition.setOverrideAnimation( + TransitionInfo.AnimationOptions.makeSceneTransitionAnimOptions(), r, + null, null); r.mTransitionController.requestStartTransition(transition, null /*startTask */, null /* remoteTransition */, null /* displayChange */); @@ -910,8 +911,9 @@ class ActivityClientController extends IActivityClientController.Stub { && under.returningOptions.getAnimationType() == ANIM_SCENE_TRANSITION) { // Pass along the scene-transition animation-type - transition.setOverrideAnimation(TransitionInfo.AnimationOptions - .makeSceneTransitionAnimOptions(), null, null); + transition.setOverrideAnimation(TransitionInfo + .AnimationOptions.makeSceneTransitionAnimOptions(), r, + null, null); } } else { transition.abort(); @@ -1508,7 +1510,7 @@ class ActivityClientController extends IActivityClientController.Stub { r.mOverrideTaskTransition); r.mTransitionController.setOverrideAnimation( TransitionInfo.AnimationOptions.makeCustomAnimOptions(packageName, - enterAnim, exitAnim, backgroundColor, r.mOverrideTaskTransition), + enterAnim, exitAnim, backgroundColor, r.mOverrideTaskTransition), r, null /* startCallback */, null /* finishCallback */); } } diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 1dfa06300ace..f52a74fcdf9f 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -5048,7 +5048,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // controller but don't clear the animation information from the options since they // need to be sent to the animating activity. mTransitionController.setOverrideAnimation( - AnimationOptions.makeSceneTransitionAnimOptions(), null, null); + AnimationOptions.makeSceneTransitionAnimOptions(), this, null, null); return; } applyOptionsAnimation(mPendingOptions, intent); @@ -5171,7 +5171,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } if (options != null) { - mTransitionController.setOverrideAnimation(options, startCallback, finishCallback); + mTransitionController.setOverrideAnimation(options, this, startCallback, + finishCallback); } } diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 49ca698e36e2..3d5b2732e948 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -6207,6 +6207,8 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { @Override public void onProcessAdded(WindowProcessController proc) { synchronized (mGlobalLockWithoutBoost) { + mPackageConfigPersister.updateConfigIfNeeded( + proc, proc.mUserId, proc.mInfo.packageName); mProcessNames.put(proc.mName, proc.mUid, proc); } } diff --git a/services/core/java/com/android/server/wm/BackNavigationController.java b/services/core/java/com/android/server/wm/BackNavigationController.java index 0646fb74ddfd..dd86a149d0a5 100644 --- a/services/core/java/com/android/server/wm/BackNavigationController.java +++ b/services/core/java/com/android/server/wm/BackNavigationController.java @@ -2002,6 +2002,7 @@ class BackNavigationController { final Transition prepareOpen = migrateBackTransition && !tc.isCollecting() ? tc.createTransition(TRANSIT_PREPARE_BACK_NAVIGATION) : null; + DisplayContent commonDisplay = null; for (int i = affects.size() - 1; i >= 0; --i) { final ActivityRecord activity = affects.get(i); if (!migrateBackTransition && !activity.isVisibleRequested()) { @@ -2024,13 +2025,15 @@ class BackNavigationController { activity.mTaskSupervisor.mStoppingActivities.remove(activity); if (!migrateBackTransition) { - activity.getDisplayContent().ensureActivitiesVisible(null /* starting */, - true /* notifyClients */); + commonDisplay = activity.getDisplayContent(); } else if (activity.shouldBeVisible()) { activity.ensureActivityConfiguration(true /* ignoreVisibility */); activity.makeVisibleIfNeeded(null /* starting */, true /* notifyToClient */); } } + if (commonDisplay != null) { + commonDisplay.ensureActivitiesVisible(null /* starting */, true /* notifyClients */); + } if (prepareOpen != null) { if (prepareOpen.hasChanges()) { tc.requestStartTransition(prepareOpen, diff --git a/services/core/java/com/android/server/wm/InsetsStateController.java b/services/core/java/com/android/server/wm/InsetsStateController.java index 0daddc01f65e..481ecd3447f1 100644 --- a/services/core/java/com/android/server/wm/InsetsStateController.java +++ b/services/core/java/com/android/server/wm/InsetsStateController.java @@ -380,7 +380,6 @@ class InsetsStateController { if (android.view.inputmethod.Flags.refactorInsetsController()) { notifyInsetsChanged(); mDisplayContent.updateSystemGestureExclusion(); - mDisplayContent.updateKeepClearAreas(); mDisplayContent.getDisplayPolicy().updateSystemBarAttributes(); } } diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 3bb273c55f55..3490b3e12b2a 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -3806,6 +3806,9 @@ class Task extends TaskFragment { sb.append(" aI="); sb.append(affinityIntent.getComponent().flattenToShortString()); } + sb.append(" isResizeable=").append(isResizeable()); + sb.append(" minWidth=").append(mMinWidth); + sb.append(" minHeight=").append(mMinHeight); sb.append('}'); return stringName = sb.toString(); } diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java index 366cf4d039b8..4eba36fd52a4 100644 --- a/services/core/java/com/android/server/wm/Transition.java +++ b/services/core/java/com/android/server/wm/Transition.java @@ -961,10 +961,13 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { * Set animation options for collecting transition by ActivityRecord. * @param options AnimationOptions captured from ActivityOptions */ - void setOverrideAnimation(@Nullable AnimationOptions options, + void setOverrideAnimation(@Nullable AnimationOptions options, @NonNull ActivityRecord r, @Nullable IRemoteCallback startCallback, @Nullable IRemoteCallback finishCallback) { if (!isCollecting()) return; mOverrideOptions = options; + if (mOverrideOptions != null) { + mOverrideOptions.setUserId(r.mUserId); + } sendRemoteCallback(mClientAnimationStartCallback); mClientAnimationStartCallback = startCallback; mClientAnimationFinishCallback = finishCallback; @@ -3014,7 +3017,7 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { // Create the options based on this change's custom animations and layout // parameters animOptions = getOptions(activityRecord /* customAnimActivity */, - activityRecord /* animLpActivity */); + activityRecord /* animLpActivity */); if (!change.hasFlags(FLAG_TRANSLUCENT)) { // If this change is not translucent, its options are going to be // inherited by the changes below @@ -3036,6 +3039,7 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { params.getOpenAnimationResId(), params.getChangeAnimationResId(), params.getCloseAnimationResId(), 0 /* backgroundColor */, false /* overrideTaskTransition */); + animOptions.setUserId(taskFragment.getTask().mUserId); } } if (animOptions != null) { @@ -3116,6 +3120,7 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { } else { animOptions = TransitionInfo.AnimationOptions .makeAnimOptionsFromLayoutParameters(animLp); + animOptions.setUserId(animLpActivity.mUserId); } } return animOptions; @@ -3141,6 +3146,7 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { if (animOptions == null) { animOptions = TransitionInfo.AnimationOptions .makeCommonAnimOptions(activity.packageName); + animOptions.setUserId(activity.mUserId); } animOptions.addCustomActivityTransition(open, customAnim.mEnterAnim, customAnim.mExitAnim, customAnim.mBackgroundColor); @@ -3925,9 +3931,9 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { /** @return true if all tracked subtrees are ready. */ boolean allReady() { - ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, " allReady query: used=%b " - + "override=%b defer=%d states=[%s]", mUsed, mReadyOverride, mDeferReadyDepth, - groupsToString()); + ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, + " allReady query: used=%b " + "override=%b defer=%d states=[%s]", mUsed, + mReadyOverride, mDeferReadyDepth, groupsToString()); // If the readiness has never been touched, mUsed will be false. We never want to // consider a transition ready if nothing has been reported on it. if (!mUsed) return false; diff --git a/services/core/java/com/android/server/wm/TransitionController.java b/services/core/java/com/android/server/wm/TransitionController.java index 50fe69cbb50a..1d2a605e8dae 100644 --- a/services/core/java/com/android/server/wm/TransitionController.java +++ b/services/core/java/com/android/server/wm/TransitionController.java @@ -52,8 +52,8 @@ import android.window.WindowContainerTransaction; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; -import com.android.internal.protolog.ProtoLogGroup; import com.android.internal.protolog.ProtoLog; +import com.android.internal.protolog.ProtoLogGroup; import com.android.server.FgThread; import com.android.window.flags.Flags; @@ -880,10 +880,10 @@ class TransitionController { } /** @see Transition#setOverrideAnimation */ - void setOverrideAnimation(TransitionInfo.AnimationOptions options, + void setOverrideAnimation(TransitionInfo.AnimationOptions options, ActivityRecord r, @Nullable IRemoteCallback startCallback, @Nullable IRemoteCallback finishCallback) { if (mCollectingTransition == null) return; - mCollectingTransition.setOverrideAnimation(options, startCallback, finishCallback); + mCollectingTransition.setOverrideAnimation(options, r, startCallback, finishCallback); } void setNoAnimation(WindowContainer wc) { diff --git a/services/core/java/com/android/server/wm/TransparentPolicy.java b/services/core/java/com/android/server/wm/TransparentPolicy.java index f1941afe8f58..85a118db36eb 100644 --- a/services/core/java/com/android/server/wm/TransparentPolicy.java +++ b/services/core/java/com/android/server/wm/TransparentPolicy.java @@ -16,6 +16,7 @@ package com.android.server.wm; +import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; import static android.content.res.Configuration.ORIENTATION_UNDEFINED; import static android.content.res.Configuration.SCREEN_HEIGHT_DP_UNDEFINED; @@ -331,6 +332,11 @@ class TransparentPolicy { } private boolean isPolicyEnabled() { + // Disable transparent policy if task is null or in freeform. + final Task task = mActivityRecord.getTask(); + if (task == null || task.getWindowingMode() == WINDOWING_MODE_FREEFORM) { + return false; + } if (!mActivityRecord.mWmService.mFlags.mRespectNonTopVisibleFixedOrientation) { return true; } diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java index 87ce8661c97c..976be4aa3bd4 100644 --- a/services/core/java/com/android/server/wm/WindowProcessController.java +++ b/services/core/java/com/android/server/wm/WindowProcessController.java @@ -357,8 +357,6 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio } mUseFifoUiScheduling = com.android.window.flags.Flags.fifoPriorityForMajorUiProcesses() && (isSysUiPackage || mAtm.isCallerRecents(uid)); - - mAtm.mPackageConfigPersister.updateConfigIfNeeded(this, mUserId, mInfo.packageName); } public void setPid(int pid) { diff --git a/services/core/jni/com_android_server_hint_HintManagerService.cpp b/services/core/jni/com_android_server_hint_HintManagerService.cpp index 2307aced6141..febfb9ff1def 100644 --- a/services/core/jni/com_android_server_hint_HintManagerService.cpp +++ b/services/core/jni/com_android_server_hint_HintManagerService.cpp @@ -109,7 +109,7 @@ static jlong createHintSessionWithConfig(JNIEnv* env, int32_t tgid, int32_t uid, return session_ptr; } else if (result.isUnsupported()) { throwUnsupported(env, result.errorMessage()); - return -1; + return 0; } throwFailed(env, result.errorMessage()); return 0; @@ -190,7 +190,7 @@ static jlong nativeCreateHintSessionWithConfig(JNIEnv* env, jclass /* clazz */, hal::SessionConfig config; jlong out = createHintSessionWithConfig(env, tgid, uid, std::move(threadIds), durationNanos, sessionTag, config); - if (out <= 0) { + if (out == 0) { return out; } static jclass configClass = env->FindClass("android/hardware/power/SessionConfig"); diff --git a/services/core/jni/com_android_server_vibrator_VibratorController.cpp b/services/core/jni/com_android_server_vibrator_VibratorController.cpp index 5c5ac28b2169..39c0c3ef1847 100644 --- a/services/core/jni/com_android_server_vibrator_VibratorController.cpp +++ b/services/core/jni/com_android_server_vibrator_VibratorController.cpp @@ -54,6 +54,9 @@ static struct { jmethodID setCompositionSizeMax; jmethodID setQFactor; jmethodID setFrequencyProfile; + jmethodID setMaxEnvelopeEffectSize; + jmethodID setMinEnvelopeEffectControlPointDurationMillis; + jmethodID setMaxEnvelopeEffectControlPointDurationMillis; } sVibratorInfoBuilderClassInfo; static struct { jfieldID id; @@ -484,6 +487,25 @@ static jboolean vibratorGetInfo(JNIEnv* env, jclass /* clazz */, jlong ptr, env->CallObjectMethod(vibratorInfoBuilder, sVibratorInfoBuilderClassInfo.setQFactor, static_cast<jfloat>(info.qFactor.value())); } + if (info.maxEnvelopeEffectSize.isOk()) { + env->CallObjectMethod(vibratorInfoBuilder, + sVibratorInfoBuilderClassInfo.setMaxEnvelopeEffectSize, + static_cast<jint>(info.maxEnvelopeEffectSize.value())); + } + if (info.minEnvelopeEffectControlPointDuration.isOk()) { + env->CallObjectMethod(vibratorInfoBuilder, + sVibratorInfoBuilderClassInfo + .setMinEnvelopeEffectControlPointDurationMillis, + static_cast<jint>( + info.minEnvelopeEffectControlPointDuration.value().count())); + } + if (info.maxEnvelopeEffectControlPointDuration.isOk()) { + env->CallObjectMethod(vibratorInfoBuilder, + sVibratorInfoBuilderClassInfo + .setMaxEnvelopeEffectControlPointDurationMillis, + static_cast<jint>( + info.maxEnvelopeEffectControlPointDuration.value().count())); + } jfloat minFrequency = static_cast<jfloat>(info.minFrequency.valueOr(NAN)); jfloat resonantFrequency = static_cast<jfloat>(info.resonantFrequency.valueOr(NAN)); @@ -580,6 +602,17 @@ int register_android_server_vibrator_VibratorController(JavaVM* jvm, JNIEnv* env GetMethodIDOrDie(env, vibratorInfoBuilderClass, "setFrequencyProfile", "(Landroid/os/VibratorInfo$FrequencyProfile;)" "Landroid/os/VibratorInfo$Builder;"); + sVibratorInfoBuilderClassInfo.setMaxEnvelopeEffectSize = + GetMethodIDOrDie(env, vibratorInfoBuilderClass, "setMaxEnvelopeEffectSize", + "(I)Landroid/os/VibratorInfo$Builder;"); + sVibratorInfoBuilderClassInfo.setMinEnvelopeEffectControlPointDurationMillis = + GetMethodIDOrDie(env, vibratorInfoBuilderClass, + "setMinEnvelopeEffectControlPointDurationMillis", + "(I)Landroid/os/VibratorInfo$Builder;"); + sVibratorInfoBuilderClassInfo.setMaxEnvelopeEffectControlPointDurationMillis = + GetMethodIDOrDie(env, vibratorInfoBuilderClass, + "setMaxEnvelopeEffectControlPointDurationMillis", + "(I)Landroid/os/VibratorInfo$Builder;"); return jniRegisterNativeMethods(env, "com/android/server/vibrator/VibratorController$NativeWrapper", diff --git a/services/foldables/devicestateprovider/tests/Android.bp b/services/foldables/devicestateprovider/tests/Android.bp index 84a6df38e0a0..4352c15879e1 100644 --- a/services/foldables/devicestateprovider/tests/Android.bp +++ b/services/foldables/devicestateprovider/tests/Android.bp @@ -6,9 +6,9 @@ android_test { name: "foldable-device-state-provider-tests", srcs: ["src/**/*.java"], libs: [ - "android.test.runner", - "android.test.base", - "android.test.mock", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", + "android.test.mock.stubs.system", ], jni_libs: [ "libdexmakerjvmtiagent", diff --git a/services/tests/InputMethodSystemServerTests/Android.bp b/services/tests/InputMethodSystemServerTests/Android.bp index 9044259cb39f..e6ff5068368f 100644 --- a/services/tests/InputMethodSystemServerTests/Android.bp +++ b/services/tests/InputMethodSystemServerTests/Android.bp @@ -50,9 +50,9 @@ android_test { ], libs: [ - "android.test.mock", - "android.test.base", - "android.test.runner", + "android.test.mock.stubs.system", + "android.test.base.stubs.system", + "android.test.runner.stubs.system", ], data: [ @@ -79,8 +79,8 @@ android_ravenwood_test { "services", ], libs: [ - "android.test.base", - "android.test.runner", + "android.test.base.stubs.system", + "android.test.runner.stubs.system", ], srcs: [ "src/com/android/server/inputmethod/**/ClientControllerTest.java", @@ -121,9 +121,9 @@ android_test { ], libs: [ - "android.test.mock", - "android.test.base", - "android.test.runner", + "android.test.mock.stubs.system", + "android.test.base.stubs.system", + "android.test.runner.stubs.system", ], data: [ diff --git a/services/tests/PackageManagerServiceTests/host/Android.bp b/services/tests/PackageManagerServiceTests/host/Android.bp index 75db31679a88..b46a6fffbaa9 100644 --- a/services/tests/PackageManagerServiceTests/host/Android.bp +++ b/services/tests/PackageManagerServiceTests/host/Android.bp @@ -95,3 +95,10 @@ test_module_config_host { test_suites: ["device-tests"], include_filters: ["com.android.server.pm.test.OverlayActorVisibilityTest"], } + +test_module_config_host { + name: "PackageManagerServiceHostTests_android_server_pm_Presubmit", + base: "PackageManagerServiceHostTests", + test_suites: ["device-tests"], + include_annotations: ["android.platform.test.annotations.Presubmit"], +} diff --git a/services/tests/PackageManagerServiceTests/host/test-apps/DeviceSide/Android.bp b/services/tests/PackageManagerServiceTests/host/test-apps/DeviceSide/Android.bp index 73cec6c13d6d..71ada2e973ce 100644 --- a/services/tests/PackageManagerServiceTests/host/test-apps/DeviceSide/Android.bp +++ b/services/tests/PackageManagerServiceTests/host/test-apps/DeviceSide/Android.bp @@ -29,7 +29,7 @@ android_test_helper_app { sdk_version: "test_current", srcs: ["src/**/*.kt"], libs: [ - "android.test.base", + "android.test.base.stubs.test", ], static_libs: [ "androidx.annotation_annotation", diff --git a/services/tests/PackageManagerServiceTests/server/Android.bp b/services/tests/PackageManagerServiceTests/server/Android.bp index e26213eadde3..f5b0015aff94 100644 --- a/services/tests/PackageManagerServiceTests/server/Android.bp +++ b/services/tests/PackageManagerServiceTests/server/Android.bp @@ -65,9 +65,9 @@ android_test { "android.hardware.tv.cec-V1.0-java", "android.hardware.vibrator-V3-java", "android.hidl.manager-V1.0-java", - "android.test.mock", - "android.test.base", - "android.test.runner", + "android.test.mock.stubs.system", + "android.test.base.stubs.system", + "android.test.runner.stubs.system", ], platform_apis: true, @@ -186,3 +186,13 @@ test_module_config { include_filters: ["com.android.server.pm."], include_annotations: ["android.platform.test.annotations.Postsubmit"], } + +test_module_config { + name: "PackageManagerServiceServerTests_Presubmit", + base: "PackageManagerServiceServerTests", + test_suites: [ + "automotive-tests", + "device-tests", + ], + include_annotations: ["android.platform.test.annotations.Presubmit"], +} diff --git a/services/tests/VpnTests/Android.bp b/services/tests/VpnTests/Android.bp index a5011a8d8b00..0568892c3684 100644 --- a/services/tests/VpnTests/Android.bp +++ b/services/tests/VpnTests/Android.bp @@ -38,8 +38,15 @@ android_test { "framework-connectivity-t.impl", "framework", "framework-res", - "android.test.runner", - "android.test.base", - "android.test.mock", + "android.test.runner.stubs", + "android.test.base.stubs", + "android.test.mock.stubs", ], } + +test_module_config { + name: "FrameworksVpnTests_android_server_connectivity", + base: "FrameworksVpnTests", + test_suites: ["device-tests"], + exclude_annotations: ["com.android.testutils.SkipPresubmit"], +} diff --git a/services/tests/appfunctions/src/com/android/server/appfunctions/FutureAppSearchSessionTest.kt b/services/tests/appfunctions/src/com/android/server/appfunctions/FutureAppSearchSessionTest.kt index 3bc44111ba08..edcbb9e81d87 100644 --- a/services/tests/appfunctions/src/com/android/server/appfunctions/FutureAppSearchSessionTest.kt +++ b/services/tests/appfunctions/src/com/android/server/appfunctions/FutureAppSearchSessionTest.kt @@ -21,6 +21,8 @@ import android.app.appfunctions.AppFunctionRuntimeMetadata.createAppFunctionRunt import android.app.appfunctions.AppFunctionRuntimeMetadata.createParentAppFunctionRuntimeSchema import android.app.appsearch.AppSearchBatchResult import android.app.appsearch.AppSearchManager +import android.app.appsearch.GenericDocument +import android.app.appsearch.GetByDocumentIdRequest import android.app.appsearch.PutDocumentsRequest import android.app.appsearch.RemoveByDocumentIdRequest import android.app.appsearch.SearchSpec @@ -44,16 +46,16 @@ class FutureAppSearchSessionTest { @After fun clearData() { val searchContext = AppSearchManager.SearchContext.Builder(TEST_DB).build() - FutureAppSearchSession(appSearchManager, testExecutor, searchContext).use { + FutureAppSearchSessionImpl(appSearchManager, testExecutor, searchContext).use { val setSchemaRequest = SetSchemaRequest.Builder().setForceOverride(true).build() - it.setSchema(setSchemaRequest) + it.setSchema(setSchemaRequest).get() } } @Test fun setSchema() { val searchContext = AppSearchManager.SearchContext.Builder(TEST_DB).build() - FutureAppSearchSession(appSearchManager, testExecutor, searchContext).use { session -> + FutureAppSearchSessionImpl(appSearchManager, testExecutor, searchContext).use { session -> val setSchemaRequest = SetSchemaRequest.Builder() .addSchemas( @@ -71,7 +73,7 @@ class FutureAppSearchSessionTest { @Test fun put() { val searchContext = AppSearchManager.SearchContext.Builder(TEST_DB).build() - FutureAppSearchSession(appSearchManager, testExecutor, searchContext).use { session -> + FutureAppSearchSessionImpl(appSearchManager, testExecutor, searchContext).use { session -> val setSchemaRequest = SetSchemaRequest.Builder() .addSchemas( @@ -97,7 +99,7 @@ class FutureAppSearchSessionTest { @Test fun remove() { val searchContext = AppSearchManager.SearchContext.Builder(TEST_DB).build() - FutureAppSearchSession(appSearchManager, testExecutor, searchContext).use { session -> + FutureAppSearchSessionImpl(appSearchManager, testExecutor, searchContext).use { session -> val setSchemaRequest = SetSchemaRequest.Builder() .addSchemas( @@ -131,7 +133,7 @@ class FutureAppSearchSessionTest { @Test fun search() { val searchContext = AppSearchManager.SearchContext.Builder(TEST_DB).build() - FutureAppSearchSession(appSearchManager, testExecutor, searchContext).use { session -> + FutureAppSearchSessionImpl(appSearchManager, testExecutor, searchContext).use { session -> val setSchemaRequest = SetSchemaRequest.Builder() .addSchemas( @@ -163,7 +165,7 @@ class FutureAppSearchSessionTest { @Test fun getByDocumentId() { val searchContext = AppSearchManager.SearchContext.Builder(TEST_DB).build() - FutureAppSearchSession(appSearchManager, testExecutor, searchContext).use { session -> + FutureAppSearchSessionImpl(appSearchManager, testExecutor, searchContext).use { session -> val setSchemaRequest = SetSchemaRequest.Builder() .addSchemas( @@ -171,24 +173,24 @@ class FutureAppSearchSessionTest { createAppFunctionRuntimeSchema(TEST_PACKAGE_NAME), ) .build() - val schema = session.setSchema(setSchemaRequest) + session.setSchema(setSchemaRequest).get() val appFunctionRuntimeMetadata = AppFunctionRuntimeMetadata.Builder(TEST_PACKAGE_NAME, TEST_FUNCTION_ID, "").build() val putDocumentsRequest: PutDocumentsRequest = PutDocumentsRequest.Builder() .addGenericDocuments(appFunctionRuntimeMetadata) .build() - val putResult = session.put(putDocumentsRequest) + session.put(putDocumentsRequest) + val getRequest = + GetByDocumentIdRequest.Builder(APP_FUNCTION_RUNTIME_NAMESPACE) + .addIds(appFunctionRuntimeMetadata.id) + .build() - val genricDocument = - session - .getByDocumentId( - /* documentId= */ "${TEST_PACKAGE_NAME}/${TEST_FUNCTION_ID}", - APP_FUNCTION_RUNTIME_NAMESPACE, - ) - .get() + val genericDocument: GenericDocument? = + session.getByDocumentId(getRequest).get().successes[appFunctionRuntimeMetadata.id] - val foundAppFunctionRuntimeMetadata = AppFunctionRuntimeMetadata(genricDocument) + assertThat(genericDocument).isNotNull() + val foundAppFunctionRuntimeMetadata = AppFunctionRuntimeMetadata(genericDocument!!) assertThat(foundAppFunctionRuntimeMetadata.functionId).isEqualTo(TEST_FUNCTION_ID) } } diff --git a/services/tests/appfunctions/src/com/android/server/appfunctions/FutureGlobalSearchSessionTest.kt b/services/tests/appfunctions/src/com/android/server/appfunctions/FutureGlobalSearchSessionTest.kt index 1fa55c7090aa..38cba6537c95 100644 --- a/services/tests/appfunctions/src/com/android/server/appfunctions/FutureGlobalSearchSessionTest.kt +++ b/services/tests/appfunctions/src/com/android/server/appfunctions/FutureGlobalSearchSessionTest.kt @@ -46,9 +46,9 @@ class FutureGlobalSearchSessionTest { @After fun clearData() { val searchContext = SearchContext.Builder(TEST_DB).build() - FutureAppSearchSession(appSearchManager, testExecutor, searchContext).use { + FutureAppSearchSessionImpl(appSearchManager, testExecutor, searchContext).use { val setSchemaRequest = SetSchemaRequest.Builder().setForceOverride(true).build() - it.setSchema(setSchemaRequest) + it.setSchema(setSchemaRequest).get() } } @@ -83,7 +83,7 @@ class FutureGlobalSearchSessionTest { assertThat(registerPackageObserver).isNull() // Trigger document change val searchContext = SearchContext.Builder(TEST_DB).build() - FutureAppSearchSession(appSearchManager, testExecutor, searchContext).use { session -> + FutureAppSearchSessionImpl(appSearchManager, testExecutor, searchContext).use { session -> val setSchemaRequest = SetSchemaRequest.Builder() .addSchemas( diff --git a/services/tests/appfunctions/src/com/android/server/appfunctions/MetadataSyncAdapterTest.kt b/services/tests/appfunctions/src/com/android/server/appfunctions/MetadataSyncAdapterTest.kt index 5769e07ee58d..3ebf68937674 100644 --- a/services/tests/appfunctions/src/com/android/server/appfunctions/MetadataSyncAdapterTest.kt +++ b/services/tests/appfunctions/src/com/android/server/appfunctions/MetadataSyncAdapterTest.kt @@ -41,9 +41,9 @@ class MetadataSyncAdapterTest { @After fun clearData() { val searchContext = SearchContext.Builder(TEST_DB).build() - FutureAppSearchSession(appSearchManager, testExecutor, searchContext).use { + FutureAppSearchSessionImpl(appSearchManager, testExecutor, searchContext).use { val setSchemaRequest = SetSchemaRequest.Builder().setForceOverride(true).build() - it.setSchema(setSchemaRequest) + it.setSchema(setSchemaRequest).get() } } @@ -61,7 +61,7 @@ class MetadataSyncAdapterTest { .build() val putDocumentsRequest: PutDocumentsRequest = PutDocumentsRequest.Builder().addGenericDocuments(functionRuntimeMetadata).build() - FutureAppSearchSession(appSearchManager, testExecutor, searchContext).use { + FutureAppSearchSessionImpl(appSearchManager, testExecutor, searchContext).use { val setSchemaResponse = it.setSchema(setSchemaRequest).get() assertThat(setSchemaResponse).isNotNull() val appSearchBatchResult = it.put(putDocumentsRequest).get() @@ -71,7 +71,7 @@ class MetadataSyncAdapterTest { val metadataSyncAdapter = MetadataSyncAdapter( testExecutor, - FutureAppSearchSession(appSearchManager, testExecutor, searchContext), + FutureAppSearchSessionImpl(appSearchManager, testExecutor, searchContext), ) val packageToFunctionIdMap = metadataSyncAdapter.getPackageToFunctionIdMap( @@ -111,7 +111,7 @@ class MetadataSyncAdapterTest { functionRuntimeMetadata3, ) .build() - FutureAppSearchSession(appSearchManager, testExecutor, searchContext).use { + FutureAppSearchSessionImpl(appSearchManager, testExecutor, searchContext).use { val setSchemaResponse = it.setSchema(setSchemaRequest).get() assertThat(setSchemaResponse).isNotNull() val appSearchBatchResult = it.put(putDocumentsRequest).get() @@ -121,7 +121,7 @@ class MetadataSyncAdapterTest { val metadataSyncAdapter = MetadataSyncAdapter( testExecutor, - FutureAppSearchSession(appSearchManager, testExecutor, searchContext), + FutureAppSearchSessionImpl(appSearchManager, testExecutor, searchContext), ) val packageToFunctionIdMap = metadataSyncAdapter.getPackageToFunctionIdMap( diff --git a/services/tests/displayservicetests/Android.bp b/services/tests/displayservicetests/Android.bp index 61350bf24868..fe73025e9736 100644 --- a/services/tests/displayservicetests/Android.bp +++ b/services/tests/displayservicetests/Android.bp @@ -16,7 +16,7 @@ android_test { ], libs: [ - "android.test.mock", + "android.test.mock.stubs.system", ], static_libs: [ diff --git a/services/tests/mockingservicestests/Android.bp b/services/tests/mockingservicestests/Android.bp index 01435ff7f253..c81d6be43223 100644 --- a/services/tests/mockingservicestests/Android.bp +++ b/services/tests/mockingservicestests/Android.bp @@ -80,9 +80,9 @@ android_test { ], libs: [ - "android.test.mock", - "android.test.base", - "android.test.runner", + "android.test.mock.stubs.system", + "android.test.base.stubs.system", + "android.test.runner.stubs.system", "servicestests-core-utils", ], @@ -118,14 +118,14 @@ java_library { "mockito-target-extended-minus-junit4", ], libs: [ - "android.test.runner", + "android.test.runner.stubs.system", ], } android_ravenwood_test { name: "FrameworksMockingServicesTestsRavenwood", libs: [ - "android.test.mock", + "android.test.mock.stubs.system", ], static_libs: [ "androidx.annotation_annotation", @@ -391,3 +391,13 @@ test_module_config { ], include_filters: ["com.android.server.trust"], } + +test_module_config { + name: "FrameworksMockingServicesTests_server_storagemanagerservicetest", + base: "FrameworksMockingServicesTests", + test_suites: [ + "automotive-tests", + "device-tests", + ], + include_filters: ["com.android.server.StorageManagerServiceTest"], +} diff --git a/services/tests/mockingservicestests/src/com/android/server/rollback/Android.bp b/services/tests/mockingservicestests/src/com/android/server/rollback/Android.bp index 6a16d1e14795..677ecf47355d 100644 --- a/services/tests/mockingservicestests/src/com/android/server/rollback/Android.bp +++ b/services/tests/mockingservicestests/src/com/android/server/rollback/Android.bp @@ -37,9 +37,9 @@ android_test { ], libs: [ - "android.test.mock", - "android.test.base", - "android.test.runner", + "android.test.mock.stubs.system", + "android.test.base.stubs.system", + "android.test.runner.stubs.system", ], jni_libs: [ 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 b2ca991a4aa8..639ae30c00b9 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 @@ -48,7 +48,9 @@ import android.app.ActivityManagerInternal; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; +import android.hardware.common.fmq.MQDescriptor; import android.hardware.power.ChannelConfig; +import android.hardware.power.ChannelMessage; import android.hardware.power.IPower; import android.hardware.power.SessionConfig; import android.hardware.power.SessionTag; @@ -167,6 +169,8 @@ public class HintManagerServiceTest { mConfig = new ChannelConfig(); mConfig.readFlagBitmask = 1; mConfig.writeFlagBitmask = 2; + mConfig.channelDescriptor = new MQDescriptor<ChannelMessage, Byte>(); + mConfig.eventFlagDescriptor = new MQDescriptor<Byte, Byte>(); ApplicationInfo applicationInfo = new ApplicationInfo(); applicationInfo.category = ApplicationInfo.CATEGORY_GAME; when(mContext.getPackageManager()).thenReturn(mMockPackageManager); diff --git a/services/tests/powerservicetests/Android.bp b/services/tests/powerservicetests/Android.bp index f8cc6d0fedb6..f03043ea0ae0 100644 --- a/services/tests/powerservicetests/Android.bp +++ b/services/tests/powerservicetests/Android.bp @@ -23,7 +23,7 @@ android_test { ], libs: [ - "android.test.mock", + "android.test.mock.stubs.system", ], defaults: [ diff --git a/services/tests/powerstatstests/Android.bp b/services/tests/powerstatstests/Android.bp index 0e922ceee26e..d6ca10a23fb9 100644 --- a/services/tests/powerstatstests/Android.bp +++ b/services/tests/powerstatstests/Android.bp @@ -30,7 +30,7 @@ android_test { ], libs: [ - "android.test.base", + "android.test.base.stubs.system", ], resource_dirs: ["res/"], diff --git a/services/tests/servicestests/Android.bp b/services/tests/servicestests/Android.bp index 914b29f44bb1..e55e0f27dfb4 100644 --- a/services/tests/servicestests/Android.bp +++ b/services/tests/servicestests/Android.bp @@ -97,9 +97,9 @@ android_test { "android.hardware.tv.cec-V1.0-java", "android.hardware.vibrator-V3-java", "android.hidl.manager-V1.0-java", - "android.test.mock", - "android.test.base", - "android.test.runner", + "android.test.mock.stubs.system", + "android.test.base.stubs.system", + "android.test.runner.stubs.system", ], platform_apis: true, @@ -153,7 +153,7 @@ android_test { android_ravenwood_test { name: "FrameworksServicesTestsRavenwood", libs: [ - "android.test.mock", + "android.test.mock.stubs.system", ], static_libs: [ "androidx.annotation_annotation", @@ -193,8 +193,8 @@ java_library { "src/com/android/server/devicepolicy/MockUtils.java", ], libs: [ - "android.test.mock", - "android.test.base", + "android.test.mock.stubs.system", + "android.test.base.stubs.system", "mockito-target-minus-junit4", ], static_libs: [ @@ -219,7 +219,7 @@ java_library { "mockito-target-minus-junit4", ], libs: [ - "android.test.runner", + "android.test.runner.stubs.system", ], } @@ -245,7 +245,7 @@ java_library { "mockito-target-extended-minus-junit4", ], libs: [ - "android.test.runner", + "android.test.runner.stubs.system", ], } @@ -278,14 +278,22 @@ java_genrule { test_module_config { name: "FrameworksServicesTests_contentprotection", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_filters: ["com.android.server.contentprotection"], } test_module_config { name: "FrameworksServicesTests_om", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_filters: ["com.android.server.om."], } @@ -293,7 +301,11 @@ test_module_config { test_module_config { name: "FrameworksServicesTests_contexthub_presubmit", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_filters: ["com.android.server.location.contexthub."], // TODO(ron): are these right, does it run anything? include_annotations: ["android.platform.test.annotations.Presubmit"], @@ -302,7 +314,11 @@ test_module_config { test_module_config { name: "FrameworksServicesTests_contexthub_postsubmit", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_filters: ["com.android.server.location.contexthub."], // TODO(ron): are these right, does it run anything? include_annotations: ["android.platform.test.annotations.Postsubmit"], @@ -312,14 +328,22 @@ test_module_config { test_module_config { name: "FrameworksServicesTests_contentcapture", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_filters: ["com.android.server.contentcapture"], } test_module_config { name: "FrameworksServicesTests_recoverysystem", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_filters: ["com.android.server.recoverysystem."], } @@ -327,7 +351,11 @@ test_module_config { test_module_config { name: "FrameworksServicesTests_pm_presubmit", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_annotations: ["android.platform.test.annotations.Presubmit"], include_filters: ["com.android.server.pm."], } @@ -335,7 +363,11 @@ test_module_config { test_module_config { name: "FrameworksServicesTests_pm_postsubmit", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_annotations: ["android.platform.test.annotations.Postsubmit"], include_filters: ["com.android.server.pm."], } @@ -344,21 +376,33 @@ test_module_config { test_module_config { name: "FrameworksServicesTests_os", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_filters: ["com.android.server.os."], } test_module_config { name: "FrameworksServicesTests_presubmit", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_annotations: ["android.platform.test.annotations.Presubmit"], } test_module_config { name: "FrameworksServicesTests_com_android_server_job_Presubmit", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_filters: ["com.android.server.job"], exclude_annotations: [ "androidx.test.filters.LargeTest", @@ -369,49 +413,77 @@ test_module_config { test_module_config { name: "FrameworksServicesTests_com_android_server_job", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_filters: ["com.android.server.job"], } test_module_config { name: "FrameworksServicesTests_com_android_server_tare", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_filters: ["com.android.server.tare"], } test_module_config { name: "FrameworksServicesTests_com_android_server_usage", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_filters: ["com.android.server.usage"], } test_module_config { name: "FrameworksServicesTests_battery_stats", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_filters: ["com.android.server.am.BatteryStatsServiceTest"], } test_module_config { name: "FrameworksServicesTests_accessibility", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_filters: ["com.android.server.accessibility"], } test_module_config { name: "FrameworksServicesTests_binary_transparency", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_filters: ["com.android.server.BinaryTransparencyServiceTest"], } test_module_config { name: "FrameworksServicesTests_pinner_service", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_filters: ["com.android.server.PinnerServiceTest"], exclude_annotations: ["org.junit.Ignore"], } @@ -419,7 +491,11 @@ test_module_config { test_module_config { name: "FrameworksServicesTests_android_server_am_Presubmit", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_filters: ["com.android.server.am."], include_annotations: ["android.platform.test.annotations.Presubmit"], } @@ -427,21 +503,33 @@ test_module_config { test_module_config { name: "FrameworksServicesTests_android_server_am", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_filters: ["com.android.server.am."], } test_module_config { name: "FrameworksServicesTests_android_server_appop", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_filters: ["com.android.server.appop"], } test_module_config { name: "FrameworksServicesTests_android_server_audio", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_filters: ["com.android.server.audio"], include_annotations: ["android.platform.test.annotations.Presubmit"], } @@ -449,14 +537,22 @@ test_module_config { test_module_config { name: "FrameworksServicesTests_android_server_compat", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_filters: ["com.android.server.compat"], } test_module_config { name: "FrameworksServicesTests_android_server_hdmi_Presubmit", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_filters: ["com.android.server.hdmi"], include_annotations: ["android.platform.test.annotations.Presubmit"], } @@ -464,35 +560,55 @@ test_module_config { test_module_config { name: "FrameworksServicesTests_android_server_hdmi", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_filters: ["com.android.server.hdmi"], } test_module_config { name: "FrameworksServicesTests_android_server_integrity", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_filters: ["com.android.server.integrity."], } test_module_config { name: "FrameworksServicesTests_android_server_lights", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_filters: ["com.android.server.lights"], } test_module_config { name: "FrameworksServicesTests_android_server_locales", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_filters: ["com.android.server.locales."], } test_module_config { name: "FrameworksServicesTests_android_server_location_contexthub_Presubmit", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_filters: ["com.android.server.location.contexthub."], include_annotations: ["android.platform.test.annotations.Presubmit"], } @@ -500,21 +616,33 @@ test_module_config { test_module_config { name: "FrameworksServicesTests_android_server_locksettings", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_filters: ["com.android.server.locksettings."], } test_module_config { name: "FrameworksServicesTests_android_server_logcat", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_filters: ["com.android.server.logcat"], } test_module_config { name: "FrameworksServicesTests_android_server_net_Presubmit", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_filters: ["com.android.server.net."], include_annotations: ["android.platform.test.annotations.Presubmit"], } @@ -522,28 +650,44 @@ test_module_config { test_module_config { name: "FrameworksServicesTests_android_server_om", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_filters: ["com.android.server.om."], } test_module_config { name: "FrameworksServicesTests_android_server_pdb", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_filters: ["com.android.server.pdb.PersistentDataBlockServiceTest"], } test_module_config { name: "FrameworksServicesTests_android_server_pm_dex", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_filters: ["com.android.server.pm.dex"], } test_module_config { name: "FrameworksServicesTests_android_server_policy_Presubmit", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_filters: ["com.android.server.policy."], include_annotations: ["android.platform.test.annotations.Presubmit"], } @@ -551,49 +695,77 @@ test_module_config { test_module_config { name: "FrameworksServicesTests_android_server_policy", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_filters: ["com.android.server.policy."], } test_module_config { name: "FrameworksServicesTests_android_server_power", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_filters: ["com.android.server.power"], } test_module_config { name: "FrameworksServicesTests_android_server_power_hint", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_filters: ["com.android.server.power.hint"], } test_module_config { name: "FrameworksServicesTests_android_server_powerstats", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_filters: ["com.android.server.powerstats"], } test_module_config { name: "FrameworksServicesTests_android_server_rollback", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_filters: ["com.android.server.rollback"], } test_module_config { name: "FrameworksServicesTests_android_server_uri", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_filters: ["com.android.server.uri."], } test_module_config { name: "FrameworksServicesTests_com_android_server_location_contexthub", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_filters: ["com.android.server.location.contexthub."], include_annotations: ["android.platform.test.annotations.Postsubmit"], } @@ -601,7 +773,11 @@ test_module_config { test_module_config { name: "FrameworksServicesTests_android_server_usage", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_filters: ["com.android.server.usage"], exclude_filters: ["com.android.server.usage.StorageStatsServiceTest"], } @@ -609,14 +785,22 @@ test_module_config { test_module_config { name: "FrameworksServicesTests_android_server_soundtrigger_middleware", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_filters: ["com.android.server.soundtrigger_middleware"], } test_module_config { name: "FrameworksServicesTests_android_server_input", base: "FrameworksServicesTests", - test_suites: ["device-tests"], + test_suites: [ + "device-tests", + "automotive-tests", + ], + include_filters: ["com.android.server.input"], } @@ -792,3 +976,23 @@ test_module_config { ], include_filters: ["com.android.server.input"], } + +test_module_config { + name: "FrameworksServicesTests_people_data", + base: "FrameworksServicesTests", + test_suites: [ + "automotive-tests", + "device-tests", + ], + include_filters: ["com.android.server.people.data"], +} + +test_module_config { + name: "FrameworksServicesTests_Presubmit", + base: "FrameworksServicesTests", + test_suites: [ + "automotive-tests", + "device-tests", + ], + include_annotations: ["android.platform.test.annotations.Presubmit"], +} diff --git a/services/tests/timetests/Android.bp b/services/tests/timetests/Android.bp index 05a1433c128e..aae6acc7c53a 100644 --- a/services/tests/timetests/Android.bp +++ b/services/tests/timetests/Android.bp @@ -20,7 +20,7 @@ android_test { "services.core", "truth", ], - libs: ["android.test.runner"], + libs: ["android.test.runner.stubs.system"], platform_apis: true, certificate: "platform", test_suites: ["device-tests"], diff --git a/services/tests/uiservicestests/Android.bp b/services/tests/uiservicestests/Android.bp index e6cf0c38a10c..a63a38da3740 100644 --- a/services/tests/uiservicestests/Android.bp +++ b/services/tests/uiservicestests/Android.bp @@ -54,9 +54,9 @@ android_test { ], libs: [ - "android.test.runner", - "android.test.base", - "android.test.mock", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", + "android.test.mock.stubs.system", ], dxflags: ["--multi-dex"], @@ -92,3 +92,13 @@ android_test { // Required for TestParameterInjector javacflags: ["-parameters"], } + +test_module_config { + name: "FrameworksUiServicesTests_notification", + base: "FrameworksUiServicesTests", + test_suites: [ + "automotive-tests", + "device-tests", + ], + exclude_annotations: ["androidx.test.filters.LargeTest"], +} diff --git a/services/tests/vibrator/Android.bp b/services/tests/vibrator/Android.bp index 2549ff5360ec..ed18c8b04c0f 100644 --- a/services/tests/vibrator/Android.bp +++ b/services/tests/vibrator/Android.bp @@ -17,9 +17,9 @@ android_test { libs: [ "android.hardware.vibrator-V3-java", - "android.test.mock", - "android.test.base", - "android.test.runner", + "android.test.mock.stubs.system", + "android.test.base.stubs.system", + "android.test.runner.stubs.system", ], static_libs: [ diff --git a/services/tests/vibrator/utils/com/android/server/vibrator/FakeVibratorControllerProvider.java b/services/tests/vibrator/utils/com/android/server/vibrator/FakeVibratorControllerProvider.java index 031d1c29a215..946e1eaa5666 100644 --- a/services/tests/vibrator/utils/com/android/server/vibrator/FakeVibratorControllerProvider.java +++ b/services/tests/vibrator/utils/com/android/server/vibrator/FakeVibratorControllerProvider.java @@ -68,6 +68,9 @@ public final class FakeVibratorControllerProvider { private int[] mSupportedPrimitives; private int mCompositionSizeMax; private int mPwleSizeMax; + private int mMaxEnvelopeEffectSize; + private int mMinEnvelopeEffectControlPointDurationMillis; + private int mMaxEnvelopeEffectControlPointDurationMillis; private float mMinFrequency = Float.NaN; private float mResonantFrequency = Float.NaN; private float mFrequencyResolution = Float.NaN; @@ -217,6 +220,11 @@ public final class FakeVibratorControllerProvider { infoBuilder.setQFactor(mQFactor); infoBuilder.setFrequencyProfile(new VibratorInfo.FrequencyProfile( mResonantFrequency, mMinFrequency, mFrequencyResolution, mMaxAmplitudes)); + infoBuilder.setMaxEnvelopeEffectSize(mMaxEnvelopeEffectSize); + infoBuilder.setMinEnvelopeEffectControlPointDurationMillis( + mMinEnvelopeEffectControlPointDurationMillis); + infoBuilder.setMaxEnvelopeEffectControlPointDurationMillis( + mMaxEnvelopeEffectControlPointDurationMillis); return mIsInfoLoadSuccessful; } @@ -358,6 +366,26 @@ public final class FakeVibratorControllerProvider { } /** + * Set the maximum number of envelope effects control points supported in fake vibrator + * hardware. + */ + public void setMaxEnvelopeEffectSize(int envelopeEffectControlPointsMax) { + mMaxEnvelopeEffectSize = envelopeEffectControlPointsMax; + } + + /** Set the envelope effect minimum segment duration in fake vibrator hardware. */ + public void setMinEnvelopeEffectControlPointDurationMillis( + int minEnvelopeEffectControlPointDurationMillis) { + mMinEnvelopeEffectControlPointDurationMillis = minEnvelopeEffectControlPointDurationMillis; + } + + /** Set the envelope effect maximum segment duration in fake vibrator hardware. */ + public void setMaxEnvelopeEffectControlPointDurationMillis( + int maxEnvelopeEffectControlPointDurationMillis) { + mMaxEnvelopeEffectControlPointDurationMillis = maxEnvelopeEffectControlPointDurationMillis; + } + + /** * Return the amplitudes set by this controller, including zeroes for each time the vibrator was * turned off. */ diff --git a/services/tests/voiceinteractiontests/Android.bp b/services/tests/voiceinteractiontests/Android.bp index 8c70851f87df..5fbf02cfc984 100644 --- a/services/tests/voiceinteractiontests/Android.bp +++ b/services/tests/voiceinteractiontests/Android.bp @@ -49,9 +49,9 @@ android_test { ], libs: [ - "android.test.mock", - "android.test.base", - "android.test.runner", + "android.test.mock.stubs.system", + "android.test.base.stubs.system", + "android.test.runner.stubs.system", ], certificate: "platform", diff --git a/services/tests/wmtests/Android.bp b/services/tests/wmtests/Android.bp index 289f8a90e0bd..4e59fe516608 100644 --- a/services/tests/wmtests/Android.bp +++ b/services/tests/wmtests/Android.bp @@ -76,9 +76,9 @@ android_test { libs: [ "android.hardware.power-V1-java", - "android.test.mock", - "android.test.base", - "android.test.runner", + "android.test.mock.stubs.system", + "android.test.base.stubs.system", + "android.test.runner.stubs.system", ], defaults: [ diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java index c706d5200443..c176658da847 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java @@ -932,7 +932,6 @@ public class ActivityTaskManagerServiceTests extends WindowTestsBase { WindowProcessController wpc = createWindowProcessController( DEFAULT_PACKAGE_NAME, DEFAULT_USER_ID); mAtm.mProcessMap.put(Binder.getCallingPid(), wpc); - mAtm.mInternal.onProcessAdded(wpc); ActivityTaskManagerInternal.PackageConfig appSpecificConfig = mAtm.mInternal .getApplicationConfig(DEFAULT_PACKAGE_NAME, DEFAULT_USER_ID); @@ -987,7 +986,6 @@ public class ActivityTaskManagerServiceTests extends WindowTestsBase { WindowProcessController wpc = createWindowProcessController( DEFAULT_PACKAGE_NAME, DEFAULT_USER_ID); mAtm.mProcessMap.put(Binder.getCallingPid(), wpc); - mAtm.mInternal.onProcessAdded(wpc); ActivityTaskManagerInternal.PackageConfigurationUpdater packageConfigUpdater = mAtm.mInternal.createPackageConfigurationUpdater(DEFAULT_PACKAGE_NAME, @@ -1018,7 +1016,6 @@ public class ActivityTaskManagerServiceTests extends WindowTestsBase { WindowProcessController wpc = createWindowProcessController( DEFAULT_PACKAGE_NAME, DEFAULT_USER_ID); mAtm.mProcessMap.put(Binder.getCallingPid(), wpc); - mAtm.mInternal.onProcessAdded(wpc); ActivityTaskManagerInternal.PackageConfigurationUpdater packageConfigUpdater = mAtm.mInternal.createPackageConfigurationUpdater(DEFAULT_PACKAGE_NAME, @@ -1048,6 +1045,7 @@ public class ActivityTaskManagerServiceTests extends WindowTestsBase { WindowProcessController wpc = new WindowProcessController( mAtm, info, packageName, 0, userId, null, mMockListener); mAtm.mInternal.preBindApplication(wpc, info); + mAtm.mInternal.onProcessAdded(wpc); wpc.setThread(mock(IApplicationThread.class)); return wpc; } 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 adf878c389dd..064b434e1a6b 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java @@ -2005,10 +2005,10 @@ public class TransitionTests extends WindowTestsBase { @DisableFlags(Flags.FLAG_MOVE_ANIMATION_OPTIONS_TO_CHANGE) @Test public void testOverrideAnimationOptionsToInfoIfNecessary_disableAnimOptionsPerChange() { - initializeOverrideAnimationOptionsTest(); + ActivityRecord r = initializeOverrideAnimationOptionsTest(); TransitionInfo.AnimationOptions options = TransitionInfo.AnimationOptions .makeCommonAnimOptions("testPackage"); - mTransition.setOverrideAnimation(options, null /* startCallback */, + mTransition.setOverrideAnimation(options, r, null /* startCallback */, null /* finishCallback */); mTransition.overrideAnimationOptionsToInfoIfNecessary(mInfo); @@ -2019,10 +2019,10 @@ public class TransitionTests extends WindowTestsBase { @EnableFlags(Flags.FLAG_MOVE_ANIMATION_OPTIONS_TO_CHANGE) @Test public void testOverrideAnimationOptionsToInfoIfNecessary_fromStyleAnimOptions() { - initializeOverrideAnimationOptionsTest(); + ActivityRecord r = initializeOverrideAnimationOptionsTest(); TransitionInfo.AnimationOptions options = TransitionInfo.AnimationOptions .makeCommonAnimOptions("testPackage"); - mTransition.setOverrideAnimation(options, null /* startCallback */, + mTransition.setOverrideAnimation(options, r, null /* startCallback */, null /* finishCallback */); mTransition.overrideAnimationOptionsToInfoIfNecessary(mInfo); @@ -2045,10 +2045,10 @@ public class TransitionTests extends WindowTestsBase { @EnableFlags(Flags.FLAG_MOVE_ANIMATION_OPTIONS_TO_CHANGE) @Test public void testOverrideAnimationOptionsToInfoIfNecessary_sceneAnimOptions() { - initializeOverrideAnimationOptionsTest(); + ActivityRecord r = initializeOverrideAnimationOptionsTest(); TransitionInfo.AnimationOptions options = TransitionInfo.AnimationOptions .makeSceneTransitionAnimOptions(); - mTransition.setOverrideAnimation(options, null /* startCallback */, + mTransition.setOverrideAnimation(options, r, null /* startCallback */, null /* finishCallback */); mTransition.overrideAnimationOptionsToInfoIfNecessary(mInfo); @@ -2071,10 +2071,10 @@ public class TransitionTests extends WindowTestsBase { @EnableFlags(Flags.FLAG_MOVE_ANIMATION_OPTIONS_TO_CHANGE) @Test public void testOverrideAnimationOptionsToInfoIfNecessary_crossProfileAnimOptions() { - initializeOverrideAnimationOptionsTest(); + ActivityRecord r = initializeOverrideAnimationOptionsTest(); TransitionInfo.AnimationOptions options = TransitionInfo.AnimationOptions .makeCrossProfileAnimOptions(); - mTransition.setOverrideAnimation(options, null /* startCallback */, + mTransition.setOverrideAnimation(options, r, null /* startCallback */, null /* finishCallback */); final TransitionInfo.Change displayChange = mInfo.getChanges().get(0); @@ -2099,13 +2099,13 @@ public class TransitionTests extends WindowTestsBase { @EnableFlags(Flags.FLAG_MOVE_ANIMATION_OPTIONS_TO_CHANGE) @Test public void testOverrideAnimationOptionsToInfoIfNecessary_customAnimOptions() { - initializeOverrideAnimationOptionsTest(); + ActivityRecord r = initializeOverrideAnimationOptionsTest(); TransitionInfo.AnimationOptions options = TransitionInfo.AnimationOptions .makeCustomAnimOptions("testPackage", Resources.ID_NULL, TransitionInfo.AnimationOptions.DEFAULT_ANIMATION_RESOURCES_ID, TransitionInfo.AnimationOptions.DEFAULT_ANIMATION_RESOURCES_ID, Color.GREEN, false /* overrideTaskTransition */); - mTransition.setOverrideAnimation(options, null /* startCallback */, + mTransition.setOverrideAnimation(options, r, null /* startCallback */, null /* finishCallback */); mTransition.overrideAnimationOptionsToInfoIfNecessary(mInfo); @@ -2132,7 +2132,7 @@ public class TransitionTests extends WindowTestsBase { @EnableFlags(Flags.FLAG_MOVE_ANIMATION_OPTIONS_TO_CHANGE) @Test public void testOverrideAnimationOptionsToInfoIfNecessary_haveTaskFragmentAnimParams() { - initializeOverrideAnimationOptionsTest(); + ActivityRecord r = initializeOverrideAnimationOptionsTest(); final TaskFragment embeddedTf = mTransition.mTargets.get(2).mContainer.asTaskFragment(); embeddedTf.setAnimationParams(new TaskFragmentAnimationParams.Builder() @@ -2145,7 +2145,7 @@ public class TransitionTests extends WindowTestsBase { TransitionInfo.AnimationOptions.DEFAULT_ANIMATION_RESOURCES_ID, TransitionInfo.AnimationOptions.DEFAULT_ANIMATION_RESOURCES_ID, Color.GREEN, false /* overrideTaskTransition */); - mTransition.setOverrideAnimation(options, null /* startCallback */, + mTransition.setOverrideAnimation(options, r, null /* startCallback */, null /* finishCallback */); final TransitionInfo.Change displayChange = mInfo.getChanges().get(0); @@ -2181,13 +2181,13 @@ public class TransitionTests extends WindowTestsBase { @EnableFlags(Flags.FLAG_MOVE_ANIMATION_OPTIONS_TO_CHANGE) @Test public void testOverrideAnimationOptionsToInfoIfNecessary_customAnimOptionsWithTaskOverride() { - initializeOverrideAnimationOptionsTest(); + ActivityRecord r = initializeOverrideAnimationOptionsTest(); TransitionInfo.AnimationOptions options = TransitionInfo.AnimationOptions .makeCustomAnimOptions("testPackage", Resources.ID_NULL, TransitionInfo.AnimationOptions.DEFAULT_ANIMATION_RESOURCES_ID, TransitionInfo.AnimationOptions.DEFAULT_ANIMATION_RESOURCES_ID, Color.GREEN, true /* overrideTaskTransition */); - mTransition.setOverrideAnimation(options, null /* startCallback */, + mTransition.setOverrideAnimation(options, r, null /* startCallback */, null /* finishCallback */); mTransition.overrideAnimationOptionsToInfoIfNecessary(mInfo); @@ -2213,7 +2213,7 @@ public class TransitionTests extends WindowTestsBase { options.getBackgroundColor(), activityChange.getBackgroundColor()); } - private void initializeOverrideAnimationOptionsTest() { + private ActivityRecord initializeOverrideAnimationOptionsTest() { mTransition = createTestTransition(TRANSIT_OPEN); // Test set AnimationOptions for Activity and Task. @@ -2241,6 +2241,7 @@ public class TransitionTests extends WindowTestsBase { embeddedTf.getAnimationLeash())); mInfo.addChange(new TransitionInfo.Change(null /* container */, nonEmbeddedActivity.getAnimationLeash())); + return nonEmbeddedActivity; } @Test diff --git a/services/tests/wmtests/src/com/android/server/wm/TransparentPolicyTest.java b/services/tests/wmtests/src/com/android/server/wm/TransparentPolicyTest.java index 7a440e676b39..5187f87cd6db 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TransparentPolicyTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/TransparentPolicyTest.java @@ -16,6 +16,7 @@ package com.android.server.wm; +import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; @@ -236,6 +237,21 @@ public class TransparentPolicyTest extends WindowTestsBase { } @Test + public void testNotRunStrategyToTranslucentActivitiesIfTaskIsFreeform() { + runTestScenario((robot) -> { + robot.transparentActivity((ta) -> { + ta.applyOnActivity((a) -> { + a.setIgnoreOrientationRequest(true); + ta.launchTransparentActivityInTask(); + a.setTaskWindowingMode(WINDOWING_MODE_FREEFORM); + + ta.checkTopActivityTransparentPolicyStateIsRunning(/* running */ false); + }); + }); + }, /* displayWidth */ 2800, /* displayHeight */ 1400); + } + + @Test public void testTranslucentActivitiesDontGoInSizeCompatMode() { runTestScenario((robot) -> { robot.transparentActivity((ta) -> { diff --git a/test-runner/Android.bp b/test-runner/Android.bp index 6b5be3cba204..bb2c4d97c87a 100644 --- a/test-runner/Android.bp +++ b/test-runner/Android.bp @@ -32,14 +32,28 @@ java_sdk_library { javacflags: ["-Xep:DepAnn:ERROR"], }, - libs: [ - "android.test.base", - "android.test.mock", - ], - stub_only_libs: [ - "android.test.base", - "android.test.mock", + impl_only_libs: [ + "android.test.base.impl", + "android.test.mock.impl", ], + public: { + libs: [ + "android.test.base.stubs", + "android.test.mock.stubs", + ], + }, + system: { + libs: [ + "android.test.base.stubs.system", + "android.test.mock.stubs.system", + ], + }, + test: { + libs: [ + "android.test.base.stubs.test", + "android.test.mock.stubs.test", + ], + }, api_packages: [ "android.test", "android.test.suitebuilder", @@ -64,7 +78,7 @@ java_library { sdk_version: "current", libs: [ "android.test.base_static", - "android.test.mock", + "android.test.mock.stubs", "junit", ], } diff --git a/test-runner/tests/Android.bp b/test-runner/tests/Android.bp index 0c0c0805f2d3..39f41ed7f667 100644 --- a/test-runner/tests/Android.bp +++ b/test-runner/tests/Android.bp @@ -30,8 +30,8 @@ android_test { libs: [ "android.test.runner.impl", - "android.test.base", - "android.test.mock", + "android.test.base.stubs.system", + "android.test.mock.stubs.system", ], static_libs: [ "junit", diff --git a/tests/AppLaunch/Android.bp b/tests/AppLaunch/Android.bp index f838c5a80c28..90a00fe6083e 100644 --- a/tests/AppLaunch/Android.bp +++ b/tests/AppLaunch/Android.bp @@ -14,11 +14,12 @@ android_test { platform_apis: true, certificate: "platform", libs: [ - "android.test.base", - "android.test.runner", + "android.test.base.stubs.system", + "android.test.runner.stubs.system", ], static_libs: [ "androidx.test.rules", - "ub-uiautomator"], + "ub-uiautomator", + ], test_suites: ["device-tests"], } diff --git a/tests/AttestationVerificationTest/Android.bp b/tests/AttestationVerificationTest/Android.bp index b98f8cb0c21d..5f0908959ed5 100644 --- a/tests/AttestationVerificationTest/Android.bp +++ b/tests/AttestationVerificationTest/Android.bp @@ -32,8 +32,8 @@ android_test { }, test_suites: ["device-tests"], libs: [ - "android.test.runner", - "android.test.base", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", ], static_libs: [ "compatibility-device-util-axt", diff --git a/tests/BrowserPowerTest/Android.bp b/tests/BrowserPowerTest/Android.bp index a8a9897c0e86..100e975b4d5e 100644 --- a/tests/BrowserPowerTest/Android.bp +++ b/tests/BrowserPowerTest/Android.bp @@ -24,8 +24,8 @@ package { android_test { name: "BrowserPowerTests", libs: [ - "android.test.runner", - "android.test.base", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", ], static_libs: ["junit"], // Include all test java files. diff --git a/tests/Camera2Tests/SmartCamera/SimpleCamera/tests/Android.bp b/tests/Camera2Tests/SmartCamera/SimpleCamera/tests/Android.bp index 5edb1de9586e..4aeca5b04602 100644 --- a/tests/Camera2Tests/SmartCamera/SimpleCamera/tests/Android.bp +++ b/tests/Camera2Tests/SmartCamera/SimpleCamera/tests/Android.bp @@ -24,7 +24,7 @@ android_test { name: "SmartCamera-tests", platform_apis: true, srcs: ["src/**/*.java"], - libs: ["android.test.base"], + libs: ["android.test.base.stubs.system"], static_libs: [ "guava", "junit", diff --git a/tests/ChoreographerTests/Android.bp b/tests/ChoreographerTests/Android.bp index 3f48d70d659f..69a9d180bfd3 100644 --- a/tests/ChoreographerTests/Android.bp +++ b/tests/ChoreographerTests/Android.bp @@ -26,8 +26,8 @@ android_test { name: "ChoreographerTests", srcs: ["src/**/*.java"], libs: [ - "android.test.runner", - "android.test.base", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", ], static_libs: [ "androidx.test.core", diff --git a/tests/CompanionDeviceMultiDeviceTests/client/Android.bp b/tests/CompanionDeviceMultiDeviceTests/client/Android.bp index 9994826d061a..ce63fe89fe2e 100644 --- a/tests/CompanionDeviceMultiDeviceTests/client/Android.bp +++ b/tests/CompanionDeviceMultiDeviceTests/client/Android.bp @@ -40,8 +40,8 @@ android_test { "mobly-snippet-lib", ], libs: [ - "android.test.base", - "android.test.runner", + "android.test.base.stubs.system", + "android.test.runner.stubs.system", ], optimize: { diff --git a/tests/CoreTests/android/Android.bp b/tests/CoreTests/android/Android.bp index 97a6e5fd4d1b..85e951e099ce 100644 --- a/tests/CoreTests/android/Android.bp +++ b/tests/CoreTests/android/Android.bp @@ -12,7 +12,7 @@ android_test { srcs: ["**/*.java"], libs: [ "android.test.runner.stubs", - "org.apache.http.legacy", + "org.apache.http.legacy.stubs", "android.test.base.stubs", ], sdk_version: "current", diff --git a/tests/CtsSurfaceControlTestsStaging/Android.bp b/tests/CtsSurfaceControlTestsStaging/Android.bp index 1038c9e93931..8d93b28b9acb 100644 --- a/tests/CtsSurfaceControlTestsStaging/Android.bp +++ b/tests/CtsSurfaceControlTestsStaging/Android.bp @@ -28,8 +28,8 @@ android_test { name: "CtsSurfaceControlTestsStaging", srcs: ["src/**/*.java"], libs: [ - "android.test.runner", - "android.test.base", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", ], static_libs: [ "androidx.test.core", diff --git a/tests/DataIdleTest/Android.bp b/tests/DataIdleTest/Android.bp index f9509cc9a4bf..8839df664abf 100644 --- a/tests/DataIdleTest/Android.bp +++ b/tests/DataIdleTest/Android.bp @@ -27,8 +27,8 @@ android_test { name: "DataIdleTest", platform_apis: true, libs: [ - "android.test.runner", - "android.test.base", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", ], static_libs: ["junit"], srcs: ["src/**/*.java"], diff --git a/tests/EnforcePermission/perf-app/Android.bp b/tests/EnforcePermission/perf-app/Android.bp index 6d04fdc821bb..dbafd739c7bc 100644 --- a/tests/EnforcePermission/perf-app/Android.bp +++ b/tests/EnforcePermission/perf-app/Android.bp @@ -32,8 +32,8 @@ android_test { "androidx.test.rules", ], libs: [ - "android.test.base", - "android.test.runner", + "android.test.base.stubs.system", + "android.test.runner.stubs.system", ], data: [ ":EnforcePermissionTestHelper", diff --git a/tests/EnforcePermission/test-app/Android.bp b/tests/EnforcePermission/test-app/Android.bp index 065ab33448e3..64f850b1e147 100644 --- a/tests/EnforcePermission/test-app/Android.bp +++ b/tests/EnforcePermission/test-app/Android.bp @@ -27,8 +27,8 @@ android_test { "androidx.test.rules", ], libs: [ - "android.test.base", - "android.test.runner", + "android.test.base.stubs.system", + "android.test.runner.stubs.system", ], data: [ ":EnforcePermissionTestHelper", diff --git a/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/open/OpenTrampolineActivityTest.kt b/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/open/OpenTrampolineActivityTest.kt index 67825d2df361..095c8195532c 100644 --- a/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/open/OpenTrampolineActivityTest.kt +++ b/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/open/OpenTrampolineActivityTest.kt @@ -41,7 +41,7 @@ import org.junit.runners.Parameterized * Transitions: From A launch a trampoline Activity T, T launches secondary Activity B and finishes * itself, end up in split A|B. * - * To run this test: `atest FlickerTestsOther:OpenTrampolineActivityTest` + * To run this test: `atest FlickerTestsActivityEmbedding:OpenTrampolineActivityTest` */ @FlakyTest(bugId = 341209752) @RequiresDevice diff --git a/tests/FlickerTests/Android.bp b/tests/FlickerTests/Android.bp index d658d5991a57..27e9ffa4cea5 100644 --- a/tests/FlickerTests/Android.bp +++ b/tests/FlickerTests/Android.bp @@ -31,7 +31,7 @@ java_defaults { enabled: false, }, test_suites: ["device-tests"], - libs: ["android.test.runner"], + libs: ["android.test.runner.stubs.system"], static_libs: [ "androidx.test.ext.junit", "flickertestapplib", diff --git a/tests/FlickerTests/test-apps/app-helpers/src/com/android/server/wm/flicker/helpers/ActivityEmbeddingAppHelper.kt b/tests/FlickerTests/test-apps/app-helpers/src/com/android/server/wm/flicker/helpers/ActivityEmbeddingAppHelper.kt index 4a675be65549..0bcd2f334c32 100644 --- a/tests/FlickerTests/test-apps/app-helpers/src/com/android/server/wm/flicker/helpers/ActivityEmbeddingAppHelper.kt +++ b/tests/FlickerTests/test-apps/app-helpers/src/com/android/server/wm/flicker/helpers/ActivityEmbeddingAppHelper.kt @@ -17,6 +17,7 @@ package com.android.server.wm.flicker.helpers import android.app.Instrumentation +import android.os.SystemClock import android.tools.PlatformConsts import android.tools.device.apphelpers.StandardAppHelper import android.tools.helpers.FIND_TIMEOUT @@ -25,6 +26,7 @@ import android.tools.traces.parsers.WindowManagerStateHelper import android.tools.traces.parsers.toFlickerComponent import android.util.Log import androidx.test.uiautomator.By +import androidx.test.uiautomator.Direction import androidx.test.uiautomator.Until import androidx.window.extensions.WindowExtensions import androidx.window.extensions.WindowExtensionsProvider @@ -83,6 +85,7 @@ constructor( * activity and finish itself. */ fun launchTrampolineActivity(wmHelper: WindowManagerStateHelper) { + scrollToBottom() val launchButton = uiDevice.wait( Until.findObject(By.res(packageName, "launch_trampoline_button")), @@ -210,6 +213,7 @@ constructor( * placeholder secondary activity based on the placeholder rule. */ fun launchPlaceholderSplitRTL(wmHelper: WindowManagerStateHelper) { + scrollToBottom() val launchButton = uiDevice.wait( Until.findObject(By.res(packageName, "launch_placeholder_split_rtl_button")), @@ -224,6 +228,21 @@ constructor( .waitForAndVerify() } + /** + * Scrolls to the bottom of the launch options. This is needed if the launch button is at the + * bottom. Otherwise the click may trigger touch on navBar. + */ + private fun scrollToBottom() { + val launchOptionsList = uiDevice.wait( + Until.findObject(By.res(packageName, "launch_options_list")), + FIND_TIMEOUT + ) + requireNotNull(launchOptionsList) { "Unable to find the list of launch options" } + launchOptionsList.scrollUntil(Direction.DOWN, Until.scrollFinished(Direction.DOWN)) + // Wait a bit after scrolling, otherwise the immediate click may not be treated as "click". + SystemClock.sleep(1000L) + } + companion object { private const val TAG = "ActivityEmbeddingAppHelper" diff --git a/tests/FlickerTests/test-apps/flickerapp/res/layout/activity_embedding_main_layout.xml b/tests/FlickerTests/test-apps/flickerapp/res/layout/activity_embedding_main_layout.xml index 917aec1e809d..939ba81a47ea 100644 --- a/tests/FlickerTests/test-apps/flickerapp/res/layout/activity_embedding_main_layout.xml +++ b/tests/FlickerTests/test-apps/flickerapp/res/layout/activity_embedding_main_layout.xml @@ -21,8 +21,10 @@ android:background="@android:color/holo_orange_light"> <LinearLayout + android:id="@+id/launch_options_list" android:layout_width="match_parent" android:layout_height="match_parent" + android:paddingBottom="48dp" android:orientation="vertical"> <Button diff --git a/tests/FrameworkPerf/Android.bp b/tests/FrameworkPerf/Android.bp index 9be3ab795b86..4e39fe1c5e4a 100644 --- a/tests/FrameworkPerf/Android.bp +++ b/tests/FrameworkPerf/Android.bp @@ -12,8 +12,8 @@ android_test { srcs: ["**/*.java"], platform_apis: true, libs: [ - "android.test.runner", - "android.test.base", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", ], static_libs: ["junit"], aaptflags: [ diff --git a/tests/GamePerformance/Android.bp b/tests/GamePerformance/Android.bp index f250a1bbdaca..964f0b914c65 100644 --- a/tests/GamePerformance/Android.bp +++ b/tests/GamePerformance/Android.bp @@ -33,8 +33,8 @@ android_test_helper_app { srcs: ["src/**/*.java"], static_libs: ["androidx.test.rules"], libs: [ - "android.test.base", - "android.test.runner", + "android.test.base.stubs.system", + "android.test.runner.stubs.system", ], platform_apis: true, certificate: "platform", diff --git a/tests/Input/Android.bp b/tests/Input/Android.bp index 65398a22d968..f3e040a1a86a 100644 --- a/tests/Input/Android.bp +++ b/tests/Input/Android.bp @@ -51,8 +51,8 @@ android_test { "ui-trace-collector", ], libs: [ - "android.test.mock", - "android.test.base", + "android.test.mock.stubs.system", + "android.test.base.stubs.system", ], test_suites: ["device-tests"], } diff --git a/tests/InputMethodStressTest/Android.bp b/tests/InputMethodStressTest/Android.bp index 5ed8d8d528c4..2697d32dd622 100644 --- a/tests/InputMethodStressTest/Android.bp +++ b/tests/InputMethodStressTest/Android.bp @@ -20,7 +20,7 @@ package { android_test { name: "InputMethodStressTest", srcs: ["src/**/*.java"], - libs: ["android.test.runner"], + libs: ["android.test.runner.stubs"], static_libs: [ "androidx.test.ext.junit", "androidx.test.uiautomator_uiautomator", diff --git a/tests/InputScreenshotTest/Android.bp b/tests/InputScreenshotTest/Android.bp index 927b101012c5..12ab550c2da2 100644 --- a/tests/InputScreenshotTest/Android.bp +++ b/tests/InputScreenshotTest/Android.bp @@ -67,8 +67,8 @@ android_test { "truth", ], libs: [ - "android.test.mock", - "android.test.base", + "android.test.mock.stubs.system", + "android.test.base.stubs.system", ], test_suites: ["device-tests"], compile_multilib: "both", diff --git a/tests/InputScreenshotTest/robotests/Android.bp b/tests/InputScreenshotTest/robotests/Android.bp index d63fd69ae4d9..b2414a85c095 100644 --- a/tests/InputScreenshotTest/robotests/Android.bp +++ b/tests/InputScreenshotTest/robotests/Android.bp @@ -61,9 +61,9 @@ android_robolectric_test { "uiautomator-helpers", ], libs: [ - "android.test.runner", - "android.test.base", - "android.test.mock", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", + "android.test.mock.stubs.system", "truth", ], upstream: true, diff --git a/tests/Internal/Android.bp b/tests/Internal/Android.bp index ad98e47fa8f0..3e58517579b8 100644 --- a/tests/Internal/Android.bp +++ b/tests/Internal/Android.bp @@ -14,7 +14,7 @@ android_test { }, // Include some source files directly to be able to access package members srcs: ["src/**/*.java"], - libs: ["android.test.runner"], + libs: ["android.test.runner.stubs.system"], static_libs: [ "junit", "androidx.test.rules", diff --git a/tests/LocalizationTest/Android.bp b/tests/LocalizationTest/Android.bp index 909ca5972552..5d9901bb4d0d 100644 --- a/tests/LocalizationTest/Android.bp +++ b/tests/LocalizationTest/Android.bp @@ -25,9 +25,9 @@ android_test { name: "LocalizationTest", srcs: ["java/**/*.kt"], libs: [ - "android.test.runner", - "android.test.base", - "android.test.mock", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", + "android.test.mock.stubs.system", ], static_libs: [ "androidx.test.core", diff --git a/tests/MemoryUsage/Android.bp b/tests/MemoryUsage/Android.bp index e30a0a7cd8b5..deb46636e5b2 100644 --- a/tests/MemoryUsage/Android.bp +++ b/tests/MemoryUsage/Android.bp @@ -14,8 +14,8 @@ android_test { platform_apis: true, certificate: "platform", libs: [ - "android.test.runner", - "android.test.base", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", ], static_libs: ["junit"], } diff --git a/tests/MultiUser/Android.bp b/tests/MultiUser/Android.bp index bde309fe3015..e4d9f02b3d02 100644 --- a/tests/MultiUser/Android.bp +++ b/tests/MultiUser/Android.bp @@ -18,9 +18,9 @@ android_test { "services.core", ], libs: [ - "android.test.runner", - "android.test.base", - "android.test.mock", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", + "android.test.mock.stubs.system", ], certificate: "platform", test_suites: ["device-tests"], diff --git a/tests/NetworkSecurityConfigTest/Android.bp b/tests/NetworkSecurityConfigTest/Android.bp index 473eadbcad73..4c48eaa4622e 100644 --- a/tests/NetworkSecurityConfigTest/Android.bp +++ b/tests/NetworkSecurityConfigTest/Android.bp @@ -11,8 +11,8 @@ android_test { name: "NetworkSecurityConfigTests", certificate: "platform", libs: [ - "android.test.runner", - "android.test.base", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", ], static_libs: ["junit"], // Include all test java files. diff --git a/tests/OneMedia/Android.bp b/tests/OneMedia/Android.bp index a43cd39f0dcb..a1817ccb662a 100644 --- a/tests/OneMedia/Android.bp +++ b/tests/OneMedia/Android.bp @@ -15,7 +15,7 @@ android_app { ], platform_apis: true, certificate: "platform", - libs: ["org.apache.http.legacy"], + libs: ["org.apache.http.legacy.stubs.system"], optional_uses_libs: ["org.apache.http.legacy"], optimize: { enabled: false, diff --git a/tests/PackageWatchdog/Android.bp b/tests/PackageWatchdog/Android.bp index 2c5fdd3228ed..096555eb3056 100644 --- a/tests/PackageWatchdog/Android.bp +++ b/tests/PackageWatchdog/Android.bp @@ -36,7 +36,7 @@ android_test { "services.net", "truth", ], - libs: ["android.test.runner"], + libs: ["android.test.runner.stubs.system"], jni_libs: [ // mockito-target-extended dependencies "libdexmakerjvmtiagent", diff --git a/tests/ProtoInputStreamTests/Android.bp b/tests/ProtoInputStreamTests/Android.bp index 0029080b5a89..40ab257fef37 100644 --- a/tests/ProtoInputStreamTests/Android.bp +++ b/tests/ProtoInputStreamTests/Android.bp @@ -33,7 +33,7 @@ android_test { platform_apis: true, certificate: "platform", test_suites: ["device-tests"], - libs: ["android.test.runner"], + libs: ["android.test.runner.stubs.system"], static_libs: [ "androidx.test.rules", "frameworks-base-testutils", diff --git a/tests/RemoteDisplayProvider/Android.bp b/tests/RemoteDisplayProvider/Android.bp index 55732d14af46..468bdda75713 100644 --- a/tests/RemoteDisplayProvider/Android.bp +++ b/tests/RemoteDisplayProvider/Android.bp @@ -27,6 +27,6 @@ android_test { sdk_version: "system_current", srcs: ["src/**/*.java"], resource_dirs: ["res"], - libs: ["com.android.media.remotedisplay"], + libs: ["com.android.media.remotedisplay.stubs.system"], certificate: "platform", } diff --git a/tests/RollbackTest/lib/src/com/android/tests/rollback/host/WatchdogEventLogger.java b/tests/RollbackTest/lib/src/com/android/tests/rollback/host/WatchdogEventLogger.java index 8c16079dca85..01f8bc148fce 100644 --- a/tests/RollbackTest/lib/src/com/android/tests/rollback/host/WatchdogEventLogger.java +++ b/tests/RollbackTest/lib/src/com/android/tests/rollback/host/WatchdogEventLogger.java @@ -16,33 +16,26 @@ package com.android.tests.rollback.host; +import static com.google.common.truth.Truth.assertThat; + import com.android.tradefed.device.ITestDevice; +import com.android.tradefed.log.LogUtil.CLog; + import com.google.common.truth.FailureMetadata; import com.google.common.truth.Truth; -import static com.google.common.truth.Truth.assertThat; +import java.util.regex.Matcher; +import java.util.regex.Pattern; public class WatchdogEventLogger { - private static final String[] ROLLBACK_EVENT_TYPES = { - "ROLLBACK_INITIATE", "ROLLBACK_BOOT_TRIGGERED", "ROLLBACK_SUCCESS"}; - private static final String[] ROLLBACK_EVENT_ATTRS = { - "logPackage", "rollbackReason", "failedPackageName"}; - private static final String PROP_PREFIX = "persist.sys.rollbacktest."; private ITestDevice mDevice; - private void resetProperties(boolean enabled) throws Exception { + private void updateTestSysProp(boolean enabled) throws Exception { try { mDevice.enableAdbRoot(); assertThat(mDevice.setProperty( - PROP_PREFIX + "enabled", String.valueOf(enabled))).isTrue(); - for (String type : ROLLBACK_EVENT_TYPES) { - String key = PROP_PREFIX + type; - assertThat(mDevice.setProperty(key, "")).isTrue(); - for (String attr : ROLLBACK_EVENT_ATTRS) { - assertThat(mDevice.setProperty(key + "." + attr, "")).isTrue(); - } - } + "persist.sys.rollbacktest.enabled", String.valueOf(enabled))).isTrue(); } finally { mDevice.disableAdbRoot(); } @@ -50,19 +43,17 @@ public class WatchdogEventLogger { public void start(ITestDevice device) throws Exception { mDevice = device; - resetProperties(true); + updateTestSysProp(true); } public void stop() throws Exception { if (mDevice != null) { - resetProperties(false); + updateTestSysProp(false); } } - private boolean matchProperty(String type, String attr, String expectedVal) throws Exception { - String key = PROP_PREFIX + type + "." + attr; - String val = mDevice.getProperty(key); - return expectedVal == null || expectedVal.equals(val); + private boolean verifyEventContainsVal(String watchdogEvent, String expectedVal) { + return expectedVal == null || watchdogEvent.contains(expectedVal); } /** @@ -72,11 +63,33 @@ public class WatchdogEventLogger { * occurred, and return {@code true} if an event exists which matches all criteria. */ public boolean watchdogEventOccurred(String type, String logPackage, - String rollbackReason, String failedPackageName) throws Exception { - return mDevice.getBooleanProperty(PROP_PREFIX + type, false) - && matchProperty(type, "logPackage", logPackage) - && matchProperty(type, "rollbackReason", rollbackReason) - && matchProperty(type, "failedPackageName", failedPackageName); + String rollbackReason, String failedPackageName) { + String watchdogEvent = getEventForRollbackType(type); + return (watchdogEvent != null) + && verifyEventContainsVal(watchdogEvent, logPackage) + && verifyEventContainsVal(watchdogEvent, rollbackReason) + && verifyEventContainsVal(watchdogEvent, failedPackageName); + } + + /** Returns last matched event for rollbackType **/ + private String getEventForRollbackType(String rollbackType) { + String lastMatchedEvent = null; + try { + String rollbackDump = mDevice.executeShellCommand("dumpsys rollback"); + String eventRegex = ".*%s%s(.*)\\n"; + String eventPrefix = "Watchdog event occurred with type: "; + + final Pattern pattern = Pattern.compile( + String.format(eventRegex, eventPrefix, rollbackType)); + final Matcher matcher = pattern.matcher(rollbackDump); + while (matcher.find()) { + lastMatchedEvent = matcher.group(1); + } + CLog.d("Found watchdogEvent: " + lastMatchedEvent + " for type: " + rollbackType); + } catch (Exception e) { + CLog.e("Unable to find event for type: " + rollbackType, e); + } + return lastMatchedEvent; } static class Subject extends com.google.common.truth.Subject { @@ -97,7 +110,7 @@ public class WatchdogEventLogger { } void eventOccurred(String type, String logPackage, String rollbackReason, - String failedPackageName) throws Exception { + String failedPackageName) { check("watchdogEventOccurred(type=%s, logPackage=%s, rollbackReason=%s, " + "failedPackageName=%s)", type, logPackage, rollbackReason, failedPackageName) .that(mActual.watchdogEventOccurred(type, logPackage, rollbackReason, diff --git a/tests/ServiceCrashTest/Android.bp b/tests/ServiceCrashTest/Android.bp index fb98b7631b7e..82f397ffe259 100644 --- a/tests/ServiceCrashTest/Android.bp +++ b/tests/ServiceCrashTest/Android.bp @@ -13,7 +13,7 @@ android_test { srcs: ["src/**/*.java"], platform_apis: true, certificate: "platform", - libs: ["android.test.base"], + libs: ["android.test.base.stubs.system"], static_libs: [ "compatibility-device-util-axt", "androidx.test.rules", diff --git a/tests/SharedLibraryLoadingTest/test-apps/SharedLibraryClientTests/Android.bp b/tests/SharedLibraryLoadingTest/test-apps/SharedLibraryClientTests/Android.bp index 0d204979cb92..c0ac50c962f2 100644 --- a/tests/SharedLibraryLoadingTest/test-apps/SharedLibraryClientTests/Android.bp +++ b/tests/SharedLibraryLoadingTest/test-apps/SharedLibraryClientTests/Android.bp @@ -23,7 +23,7 @@ android_test_helper_app { libs: [ "SharedLibraryLoadingTests_StandardSharedLibrary", "SharedLibraryLoadingTests_SharedLibraryLoadedAfter", - "android.test.base", + "android.test.base.stubs.system", ], static_libs: [ "androidx.test.ext.junit", diff --git a/tests/TelephonyCommonTests/Android.bp b/tests/TelephonyCommonTests/Android.bp index b968e5d81148..b1af6aed27a0 100644 --- a/tests/TelephonyCommonTests/Android.bp +++ b/tests/TelephonyCommonTests/Android.bp @@ -50,9 +50,9 @@ android_test { platform_apis: true, libs: [ - "android.test.runner", - "android.test.mock", - "android.test.base", + "android.test.runner.stubs.system", + "android.test.mock.stubs.system", + "android.test.base.stubs.system", "unsupportedappusage", ], } diff --git a/tests/TrustTests/Android.bp b/tests/TrustTests/Android.bp index 8888b32d2c69..f22feb3f88fa 100644 --- a/tests/TrustTests/Android.bp +++ b/tests/TrustTests/Android.bp @@ -31,8 +31,8 @@ android_test { "truth", ], libs: [ - "android.test.runner", - "android.test.base", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", ], test_suites: [ "device-tests", diff --git a/tests/TtsTests/Android.bp b/tests/TtsTests/Android.bp index b7aa5d4a38aa..e28f69b78141 100644 --- a/tests/TtsTests/Android.bp +++ b/tests/TtsTests/Android.bp @@ -28,8 +28,8 @@ android_test { srcs: ["**/*.java"], static_libs: ["mockito-target"], libs: [ - "android.test.runner", - "android.test.base", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", ], platform_apis: true, } diff --git a/tests/UpdatableSystemFontTest/Android.bp b/tests/UpdatableSystemFontTest/Android.bp index 12d43383a6e2..34eff4f4579b 100644 --- a/tests/UpdatableSystemFontTest/Android.bp +++ b/tests/UpdatableSystemFontTest/Android.bp @@ -25,7 +25,7 @@ package { android_test { name: "UpdatableSystemFontTest", srcs: ["src/**/*.java"], - libs: ["android.test.runner"], + libs: ["android.test.runner.stubs.test"], static_libs: [ "androidx.test.ext.junit", "androidx.test.uiautomator_uiautomator", diff --git a/tests/UsbManagerTests/lib/Android.bp b/tests/UsbManagerTests/lib/Android.bp index 4e5a70fef0ca..506de5c26e3b 100644 --- a/tests/UsbManagerTests/lib/Android.bp +++ b/tests/UsbManagerTests/lib/Android.bp @@ -38,6 +38,6 @@ android_library { "androidx.core_core", ], libs: [ - "android.test.mock", + "android.test.mock.stubs.system", ], } diff --git a/tests/inputmethod/ConcurrentMultiSessionImeTest/Android.bp b/tests/inputmethod/ConcurrentMultiSessionImeTest/Android.bp index a4085e5315a4..44aa4028c916 100644 --- a/tests/inputmethod/ConcurrentMultiSessionImeTest/Android.bp +++ b/tests/inputmethod/ConcurrentMultiSessionImeTest/Android.bp @@ -21,7 +21,7 @@ android_test { name: "ConcurrentMultiSessionImeTest", srcs: ["src/**/*.java"], resource_dirs: ["res"], - libs: ["android.test.runner"], + libs: ["android.test.runner.stubs"], static_libs: [ "androidx.core_core", "androidx.test.ext.junit", diff --git a/tests/permission/Android.bp b/tests/permission/Android.bp index b02f410c733e..1a08f998442d 100644 --- a/tests/permission/Android.bp +++ b/tests/permission/Android.bp @@ -12,8 +12,8 @@ android_test { // Include all test java files. srcs: ["src/**/*.java"], libs: [ - "android.test.runner", - "android.test.base", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", "telephony-common", ], static_libs: [ @@ -25,3 +25,10 @@ android_test { platform_apis: true, test_suites: ["device-tests"], } + +test_module_config { + name: "FrameworkPermissionTests_Presubmit", + base: "FrameworkPermissionTests", + test_suites: ["device-tests"], + include_annotations: ["android.platform.test.annotations.Presubmit"], +} diff --git a/tests/testables/Android.bp b/tests/testables/Android.bp index c0e3d630d1ab..7596ee722d01 100644 --- a/tests/testables/Android.bp +++ b/tests/testables/Android.bp @@ -27,8 +27,8 @@ java_library { name: "testables", srcs: ["src/**/*.java"], libs: [ - "android.test.runner", - "android.test.mock", + "android.test.runner.stubs.system", + "android.test.mock.stubs.system", "androidx.test.rules", "mockito-target-inline-minus-junit4", ], diff --git a/tests/testables/tests/Android.bp b/tests/testables/tests/Android.bp index d6a4754c37aa..1eb36fa5f908 100644 --- a/tests/testables/tests/Android.bp +++ b/tests/testables/tests/Android.bp @@ -45,9 +45,9 @@ android_test { "libmultiplejvmtiagentsinterferenceagent", ], libs: [ - "android.test.runner", - "android.test.base", - "android.test.mock", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", + "android.test.mock.stubs.system", ], certificate: "platform", test_suites: [ diff --git a/tests/utils/testutils/Android.bp b/tests/utils/testutils/Android.bp index deff42a27f47..35fd5b1e6ed0 100644 --- a/tests/utils/testutils/Android.bp +++ b/tests/utils/testutils/Android.bp @@ -35,9 +35,9 @@ java_library { ], libs: [ - "android.test.runner", - "android.test.base", - "android.test.mock", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", + "android.test.mock.stubs.system", "mockito-target-extended-minus-junit4", ], } diff --git a/tests/utils/testutils/tests/Android.bp b/tests/utils/testutils/tests/Android.bp index 8104280cdd5e..3bb02e42ca3b 100644 --- a/tests/utils/testutils/tests/Android.bp +++ b/tests/utils/testutils/tests/Android.bp @@ -35,9 +35,9 @@ android_test { ], libs: [ - "android.test.runner", - "android.test.base", - "android.test.mock", + "android.test.runner.stubs.system", + "android.test.base.stubs.system", + "android.test.mock.stubs.system", ], certificate: "platform", diff --git a/tests/vcn/Android.bp b/tests/vcn/Android.bp index ee2e7cfcd480..b16ba15a6867 100644 --- a/tests/vcn/Android.bp +++ b/tests/vcn/Android.bp @@ -34,8 +34,8 @@ android_test { "flag-junit", ], libs: [ - "android.test.runner", - "android.test.base", - "android.test.mock", + "android.test.runner.stubs", + "android.test.base.stubs", + "android.test.mock.stubs", ], } diff --git a/wifi/tests/Android.bp b/wifi/tests/Android.bp index 1d3e4bd531b4..74a6be9baa56 100644 --- a/wifi/tests/Android.bp +++ b/wifi/tests/Android.bp @@ -44,8 +44,8 @@ android_test { ], libs: [ - "android.test.runner", - "android.test.base", + "android.test.runner.stubs", + "android.test.base.stubs", ], // Required by Extended Mockito |