Merge "Fix pinch gesture dragging TouchpadDebugView" into main
diff --git a/core/api/current.txt b/core/api/current.txt
index f817241..8eb8811 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -5333,6 +5333,7 @@
method @NonNull public String getProcessName();
method public int getRealUid();
method public int getReason();
+ method @FlaggedApi("android.app.app_start_info_component") public int getStartComponent();
method public int getStartType();
method public int getStartupState();
method @NonNull public java.util.Map<java.lang.Integer,java.lang.Long> getStartupTimestamps();
@@ -5347,6 +5348,11 @@
field public static final int STARTUP_STATE_ERROR = 1; // 0x1
field public static final int STARTUP_STATE_FIRST_FRAME_DRAWN = 2; // 0x2
field public static final int STARTUP_STATE_STARTED = 0; // 0x0
+ field @FlaggedApi("android.app.app_start_info_component") public static final int START_COMPONENT_ACTIVITY = 1; // 0x1
+ field @FlaggedApi("android.app.app_start_info_component") public static final int START_COMPONENT_BROADCAST = 2; // 0x2
+ field @FlaggedApi("android.app.app_start_info_component") public static final int START_COMPONENT_CONTENT_PROVIDER = 3; // 0x3
+ field @FlaggedApi("android.app.app_start_info_component") public static final int START_COMPONENT_OTHER = 5; // 0x5
+ field @FlaggedApi("android.app.app_start_info_component") public static final int START_COMPONENT_SERVICE = 4; // 0x4
field public static final int START_REASON_ALARM = 0; // 0x0
field public static final int START_REASON_BACKUP = 1; // 0x1
field public static final int START_REASON_BOOT_COMPLETE = 2; // 0x2
@@ -7009,6 +7015,7 @@
method public boolean areNotificationsEnabled();
method public boolean areNotificationsPaused();
method public boolean canNotifyAsPackage(@NonNull String);
+ method @FlaggedApi("android.app.api_rich_ongoing") public boolean canPostPromotedNotifications();
method public boolean canUseFullScreenIntent();
method public void cancel(int);
method public void cancel(@Nullable String, int);
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index cc0354c..569776e 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -13020,6 +13020,8 @@
method public void onSuggestedReplySent(@NonNull String, @NonNull CharSequence, int);
method public final void unsnoozeNotification(@NonNull String);
field public static final String ACTION_NOTIFICATION_ASSISTANT_DETAIL_SETTINGS = "android.service.notification.action.NOTIFICATION_ASSISTANT_DETAIL_SETTINGS";
+ field @FlaggedApi("android.service.notification.notification_classification") public static final String ACTION_NOTIFICATION_ASSISTANT_FEEDBACK_SETTINGS = "android.service.notification.action.NOTIFICATION_ASSISTANT_FEEDBACK_SETTINGS";
+ field @FlaggedApi("android.service.notification.notification_classification") public static final String EXTRA_NOTIFICATION_KEY = "android.service.notification.extra.NOTIFICATION_KEY";
field public static final String FEEDBACK_RATING = "feedback.rating";
field public static final String SERVICE_INTERFACE = "android.service.notification.NotificationAssistantService";
field public static final int SOURCE_FROM_APP = 0; // 0x0
diff --git a/core/api/test-current.txt b/core/api/test-current.txt
index 72a68f8..659222d 100644
--- a/core/api/test-current.txt
+++ b/core/api/test-current.txt
@@ -398,6 +398,7 @@
method public android.content.ComponentName getEffectsSuppressor();
method public boolean isNotificationPolicyAccessGrantedForPackage(@NonNull String);
method @FlaggedApi("android.app.modes_api") public boolean removeAutomaticZenRule(@NonNull String, boolean);
+ method @FlaggedApi("android.app.api_rich_ongoing") public void setCanPostPromotedNotifications(@NonNull String, int, boolean);
method @RequiresPermission(android.Manifest.permission.MANAGE_NOTIFICATION_LISTENERS) public void setNotificationListenerAccessGranted(@NonNull android.content.ComponentName, boolean, boolean);
method @RequiresPermission(android.Manifest.permission.MANAGE_TOAST_RATE_LIMITING) public void setToastRateLimitingEnabled(boolean);
method @FlaggedApi("android.app.modes_api") public boolean updateAutomaticZenRule(@NonNull String, @NonNull android.app.AutomaticZenRule, boolean);
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 3bc3a93..5b556cc 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -230,6 +230,7 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.app.IVoiceInteractor;
import com.android.internal.content.ReferrerIntent;
+import com.android.internal.os.ApplicationSharedMemory;
import com.android.internal.os.BinderCallsStats;
import com.android.internal.os.BinderInternal;
import com.android.internal.os.DebugStore;
@@ -1301,6 +1302,7 @@
long[] disabledCompatChanges,
long[] loggableCompatChanges,
SharedMemory serializedSystemFontMap,
+ FileDescriptor applicationSharedMemoryFd,
long startRequestedElapsedTime,
long startRequestedUptime) {
if (services != null) {
@@ -1329,6 +1331,16 @@
ServiceManager.initServiceCache(services);
}
+ // This must be initialized as early as possible to ensure availability for any
+ // downstream callers.
+ if (com.android.internal.os.Flags.applicationSharedMemoryEnabled()) {
+ ApplicationSharedMemory instance =
+ ApplicationSharedMemory.fromFileDescriptor(
+ applicationSharedMemoryFd, /* mutable= */ false);
+ instance.closeFileDescriptor();
+ ApplicationSharedMemory.setInstance(instance);
+ }
+
setCoreSettings(coreSettings);
AppBindData data = new AppBindData();
diff --git a/core/java/android/app/ApplicationStartInfo.java b/core/java/android/app/ApplicationStartInfo.java
index 4fb0601..edcdb6c 100644
--- a/core/java/android/app/ApplicationStartInfo.java
+++ b/core/java/android/app/ApplicationStartInfo.java
@@ -102,10 +102,10 @@
/** Process started due to boot complete. */
public static final int START_REASON_BOOT_COMPLETE = 2;
- /** Process started due to broadcast received. */
+ /** Process started due to broadcast received for any reason not explicitly listed. */
public static final int START_REASON_BROADCAST = 3;
- /** Process started due to access of ContentProvider */
+ /** Process started due to access of ContentProvider for any reason not explicitly listed. */
public static final int START_REASON_CONTENT_PROVIDER = 4;
/** * Process started to run scheduled job. */
@@ -123,7 +123,7 @@
/** Process started due to push message. */
public static final int START_REASON_PUSH = 9;
- /** Process service started. */
+ /** Process started due to Service started for any reason not explicitly listed.. */
public static final int START_REASON_SERVICE = 10;
/** Process started due to Activity started for any reason not explicitly listed. */
@@ -209,6 +209,26 @@
/** Clock monotonic timestamp of surfaceflinger composition complete. */
public static final int START_TIMESTAMP_SURFACEFLINGER_COMPOSITION_COMPLETE = 7;
+ /** Process was started for an activity component. */
+ @FlaggedApi(Flags.FLAG_APP_START_INFO_COMPONENT)
+ public static final int START_COMPONENT_ACTIVITY = 1;
+
+ /** Process was started for a broadcast component. */
+ @FlaggedApi(Flags.FLAG_APP_START_INFO_COMPONENT)
+ public static final int START_COMPONENT_BROADCAST = 2;
+
+ /** Process was started for a content provider component. */
+ @FlaggedApi(Flags.FLAG_APP_START_INFO_COMPONENT)
+ public static final int START_COMPONENT_CONTENT_PROVIDER = 3;
+
+ /** Process was started for a service component. */
+ @FlaggedApi(Flags.FLAG_APP_START_INFO_COMPONENT)
+ public static final int START_COMPONENT_SERVICE = 4;
+
+ /** Process was started not for one of the four standard components. */
+ @FlaggedApi(Flags.FLAG_APP_START_INFO_COMPONENT)
+ public static final int START_COMPONENT_OTHER = 5;
+
/**
* @see #getMonoticCreationTimeMs
*/
@@ -280,6 +300,11 @@
private boolean mWasForceStopped;
/**
+ * @see #getStartComponent()
+ */
+ private @StartComponent int mStartComponent;
+
+ /**
* @hide *
*/
@IntDef(
@@ -344,6 +369,21 @@
public @interface LaunchMode {}
/**
+ * @hide *
+ */
+ @IntDef(
+ prefix = {"START_COMPONENT_"},
+ value = {
+ START_COMPONENT_ACTIVITY,
+ START_COMPONENT_BROADCAST,
+ START_COMPONENT_CONTENT_PROVIDER,
+ START_COMPONENT_SERVICE,
+ START_COMPONENT_OTHER,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface StartComponent {}
+
+ /**
* @see #getStartupState
* @hide
*/
@@ -480,6 +520,14 @@
}
/**
+ * @see #getStartComponent()
+ * @hide
+ */
+ public void setStartComponent(@StartComponent int startComponent) {
+ mStartComponent = startComponent;
+ }
+
+ /**
* Current state of startup.
*
* Can be used to determine whether the object will have additional fields added as it may be
@@ -567,6 +615,11 @@
/**
* The reason code of what triggered the process's start.
*
+ * Start reason provides granular reasoning on why the app is being started. Start reason should
+ * not be used for distinguishing between the component the app is being started for as some
+ * reasons may overlap with multiple components, see {@link #getStartComponent} for this
+ * functionality instead.
+ *
* <p class="note"> Note: field will be set for any {@link #getStartupState} value.</p>
*/
public @StartReason int getReason() {
@@ -654,6 +707,22 @@
return mWasForceStopped;
}
+ /**
+ * The component type that was being started which triggered the start.
+ *
+ * Start component should be used to accurately distinguish between the 4 component types:
+ * activity, service, broadcast, and content provider. This can be useful for optimizing
+ * startup flow by enabling the caller to only load the necessary dependencies for a specific
+ * component type. For more granular information on why the app is being started, see
+ * {@link #getReason}.
+ *
+ * <p class="note"> Note: field will be set for any {@link #getStartupState} value.</p>
+ */
+ @FlaggedApi(Flags.FLAG_APP_START_INFO_COMPONENT)
+ public @StartComponent int getStartComponent() {
+ return mStartComponent;
+ }
+
@Override
public int describeContents() {
return 0;
@@ -681,6 +750,7 @@
dest.writeInt(mLaunchMode);
dest.writeBoolean(mWasForceStopped);
dest.writeLong(mMonoticCreationTimeMs);
+ dest.writeInt(mStartComponent);
}
/** @hide */
@@ -704,6 +774,7 @@
mLaunchMode = other.mLaunchMode;
mWasForceStopped = other.mWasForceStopped;
mMonoticCreationTimeMs = other.mMonoticCreationTimeMs;
+ mStartComponent = other.mStartComponent;
}
private ApplicationStartInfo(@NonNull Parcel in) {
@@ -727,6 +798,7 @@
mLaunchMode = in.readInt();
mWasForceStopped = in.readBoolean();
mMonoticCreationTimeMs = in.readLong();
+ mStartComponent = in.readInt();
}
private static String intern(@Nullable String source) {
@@ -806,6 +878,7 @@
proto.write(ApplicationStartInfoProto.LAUNCH_MODE, mLaunchMode);
proto.write(ApplicationStartInfoProto.WAS_FORCE_STOPPED, mWasForceStopped);
proto.write(ApplicationStartInfoProto.MONOTONIC_CREATION_TIME_MS, mMonoticCreationTimeMs);
+ proto.write(ApplicationStartInfoProto.START_COMPONENT, mStartComponent);
proto.end(token);
}
@@ -893,6 +966,9 @@
mMonoticCreationTimeMs = proto.readLong(
ApplicationStartInfoProto.MONOTONIC_CREATION_TIME_MS);
break;
+ case (int) ApplicationStartInfoProto.START_COMPONENT:
+ mStartComponent = proto.readInt(ApplicationStartInfoProto.START_COMPONENT);
+ break;
}
}
proto.end(token);
@@ -919,8 +995,11 @@
.append(" reason=").append(reasonToString(mReason))
.append(" startType=").append(startTypeToString(mStartType))
.append(" launchMode=").append(mLaunchMode)
- .append(" wasForceStopped=").append(mWasForceStopped)
- .append('\n');
+ .append(" wasForceStopped=").append(mWasForceStopped);
+ if (Flags.appStartInfoComponent()) {
+ sb.append(" startComponent=").append(startComponentToString(mStartComponent));
+ }
+ sb.append('\n');
if (mStartIntent != null) {
sb.append(" intent=").append(mStartIntent.toString())
.append('\n');
@@ -964,6 +1043,18 @@
};
}
+ @FlaggedApi(Flags.FLAG_APP_START_INFO_COMPONENT)
+ private static String startComponentToString(@StartComponent int startComponent) {
+ return switch (startComponent) {
+ case START_COMPONENT_ACTIVITY -> "ACTIVITY";
+ case START_COMPONENT_BROADCAST -> "BROADCAST";
+ case START_COMPONENT_CONTENT_PROVIDER -> "CONTENT PROVIDER";
+ case START_COMPONENT_SERVICE -> "SERVICE";
+ case START_COMPONENT_OTHER -> "OTHER";
+ default -> "";
+ };
+ }
+
/** @hide */
@Override
public boolean equals(@Nullable Object other) {
@@ -972,18 +1063,19 @@
}
final ApplicationStartInfo o = (ApplicationStartInfo) other;
return mPid == o.mPid && mRealUid == o.mRealUid && mPackageUid == o.mPackageUid
- && mDefiningUid == o.mDefiningUid && mReason == o.mReason
- && mStartupState == o.mStartupState && mStartType == o.mStartType
- && mLaunchMode == o.mLaunchMode && TextUtils.equals(mProcessName, o.mProcessName)
- && timestampsEquals(o) && mWasForceStopped == o.mWasForceStopped
- && mMonoticCreationTimeMs == o.mMonoticCreationTimeMs;
+ && mDefiningUid == o.mDefiningUid && mReason == o.mReason
+ && mStartupState == o.mStartupState && mStartType == o.mStartType
+ && mLaunchMode == o.mLaunchMode && TextUtils.equals(mProcessName, o.mProcessName)
+ && timestampsEquals(o) && mWasForceStopped == o.mWasForceStopped
+ && mMonoticCreationTimeMs == o.mMonoticCreationTimeMs
+ && mStartComponent == o.mStartComponent;
}
@Override
public int hashCode() {
return Objects.hash(mPid, mRealUid, mPackageUid, mDefiningUid, mReason, mStartupState,
mStartType, mLaunchMode, mProcessName, mStartupTimestampsNs,
- mMonoticCreationTimeMs);
+ mMonoticCreationTimeMs, mStartComponent);
}
private boolean timestampsEquals(@NonNull ApplicationStartInfo other) {
diff --git a/core/java/android/app/GameManager.java b/core/java/android/app/GameManager.java
index c6fa064..12deaec 100644
--- a/core/java/android/app/GameManager.java
+++ b/core/java/android/app/GameManager.java
@@ -29,16 +29,24 @@
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.Build;
-import android.os.Handler;
import android.os.RemoteException;
-import android.os.ServiceManager;
-import android.os.ServiceManager.ServiceNotFoundException;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
* The GameManager allows system apps to modify and query the game mode of apps.
+ *
+ * <p><b>Note:</b> After {@link android.os.Build.VERSION_CODES#VANILLA_ICE_CREAM}, some devices
+ * that do not support the GameManager features <i>may</i> not publish a GameManager instance.
+ * These device types include:
+ * <ul>
+ * <li> Wear devices ({@link PackageManager#FEATURE_WATCH})
+ * </ul>
+ *
+ * <p>Therefore, you should always do a {@code null} check on the return value of
+ * {@link Context#getSystemService(Class)} and {@link Context#getSystemService(String)} when trying
+ * to obtain an instance of GameManager on the aforementioned device types.
*/
@SystemService(Context.GAME_SERVICE)
public final class GameManager {
@@ -46,7 +54,7 @@
private static final String TAG = "GameManager";
private final @Nullable Context mContext;
- private final IGameManagerService mService;
+ private final @Nullable IGameManagerService mService;
/** @hide */
@IntDef(flag = false, prefix = {"GAME_MODE_"}, value = {
@@ -92,10 +100,9 @@
*/
public static final int GAME_MODE_CUSTOM = 4;
- GameManager(Context context, Handler handler) throws ServiceNotFoundException {
+ GameManager(Context context, @Nullable IGameManagerService service) {
mContext = context;
- mService = IGameManagerService.Stub.asInterface(
- ServiceManager.getServiceOrThrow(Context.GAME_SERVICE));
+ mService = service;
}
/**
@@ -145,6 +152,7 @@
// we don't want a binder call each time to check on behalf of an app using CompatChange.
@SuppressWarnings("AndroidFrameworkCompatChange")
private @GameMode int getGameModeImpl(@NonNull String packageName, int targetSdkVersion) {
+ if (mService == null) return GAME_MODE_UNSUPPORTED;
final int gameMode;
try {
gameMode = mService.getGameMode(packageName,
@@ -176,6 +184,7 @@
@UserHandleAware
@RequiresPermission(Manifest.permission.MANAGE_GAME_MODE)
public @Nullable GameModeInfo getGameModeInfo(@NonNull String packageName) {
+ if (mService == null) return null;
try {
return mService.getGameModeInfo(packageName, mContext.getUserId());
} catch (RemoteException e) {
@@ -196,6 +205,7 @@
@UserHandleAware
@RequiresPermission(Manifest.permission.MANAGE_GAME_MODE)
public void setGameMode(@NonNull String packageName, @GameMode int gameMode) {
+ if (mService == null) return;
try {
mService.setGameMode(packageName, gameMode, mContext.getUserId());
} catch (RemoteException e) {
@@ -212,6 +222,7 @@
*/
@RequiresPermission(Manifest.permission.MANAGE_GAME_MODE)
public @GameMode int[] getAvailableGameModes(@NonNull String packageName) {
+ if (mService == null) return new int[0];
try {
return mService.getAvailableGameModes(packageName, mContext.getUserId());
} catch (RemoteException e) {
@@ -232,6 +243,7 @@
@TestApi
@RequiresPermission(Manifest.permission.MANAGE_GAME_MODE)
public boolean isAngleEnabled(@NonNull String packageName) {
+ if (mService == null) return false;
try {
return mService.isAngleEnabled(packageName, mContext.getUserId());
} catch (RemoteException e) {
@@ -246,6 +258,7 @@
*/
@RequiresPermission(Manifest.permission.MANAGE_GAME_MODE)
public void notifyGraphicsEnvironmentSetup() {
+ if (mService == null) return;
try {
mService.notifyGraphicsEnvironmentSetup(
mContext.getPackageName(), mContext.getUserId());
@@ -259,6 +272,7 @@
* @param gameState An object set to the current state.
*/
public void setGameState(@NonNull GameState gameState) {
+ if (mService == null) return;
try {
mService.setGameState(mContext.getPackageName(), gameState, mContext.getUserId());
} catch (RemoteException e) {
@@ -275,6 +289,7 @@
*/
@TestApi
public void setGameServiceProvider(@Nullable String packageName) {
+ if (mService == null) return;
try {
mService.setGameServiceProvider(packageName);
} catch (RemoteException e) {
@@ -296,6 +311,7 @@
@RequiresPermission(Manifest.permission.MANAGE_GAME_MODE)
public void updateCustomGameModeConfiguration(@NonNull String packageName,
@NonNull GameModeConfiguration gameModeConfig) {
+ if (mService == null) return;
try {
mService.updateCustomGameModeConfiguration(packageName, gameModeConfig,
mContext.getUserId());
diff --git a/core/java/android/app/IApplicationThread.aidl b/core/java/android/app/IApplicationThread.aidl
index 9f3829e..06d01ec 100644
--- a/core/java/android/app/IApplicationThread.aidl
+++ b/core/java/android/app/IApplicationThread.aidl
@@ -92,6 +92,7 @@
in Bundle coreSettings, in String buildSerial, in AutofillOptions autofillOptions,
in ContentCaptureOptions contentCaptureOptions, in long[] disabledCompatChanges,
in long[] loggableCompatChanges, in SharedMemory serializedSystemFontMap,
+ in FileDescriptor applicationSharedMemoryFd,
long startRequestedElapsedTime, long startRequestedUptime);
void runIsolatedEntryPoint(in String entryPoint, in String[] entryPointArgs);
void scheduleExit();
diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl
index b9fe356..237780f 100644
--- a/core/java/android/app/INotificationManager.aidl
+++ b/core/java/android/app/INotificationManager.aidl
@@ -259,5 +259,6 @@
void unregisterCallNotificationEventListener(String packageName, in UserHandle userHandle, in ICallNotificationEventCallback listener);
void setCanBePromoted(String pkg, int uid, boolean promote);
- boolean canBePromoted(String pkg, int uid);
+ boolean appCanBePromoted(String pkg, int uid);
+ boolean canBePromoted(String pkg);
}
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 4d73c35..392a1f1 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -8839,6 +8839,16 @@
}
/**
+ * @hide
+ */
+ public boolean displayCustomViewInline() {
+ // This is a lie; True is returned for conversations to make sure that the custom
+ // view is not used instead of the template, but it will not actually be included.
+ return Flags.notificationNoCustomViewConversations()
+ && mConversationType != CONVERSATION_TYPE_LEGACY;
+ }
+
+ /**
* @return the text that should be displayed in the statusBar when heads upped.
* If {@code null} is returned, the default implementation will be used.
*
diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java
index 83f9ff7..06f21b8 100644
--- a/core/java/android/app/NotificationManager.java
+++ b/core/java/android/app/NotificationManager.java
@@ -953,6 +953,36 @@
}
/**
+ * Returns whether the calling app's properly formatted notifications can appear in a promoted
+ * format, which may result in higher ranking, appearances on additional surfaces, and richer
+ * presentation.
+ */
+ @FlaggedApi(android.app.Flags.FLAG_API_RICH_ONGOING)
+ public boolean canPostPromotedNotifications() {
+ INotificationManager service = getService();
+ try {
+ return service.canBePromoted(mContext.getPackageName());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Setter for {@link #canPostPromotedNotifications()}. Only callable by the OS.
+ * @hide
+ */
+ @TestApi
+ @FlaggedApi(android.app.Flags.FLAG_API_RICH_ONGOING)
+ public void setCanPostPromotedNotifications(@NonNull String pkg, int uid, boolean allowed) {
+ INotificationManager service = getService();
+ try {
+ service.setCanBePromoted(pkg, uid, allowed);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Creates a group container for {@link NotificationChannel} objects.
*
* This can be used to rename an existing group.
diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java
index 03bec71..c13a58f 100644
--- a/core/java/android/app/SystemServiceRegistry.java
+++ b/core/java/android/app/SystemServiceRegistry.java
@@ -17,6 +17,7 @@
package android.app;
import static android.app.appfunctions.flags.Flags.enableAppFunctionManager;
+import static android.server.Flags.removeGameManagerServiceFromWear;
import android.accounts.AccountManager;
import android.accounts.IAccountManager;
@@ -74,6 +75,7 @@
import android.companion.virtual.VirtualDeviceManager;
import android.compat.Compatibility;
import android.compat.annotation.ChangeId;
+import android.compat.annotation.EnabledAfter;
import android.compat.annotation.EnabledSince;
import android.content.ClipboardManager;
import android.content.ContentCaptureOptions;
@@ -309,6 +311,16 @@
static final long ENABLE_CHECKING_TELEPHONY_FEATURES_FOR_VCN = 330902016;
/**
+ * After {@link Build.VERSION_CODES.VANILLA_ICE_CREAM}, Wear devices will be allowed to publish
+ * no {@link GameManager} instance. This is because the respective system service is no longer
+ * started for Wear devices given that the applications of the service do not currently apply to
+ * Wear.
+ */
+ @ChangeId
+ @EnabledAfter(targetSdkVersion = Build.VERSION_CODES.VANILLA_ICE_CREAM)
+ static final long NULL_GAME_MANAGER_IN_WEAR = 340929737;
+
+ /**
* The corresponding vendor API for Android V
*
* <p>Starting with Android V, the vendor API format has switched to YYYYMM.
@@ -1624,8 +1636,24 @@
@Override
public GameManager createService(ContextImpl ctx)
throws ServiceNotFoundException {
- return new GameManager(ctx.getOuterContext(),
- ctx.mMainThread.getHandler());
+ final PackageManager pm = ctx.getPackageManager();
+ final boolean isWatch = pm.hasSystemFeature(PackageManager.FEATURE_WATCH);
+ final IBinder binder =
+ // Allow a potentially absent GameManagerService only for
+ // Wear devices. For non-Wear devices, throw a
+ // ServiceNotFoundException when the service is missing.
+ (removeGameManagerServiceFromWear() && isWatch)
+ ? ServiceManager.getService(Context.GAME_SERVICE)
+ : ServiceManager.getServiceOrThrow(Context.GAME_SERVICE);
+
+ if (binder == null
+ && Compatibility.isChangeEnabled(NULL_GAME_MANAGER_IN_WEAR)) {
+ return null;
+ }
+
+ return new GameManager(
+ ctx.getOuterContext(),
+ IGameManagerService.Stub.asInterface(binder));
}
});
diff --git a/core/java/android/app/activity_manager.aconfig b/core/java/android/app/activity_manager.aconfig
index 56488e7..1f31ab5 100644
--- a/core/java/android/app/activity_manager.aconfig
+++ b/core/java/android/app/activity_manager.aconfig
@@ -158,3 +158,10 @@
purpose: PURPOSE_BUGFIX
}
}
+
+flag {
+ namespace: "system_performance"
+ name: "app_start_info_component"
+ description: "Control ApplicationStartInfo component field and API"
+ bug: "362537357"
+}
diff --git a/core/java/android/app/notification.aconfig b/core/java/android/app/notification.aconfig
index 9b06adf..108b5f4 100644
--- a/core/java/android/app/notification.aconfig
+++ b/core/java/android/app/notification.aconfig
@@ -105,6 +105,13 @@
}
flag {
+ name: "notification_no_custom_view_conversations"
+ namespace: "systemui"
+ description: "Ensures that conversations are not allowed to use Custom Views."
+ bug: "368817201"
+}
+
+flag {
name: "keyguard_private_notifications"
namespace: "systemui"
description: "Fixes the behavior of KeyguardManager#setPrivateNotificationsAllowed()"
@@ -244,4 +251,4 @@
namespace: "systemui"
description: "Guards new android.app.richongoingnotification promotion and new uis"
bug: "337261753"
-}
\ No newline at end of file
+}
diff --git a/core/java/android/app/supervision/ISupervisionManager.aidl b/core/java/android/app/supervision/ISupervisionManager.aidl
index 8d25cad..4598421 100644
--- a/core/java/android/app/supervision/ISupervisionManager.aidl
+++ b/core/java/android/app/supervision/ISupervisionManager.aidl
@@ -21,5 +21,5 @@
* {@hide}
*/
interface ISupervisionManager {
- boolean isSupervisionEnabled();
+ boolean isSupervisionEnabledForUser(int userId);
}
diff --git a/core/java/android/app/supervision/OWNERS b/core/java/android/app/supervision/OWNERS
index afc5495..4785a72 100644
--- a/core/java/android/app/supervision/OWNERS
+++ b/core/java/android/app/supervision/OWNERS
@@ -1,2 +1,2 @@
jparks@google.com
-romkal@google.com
+vtrmc@google.com
diff --git a/core/java/android/app/supervision/SupervisionManager.java b/core/java/android/app/supervision/SupervisionManager.java
index 8611a92..aee1cd9 100644
--- a/core/java/android/app/supervision/SupervisionManager.java
+++ b/core/java/android/app/supervision/SupervisionManager.java
@@ -17,6 +17,7 @@
package android.app.supervision;
import android.annotation.SystemService;
+import android.annotation.UserHandleAware;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.Context;
import android.os.RemoteException;
@@ -45,13 +46,12 @@
*
* @hide
*/
+ @UserHandleAware
public boolean isSupervisionEnabled() {
try {
- return mService.isSupervisionEnabled();
+ return mService.isSupervisionEnabledForUser(mContext.getUserId());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
-
-
}
diff --git a/core/java/android/appwidget/flags.aconfig b/core/java/android/appwidget/flags.aconfig
index 7117f25..ac9263c 100644
--- a/core/java/android/appwidget/flags.aconfig
+++ b/core/java/android/appwidget/flags.aconfig
@@ -63,4 +63,14 @@
namespace: "app_widgets"
description: "Remote document support features in Q2 2025 release"
bug: "339721781"
-}
\ No newline at end of file
+}
+
+flag {
+ name: "security_policy_interact_across_users"
+ namespace: "app_widgets"
+ description: "Allow packages with interact_across_users permission to manage app widgets on behalf of other users."
+ bug: "357621815"
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+}
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index 031380d..044178c 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -20,6 +20,7 @@
import static android.content.ContentProvider.maybeAddUserId;
import static android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE;
import static android.security.Flags.FLAG_FRP_ENFORCEMENT;
+import static android.security.Flags.preventIntentRedirect;
import android.Manifest;
import android.accessibilityservice.AccessibilityService;
@@ -7687,9 +7688,17 @@
/** @hide */
public static final int LOCAL_FLAG_FROM_SYSTEM = 1 << 5;
+ /**
+ * This flag indicates the creator token of this intent has been verified.
+ *
+ * @hide
+ */
+ public static final int LOCAL_FLAG_CREATOR_TOKEN_VERIFIED = 1 << 6;
+
/** @hide */
@IntDef(flag = true, prefix = { "EXTENDED_FLAG_" }, value = {
EXTENDED_FLAG_FILTER_MISMATCH,
+ EXTENDED_FLAG_MISSING_CREATOR_OR_INVALID_TOKEN,
})
@Retention(RetentionPolicy.SOURCE)
public @interface ExtendedFlags {}
@@ -7703,6 +7712,13 @@
@TestApi
public static final int EXTENDED_FLAG_FILTER_MISMATCH = 1 << 0;
+ /**
+ * This flag indicates the creator token of this intent is either missing or invalid.
+ *
+ * @hide
+ */
+ public static final int EXTENDED_FLAG_MISSING_CREATOR_OR_INVALID_TOKEN = 1 << 1;
+
// ---------------------------------------------------------------------
// ---------------------------------------------------------------------
// toUri() and parseUri() options.
@@ -7870,6 +7886,7 @@
this.mPackage = o.mPackage;
this.mComponent = o.mComponent;
this.mOriginalIntent = o.mOriginalIntent;
+ this.mCreatorTokenInfo = o.mCreatorTokenInfo;
if (o.mCategories != null) {
this.mCategories = new ArraySet<>(o.mCategories);
@@ -12176,6 +12193,60 @@
return (mExtras != null) ? mExtras.describeContents() : 0;
}
+ private static class CreatorTokenInfo {
+ // Stores a creator token for an intent embedded as an extra intent in a top level intent,
+ private IBinder mCreatorToken;
+ // Stores all extra keys whose values are intents for a top level intent.
+ private ArraySet<String> mExtraIntentKeys;
+ }
+
+ private @Nullable CreatorTokenInfo mCreatorTokenInfo;
+
+ /** @hide */
+ public void removeCreatorTokenInfo() {
+ mCreatorTokenInfo = null;
+ }
+
+ /** @hide */
+ public @Nullable IBinder getCreatorToken() {
+ return mCreatorTokenInfo == null ? null : mCreatorTokenInfo.mCreatorToken;
+ }
+
+ /** @hide */
+ public Set<String> getExtraIntentKeys() {
+ return mCreatorTokenInfo == null ? null : mCreatorTokenInfo.mExtraIntentKeys;
+ }
+
+ /** @hide */
+ public void setCreatorToken(@NonNull IBinder creatorToken) {
+ if (mCreatorTokenInfo == null) {
+ mCreatorTokenInfo = new CreatorTokenInfo();
+ }
+ mCreatorTokenInfo.mCreatorToken = creatorToken;
+ }
+
+ /**
+ * Collects keys in the extra bundle whose value are intents.
+ * @hide
+ */
+ public void collectExtraIntentKeys() {
+ if (!preventIntentRedirect()) return;
+
+ if (mExtras != null && !mExtras.isParcelled() && !mExtras.isEmpty()) {
+ for (String key : mExtras.keySet()) {
+ if (mExtras.get(key) instanceof Intent) {
+ if (mCreatorTokenInfo == null) {
+ mCreatorTokenInfo = new CreatorTokenInfo();
+ }
+ if (mCreatorTokenInfo.mExtraIntentKeys == null) {
+ mCreatorTokenInfo.mExtraIntentKeys = new ArraySet<>();
+ }
+ mCreatorTokenInfo.mExtraIntentKeys.add(key);
+ }
+ }
+ }
+ }
+
public void writeToParcel(Parcel out, int flags) {
out.writeString8(mAction);
Uri.writeToParcel(out, mData);
@@ -12225,6 +12296,16 @@
} else {
out.writeInt(0);
}
+
+ if (preventIntentRedirect()) {
+ if (mCreatorTokenInfo == null) {
+ out.writeInt(0);
+ } else {
+ out.writeInt(1);
+ out.writeStrongBinder(mCreatorTokenInfo.mCreatorToken);
+ out.writeArraySet(mCreatorTokenInfo.mExtraIntentKeys);
+ }
+ }
}
public static final @android.annotation.NonNull Parcelable.Creator<Intent> CREATOR
@@ -12282,6 +12363,14 @@
if (in.readInt() != 0) {
mOriginalIntent = new Intent(in);
}
+
+ if (preventIntentRedirect()) {
+ if (in.readInt() != 0) {
+ mCreatorTokenInfo = new CreatorTokenInfo();
+ mCreatorTokenInfo.mCreatorToken = in.readStrongBinder();
+ mCreatorTokenInfo.mExtraIntentKeys = (ArraySet<String>) in.readArraySet(null);
+ }
+ }
}
/**
diff --git a/core/java/android/content/pm/SharedLibraryInfo.java b/core/java/android/content/pm/SharedLibraryInfo.java
index 5acebf5..d77b2f5 100644
--- a/core/java/android/content/pm/SharedLibraryInfo.java
+++ b/core/java/android/content/pm/SharedLibraryInfo.java
@@ -94,7 +94,7 @@
private final String mPath;
private final String mPackageName;
private final String mName;
- private final List<String> mCodePaths;
+ private List<String> mCodePaths;
private final long mVersion;
private final @Type int mType;
@@ -282,6 +282,15 @@
}
/**
+ * Sets new all code paths for that library.
+ *
+ * @hide
+ */
+ public void setAllCodePaths(List<String> paths) {
+ mCodePaths = paths;
+ }
+
+ /**
* Add a library dependency to that library. Note that this
* should be called under the package manager lock.
*
diff --git a/core/java/android/database/sqlite/SQLiteCompatibilityWalFlags.java b/core/java/android/database/sqlite/SQLiteCompatibilityWalFlags.java
index a269072..bb4a0e0 100644
--- a/core/java/android/database/sqlite/SQLiteCompatibilityWalFlags.java
+++ b/core/java/android/database/sqlite/SQLiteCompatibilityWalFlags.java
@@ -104,6 +104,11 @@
sCallingGlobalSettings = true;
flags = Settings.Global.getString(app.getContentResolver(),
Settings.Global.SQLITE_COMPATIBILITY_WAL_FLAGS);
+ } catch (Exception e) {
+ // The process is unable to read the flags. Treat this condition the same as if
+ // the ActivityThread application was not available.
+ Log.w(TAG, "Cannot read global setting "
+ + Settings.Global.SQLITE_COMPATIBILITY_WAL_FLAGS + " - " + e.toString());
} finally {
sCallingGlobalSettings = false;
}
diff --git a/core/java/android/net/vcn/VcnManager.java b/core/java/android/net/vcn/VcnManager.java
index 91cdf8d..1c9be6f 100644
--- a/core/java/android/net/vcn/VcnManager.java
+++ b/core/java/android/net/vcn/VcnManager.java
@@ -76,11 +76,15 @@
* PackageManager#FEATURE_TELEPHONY_SUBSCRIPTION} before querying the service. If the feature is
* absent, {@link Context#getSystemService} may return null.
*/
-@SystemService(Context.VCN_MANAGEMENT_SERVICE)
+@SystemService(VcnManager.VCN_MANAGEMENT_SERVICE_STRING)
@RequiresFeature(PackageManager.FEATURE_TELEPHONY_SUBSCRIPTION)
public class VcnManager {
@NonNull private static final String TAG = VcnManager.class.getSimpleName();
+ // TODO: b/366598445: Expose and use Context.VCN_MANAGEMENT_SERVICE
+ /** @hide */
+ public static final String VCN_MANAGEMENT_SERVICE_STRING = "vcn_management";
+
/**
* Key for WiFi entry RSSI thresholds
*
diff --git a/core/java/android/os/BatteryUsageStats.java b/core/java/android/os/BatteryUsageStats.java
index 1fef602..a698b9d 100644
--- a/core/java/android/os/BatteryUsageStats.java
+++ b/core/java/android/os/BatteryUsageStats.java
@@ -788,6 +788,12 @@
/** Parses an XML representation of BatteryUsageStats */
public static BatteryUsageStats createFromXml(TypedXmlPullParser parser)
throws XmlPullParserException, IOException {
+ return createBuilderFromXml(parser).build();
+ }
+
+ /** Parses an XML representation of BatteryUsageStats */
+ public static BatteryUsageStats.Builder createBuilderFromXml(TypedXmlPullParser parser)
+ throws XmlPullParserException, IOException {
Builder builder = null;
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
@@ -862,7 +868,7 @@
eventType = parser.next();
}
- return builder.build();
+ return builder;
}
@Override
@@ -978,10 +984,21 @@
*/
@NonNull
public BatteryUsageStats build() {
+ if (mBatteryConsumersCursorWindow == null) {
+ throw new IllegalStateException("Builder has been discarded");
+ }
return new BatteryUsageStats(this);
}
/**
+ * Close this builder without actually calling ".build()". Do not attempt
+ * to continue using the builder after this call.
+ */
+ public void discard() {
+ mBatteryConsumersCursorWindow.close();
+ }
+
+ /**
* Sets the battery capacity in milli-amp-hours.
*/
public Builder setBatteryCapacity(double batteryCapacityMah) {
diff --git a/core/java/android/os/BatteryUsageStatsQuery.java b/core/java/android/os/BatteryUsageStatsQuery.java
index a12606b..b533225 100644
--- a/core/java/android/os/BatteryUsageStatsQuery.java
+++ b/core/java/android/os/BatteryUsageStatsQuery.java
@@ -77,6 +77,8 @@
public static final int FLAG_BATTERY_USAGE_STATS_INCLUDE_POWER_STATE = 0x0040;
+ public static final int FLAG_BATTERY_USAGE_STATS_ACCUMULATED = 0x0080;
+
private static final long DEFAULT_MAX_STATS_AGE_MS = 5 * 60 * 1000;
private final int mFlags;
@@ -328,6 +330,15 @@
}
/**
+ * Requests the full continuously accumulated battery usage stats: across reboots
+ * and most battery stats resets.
+ */
+ public Builder accumulated() {
+ mFlags |= FLAG_BATTERY_USAGE_STATS_ACCUMULATED;
+ return this;
+ }
+
+ /**
* Requests to aggregate stored snapshots between the two supplied timestamps
* @param fromTimestamp Exclusive starting timestamp, as per System.currentTimeMillis()
* @param toTimestamp Inclusive ending timestamp, as per System.currentTimeMillis()
diff --git a/core/java/android/os/SystemClock.java b/core/java/android/os/SystemClock.java
index 4c9a02c..dfc591b 100644
--- a/core/java/android/os/SystemClock.java
+++ b/core/java/android/os/SystemClock.java
@@ -28,6 +28,8 @@
import android.text.format.DateUtils;
import android.util.Slog;
+import com.android.internal.os.ApplicationSharedMemory;
+
import dalvik.annotation.optimization.CriticalNative;
import java.time.Clock;
@@ -323,74 +325,74 @@
}
/**
- * Returns milliseconds since January 1, 1970 00:00:00.0 UTC, synchronized
- * using a remote network source outside the device.
- * <p>
- * While the time returned by {@link System#currentTimeMillis()} can be
- * adjusted by the user, the time returned by this method cannot be adjusted
- * by the user.
- * <p>
- * This performs no blocking network operations and returns values based on
- * a recent successful synchronization event; it will either return a valid
- * time or throw.
- * <p>
- * Note that synchronization may occur using an insecure network protocol,
- * so the returned time should not be used for security purposes.
- * The device may resynchronize with the same or different network source
- * at any time. Due to network delays, variations between servers, or local
- * (client side) clock drift, the accuracy of the returned times cannot be
- * guaranteed. In extreme cases, consecutive calls to {@link
- * #currentNetworkTimeMillis(ITimeDetectorService)} could return times that
- * are out of order.
+ * Returns milliseconds since January 1, 1970 00:00:00.0 UTC, synchronized using a remote
+ * network source outside the device.
+ *
+ * <p>While the time returned by {@link System#currentTimeMillis()} can be adjusted by the user,
+ * the time returned by this method cannot be adjusted by the user.
+ *
+ * <p>This performs no blocking network operations and returns values based on a recent
+ * successful synchronization event; it will either return a valid time or throw.
+ *
+ * <p>Note that synchronization may occur using an insecure network protocol, so the returned
+ * time should not be used for security purposes. The device may resynchronize with the same or
+ * different network source at any time. Due to network delays, variations between servers, or
+ * local (client side) clock drift, the accuracy of the returned times cannot be guaranteed. In
+ * extreme cases, consecutive calls to {@link #currentNetworkTimeMillis()} could return times
+ * that are out of order.
*
* @throws DateTimeException when no network time can be provided.
* @hide
*/
public static long currentNetworkTimeMillis() {
- ITimeDetectorService timeDetectorService = getITimeDetectorService();
- if (timeDetectorService == null) {
- throw new RuntimeException(new DeadSystemException());
- }
+ if (com.android.internal.os.Flags.applicationSharedMemoryEnabled()
+ && Flags.networkTimeUsesSharedMemory()) {
+ final long latestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis =
+ ApplicationSharedMemory.getInstance()
+ .getLatestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis();
+ return latestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis + elapsedRealtime();
+ } else {
+ ITimeDetectorService timeDetectorService = getITimeDetectorService();
+ if (timeDetectorService == null) {
+ throw new RuntimeException(new DeadSystemException());
+ }
- UnixEpochTime time;
- try {
- time = timeDetectorService.latestNetworkTime();
- } catch (ParcelableException e) {
- e.maybeRethrow(DateTimeException.class);
- throw new RuntimeException(e);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- if (time == null) {
- // This is not expected.
- throw new DateTimeException("Network based time is not available.");
- }
+ UnixEpochTime time;
+ try {
+ time = timeDetectorService.latestNetworkTime();
+ } catch (ParcelableException e) {
+ e.maybeRethrow(DateTimeException.class);
+ throw new RuntimeException(e);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ if (time == null) {
+ // This is not expected.
+ throw new DateTimeException("Network based time is not available.");
+ }
- long currentMillis = elapsedRealtime();
- long deltaMs = currentMillis - time.getElapsedRealtimeMillis();
- return time.getUnixEpochTimeMillis() + deltaMs;
+ long currentMillis = elapsedRealtime();
+ long deltaMs = currentMillis - time.getElapsedRealtimeMillis();
+ return time.getUnixEpochTimeMillis() + deltaMs;
+ }
}
- /**
- * Returns a {@link Clock} that starts at January 1, 1970 00:00:00.0 UTC,
- * synchronized using a remote network source outside the device.
- * <p>
- * While the time returned by {@link System#currentTimeMillis()} can be
- * adjusted by the user, the time returned by this method cannot be adjusted
- * by the user.
- * <p>
- * This performs no blocking network operations and returns values based on
- * a recent successful synchronization event; it will either return a valid
- * time or throw.
- * <p>
- * Note that synchronization may occur using an insecure network protocol,
- * so the returned time should not be used for security purposes.
- * The device may resynchronize with the same or different network source
- * at any time. Due to network delays, variations between servers, or local
- * (client side) clock drift, the accuracy of the returned times cannot be
- * guaranteed. In extreme cases, consecutive calls to {@link
- * Clock#millis()} on the returned {@link Clock} could return times that are
- * out of order.
+ /**
+ * Returns a {@link Clock} that starts at January 1, 1970 00:00:00.0 UTC, synchronized using a
+ * remote network source outside the device.
+ *
+ * <p>While the time returned by {@link System#currentTimeMillis()} can be adjusted by the user,
+ * the time returned by this method cannot be adjusted by the user.
+ *
+ * <p>This performs no blocking network operations and returns values based on a recent
+ * successful synchronization event; it will either return a valid time or throw.
+ *
+ * <p>Note that synchronization may occur using an insecure network protocol, so the returned
+ * time should not be used for security purposes. The device may resynchronize with the same or
+ * different network source at any time. Due to network delays, variations between servers, or
+ * local (client side) clock drift, the accuracy of the returned times cannot be guaranteed. In
+ * extreme cases, consecutive calls to {@link Clock#millis()} on the returned {@link Clock}
+ * could return times that are out of order.
*
* @throws DateTimeException when no network time can be provided.
*/
diff --git a/core/java/android/os/SystemProperties.java b/core/java/android/os/SystemProperties.java
index e53873b..89b727c 100644
--- a/core/java/android/os/SystemProperties.java
+++ b/core/java/android/os/SystemProperties.java
@@ -21,13 +21,10 @@
import android.annotation.SystemApi;
import android.compat.annotation.UnsupportedAppUsage;
import android.ravenwood.annotation.RavenwoodKeepWholeClass;
-import android.ravenwood.annotation.RavenwoodRedirect;
-import android.ravenwood.annotation.RavenwoodRedirectionClass;
import android.util.Log;
import android.util.MutableInt;
import com.android.internal.annotations.GuardedBy;
-import com.android.internal.ravenwood.RavenwoodEnvironment;
import dalvik.annotation.optimization.CriticalNative;
import dalvik.annotation.optimization.FastNative;
@@ -40,8 +37,6 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
-import java.util.Map;
-import java.util.function.Predicate;
/**
* Gives access to the system properties store. The system properties
@@ -58,7 +53,6 @@
*/
@SystemApi
@RavenwoodKeepWholeClass
-@RavenwoodRedirectionClass("SystemProperties_host")
public class SystemProperties {
private static final String TAG = "SystemProperties";
private static final boolean TRACK_KEY_ACCESS = false;
@@ -76,7 +70,7 @@
@UnsupportedAppUsage
@GuardedBy("sChangeCallbacks")
- static final ArrayList<Runnable> sChangeCallbacks = new ArrayList<Runnable>();
+ private static final ArrayList<Runnable> sChangeCallbacks = new ArrayList<Runnable>();
@GuardedBy("sRoReads")
private static final HashMap<String, MutableInt> sRoReads =
@@ -102,19 +96,6 @@
}
}
- /** @hide */
- @RavenwoodRedirect
- public static void init$ravenwood(Map<String, String> values,
- Predicate<String> keyReadablePredicate, Predicate<String> keyWritablePredicate) {
- throw RavenwoodEnvironment.notSupportedOnDevice();
- }
-
- /** @hide */
- @RavenwoodRedirect
- public static void reset$ravenwood() {
- throw RavenwoodEnvironment.notSupportedOnDevice();
- }
-
// The one-argument version of native_get used to be a regular native function. Nowadays,
// we use the two-argument form of native_get all the time, but we can't just delete the
// one-argument overload: apps use it via reflection, as the UnsupportedAppUsage annotation
@@ -126,46 +107,34 @@
@FastNative
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
- @RavenwoodRedirect
private static native String native_get(String key, String def);
@FastNative
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
- @RavenwoodRedirect
private static native int native_get_int(String key, int def);
@FastNative
@UnsupportedAppUsage
- @RavenwoodRedirect
private static native long native_get_long(String key, long def);
@FastNative
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
- @RavenwoodRedirect
private static native boolean native_get_boolean(String key, boolean def);
@FastNative
- @RavenwoodRedirect
private static native long native_find(String name);
@FastNative
- @RavenwoodRedirect
private static native String native_get(long handle);
@CriticalNative
- @RavenwoodRedirect
private static native int native_get_int(long handle, int def);
@CriticalNative
- @RavenwoodRedirect
private static native long native_get_long(long handle, long def);
@CriticalNative
- @RavenwoodRedirect
private static native boolean native_get_boolean(long handle, boolean def);
// _NOT_ FastNative: native_set performs IPC and can block
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
- @RavenwoodRedirect
private static native void native_set(String key, String def);
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
- @RavenwoodRedirect
private static native void native_add_change_callback();
- @RavenwoodRedirect
private static native void native_report_sysprop_change();
/**
@@ -301,7 +270,7 @@
}
@SuppressWarnings("unused") // Called from native code.
- static void callChangeCallbacks() {
+ private static void callChangeCallbacks() {
ArrayList<Runnable> callbacks = null;
synchronized (sChangeCallbacks) {
//Log.i("foo", "Calling " + sChangeCallbacks.size() + " change callbacks!");
@@ -327,6 +296,16 @@
}
/**
+ * Clear all callback changes.
+ * @hide
+ */
+ public static void clearChangeCallbacksForTest() {
+ synchronized (sChangeCallbacks) {
+ sChangeCallbacks.clear();
+ }
+ }
+
+ /**
* Notifies listeners that a system property has changed
* @hide
*/
diff --git a/core/java/android/os/SystemVibratorManager.java b/core/java/android/os/SystemVibratorManager.java
index cfbf528..a5697fb 100644
--- a/core/java/android/os/SystemVibratorManager.java
+++ b/core/java/android/os/SystemVibratorManager.java
@@ -16,6 +16,8 @@
package android.os;
+import static android.os.Trace.TRACE_TAG_VIBRATOR;
+
import android.annotation.CallbackExecutor;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -138,14 +140,14 @@
Log.w(TAG, "Failed to vibrate; no vibrator manager service.");
return;
}
- Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "vibrate, reason=" + reason);
+ Trace.traceBegin(TRACE_TAG_VIBRATOR, "vibrate");
try {
mService.vibrate(uid, mContext.getDeviceId(), opPkg, effect, attributes, reason,
mToken);
} catch (RemoteException e) {
Log.w(TAG, "Failed to vibrate.", e);
} finally {
- Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
+ Trace.traceEnd(TRACE_TAG_VIBRATOR);
}
}
@@ -155,14 +157,14 @@
Log.w(TAG, "Failed to perform haptic feedback; no vibrator manager service.");
return;
}
- Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "performHapticFeedback, reason=" + reason);
+ Trace.traceBegin(TRACE_TAG_VIBRATOR, "performHapticFeedback");
try {
mService.performHapticFeedback(mUid, mContext.getDeviceId(), mPackageName, constant,
reason, flags, privFlags);
} catch (RemoteException e) {
Log.w(TAG, "Failed to perform haptic feedback.", e);
} finally {
- Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
+ Trace.traceEnd(TRACE_TAG_VIBRATOR);
}
}
@@ -174,15 +176,14 @@
+ " no vibrator manager service.");
return;
}
- Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR,
- "performHapticFeedbackForInputDevice, reason=" + reason);
+ Trace.traceBegin(TRACE_TAG_VIBRATOR, "performHapticFeedbackForInputDevice");
try {
mService.performHapticFeedbackForInputDevice(mUid, mContext.getDeviceId(), mPackageName,
constant, inputDeviceId, inputSource, reason, flags, privFlags);
} catch (RemoteException e) {
Log.w(TAG, "Failed to perform haptic feedback for input device.", e);
} finally {
- Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
+ Trace.traceEnd(TRACE_TAG_VIBRATOR);
}
}
diff --git a/core/java/android/os/flags.aconfig b/core/java/android/os/flags.aconfig
index f670601..a1bfe39 100644
--- a/core/java/android/os/flags.aconfig
+++ b/core/java/android/os/flags.aconfig
@@ -224,3 +224,11 @@
is_exported: true
bug: "366598445"
}
+
+flag {
+ name: "network_time_uses_shared_memory"
+ namespace: "system_performance"
+ description: "SystemClock.currentNetworkTimeMillis() reads network time offset from shared memory"
+ bug: "361329788"
+ is_exported: true
+}
diff --git a/core/java/android/security/OWNERS b/core/java/android/security/OWNERS
index c38ee08..325d274 100644
--- a/core/java/android/security/OWNERS
+++ b/core/java/android/security/OWNERS
@@ -10,3 +10,4 @@
per-file FileIntegrityManager.java = file:platform/system/security:/fsverity/OWNERS
per-file IFileIntegrityService.aidl = file:platform/system/security:/fsverity/OWNERS
per-file *.aconfig = victorhsieh@google.com,eranm@google.com
+per-file *responsible_apis_flags.aconfig = haok@google.com
\ No newline at end of file
diff --git a/core/java/android/security/forensic/OWNERS b/core/java/android/security/forensic/OWNERS
new file mode 100644
index 0000000..d9e82a6
--- /dev/null
+++ b/core/java/android/security/forensic/OWNERS
@@ -0,0 +1,8 @@
+# Bug component: 1630302
+
+lizprucka@google.com
+mteffeteller@google.com
+myriamleggieri@google.com
+rmneal@google.com
+wenhaowang@google.com
+willcoster@google.com
diff --git a/core/java/android/security/responsible_apis_flags.aconfig b/core/java/android/security/responsible_apis_flags.aconfig
index 56d3669..45e9def 100644
--- a/core/java/android/security/responsible_apis_flags.aconfig
+++ b/core/java/android/security/responsible_apis_flags.aconfig
@@ -52,3 +52,11 @@
description: "Opt the system into enforcement of BAL"
bug: "339403750"
}
+
+flag {
+ name: "prevent_intent_redirect"
+ namespace: "responsible_apis"
+ description: "Prevent intent redirect attacks"
+ bug: "361143368"
+ is_fixed_read_only: true
+}
\ No newline at end of file
diff --git a/core/java/android/service/notification/NotificationAssistantService.java b/core/java/android/service/notification/NotificationAssistantService.java
index 88da8eb..48d7cf7 100644
--- a/core/java/android/service/notification/NotificationAssistantService.java
+++ b/core/java/android/service/notification/NotificationAssistantService.java
@@ -18,6 +18,7 @@
import static java.lang.annotation.RetentionPolicy.SOURCE;
+import android.annotation.FlaggedApi;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -90,10 +91,11 @@
= "android.service.notification.NotificationAssistantService";
/**
- * Activity Action: Show notification assistant detail setting page in NAS app.
+ * Activity Action: Show notification assistant detail setting page in the NAS app.
* <p>
- * In some cases, a matching Activity may not exist, so ensure you
- * safeguard against this.
+ * To be implemented by the NAS to offer users additional customization of intelligence
+ * features. If the action is not implemented, the OS will not provide a link to it in the
+ * Settings UI.
* <p>
* Input: Nothing.
* <p>
@@ -103,6 +105,30 @@
public static final String ACTION_NOTIFICATION_ASSISTANT_DETAIL_SETTINGS =
"android.service.notification.action.NOTIFICATION_ASSISTANT_DETAIL_SETTINGS";
+ /**
+ * Activity Action: Open notification assistant feedback page in the NAS app.
+ * <p>
+ * If the NAS does not implement this page, the OS will not show any feedback calls to action in
+ * the UI.
+ * <p>
+ * Input: {@link #EXTRA_NOTIFICATION_KEY}, the {@link StatusBarNotification#getKey()} of the
+ * notification the user wants to file feedback for.
+ * <p>
+ * Output: Nothing.
+ */
+ @FlaggedApi(Flags.FLAG_NOTIFICATION_CLASSIFICATION)
+ @SdkConstant(SdkConstant.SdkConstantType.ACTIVITY_INTENT_ACTION)
+ public static final String ACTION_NOTIFICATION_ASSISTANT_FEEDBACK_SETTINGS =
+ "android.service.notification.action.NOTIFICATION_ASSISTANT_FEEDBACK_SETTINGS";
+
+ /**
+ * A string extra containing the key of the notification that the user triggered feedback for.
+ *
+ * Extra for {@link #ACTION_NOTIFICATION_ASSISTANT_FEEDBACK_SETTINGS}.
+ */
+ @FlaggedApi(Flags.FLAG_NOTIFICATION_CLASSIFICATION)
+ public static final String EXTRA_NOTIFICATION_KEY
+ = "android.service.notification.extra.NOTIFICATION_KEY";
/**
* Data type: int, the feedback rating score provided by user. The score can be any integer
diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java
index 2dda835..90ceb44 100644
--- a/core/java/android/view/SurfaceControl.java
+++ b/core/java/android/view/SurfaceControl.java
@@ -4525,6 +4525,21 @@
}
/**
+ * TODO(b/366484871): To be removed once we have some logging in native
+ * This is called when BlastBufferQueue.mergeWithNextTransaction() is called from java, and
+ * for the purposes of logging that path.
+ */
+ void onMergeWithNextTransaction(CharSequence windowName) {
+ if (SurfaceControlRegistry.sCallStackDebuggingEnabled) {
+ SurfaceControlRegistry.getProcessInstance().checkCallStackDebugging(
+ "merge", this, null, "window=" + windowName);
+ if (mCalls != null) {
+ mCalls.clear();
+ }
+ }
+ }
+
+ /**
* Equivalent to reparent with a null parent, in that it removes
* the SurfaceControl from the scene, but it also releases
* the local resources (by calling {@link SurfaceControl#release})
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index daa0c57..66776ce 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -12391,6 +12391,7 @@
transaction.setBlurRegions(surfaceControl, regionCopy);
if (mBlastBufferQueue != null) {
+ transaction.onMergeWithNextTransaction(getTitle());
mBlastBufferQueue.mergeWithNextTransaction(transaction, frameNumber);
}
}
@@ -12417,6 +12418,9 @@
*/
public void mergeWithNextTransaction(Transaction t, long frameNumber) {
if (mBlastBufferQueue != null) {
+ if (t != null) {
+ t.onMergeWithNextTransaction(getTitle());
+ }
mBlastBufferQueue.mergeWithNextTransaction(t, frameNumber);
} else {
t.apply();
diff --git a/core/java/android/window/flags/windowing_frontend.aconfig b/core/java/android/window/flags/windowing_frontend.aconfig
index b6aad11..ccaaf63 100644
--- a/core/java/android/window/flags/windowing_frontend.aconfig
+++ b/core/java/android/window/flags/windowing_frontend.aconfig
@@ -70,6 +70,17 @@
}
flag {
+ name: "common_surface_animator"
+ namespace: "windowing_frontend"
+ description: "A reusable surface animator for default transition"
+ bug: "326331384"
+ is_fixed_read_only: true
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+}
+
+flag {
name: "reduce_keyguard_transitions"
namespace: "windowing_frontend"
description: "Avoid setting keyguard transitions ready unless there are no other changes"
@@ -111,6 +122,17 @@
}
flag {
+ name: "remove_activity_starter_dream_callback"
+ namespace: "windowing_frontend"
+ description: "Avoid a race with DreamManagerService callbacks for isDreaming by checking Activity state directly"
+ bug: "366452352"
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+ is_fixed_read_only: true
+}
+
+flag {
name: "supports_multi_instance_system_ui"
is_exported: true
namespace: "multitasking"
diff --git a/core/java/com/android/internal/os/ApplicationSharedMemory.java b/core/java/com/android/internal/os/ApplicationSharedMemory.java
new file mode 100644
index 0000000..84f713e
--- /dev/null
+++ b/core/java/com/android/internal/os/ApplicationSharedMemory.java
@@ -0,0 +1,296 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.os;
+
+import android.annotation.NonNull;
+import android.util.Log;
+import com.android.internal.annotations.VisibleForTesting;
+
+import dalvik.annotation.optimization.CriticalNative;
+
+import libcore.io.IoUtils;
+
+import java.io.FileDescriptor;
+import java.io.IOException;
+import java.time.DateTimeException;
+
+/**
+ * This class is used to create and access a shared memory region.
+ *
+ * <p>The intended use case is that memory is shared between system processes and application
+ * processes such that it's readable to all apps and writable only to system processes.
+ *
+ * <p>This shared memory region can be used as an alternative to Binder IPC for driving
+ * communication between system processes and application processes at a lower latency and higher
+ * throughput than Binder IPC can provide, under circumstances where the additional features of
+ * Binder IPC are not required.
+ *
+ * <p>Unlike Binder IPC, shared memory doesn't support synchronous transactions and associated
+ * ordering guarantees, client identity (and therefore caller permission checking), and access
+ * auditing. Therefore it's not a suitable alternative to Binder IPC for most use cases.
+ *
+ * <p>Additionally, because the intended use case is to make this shared memory region readable to
+ * all apps, it's not suitable for sharing sensitive data.
+ *
+ * @see {@link ApplicationSharedMemoryTestRule} for unit testing support.
+ * @hide
+ */
+public class ApplicationSharedMemory implements AutoCloseable {
+
+ // LINT.IfChange(invalid_network_time)
+ public static final long INVALID_NETWORK_TIME = -1;
+ // LINT.ThenChange(frameworks/base/core/jni/com_android_internal_os_ApplicationSharedMemory.cpp:invalid_network_time)
+
+ private static final boolean DEBUG = false;
+ private static final String LOG_TAG = "ApplicationSharedMemory";
+
+ @VisibleForTesting public static ApplicationSharedMemory sInstance;
+
+ /** Get the process-global instance. */
+ public static ApplicationSharedMemory getInstance() {
+ ApplicationSharedMemory instance = sInstance;
+ if (instance == null) {
+ throw new IllegalStateException("ApplicationSharedMemory not initialized");
+ }
+ return instance;
+ }
+
+ /** Set the process-global instance. */
+ public static void setInstance(ApplicationSharedMemory instance) {
+ if (DEBUG) {
+ Log.d(LOG_TAG, "setInstance: " + instance);
+ }
+
+ if (sInstance != null) {
+ throw new IllegalStateException("ApplicationSharedMemory already initialized");
+ }
+ sInstance = instance;
+ }
+
+ /** Allocate mutable shared memory region. */
+ public static ApplicationSharedMemory create() {
+ if (DEBUG) {
+ Log.d(LOG_TAG, "create");
+ }
+
+ int fd = nativeCreate();
+ FileDescriptor fileDescriptor = new FileDescriptor();
+ fileDescriptor.setInt$(fd);
+
+ final boolean mutable = true;
+ long ptr = nativeMap(fd, mutable);
+ nativeInit(ptr);
+
+ return new ApplicationSharedMemory(fileDescriptor, mutable, ptr);
+ }
+
+ /**
+ * Open shared memory region from a given {@link FileDescriptor}.
+ *
+ * @param fileDescriptor Handle to shared memory region.
+ * @param mutable Whether the shared memory region is mutable. If true, will be mapped as
+ * read-write memory. If false, will be mapped as read-only memory. Passing true (mutable)
+ * if |pfd| is a handle to read-only memory will result in undefined behavior.
+ */
+ public static ApplicationSharedMemory fromFileDescriptor(
+ @NonNull FileDescriptor fileDescriptor, boolean mutable) {
+ if (DEBUG) {
+ Log.d(LOG_TAG, "fromFileDescriptor: " + fileDescriptor + " mutable: " + mutable);
+ }
+
+ long ptr = nativeMap(fileDescriptor.getInt$(), mutable);
+ return new ApplicationSharedMemory(fileDescriptor, mutable, ptr);
+ }
+
+ /**
+ * Allocate read-write shared memory region.
+ *
+ * @return File descriptor of the shared memory region.
+ */
+ private static native int nativeCreate();
+
+ /**
+ * Map the shared memory region.
+ *
+ * @param fd File descriptor of the shared memory region.
+ * @param isMutable Whether the shared memory region is mutable. If true, will be mapped as
+ * read-write memory. If false, will be mapped as read-only memory.
+ * @return Pointer to the mapped shared memory region.
+ */
+ private static native long nativeMap(int fd, boolean isMutable);
+
+ /**
+ * Initialize read-write shared memory region.
+ *
+ * @param Pointer to the mapped shared memory region.
+ */
+ private static native void nativeInit(long ptr);
+
+ /**
+ * Unmap the shared memory region.
+ *
+ * @param ptr Pointer to the mapped shared memory region.
+ */
+ private static native void nativeUnmap(long ptr);
+
+ /**
+ * If true, this object owns the read-write instance of the shared memory region. If false, this
+ * object can only read.
+ */
+ private final boolean mMutable;
+
+ /**
+ * Handle to the shared memory region. This can be send to other processes over Binder calls or
+ * Intent extras. Recipients can use this handle to obtain read-only access to the shared memory
+ * region.
+ */
+ private FileDescriptor mFileDescriptor;
+
+ /** Native pointer to the mapped shared memory region. */
+ private volatile long mPtr;
+
+ ApplicationSharedMemory(@NonNull FileDescriptor fileDescriptor, boolean mutable, long ptr) {
+ mFileDescriptor = fileDescriptor;
+ mMutable = mutable;
+ mPtr = ptr;
+ }
+
+ /**
+ * Returns the file descriptor of the shared memory region.
+ *
+ * <p>This file descriptor retains the mutability properties of this object instance, and can be
+ * sent over Binder IPC or Intent extras to another process to allow the remote process to map
+ * the same shared memory region with the same access rights.
+ *
+ * @throws IllegalStateException if the file descriptor is closed.
+ */
+ public FileDescriptor getFileDescriptor() {
+ checkFileOpen();
+ return mFileDescriptor;
+ }
+
+ /**
+ * Returns a read-only file descriptor of the shared memory region. This object can be sent over
+ * Binder IPC or Intent extras to another process to allow the remote process to map the same
+ * shared memory region with read-only access.
+ *
+ * @return a read-only handle to the shared memory region.
+ * @throws IllegalStateException if the file descriptor is closed.
+ */
+ public FileDescriptor getReadOnlyFileDescriptor() throws IOException {
+ checkFileOpen();
+ FileDescriptor readOnlyFileDescriptor = new FileDescriptor();
+ int readOnlyFd = nativeDupAsReadOnly(mFileDescriptor.getInt$());
+ readOnlyFileDescriptor.setInt$(readOnlyFd);
+ return readOnlyFileDescriptor;
+ }
+
+ /** Return a read-only duplicate of the file descriptor. */
+ private static native int nativeDupAsReadOnly(int fd);
+
+ /** Set the latest network Unix Epoch minus realtime millis. */
+ public void setLatestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis(long offset) {
+ checkMutable();
+ nativeSetLatestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis(mPtr, offset);
+ }
+
+ /** Clear the latest network Unix Epoch minus realtime millis. */
+ public void clearLatestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis() {
+ checkMutable();
+ nativeSetLatestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis(
+ mPtr, INVALID_NETWORK_TIME);
+ }
+
+ @CriticalNative
+ private static native void nativeSetLatestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis(
+ long ptr, long offset);
+
+ /**
+ * Get the latest network Unix Epoch minus realtime millis.
+ *
+ * @throws DateTimeException when no network time can be provided.
+ */
+ public long getLatestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis()
+ throws DateTimeException {
+ checkMapped();
+ long offset = nativeGetLatestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis(mPtr);
+ if (offset == INVALID_NETWORK_TIME) {
+ throw new DateTimeException("No network time available");
+ }
+ return offset;
+ }
+
+ @CriticalNative
+ public static native long nativeGetLatestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis(
+ long ptr);
+
+ /**
+ * Close the associated file descriptor.
+ *
+ * <p>This method is safe to call if you never intend to pass the file descriptor to another
+ * process, whether via {@link #getFileDescriptor()} or {@link #getReadOnlyFileDescriptor()}.
+ * After calling this method, subsequent calls to {@link #getFileDescriptor()} or {@link
+ * #getReadOnlyFileDescriptor()} will throw an {@link IllegalStateException}.
+ */
+ public void closeFileDescriptor() {
+ if (mFileDescriptor != null) {
+ IoUtils.closeQuietly(mFileDescriptor);
+ mFileDescriptor = null;
+ }
+ }
+
+ public void close() {
+ if (mPtr != 0) {
+ nativeUnmap(mPtr);
+ mPtr = 0;
+ }
+
+ if (mFileDescriptor != null) {
+ IoUtils.closeQuietly(mFileDescriptor);
+ mFileDescriptor = null;
+ }
+ }
+
+ private void checkFileOpen() {
+ if (mFileDescriptor == null) {
+ throw new IllegalStateException("File descriptor is closed");
+ }
+ }
+
+ /**
+ * Check that the shared memory region is mapped.
+ *
+ * @throws IllegalStateException if the shared memory region is not mapped.
+ */
+ private void checkMapped() {
+ if (mPtr == 0) {
+ throw new IllegalStateException("Instance is closed");
+ }
+ }
+
+ /**
+ * Check that the shared memory region is mapped and mutable.
+ *
+ * @throws IllegalStateException if the shared memory region is not mapped or not mutable.
+ */
+ private void checkMutable() {
+ checkMapped();
+ if (!mMutable) {
+ throw new IllegalStateException("Not mutable");
+ }
+ }
+}
diff --git a/core/java/com/android/internal/os/OWNERS b/core/java/com/android/internal/os/OWNERS
index 391d257..ffd4499 100644
--- a/core/java/com/android/internal/os/OWNERS
+++ b/core/java/com/android/internal/os/OWNERS
@@ -15,3 +15,6 @@
# ANRs
# Bug component : 158088 = per-file TimeoutRecord.java
per-file TimeoutRecord.java = file:/PERFORMANCE_OWNERS
+
+# ApplicationSharedMemory
+per-file *ApplicationSharedMemory* = file:/PERFORMANCE_OWNERS
diff --git a/core/java/com/android/internal/os/flags.aconfig b/core/java/com/android/internal/os/flags.aconfig
index c7117e9..07df248 100644
--- a/core/java/com/android/internal/os/flags.aconfig
+++ b/core/java/com/android/internal/os/flags.aconfig
@@ -27,4 +27,12 @@
description: "If the debug store is enabled."
bug: "314735374"
is_fixed_read_only: true
+}
+
+flag {
+ name: "application_shared_memory_enabled"
+ namespace: "system_performance"
+ description: "Whether ApplicationSharedMemory is enabled."
+ bug: "365575551"
+ is_fixed_read_only: true
}
\ No newline at end of file
diff --git a/core/java/com/android/internal/pm/parsing/pkg/PackageImpl.java b/core/java/com/android/internal/pm/parsing/pkg/PackageImpl.java
index 12d3264..032ac42 100644
--- a/core/java/com/android/internal/pm/parsing/pkg/PackageImpl.java
+++ b/core/java/com/android/internal/pm/parsing/pkg/PackageImpl.java
@@ -3025,6 +3025,7 @@
@Override
public PackageImpl setSplitCodePaths(@Nullable String[] splitCodePaths) {
this.splitCodePaths = splitCodePaths;
+ this.mSplits = null; // reset for paths changed
if (splitCodePaths != null) {
int size = splitCodePaths.length;
for (int index = 0; index < size; index++) {
diff --git a/core/java/com/android/internal/util/ScreenshotRequest.java b/core/java/com/android/internal/util/ScreenshotRequest.java
index c8b7def..702e5e2 100644
--- a/core/java/com/android/internal/util/ScreenshotRequest.java
+++ b/core/java/com/android/internal/util/ScreenshotRequest.java
@@ -33,6 +33,7 @@
import android.os.Parcel;
import android.os.Parcelable;
import android.util.Log;
+import android.view.Display;
import android.view.WindowManager;
import java.util.Objects;
@@ -53,11 +54,12 @@
private final Bitmap mBitmap;
private final Rect mBoundsInScreen;
private final Insets mInsets;
+ private final int mDisplayId;
private ScreenshotRequest(
@WindowManager.ScreenshotType int type, @WindowManager.ScreenshotSource int source,
ComponentName topComponent, int taskId, int userId,
- Bitmap bitmap, Rect boundsInScreen, Insets insets) {
+ Bitmap bitmap, Rect boundsInScreen, Insets insets, int displayId) {
mType = type;
mSource = source;
mTopComponent = topComponent;
@@ -66,6 +68,7 @@
mBitmap = bitmap;
mBoundsInScreen = boundsInScreen;
mInsets = insets;
+ mDisplayId = displayId;
}
ScreenshotRequest(Parcel in) {
@@ -77,6 +80,7 @@
mBitmap = HardwareBitmapBundler.bundleToHardwareBitmap(in.readTypedObject(Bundle.CREATOR));
mBoundsInScreen = in.readTypedObject(Rect.CREATOR);
mInsets = in.readTypedObject(Insets.CREATOR);
+ mDisplayId = in.readInt();
}
@WindowManager.ScreenshotType
@@ -113,6 +117,10 @@
return mTopComponent;
}
+ public int getDisplayId() {
+ return mDisplayId;
+ }
+
@Override
public int describeContents() {
return 0;
@@ -128,6 +136,7 @@
dest.writeTypedObject(HardwareBitmapBundler.hardwareBitmapToBundle(mBitmap), 0);
dest.writeTypedObject(mBoundsInScreen, 0);
dest.writeTypedObject(mInsets, 0);
+ dest.writeInt(mDisplayId);
}
@NonNull
@@ -161,6 +170,7 @@
private int mTaskId = INVALID_TASK_ID;
private int mUserId = USER_NULL;
private ComponentName mTopComponent;
+ private int mDisplayId = Display.INVALID_DISPLAY;
/**
* Begin building a ScreenshotRequest.
@@ -193,7 +203,7 @@
}
return new ScreenshotRequest(mType, mSource, mTopComponent, mTaskId, mUserId, mBitmap,
- mBoundsInScreen, mInsets);
+ mBoundsInScreen, mInsets, mDisplayId);
}
/**
@@ -255,6 +265,16 @@
mInsets = insets;
return this;
}
+
+ /**
+ * Set the display ID for this request.
+ *
+ * @param displayId see {@link Display}
+ */
+ public Builder setDisplayId(int displayId) {
+ mDisplayId = displayId;
+ return this;
+ }
}
/**
diff --git a/core/jni/Android.bp b/core/jni/Android.bp
index 9a4ff8f..9797d96 100644
--- a/core/jni/Android.bp
+++ b/core/jni/Android.bp
@@ -258,6 +258,7 @@
"com_android_internal_content_om_OverlayConfig.cpp",
"com_android_internal_content_om_OverlayManagerImpl.cpp",
"com_android_internal_net_NetworkUtilsInternal.cpp",
+ "com_android_internal_os_ApplicationSharedMemory.cpp",
"com_android_internal_os_ClassLoaderFactory.cpp",
"com_android_internal_os_DebugStore.cpp",
"com_android_internal_os_FuseAppLoop.cpp",
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index 03b5143a..70a80b2 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -201,6 +201,7 @@
extern int register_com_android_internal_content_om_OverlayConfig(JNIEnv *env);
extern int register_com_android_internal_content_om_OverlayManagerImpl(JNIEnv* env);
extern int register_com_android_internal_net_NetworkUtilsInternal(JNIEnv* env);
+extern int register_com_android_internal_os_ApplicationSharedMemory(JNIEnv *env);
extern int register_com_android_internal_os_ClassLoaderFactory(JNIEnv* env);
extern int register_com_android_internal_os_DebugStore(JNIEnv* env);
extern int register_com_android_internal_os_FuseAppLoop(JNIEnv* env);
@@ -1516,6 +1517,7 @@
}
static const RegJNIRec gRegJNI[] = {
+ REG_JNI(register_com_android_internal_os_ApplicationSharedMemory),
REG_JNI(register_com_android_internal_os_RuntimeInit),
REG_JNI(register_com_android_internal_os_ZygoteInit_nativeZygoteInit),
REG_JNI(register_android_os_SystemClock),
diff --git a/core/jni/OWNERS b/core/jni/OWNERS
index c0fe098..af10623 100644
--- a/core/jni/OWNERS
+++ b/core/jni/OWNERS
@@ -116,3 +116,6 @@
# IF Tools
per-file android_tracing_Perfetto* = file:platform/development:/tools/winscope/OWNERS
+
+# ApplicationSharedMemory
+per-file *ApplicationSharedMemory* = file:/PERFORMANCE_OWNERS
diff --git a/core/jni/android_os_SystemProperties.cpp b/core/jni/android_os_SystemProperties.cpp
index 88e6fa3..e99d890 100644
--- a/core/jni/android_os_SystemProperties.cpp
+++ b/core/jni/android_os_SystemProperties.cpp
@@ -34,8 +34,6 @@
#if defined(__BIONIC__)
# include <sys/system_properties.h>
-#else
-struct prop_info;
#endif
namespace android {
@@ -46,7 +44,6 @@
template<typename Functor>
void ReadProperty(const prop_info* prop, Functor&& functor)
{
-#if defined(__BIONIC__)
auto thunk = [](void* cookie,
const char* /*name*/,
const char* value,
@@ -54,9 +51,6 @@
std::forward<Functor>(*static_cast<Functor*>(cookie))(value);
};
__system_property_read_callback(prop, thunk, &functor);
-#else
- LOG(FATAL) << "fast property access supported only on device";
-#endif
}
template<typename Functor>
@@ -66,16 +60,11 @@
if (!key.c_str()) {
return;
}
-#if defined(__BIONIC__)
const prop_info* prop = __system_property_find(key.c_str());
if (!prop) {
return;
}
ReadProperty(prop, std::forward<Functor>(functor));
-#else
- std::forward<Functor>(functor)(
- android::base::GetProperty(key.c_str(), "").c_str());
-#endif
}
jstring SystemProperties_getSS(JNIEnv* env, jclass clazz, jstring keyJ,
@@ -132,17 +121,12 @@
jlong SystemProperties_find(JNIEnv* env, jclass, jstring keyJ)
{
-#if defined(__BIONIC__)
ScopedUtfChars key(env, keyJ);
if (!key.c_str()) {
return 0;
}
const prop_info* prop = __system_property_find(key.c_str());
return reinterpret_cast<jlong>(prop);
-#else
- LOG(FATAL) << "fast property access supported only on device";
- __builtin_unreachable(); // Silence warning
-#endif
}
jstring SystemProperties_getH(JNIEnv* env, jclass clazz, jlong propJ)
@@ -198,11 +182,7 @@
// request" failures).
errno = 0;
bool success;
-#if defined(__BIONIC__)
success = !__system_property_set(key.c_str(), value_c_str);
-#else
- success = android::base::SetProperty(key.c_str(), value_c_str);
-#endif
if (!success) {
if (errno != 0) {
jniThrowExceptionFmt(env, "java/lang/RuntimeException",
diff --git a/core/jni/com_android_internal_os_ApplicationSharedMemory.cpp b/core/jni/com_android_internal_os_ApplicationSharedMemory.cpp
new file mode 100644
index 0000000..453e539
--- /dev/null
+++ b/core/jni/com_android_internal_os_ApplicationSharedMemory.cpp
@@ -0,0 +1,164 @@
+/*
+ * 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.
+ */
+
+// See: ApplicationSharedMemory.md
+
+#include <cutils/ashmem.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <nativehelper/JNIHelp.h>
+#include <string.h>
+#include <sys/mman.h>
+
+#include <atomic>
+#include <cstddef>
+#include <new>
+
+#include "core_jni_helpers.h"
+
+namespace {
+
+// Atomics should be safe to use across processes if they are lock free.
+static_assert(std::atomic<int64_t>::is_always_lock_free == true,
+ "atomic<int64_t> is not always lock free");
+
+// This is the data structure that is shared between processes.
+//
+// Tips for extending:
+// - Atomics are safe for cross-process use as they are lock free, if they are accessed as
+// individual values.
+// - Consider multi-ABI systems, e.g. devices that support launching both 64-bit and 32-bit
+// app processes. Use fixed-size types (e.g. `int64_t`) to ensure that the data structure is
+// the same size across all ABIs. Avoid implicit assumptions about struct packing/padding.
+class alignas(8) SharedMemory { // Ensure that `sizeof(SharedMemory)` is the same across 32-bit and
+ // 64-bit systems.
+private:
+ volatile std::atomic<int64_t> latestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis;
+
+ // LINT.IfChange(invalid_network_time)
+ static constexpr int64_t INVALID_NETWORK_TIME = -1;
+ // LINT.ThenChange(frameworks/base/core/java/com/android/internal/os/ApplicationSharedMemory.java:invalid_network_time)
+
+public:
+ // Default constructor sets initial values
+ SharedMemory()
+ : latestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis(INVALID_NETWORK_TIME) {}
+
+ int64_t getLatestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis() const {
+ return latestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis;
+ }
+
+ void setLatestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis(int64_t offset) {
+ latestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis = offset;
+ }
+};
+
+// Update the expected value when modifying the members of SharedMemory.
+// The goal of this assertion is to ensure that the data structure is the same size across 32-bit
+// and 64-bit systems.
+static_assert(sizeof(SharedMemory) == 8, "Unexpected SharedMemory size");
+
+static jint nativeCreate(JNIEnv* env, jclass) {
+ // Create anonymous shared memory region
+ int fd = ashmem_create_region("ApplicationSharedMemory", sizeof(SharedMemory));
+ if (fd < 0) {
+ jniThrowExceptionFmt(env, "java/lang/RuntimeException", "Failed to create ashmem: %s",
+ strerror(errno));
+ }
+ return fd;
+}
+
+static jlong nativeMap(JNIEnv* env, jclass, jint fd, jboolean isMutable) {
+ void* ptr = mmap(nullptr, sizeof(SharedMemory), isMutable ? PROT_READ | PROT_WRITE : PROT_READ,
+ MAP_SHARED, fd, 0);
+ if (ptr == MAP_FAILED) {
+ close(fd);
+ jniThrowExceptionFmt(env, "java/lang/RuntimeException", "Failed to mmap shared memory: %s",
+ strerror(errno));
+ }
+
+ return reinterpret_cast<jlong>(ptr);
+}
+
+static void nativeInit(JNIEnv* env, jclass, jlong ptr) {
+ new (reinterpret_cast<SharedMemory*>(ptr)) SharedMemory();
+}
+
+static void nativeUnmap(JNIEnv* env, jclass, jlong ptr) {
+ if (munmap(reinterpret_cast<void*>(ptr), sizeof(SharedMemory)) == -1) {
+ jniThrowExceptionFmt(env, "java/lang/RuntimeException",
+ "Failed to munmap shared memory: %s", strerror(errno));
+ }
+}
+
+static jint nativeDupAsReadOnly(JNIEnv* env, jclass, jint fd) {
+ // Duplicate file descriptor
+ fd = fcntl(fd, F_DUPFD_CLOEXEC, 0);
+ if (fd < 0) {
+ jniThrowExceptionFmt(env, "java/lang/RuntimeException", "Failed to dup fd: %s",
+ strerror(errno));
+ }
+
+ // Set new file descriptor to read-only
+ if (ashmem_set_prot_region(fd, PROT_READ)) {
+ close(fd);
+ jniThrowExceptionFmt(env, "java/lang/RuntimeException",
+ "Failed to ashmem_set_prot_region: %s", strerror(errno));
+ }
+
+ return fd;
+}
+
+static void nativeSetLatestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis(jlong ptr,
+ jlong offset) {
+ SharedMemory* sharedMemory = reinterpret_cast<SharedMemory*>(ptr);
+ sharedMemory->setLatestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis(offset);
+}
+
+static jlong nativeGetLatestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis(jlong ptr) {
+ SharedMemory* sharedMemory = reinterpret_cast<SharedMemory*>(ptr);
+ return sharedMemory->getLatestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis();
+}
+
+static const JNINativeMethod gMethods[] = {
+ {"nativeCreate", "()I", (void*)nativeCreate},
+ {"nativeMap", "(IZ)J", (void*)nativeMap},
+ {"nativeInit", "(J)V", (void*)nativeInit},
+ {"nativeUnmap", "(J)V", (void*)nativeUnmap},
+ {"nativeDupAsReadOnly", "(I)I", (void*)nativeDupAsReadOnly},
+ {"nativeSetLatestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis", "(JJ)V",
+ (void*)nativeSetLatestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis},
+ {"nativeGetLatestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis", "(J)J",
+ (void*)nativeGetLatestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis},
+};
+
+} // anonymous namespace
+
+namespace android {
+
+static const char kApplicationSharedMemoryClassName[] =
+ "com/android/internal/os/ApplicationSharedMemory";
+static jclass gApplicationSharedMemoryClass;
+
+int register_com_android_internal_os_ApplicationSharedMemory(JNIEnv* env) {
+ gApplicationSharedMemoryClass =
+ MakeGlobalRefOrDie(env, FindClassOrDie(env, kApplicationSharedMemoryClassName));
+ RegisterMethodsOrDie(env, "com/android/internal/os/ApplicationSharedMemory", gMethods,
+ NELEM(gMethods));
+ return JNI_OK;
+}
+
+} // namespace android
diff --git a/core/proto/android/app/appstartinfo.proto b/core/proto/android/app/appstartinfo.proto
index 78cf6f4..8e9f447 100644
--- a/core/proto/android/app/appstartinfo.proto
+++ b/core/proto/android/app/appstartinfo.proto
@@ -41,4 +41,5 @@
optional AppStartLaunchMode launch_mode = 11;
optional bool was_force_stopped = 12;
optional int64 monotonic_creation_time_ms = 13;
+ optional int32 start_component = 14;
}
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index d0f1615..a9626a6 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -2153,7 +2153,7 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Deaktiver"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Få flere oplysninger"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Tilpassede Android-notifikationer blev erstattet af forbedrede notifikationer i Android 12. Denne funktion viser foreslåede handlinger og svar samt organiserer dine notifikationer.\n\nForbedrede notifikationer kan få adgang til indhold i notifikationer, bl.a. personlige oplysninger såsom beskeder og navne på kontakter. Funktionen kan også afvise eller svare på notifikationer, f.eks. ved at besvare telefonopkald og justere Forstyr ikke."</string>
+ <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Adaptive Android-notifikationer blev erstattet af forbedrede notifikationer i Android 12. Denne funktion viser foreslåede handlinger og svar samt organiserer dine notifikationer.\n\nForbedrede notifikationer kan få adgang til indhold i notifikationer, bl.a. personlige oplysninger såsom beskeder og navne på kontakter. Funktionen kan også afvise eller svare på notifikationer, f.eks. ved at besvare telefonopkald og justere Forstyr ikke."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notifikation med oplysninger om rutinetilstand"</string>
<string name="dynamic_mode_notification_title" msgid="1388718452788985481">"Batterisparefunktion er aktiveret"</string>
<string name="dynamic_mode_notification_summary" msgid="1639031262484979689">"Reducerer batteriforbruget for at forlænge batteritiden"</string>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index 14b512e..f40fb93 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -642,7 +642,7 @@
<string name="permdesc_mediaLocation" msgid="597912899423578138">"એપને તમારા મીડિયા સંગ્રહમાંથી સ્થાનો વાંચવાની મંજૂરી આપે છે."</string>
<string name="biometric_app_setting_name" msgid="3339209978734534457">"બાયોમેટ્રિક્સનો ઉપયોગ કરો"</string>
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"બાયોમેટ્રિક્સ અથવા સ્ક્રીન લૉકનો ઉપયોગ કરો"</string>
- <string name="biometric_dialog_default_title" msgid="55026799173208210">"તે તમે જ છો એ ચકાસો"</string>
+ <string name="biometric_dialog_default_title" msgid="55026799173208210">"આ તમે જ છો તેની ચકાસણી કરો"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"આગળ વધવા માટે બાયોમેટ્રિકનો ઉપયોગ કરો"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"ચાલુ રાખવા માટે તમારા બાયોમેટ્રિક ડેટા અથવા સ્ક્રીન લૉક સુવિધાનો ઉપયોગ કરો"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"બાયોમેટ્રિક હાર્ડવેર ઉપલબ્ધ નથી"</string>
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index 0997b4b..595b9ba 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -642,7 +642,7 @@
<string name="permdesc_mediaLocation" msgid="597912899423578138">"Қолданбаға медиамазмұн жинағынан геодеректерді оқуға мүмкіндік береді."</string>
<string name="biometric_app_setting_name" msgid="3339209978734534457">"Биометриканы пайдалану"</string>
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Биометриканы немесе экран құлпын пайдалану"</string>
- <string name="biometric_dialog_default_title" msgid="55026799173208210">"Бұл сіз екеніңізді растаңыз"</string>
+ <string name="biometric_dialog_default_title" msgid="55026799173208210">"Cіз екеніңізді растаңыз"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Жалғастыру үшін биометрикаңызды пайдаланыңыз."</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Жалғастыру үшін биометриканы немесе экран құлпын пайдаланыңыз."</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Биометрикалық жабдық жоқ"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index c671f46..61d3229 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -644,7 +644,7 @@
<string name="permdesc_mediaLocation" msgid="597912899423578138">"Umožňuje aplikácii čítať polohy zo zbierky médií."</string>
<string name="biometric_app_setting_name" msgid="3339209978734534457">"Použiť biometrické údaje"</string>
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Použiť biometrické údaje alebo zámku obrazovky"</string>
- <string name="biometric_dialog_default_title" msgid="55026799173208210">"Overenie, že ste to vy"</string>
+ <string name="biometric_dialog_default_title" msgid="55026799173208210">"Potvrďte, že ste to vy"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Ak chcete pokračovať, použite biometrický údaj"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Pokračujte použitím biometrických údajov alebo zámky obrazovky"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Biometrický hardvér nie je k dispozícii"</string>
@@ -2410,9 +2410,9 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Rozloženie klávesnice je nastavené na jazyky <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g> a <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Môžete to zmeniť klepnutím."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Fyzické klávesnice sú nakonfigurované"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Klávesnice si zobrazíte klepnutím"</string>
- <string name="profile_label_private" msgid="6463418670715290696">"Súkromné"</string>
+ <string name="profile_label_private" msgid="6463418670715290696">"Súkromný"</string>
<string name="profile_label_clone" msgid="769106052210954285">"Klon"</string>
- <string name="profile_label_work" msgid="3495359133038584618">"Pracovné"</string>
+ <string name="profile_label_work" msgid="3495359133038584618">"Pracovný"</string>
<string name="profile_label_work_2" msgid="4691533661598632135">"2. pracovný"</string>
<string name="profile_label_work_3" msgid="4834572253956798917">"3. pracovný"</string>
<string name="profile_label_test" msgid="9168641926186071947">"Testovací"</string>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index 1f8a2f7..7073266 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -642,7 +642,7 @@
<string name="permdesc_mediaLocation" msgid="597912899423578138">"మీ మీడియా సేకరణ నుండి లొకేషన్లను చదవడానికి యాప్ను అనుమతిస్తుంది."</string>
<string name="biometric_app_setting_name" msgid="3339209978734534457">"బయోమెట్రిక్స్ను ఉపయోగించండి"</string>
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"బయోమెట్రిక్స్ను లేదా స్క్రీన్ లాక్ను ఉపయోగించండి"</string>
- <string name="biometric_dialog_default_title" msgid="55026799173208210">"ఇది మీరేనని వెరిఫై చేసుకోండి"</string>
+ <string name="biometric_dialog_default_title" msgid="55026799173208210">"ఈ చర్య చేస్తోంది మీరేనని వెరిఫై చేయండి"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"కొనసాగించడానికి, మీ బయోమెట్రిక్ను ఉపయోగించండి"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"కొనసాగించడానికి మీ బయోమెట్రిక్ లేదా స్క్రీన్ లాక్ను ఉపయోగించండి"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"బయోమెట్రిక్ హార్డ్వేర్ అందుబాటులో లేదు"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index a4d2752..e76dacd 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -2439,7 +2439,7 @@
<string name="face_dangling_notification_msg" msgid="746235263598985384">"Hindi na makilala ang iyong face model. I-set up ulit ang Pag-unlock Gamit ang Mukha."</string>
<string name="biometric_dangling_notification_action_set_up" msgid="8246885009807817961">"I-set up"</string>
<string name="biometric_dangling_notification_action_not_now" msgid="8095249216864443491">"Huwag muna"</string>
- <string name="bg_user_sound_notification_title_alarm" msgid="5251678483393143527">"Alarm para kay/sa <xliff:g id="USER_NAME">%s</xliff:g>"</string>
+ <string name="bg_user_sound_notification_title_alarm" msgid="5251678483393143527">"Alarm para kay <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="bg_user_sound_notification_button_switch_user" msgid="3091969648572788946">"Magpalit ng user"</string>
<string name="bg_user_sound_notification_button_mute" msgid="4942158515665615243">"I-mute"</string>
<string name="bg_user_sound_notification_message" msgid="8613881975316976673">"I-tap para i-mute ang tunog"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index f467f92..ad6fc0d 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -642,7 +642,7 @@
<string name="permdesc_mediaLocation" msgid="597912899423578138">"Uygulamanın medya koleksiyonunuzdaki konumları okumasına izin verir."</string>
<string name="biometric_app_setting_name" msgid="3339209978734534457">"Biyometri kullan"</string>
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Biyometri veya ekran kilidi kullan"</string>
- <string name="biometric_dialog_default_title" msgid="55026799173208210">"Siz olduğunuzu doğrulayın"</string>
+ <string name="biometric_dialog_default_title" msgid="55026799173208210">"Kimliğinizi doğrulayın"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Devam etmek için biyometri kullanın"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Devam etmek için biyometrik kimlik bilginizi veya ekran kilidinizi kullanın"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Biyometrik donanım kullanılamıyor"</string>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index 660068d..52d9e3b 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -2439,7 +2439,7 @@
<string name="face_dangling_notification_msg" msgid="746235263598985384">"آپ کے چہرے کا ماڈل مزید پہچانا نہیں جا سکتا۔ فیس اَن لاک کو دوبارہ سیٹ اپ کریں۔"</string>
<string name="biometric_dangling_notification_action_set_up" msgid="8246885009807817961">"سیٹ اپ کریں"</string>
<string name="biometric_dangling_notification_action_not_now" msgid="8095249216864443491">"ابھی نہیں"</string>
- <string name="bg_user_sound_notification_title_alarm" msgid="5251678483393143527">"<xliff:g id="USER_NAME">%s</xliff:g> کیلئے الارم"</string>
+ <string name="bg_user_sound_notification_title_alarm" msgid="5251678483393143527">"<xliff:g id="USER_NAME">%s</xliff:g> کیلئے الارم"</string>
<string name="bg_user_sound_notification_button_switch_user" msgid="3091969648572788946">"صارف سوئچ کریں"</string>
<string name="bg_user_sound_notification_button_mute" msgid="4942158515665615243">"خاموش کریں"</string>
<string name="bg_user_sound_notification_message" msgid="8613881975316976673">"آواز کو خاموش کرنے کے لیے تھپتھپائیں"</string>
diff --git a/core/tests/GameManagerTests/src/android/app/GameManagerTests.java b/core/tests/GameManagerTests/src/android/app/GameManagerTests.java
index d34c91e..e81cdee9 100644
--- a/core/tests/GameManagerTests/src/android/app/GameManagerTests.java
+++ b/core/tests/GameManagerTests/src/android/app/GameManagerTests.java
@@ -22,7 +22,10 @@
import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertNull;
+import static org.junit.Assume.assumeNotNull;
+
import android.content.Context;
+import android.content.pm.PackageManager;
import android.platform.test.annotations.Presubmit;
import androidx.test.filters.SmallTest;
@@ -47,6 +50,9 @@
public void setUp() {
mContext = getInstrumentation().getContext();
mGameManager = mContext.getSystemService(GameManager.class);
+ if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH)) {
+ assumeNotNull(mGameManager);
+ }
mPackageName = mContext.getPackageName();
// Reset the Game Mode for the test app, since it persists across invocations.
diff --git a/core/tests/coretests/Android.bp b/core/tests/coretests/Android.bp
index d98836f..e9ce712 100644
--- a/core/tests/coretests/Android.bp
+++ b/core/tests/coretests/Android.bp
@@ -104,6 +104,7 @@
"mockito-target-extended-minus-junit4",
"TestParameterInjector",
"android.content.res.flags-aconfig-java",
+ "android.security.flags-aconfig-java",
],
libs: [
diff --git a/core/tests/coretests/src/android/content/IntentTest.java b/core/tests/coretests/src/android/content/IntentTest.java
new file mode 100644
index 0000000..d169ce3
--- /dev/null
+++ b/core/tests/coretests/src/android/content/IntentTest.java
@@ -0,0 +1,99 @@
+/*
+ * 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.content;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertEquals;
+
+import android.net.Uri;
+import android.os.Binder;
+import android.os.IBinder;
+import android.os.Parcel;
+import android.platform.test.annotations.Presubmit;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
+import android.security.Flags;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Build/Install/Run:
+ * atest FrameworksCoreTests:IntentTest
+ */
+@Presubmit
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class IntentTest {
+ private static final String TEST_ACTION = "android.content.IntentTest_test";
+ private static final String TEST_EXTRA_NAME = "testExtraName";
+ private static final Uri TEST_URI = Uri.parse("content://com.example/people");
+
+ @Rule
+ public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_PREVENT_INTENT_REDIRECT)
+ public void testReadFromParcelWithExtraIntentKeys() {
+ Intent intent = new Intent("TEST_ACTION");
+ intent.putExtra(TEST_EXTRA_NAME, new Intent(TEST_ACTION));
+ intent.putExtra(TEST_EXTRA_NAME + "2", 1);
+
+ intent.collectExtraIntentKeys();
+ final Parcel parcel = Parcel.obtain();
+ intent.writeToParcel(parcel, 0);
+ parcel.setDataPosition(0);
+ final Intent target = new Intent();
+ target.readFromParcel(parcel);
+
+ assertEquals(intent.getAction(), target.getAction());
+ assertEquals(intent.getExtraIntentKeys(), target.getExtraIntentKeys());
+ assertThat(intent.getExtraIntentKeys()).hasSize(1);
+ }
+
+ @Test
+ public void testCreatorTokenInfo() {
+ Intent intent = new Intent(TEST_ACTION);
+ IBinder creatorToken = new Binder();
+
+ intent.setCreatorToken(creatorToken);
+ assertThat(intent.getCreatorToken()).isEqualTo(creatorToken);
+
+ intent.removeCreatorTokenInfo();
+ assertThat(intent.getCreatorToken()).isNull();
+ }
+
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_PREVENT_INTENT_REDIRECT)
+ public void testCollectExtraIntentKeys() {
+ Intent intent = new Intent(TEST_ACTION);
+ Intent extraIntent = new Intent(TEST_ACTION, TEST_URI);
+ intent.putExtra(TEST_EXTRA_NAME, extraIntent);
+
+ intent.collectExtraIntentKeys();
+
+ assertThat(intent.getExtraIntentKeys()).hasSize(1);
+ assertThat(intent.getExtraIntentKeys()).contains(TEST_EXTRA_NAME);
+ }
+
+}
diff --git a/core/tests/coretests/src/android/window/WindowOnBackInvokedDispatcherTest.java b/core/tests/coretests/src/android/window/WindowOnBackInvokedDispatcherTest.java
index 46dfcb5..25f458e 100644
--- a/core/tests/coretests/src/android/window/WindowOnBackInvokedDispatcherTest.java
+++ b/core/tests/coretests/src/android/window/WindowOnBackInvokedDispatcherTest.java
@@ -103,15 +103,7 @@
private int mCallbackInfoCalls = 0;
- private final BackMotionEvent mBackEvent = new BackMotionEvent(
- /* touchX = */ 0,
- /* touchY = */ 0,
- /* progress = */ 0,
- /* velocityX = */ 0,
- /* velocityY = */ 0,
- /* triggerBack = */ false,
- /* swipeEdge = */ BackEvent.EDGE_LEFT,
- /* departingAnimationTarget = */ null);
+ private final BackMotionEvent mBackEvent = backMotionEventFrom(/* progress */ 0f);
private final MotionEvent mMotionEvent =
MotionEvent.obtain(0, 0, MotionEvent.ACTION_MOVE, 100, 100, 0);
@@ -558,6 +550,7 @@
OnBackInvokedCallbackInfo callbackInfo = assertSetCallbackInfo();
callbackInfo.getCallback().onBackStarted(mBackEvent);
+ callbackInfo.getCallback().onBackProgressed(backMotionEventFrom(/* progress */ 0.5f));
waitForIdle();
assertTrue(mDispatcher.mProgressAnimator.isBackAnimationInProgress());
@@ -575,6 +568,18 @@
assertFalse(mDispatcher.mProgressAnimator.isBackAnimationInProgress());
}
+ private BackMotionEvent backMotionEventFrom(float progress) {
+ return new BackMotionEvent(
+ /* touchX = */ 0,
+ /* touchY = */ 0,
+ /* progress = */ progress,
+ /* velocityX = */ 0,
+ /* velocityY = */ 0,
+ /* triggerBack = */ false,
+ /* swipeEdge = */ BackEvent.EDGE_LEFT,
+ /* departingAnimationTarget = */ null);
+ }
+
private void verifyImeCallackRegistrations() throws RemoteException {
// verify default callback is replaced with ImeBackAnimationController
mDispatcher.registerOnBackInvokedCallbackUnchecked(mDefaultImeCallback, PRIORITY_DEFAULT);
diff --git a/core/tests/screenshothelpertests/src/com/android/internal/util/ScreenshotRequestTest.java b/core/tests/screenshothelpertests/src/com/android/internal/util/ScreenshotRequestTest.java
index 89acbc7..0ce403e 100644
--- a/core/tests/screenshothelpertests/src/com/android/internal/util/ScreenshotRequestTest.java
+++ b/core/tests/screenshothelpertests/src/com/android/internal/util/ScreenshotRequestTest.java
@@ -35,6 +35,7 @@
import android.graphics.Rect;
import android.hardware.HardwareBuffer;
import android.os.Parcel;
+import android.view.Display;
import androidx.test.runner.AndroidJUnit4;
@@ -64,10 +65,12 @@
assertNull("Bitmap was expected to be null", out.getBitmap());
assertNull("Bounds were expected to be null", out.getBoundsInScreen());
assertEquals(Insets.NONE, out.getInsets());
+ assertEquals(Display.INVALID_DISPLAY, out.getDisplayId());
}
@Test
public void testProvidedScreenshot() {
+ int displayId = 5;
Bitmap bitmap = makeHardwareBitmap(50, 50);
ScreenshotRequest in =
new ScreenshotRequest.Builder(TAKE_SCREENSHOT_PROVIDED_IMAGE, SCREENSHOT_OTHER)
@@ -77,6 +80,7 @@
.setBitmap(bitmap)
.setBoundsOnScreen(new Rect(10, 10, 60, 60))
.setInsets(Insets.of(2, 3, 4, 5))
+ .setDisplayId(displayId)
.build();
Parcel parcel = Parcel.obtain();
@@ -92,6 +96,7 @@
assertTrue("Bitmaps should be equal", out.getBitmap().sameAs(bitmap));
assertEquals(new Rect(10, 10, 60, 60), out.getBoundsInScreen());
assertEquals(Insets.of(2, 3, 4, 5), out.getInsets());
+ assertEquals(displayId, out.getDisplayId());
}
@Test
diff --git a/core/tests/systemproperties/src/android/os/SystemPropertiesTest.java b/core/tests/systemproperties/src/android/os/SystemPropertiesTest.java
index d98120f..75aca1b 100644
--- a/core/tests/systemproperties/src/android/os/SystemPropertiesTest.java
+++ b/core/tests/systemproperties/src/android/os/SystemPropertiesTest.java
@@ -23,11 +23,10 @@
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
-import android.platform.test.ravenwood.RavenwoodRule;
+import android.platform.test.ravenwood.RavenwoodConfig;
import androidx.test.filters.SmallTest;
-import org.junit.Rule;
import org.junit.Test;
import java.util.Objects;
@@ -35,16 +34,18 @@
import java.util.concurrent.TimeUnit;
public class SystemPropertiesTest {
- @Rule
- public final RavenwoodRule mRavenwood = new RavenwoodRule.Builder()
- .setSystemPropertyMutable(KEY, null)
- .setSystemPropertyMutable(UNSET_KEY, null)
- .setSystemPropertyMutable(PERSIST_KEY, null)
- .build();
-
private static final String KEY = "sys.testkey";
private static final String UNSET_KEY = "Aiw7woh6ie4toh7W";
private static final String PERSIST_KEY = "persist.sys.testkey";
+ private static final String NONEXIST_KEY = "doesnotexist_2341431";
+
+ @RavenwoodConfig.Config
+ public static final RavenwoodConfig mRavenwood = new RavenwoodConfig.Builder()
+ .setSystemPropertyMutable(KEY, null)
+ .setSystemPropertyMutable(UNSET_KEY, null)
+ .setSystemPropertyMutable(PERSIST_KEY, null)
+ .setSystemPropertyImmutable(NONEXIST_KEY, null)
+ .build();
@Test
@SmallTest
@@ -117,7 +118,7 @@
@SmallTest
public void testHandle() throws Exception {
String value;
- SystemProperties.Handle handle = SystemProperties.find("doesnotexist_2341431");
+ SystemProperties.Handle handle = SystemProperties.find(NONEXIST_KEY);
assertNull(handle);
SystemProperties.set(KEY, "abc");
handle = SystemProperties.find(KEY);
diff --git a/libs/WindowManager/Shell/aconfig/multitasking.aconfig b/libs/WindowManager/Shell/aconfig/multitasking.aconfig
index 526ccd5..63a2880 100644
--- a/libs/WindowManager/Shell/aconfig/multitasking.aconfig
+++ b/libs/WindowManager/Shell/aconfig/multitasking.aconfig
@@ -122,6 +122,16 @@
}
flag {
+ name: "enable_shell_top_task_tracking"
+ namespace: "multitasking"
+ description: "Enables tracking top tasks from the shell"
+ bug: "342627272"
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+}
+
+flag {
name: "enable_bubble_bar_in_persistent_task_bar"
namespace: "multitasking"
description: "Enable bubble bar to be shown in the persistent task bar"
diff --git a/libs/WindowManager/Shell/res/values-af/strings.xml b/libs/WindowManager/Shell/res/values-af/strings.xml
index e50d8dc..50aa4ca 100644
--- a/libs/WindowManager/Shell/res/values-af/strings.xml
+++ b/libs/WindowManager/Shell/res/values-af/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"Skermskoot"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"Maak in blaaier oop"</string>
<string name="new_window_text" msgid="6318648868380652280">"Nuwe venster"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"Bestuur vensters"</string>
<string name="close_text" msgid="4986518933445178928">"Maak toe"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Maak kieslys toe"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Maak kieslys oop"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maksimeer skerm"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Gryp skerm vas"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Hierdie app se grootte kan nie verander word nie"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-am/strings.xml b/libs/WindowManager/Shell/res/values-am/strings.xml
index f29bbe7..281e313 100644
--- a/libs/WindowManager/Shell/res/values-am/strings.xml
+++ b/libs/WindowManager/Shell/res/values-am/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"ቅጽበታዊ ገፅ ዕይታ"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"በአሳሽ ውስጥ ክፈት"</string>
<string name="new_window_text" msgid="6318648868380652280">"አዲስ መስኮት"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"መስኮቶችን አስተዳድር"</string>
<string name="close_text" msgid="4986518933445178928">"ዝጋ"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"ምናሌ ዝጋ"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"ምናሌን ክፈት"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"የማያ ገጹ መጠን አሳድግ"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"ማያ ገጹን አሳድግ"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"ይህ መተግበሪያ መጠኑ ሊቀየር አይችልም"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ar/strings.xml b/libs/WindowManager/Shell/res/values-ar/strings.xml
index d76a2a5..2c0b34a 100644
--- a/libs/WindowManager/Shell/res/values-ar/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ar/strings.xml
@@ -126,8 +126,15 @@
<string name="manage_windows_text" msgid="5567366688493093920">"إدارة النوافذ"</string>
<string name="close_text" msgid="4986518933445178928">"إغلاق"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"إغلاق القائمة"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"فتح القائمة"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"تكبير الشاشة إلى أقصى حدّ"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"التقاط صورة للشاشة"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"لا يمكن تغيير حجم نافذة هذا التطبيق"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-as/strings.xml b/libs/WindowManager/Shell/res/values-as/strings.xml
index 1fe79ac..c5e3716 100644
--- a/libs/WindowManager/Shell/res/values-as/strings.xml
+++ b/libs/WindowManager/Shell/res/values-as/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"স্ক্ৰীনশ্বট"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"ব্ৰাউজাৰত খোলক"</string>
<string name="new_window_text" msgid="6318648868380652280">"নতুন ৱিণ্ড’"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"ৱিণ্ড’ পৰিচালনা কৰক"</string>
<string name="close_text" msgid="4986518933445178928">"বন্ধ কৰক"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"মেনু বন্ধ কৰক"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"মেনু খোলক"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"স্ক্ৰীন মেক্সিমাইজ কৰক"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"স্ক্ৰীন স্নেপ কৰক"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"এই এপ্টোৰ আকাৰ সলনি কৰিব নোৱাৰি"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-az/strings.xml b/libs/WindowManager/Shell/res/values-az/strings.xml
index 2992655..e23e8d0 100644
--- a/libs/WindowManager/Shell/res/values-az/strings.xml
+++ b/libs/WindowManager/Shell/res/values-az/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"Skrinşot"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"Brauzerdə açın"</string>
<string name="new_window_text" msgid="6318648868380652280">"Yeni pəncərə"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"Pəncərələri idarə edin"</string>
<string name="close_text" msgid="4986518933445178928">"Bağlayın"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Menyunu bağlayın"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Menyunu açın"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Ekranı maksimum böyüdün"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Ekranı çəkin"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Bu tətbiqin ölçüsünü dəyişmək olmur"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
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 12f1418..283d1f5 100644
--- a/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml
+++ b/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml
@@ -126,8 +126,15 @@
<string name="manage_windows_text" msgid="5567366688493093920">"Upravljajte prozorima"</string>
<string name="close_text" msgid="4986518933445178928">"Zatvorite"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Zatvorite meni"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Otvorite meni"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Povećaj ekran"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Uklopi ekran"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Veličina ove aplikacije ne može da se promeni"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-be/strings.xml b/libs/WindowManager/Shell/res/values-be/strings.xml
index 8aa43f7..48914f1 100644
--- a/libs/WindowManager/Shell/res/values-be/strings.xml
+++ b/libs/WindowManager/Shell/res/values-be/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"Здымак экрана"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"Адкрыць у браўзеры"</string>
<string name="new_window_text" msgid="6318648868380652280">"Новае акно"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"Кіраваць вокнамі"</string>
<string name="close_text" msgid="4986518933445178928">"Закрыць"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Закрыць меню"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Адкрыць меню"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Разгарнуць на ўвесь экран"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Размясціць на палавіне экрана"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Немагчыма змяніць памер праграмы"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-bg/strings.xml b/libs/WindowManager/Shell/res/values-bg/strings.xml
index b84778b..b385d28 100644
--- a/libs/WindowManager/Shell/res/values-bg/strings.xml
+++ b/libs/WindowManager/Shell/res/values-bg/strings.xml
@@ -126,8 +126,15 @@
<string name="manage_windows_text" msgid="5567366688493093920">"Управление на прозорците"</string>
<string name="close_text" msgid="4986518933445178928">"Затваряне"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Затваряне на менюто"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Отваряне на менюто"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Увеличаване на екрана"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Прилепване на екрана"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Това приложение не може да бъде преоразмерено"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-bn/strings.xml b/libs/WindowManager/Shell/res/values-bn/strings.xml
index 5e47e2a..56fcf7f 100644
--- a/libs/WindowManager/Shell/res/values-bn/strings.xml
+++ b/libs/WindowManager/Shell/res/values-bn/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"স্ক্রিনশট"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"ব্রাউজারে খুলুন"</string>
<string name="new_window_text" msgid="6318648868380652280">"নতুন উইন্ডো"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"উইন্ডো ম্যানেজ করুন"</string>
<string name="close_text" msgid="4986518933445178928">"বন্ধ করুন"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"\'মেনু\' বন্ধ করুন"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"মেনু খুলুন"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"স্ক্রিন বড় করুন"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"স্ক্রিনে অ্যাপ মানানসই হিসেবে ছোট বড় করুন"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"এই অ্যাপ ছোট বড় করা যাবে না"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-bs/strings.xml b/libs/WindowManager/Shell/res/values-bs/strings.xml
index bd7cddd..95362bb 100644
--- a/libs/WindowManager/Shell/res/values-bs/strings.xml
+++ b/libs/WindowManager/Shell/res/values-bs/strings.xml
@@ -126,8 +126,15 @@
<string name="manage_windows_text" msgid="5567366688493093920">"Upravljanje prozorima"</string>
<string name="close_text" msgid="4986518933445178928">"Zatvaranje"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Zatvaranje menija"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Otvaranje menija"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maksimiziraj ekran"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Snimi ekran"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Nije moguće promijeniti veličinu aplikacije"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ca/strings.xml b/libs/WindowManager/Shell/res/values-ca/strings.xml
index af54037..e0b2538 100644
--- a/libs/WindowManager/Shell/res/values-ca/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ca/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"Captura de pantalla"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"Obre al navegador"</string>
<string name="new_window_text" msgid="6318648868380652280">"Finestra nova"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"Gestiona les finestres"</string>
<string name="close_text" msgid="4986518933445178928">"Tanca"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Tanca el menú"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Obre el menú"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximitza la pantalla"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Ajusta la pantalla"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"No es pot canviar la mida d\'aquesta aplicació"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-cs/strings.xml b/libs/WindowManager/Shell/res/values-cs/strings.xml
index dd4802e..3aae52e 100644
--- a/libs/WindowManager/Shell/res/values-cs/strings.xml
+++ b/libs/WindowManager/Shell/res/values-cs/strings.xml
@@ -126,8 +126,15 @@
<string name="manage_windows_text" msgid="5567366688493093920">"Spravovat okna"</string>
<string name="close_text" msgid="4986518933445178928">"Zavřít"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Zavřít nabídku"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Otevřít nabídku"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximalizovat obrazovku"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Rozpůlit obrazovku"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Velikost aplikace nelze změnit"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-da/strings.xml b/libs/WindowManager/Shell/res/values-da/strings.xml
index fca92a1..fdc5913 100644
--- a/libs/WindowManager/Shell/res/values-da/strings.xml
+++ b/libs/WindowManager/Shell/res/values-da/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"Screenshot"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"Åbn i browser"</string>
<string name="new_window_text" msgid="6318648868380652280">"Nyt vindue"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"Administrer vinduer"</string>
<string name="close_text" msgid="4986518933445178928">"Luk"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Luk menu"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Åbn menu"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maksimér skærm"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Tilpas skærm"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Størrelsen på denne app kan ikke justeres"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-de/strings.xml b/libs/WindowManager/Shell/res/values-de/strings.xml
index 512bd7a..913e3d0 100644
--- a/libs/WindowManager/Shell/res/values-de/strings.xml
+++ b/libs/WindowManager/Shell/res/values-de/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"Screenshot"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"Im Browser öffnen"</string>
<string name="new_window_text" msgid="6318648868380652280">"Neues Fenster"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"Fenster verwalten"</string>
<string name="close_text" msgid="4986518933445178928">"Schließen"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Menü schließen"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Menü öffnen"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Bildschirm maximieren"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Bildschirm teilen"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Die Größe dieser App kann nicht geändert werden"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-el/strings.xml b/libs/WindowManager/Shell/res/values-el/strings.xml
index f66d874..564fa91 100644
--- a/libs/WindowManager/Shell/res/values-el/strings.xml
+++ b/libs/WindowManager/Shell/res/values-el/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"Στιγμιότυπο οθόνης"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"Άνοιγμα σε πρόγραμμα περιήγησης"</string>
<string name="new_window_text" msgid="6318648868380652280">"Νέο παράθυρο"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"Διαχείριση παραθύρων"</string>
<string name="close_text" msgid="4986518933445178928">"Κλείσιμο"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Κλείσιμο μενού"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Άνοιγμα μενού"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Μεγιστοποίηση οθόνης"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Προβολή στο μισό της οθόνης"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Δεν είναι δυνατή η αλλαγή μεγέθους αυτής της εφαρμογής"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-en-rAU/strings.xml b/libs/WindowManager/Shell/res/values-en-rAU/strings.xml
index 0b11cb5..e4ece93 100644
--- a/libs/WindowManager/Shell/res/values-en-rAU/strings.xml
+++ b/libs/WindowManager/Shell/res/values-en-rAU/strings.xml
@@ -126,8 +126,15 @@
<string name="manage_windows_text" msgid="5567366688493093920">"Manage windows"</string>
<string name="close_text" msgid="4986518933445178928">"Close"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Close menu"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Open menu"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximise screen"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Snap screen"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"This app can\'t be resized"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-en-rCA/strings.xml b/libs/WindowManager/Shell/res/values-en-rCA/strings.xml
index a09e1e9..14fe60b 100644
--- a/libs/WindowManager/Shell/res/values-en-rCA/strings.xml
+++ b/libs/WindowManager/Shell/res/values-en-rCA/strings.xml
@@ -126,8 +126,15 @@
<string name="manage_windows_text" msgid="5567366688493093920">"Manage Windows"</string>
<string name="close_text" msgid="4986518933445178928">"Close"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Close Menu"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Open Menu"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximize Screen"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Snap Screen"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"This app can\'t be resized"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-en-rGB/strings.xml b/libs/WindowManager/Shell/res/values-en-rGB/strings.xml
index 0b11cb5..e4ece93 100644
--- a/libs/WindowManager/Shell/res/values-en-rGB/strings.xml
+++ b/libs/WindowManager/Shell/res/values-en-rGB/strings.xml
@@ -126,8 +126,15 @@
<string name="manage_windows_text" msgid="5567366688493093920">"Manage windows"</string>
<string name="close_text" msgid="4986518933445178928">"Close"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Close menu"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Open menu"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximise screen"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Snap screen"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"This app can\'t be resized"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-en-rIN/strings.xml b/libs/WindowManager/Shell/res/values-en-rIN/strings.xml
index 0b11cb5..e4ece93 100644
--- a/libs/WindowManager/Shell/res/values-en-rIN/strings.xml
+++ b/libs/WindowManager/Shell/res/values-en-rIN/strings.xml
@@ -126,8 +126,15 @@
<string name="manage_windows_text" msgid="5567366688493093920">"Manage windows"</string>
<string name="close_text" msgid="4986518933445178928">"Close"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Close menu"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Open menu"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximise screen"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Snap screen"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"This app can\'t be resized"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-en-rXC/strings.xml b/libs/WindowManager/Shell/res/values-en-rXC/strings.xml
index 7662a14..dda97ab 100644
--- a/libs/WindowManager/Shell/res/values-en-rXC/strings.xml
+++ b/libs/WindowManager/Shell/res/values-en-rXC/strings.xml
@@ -126,8 +126,15 @@
<string name="manage_windows_text" msgid="5567366688493093920">"Manage Windows"</string>
<string name="close_text" msgid="4986518933445178928">"Close"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Close Menu"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Open Menu"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximize Screen"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Snap Screen"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"This app can\'t be resized"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-es-rUS/strings.xml b/libs/WindowManager/Shell/res/values-es-rUS/strings.xml
index 7a324e3..a4c0363 100644
--- a/libs/WindowManager/Shell/res/values-es-rUS/strings.xml
+++ b/libs/WindowManager/Shell/res/values-es-rUS/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"Captura de pantalla"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"Abrir en el navegador"</string>
<string name="new_window_text" msgid="6318648868380652280">"Nueva ventana"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"Administrar ventanas"</string>
<string name="close_text" msgid="4986518933445178928">"Cerrar"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Cerrar menú"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Abrir el menú"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximizar pantalla"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Ajustar pantalla"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"No se puede cambiar el tamaño de esta app"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-es/strings.xml b/libs/WindowManager/Shell/res/values-es/strings.xml
index 27272aa..69f7d7b 100644
--- a/libs/WindowManager/Shell/res/values-es/strings.xml
+++ b/libs/WindowManager/Shell/res/values-es/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"Captura de pantalla"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"Abrir en el navegador"</string>
<string name="new_window_text" msgid="6318648868380652280">"Ventana nueva"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"Gestionar ventanas"</string>
<string name="close_text" msgid="4986518933445178928">"Cerrar"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Cerrar menú"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Abrir menú"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximizar pantalla"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Ajustar pantalla"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"No se puede cambiar el tamaño de esta aplicación"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-et/strings.xml b/libs/WindowManager/Shell/res/values-et/strings.xml
index d859f01..3d929f6 100644
--- a/libs/WindowManager/Shell/res/values-et/strings.xml
+++ b/libs/WindowManager/Shell/res/values-et/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"Ekraanipilt"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"Avamine brauseris"</string>
<string name="new_window_text" msgid="6318648868380652280">"Uus aken"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"Akende haldamine"</string>
<string name="close_text" msgid="4986518933445178928">"Sule"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Sule menüü"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Ava menüü"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Kuva täisekraanil"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Kuva poolel ekraanil"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Selle rakenduse aknasuurust ei saa muuta"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-eu/strings.xml b/libs/WindowManager/Shell/res/values-eu/strings.xml
index 999960b..39bcf08 100644
--- a/libs/WindowManager/Shell/res/values-eu/strings.xml
+++ b/libs/WindowManager/Shell/res/values-eu/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"Pantaila-argazkia"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"Ireki arakatzailean"</string>
<string name="new_window_text" msgid="6318648868380652280">"Leiho berria"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"Kudeatu leihoak"</string>
<string name="close_text" msgid="4986518933445178928">"Itxi"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Itxi menua"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Ireki menua"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Handitu pantaila"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Zatitu pantaila"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Ezin zaio aldatu tamaina aplikazio honi"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-fa/strings.xml b/libs/WindowManager/Shell/res/values-fa/strings.xml
index e31a6ca..9f607bf 100644
--- a/libs/WindowManager/Shell/res/values-fa/strings.xml
+++ b/libs/WindowManager/Shell/res/values-fa/strings.xml
@@ -126,8 +126,15 @@
<string name="manage_windows_text" msgid="5567366688493093920">"مدیریت کردن پنجرهها"</string>
<string name="close_text" msgid="4986518933445178928">"بستن"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"بستن منو"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"باز کردن منو"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"بزرگ کردن صفحه"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"بزرگ کردن صفحه"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"اندازه این برنامه را نمیتوان تغییر داد"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-fi/strings.xml b/libs/WindowManager/Shell/res/values-fi/strings.xml
index 71c3e36..04b6241 100644
--- a/libs/WindowManager/Shell/res/values-fi/strings.xml
+++ b/libs/WindowManager/Shell/res/values-fi/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"Kuvakaappaus"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"Avaa selaimessa"</string>
<string name="new_window_text" msgid="6318648868380652280">"Uusi ikkuna"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"Hallinnoi ikkunoita"</string>
<string name="close_text" msgid="4986518933445178928">"Sulje"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Sulje valikko"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Avaa valikko"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Suurenna näyttö"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Jaa näyttö"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Tämän sovellusikkunan kokoa ei voi muuttaa"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml b/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml
index 790a296..7312952 100644
--- a/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml
+++ b/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"Capture d\'écran"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"Ouvrir dans le navigateur"</string>
<string name="new_window_text" msgid="6318648868380652280">"Nouvelle fenêtre"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"Gérer les fenêtres"</string>
<string name="close_text" msgid="4986518933445178928">"Fermer"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Fermer le menu"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Ouvrir le menu"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Agrandir l\'écran"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Aligner l\'écran"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Impossible de redimensionner cette appli"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-fr/strings.xml b/libs/WindowManager/Shell/res/values-fr/strings.xml
index 3472edd..8f4e58f 100644
--- a/libs/WindowManager/Shell/res/values-fr/strings.xml
+++ b/libs/WindowManager/Shell/res/values-fr/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"Capture d\'écran"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"Ouvrir dans un navigateur"</string>
<string name="new_window_text" msgid="6318648868380652280">"Nouvelle fenêtre"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"Gérer les fenêtres"</string>
<string name="close_text" msgid="4986518933445178928">"Fermer"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Fermer le menu"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Ouvrir le menu"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Mettre en plein écran"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Fractionner l\'écran"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Impossible de redimensionner cette appli"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-gl/strings.xml b/libs/WindowManager/Shell/res/values-gl/strings.xml
index 31cb71d..5c0aa07 100644
--- a/libs/WindowManager/Shell/res/values-gl/strings.xml
+++ b/libs/WindowManager/Shell/res/values-gl/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"Captura de pantalla"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"Abrir no navegador"</string>
<string name="new_window_text" msgid="6318648868380652280">"Ventá nova"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"Xestionar as ventás"</string>
<string name="close_text" msgid="4986518933445178928">"Pechar"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Pechar o menú"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Abrir menú"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximizar pantalla"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Encaixar pantalla"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Non se pode cambiar o tamaño desta aplicación"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-gu/strings.xml b/libs/WindowManager/Shell/res/values-gu/strings.xml
index e1f5806..a382d0b 100644
--- a/libs/WindowManager/Shell/res/values-gu/strings.xml
+++ b/libs/WindowManager/Shell/res/values-gu/strings.xml
@@ -126,8 +126,15 @@
<string name="manage_windows_text" msgid="5567366688493093920">"વિન્ડો મેનેજ કરો"</string>
<string name="close_text" msgid="4986518933445178928">"બંધ કરો"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"મેનૂ બંધ કરો"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"મેનૂ ખોલો"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"સ્ક્રીન કરો મોટી કરો"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"સ્ક્રીન સ્નૅપ કરો"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"આ ઍપના કદમાં વધઘટ કરી શકાતો નથી"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-hi/strings.xml b/libs/WindowManager/Shell/res/values-hi/strings.xml
index cea4b23..d6fc85b 100644
--- a/libs/WindowManager/Shell/res/values-hi/strings.xml
+++ b/libs/WindowManager/Shell/res/values-hi/strings.xml
@@ -126,8 +126,15 @@
<string name="manage_windows_text" msgid="5567366688493093920">"विंडो मैनेज करें"</string>
<string name="close_text" msgid="4986518933445178928">"बंद करें"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"मेन्यू बंद करें"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"मेन्यू खोलें"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"स्क्रीन को बड़ा करें"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"स्नैप स्क्रीन"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"इस ऐप्लिकेशन का साइज़ नहीं बदला जा सकता"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-hr/strings.xml b/libs/WindowManager/Shell/res/values-hr/strings.xml
index 23cddbc..f233c02 100644
--- a/libs/WindowManager/Shell/res/values-hr/strings.xml
+++ b/libs/WindowManager/Shell/res/values-hr/strings.xml
@@ -126,8 +126,15 @@
<string name="manage_windows_text" msgid="5567366688493093920">"Upravljanje prozorima"</string>
<string name="close_text" msgid="4986518933445178928">"Zatvorite"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Zatvorite izbornik"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Otvaranje izbornika"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maksimalno povećaj zaslon"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Izradi snimku zaslona"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Nije moguće promijeniti veličinu aplikacije"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-hu/strings.xml b/libs/WindowManager/Shell/res/values-hu/strings.xml
index e3c3ced..aaa4e26 100644
--- a/libs/WindowManager/Shell/res/values-hu/strings.xml
+++ b/libs/WindowManager/Shell/res/values-hu/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"Képernyőkép"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"Megnyitás böngészőben"</string>
<string name="new_window_text" msgid="6318648868380652280">"Új ablak"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"Ablakok kezelése"</string>
<string name="close_text" msgid="4986518933445178928">"Bezárás"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Menü bezárása"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Menü megnyitása"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Képernyő méretének maximalizálása"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Igazodás a képernyő adott részéhez"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Ezt az alkalmazást nem lehet átméretezni"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-hy/strings.xml b/libs/WindowManager/Shell/res/values-hy/strings.xml
index 56b609b..cd21faa 100644
--- a/libs/WindowManager/Shell/res/values-hy/strings.xml
+++ b/libs/WindowManager/Shell/res/values-hy/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"Սքրինշոթ"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"Բացել դիտարկիչում"</string>
<string name="new_window_text" msgid="6318648868380652280">"Նոր պատուհան"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"Կառավարել պատուհանները"</string>
<string name="close_text" msgid="4986518933445178928">"Փակել"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Փակել ընտրացանկը"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Բացել ընտրացանկը"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Ծավալել էկրանը"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Ծալել էկրանը"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Այս հավելվածի չափը հնարավոր չէ փոխել"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-in/strings.xml b/libs/WindowManager/Shell/res/values-in/strings.xml
index a83d51e..ba0683d 100644
--- a/libs/WindowManager/Shell/res/values-in/strings.xml
+++ b/libs/WindowManager/Shell/res/values-in/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"Screenshot"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"Buka di browser"</string>
<string name="new_window_text" msgid="6318648868380652280">"Jendela Baru"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"Kelola Jendela"</string>
<string name="close_text" msgid="4986518933445178928">"Tutup"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Tutup Menu"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Buka Menu"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Perbesar Layar"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Gabungkan Layar"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Ukuran aplikasi ini tidak dapat diubah"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-is/strings.xml b/libs/WindowManager/Shell/res/values-is/strings.xml
index e7590cb..b427eaf 100644
--- a/libs/WindowManager/Shell/res/values-is/strings.xml
+++ b/libs/WindowManager/Shell/res/values-is/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"Skjámynd"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"Opna í vafra"</string>
<string name="new_window_text" msgid="6318648868380652280">"Nýr gluggi"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"Stjórna gluggum"</string>
<string name="close_text" msgid="4986518933445178928">"Loka"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Loka valmynd"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Opna valmynd"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Stækka skjá"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Smelluskjár"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Ekki er hægt að breyta stærð þessa forrits"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-it/strings.xml b/libs/WindowManager/Shell/res/values-it/strings.xml
index bd74fbe..9eb9d4e 100644
--- a/libs/WindowManager/Shell/res/values-it/strings.xml
+++ b/libs/WindowManager/Shell/res/values-it/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"Screenshot"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"Apri nel browser"</string>
<string name="new_window_text" msgid="6318648868380652280">"Nuova finestra"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"Gestisci finestre"</string>
<string name="close_text" msgid="4986518933445178928">"Chiudi"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Chiudi il menu"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Apri menu"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Massimizza schermo"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Aggancia schermo"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Non è possibile ridimensionare questa app"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-iw/strings.xml b/libs/WindowManager/Shell/res/values-iw/strings.xml
index d8533bb..3e82198 100644
--- a/libs/WindowManager/Shell/res/values-iw/strings.xml
+++ b/libs/WindowManager/Shell/res/values-iw/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"צילום מסך"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"פתיחה בדפדפן"</string>
<string name="new_window_text" msgid="6318648868380652280">"חלון חדש"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"ניהול החלונות"</string>
<string name="close_text" msgid="4986518933445178928">"סגירה"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"סגירת התפריט"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"פתיחת התפריט"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"הגדלת המסך"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"כיווץ המסך"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"לא ניתן לשנות את גודל החלון של האפליקציה הזו"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ja/strings.xml b/libs/WindowManager/Shell/res/values-ja/strings.xml
index 26540c7..5d8dc5e 100644
--- a/libs/WindowManager/Shell/res/values-ja/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ja/strings.xml
@@ -126,8 +126,15 @@
<string name="manage_windows_text" msgid="5567366688493093920">"ウィンドウを管理する"</string>
<string name="close_text" msgid="4986518933445178928">"閉じる"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"メニューを閉じる"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"メニューを開く"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"画面の最大化"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"画面のスナップ"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"このアプリはサイズ変更できません"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ka/strings.xml b/libs/WindowManager/Shell/res/values-ka/strings.xml
index d2fbcb1..de08b9c 100644
--- a/libs/WindowManager/Shell/res/values-ka/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ka/strings.xml
@@ -126,8 +126,15 @@
<string name="manage_windows_text" msgid="5567366688493093920">"ფანჯრების მართვა"</string>
<string name="close_text" msgid="4986518933445178928">"დახურვა"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"მენიუს დახურვა"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"მენიუს გახსნა"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"აპლიკაციის გაშლა სრულ ეკრანზე"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"აპლიკაციის დაპატარავება ეკრანზე"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"აპის ზომის შეცვლა შეუძლებელია"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-kk/strings.xml b/libs/WindowManager/Shell/res/values-kk/strings.xml
index 43c2f83..dd4e5c9 100644
--- a/libs/WindowManager/Shell/res/values-kk/strings.xml
+++ b/libs/WindowManager/Shell/res/values-kk/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"Скриншот"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"Браузерден ашу"</string>
<string name="new_window_text" msgid="6318648868380652280">"Жаңа терезе"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"Терезелерді басқару"</string>
<string name="close_text" msgid="4986518933445178928">"Жабу"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Мәзірді жабу"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Мәзірді ашу"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Экранды ұлғайту"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Экранды бөлу"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Бұл қолданбаның өлшемі өзгертілмейді."</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-km/strings.xml b/libs/WindowManager/Shell/res/values-km/strings.xml
index c0bf1bf..96fe62e 100644
--- a/libs/WindowManager/Shell/res/values-km/strings.xml
+++ b/libs/WindowManager/Shell/res/values-km/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"រូបថតអេក្រង់"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"បើកក្នុងកម្មវិធីរុករកតាមអ៊ីនធឺណិត"</string>
<string name="new_window_text" msgid="6318648868380652280">"វិនដូថ្មី"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"គ្រប់គ្រងវិនដូ"</string>
<string name="close_text" msgid="4986518933445178928">"បិទ"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"បិទម៉ឺនុយ"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"បើកម៉ឺនុយ"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"ពង្រីកអេក្រង់"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"ថតអេក្រង់"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"មិនអាចប្ដូរទំហំកម្មវិធីនេះបានទេ"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-kn/strings.xml b/libs/WindowManager/Shell/res/values-kn/strings.xml
index 92b8ad4..b38f744 100644
--- a/libs/WindowManager/Shell/res/values-kn/strings.xml
+++ b/libs/WindowManager/Shell/res/values-kn/strings.xml
@@ -34,8 +34,8 @@
<string name="dock_forced_resizable" msgid="7429086980048964687">"ಸ್ಪ್ಲಿಟ್ ಸ್ಕ್ರೀನ್ನಲ್ಲಿ ಆ್ಯಪ್ ಕೆಲಸ ಮಾಡದೇ ಇರಬಹುದು"</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"ಸ್ಪ್ಲಿಟ್ ಸ್ಕ್ರೀನ್ ಅನ್ನು ಆ್ಯಪ್ ಬೆಂಬಲಿಸುವುದಿಲ್ಲ"</string>
<string name="dock_multi_instances_not_supported_text" msgid="5011042177901502928">"ಈ ಆ್ಯಪ್ ಅನ್ನು 1 ವಿಂಡೋದಲ್ಲಿ ಮಾತ್ರ ತೆರೆಯಬಹುದು"</string>
- <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"ಸೆಕೆಂಡರಿ ಡಿಸ್ಪ್ಲೇಗಳಲ್ಲಿ ಅಪ್ಲಿಕೇಶನ್ ಕಾರ್ಯ ನಿರ್ವಹಿಸದೇ ಇರಬಹುದು."</string>
- <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"ಸೆಕೆಂಡರಿ ಡಿಸ್ಪ್ಲೇಗಳಲ್ಲಿ ಪ್ರಾರಂಭಿಸುವಿಕೆಯನ್ನು ಅಪ್ಲಿಕೇಶನ್ ಬೆಂಬಲಿಸುವುದಿಲ್ಲ."</string>
+ <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"ಸೆಕೆಂಡರಿ ಡಿಸ್ಪ್ಲೇಗಳಲ್ಲಿ ಆ್ಯಪ್ ಕಾರ್ಯ ನಿರ್ವಹಿಸದೇ ಇರಬಹುದು."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"ಸೆಕೆಂಡರಿ ಡಿಸ್ಪ್ಲೇಗಳಲ್ಲಿ ಪ್ರಾರಂಭಿಸುವಿಕೆಯನ್ನು ಆ್ಯಪ್ ಬೆಂಬಲಿಸುವುದಿಲ್ಲ."</string>
<string name="accessibility_divider" msgid="6407584574218956849">"ಸ್ಪ್ಲಿಟ್ ಸ್ಕ್ರೀನ್ ಡಿವೈಡರ್"</string>
<string name="divider_title" msgid="1963391955593749442">"ಸ್ಪ್ಲಿಟ್ ಸ್ಕ್ರೀನ್ ಡಿವೈಡರ್"</string>
<string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"ಎಡ ಫುಲ್ ಸ್ಕ್ರೀನ್"</string>
@@ -126,8 +126,15 @@
<string name="manage_windows_text" msgid="5567366688493093920">"ವಿಂಡೋಗಳನ್ನು ನಿರ್ವಹಿಸಿ"</string>
<string name="close_text" msgid="4986518933445178928">"ಮುಚ್ಚಿ"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"ಮೆನು ಮುಚ್ಚಿ"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"ಮೆನು ತೆರೆಯಿರಿ"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"ಸ್ಕ್ರೀನ್ ಅನ್ನು ಮ್ಯಾಕ್ಸಿಮೈಸ್ ಮಾಡಿ"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"ಸ್ನ್ಯಾಪ್ ಸ್ಕ್ರೀನ್"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"ಈ ಆ್ಯಪ್ ಅನ್ನು ಮರುಗಾತ್ರಗೊಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ko/strings.xml b/libs/WindowManager/Shell/res/values-ko/strings.xml
index b52c8a1..421d466 100644
--- a/libs/WindowManager/Shell/res/values-ko/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ko/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"스크린샷"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"브라우저에서 열기"</string>
<string name="new_window_text" msgid="6318648868380652280">"새 창"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"창 관리"</string>
<string name="close_text" msgid="4986518933445178928">"닫기"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"메뉴 닫기"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"메뉴 열기"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"화면 최대화"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"화면 분할"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"이 앱은 크기를 조절할 수 없습니다."</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ky/strings.xml b/libs/WindowManager/Shell/res/values-ky/strings.xml
index f994d1e..abafd7a 100644
--- a/libs/WindowManager/Shell/res/values-ky/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ky/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"Скриншот"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"Серепчиден ачуу"</string>
<string name="new_window_text" msgid="6318648868380652280">"Жаңы терезе"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"Терезелерди тескөө"</string>
<string name="close_text" msgid="4986518933445178928">"Жабуу"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Менюну жабуу"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Менюну ачуу"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Экранды чоңойтуу"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Экранды сүрөткө тартып алуу"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Бул колдонмонун өлчөмүн өзгөртүүгө болбойт"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-lo/strings.xml b/libs/WindowManager/Shell/res/values-lo/strings.xml
index 459f3a2..5bc5316 100644
--- a/libs/WindowManager/Shell/res/values-lo/strings.xml
+++ b/libs/WindowManager/Shell/res/values-lo/strings.xml
@@ -126,8 +126,15 @@
<string name="manage_windows_text" msgid="5567366688493093920">"ຈັດການໜ້າຈໍ"</string>
<string name="close_text" msgid="4986518933445178928">"ປິດ"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"ປິດເມນູ"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"ເປີດເມນູ"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"ປັບຈໍໃຫຍ່ສຸດ"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"ສະແນັບໜ້າຈໍ"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"ບໍ່ສາມາດປັບຂະໜາດແອັບນີ້ໄດ້"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-lt/strings.xml b/libs/WindowManager/Shell/res/values-lt/strings.xml
index 2bfd9d3..01a72ee 100644
--- a/libs/WindowManager/Shell/res/values-lt/strings.xml
+++ b/libs/WindowManager/Shell/res/values-lt/strings.xml
@@ -126,8 +126,15 @@
<string name="manage_windows_text" msgid="5567366688493093920">"Tvarkyti langus"</string>
<string name="close_text" msgid="4986518933445178928">"Uždaryti"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Uždaryti meniu"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Atidaryti meniu"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Išskleisti ekraną"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Sutraukti ekraną"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Negalima keisti šios programos dydžio"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-lv/strings.xml b/libs/WindowManager/Shell/res/values-lv/strings.xml
index b601274..2f235ba 100644
--- a/libs/WindowManager/Shell/res/values-lv/strings.xml
+++ b/libs/WindowManager/Shell/res/values-lv/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"Ekrānuzņēmums"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"Atvērt pārlūkā"</string>
<string name="new_window_text" msgid="6318648868380652280">"Jauns logs"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"Pārvaldīt logus"</string>
<string name="close_text" msgid="4986518933445178928">"Aizvērt"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Aizvērt izvēlni"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Atvērt izvēlni"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maksimizēt ekrānu"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Fiksēt ekrānu"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Šīs lietotnes loga lielumu nevar mainīt."</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-mk/strings.xml b/libs/WindowManager/Shell/res/values-mk/strings.xml
index 96e7f25..e58d8fc 100644
--- a/libs/WindowManager/Shell/res/values-mk/strings.xml
+++ b/libs/WindowManager/Shell/res/values-mk/strings.xml
@@ -126,8 +126,15 @@
<string name="manage_windows_text" msgid="5567366688493093920">"Управувајте со прозорци"</string>
<string name="close_text" msgid="4986518933445178928">"Затворете"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Затворете го менито"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Отвори го менито"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Максимизирај го екранот"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Подели го екранот на половина"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Не може да се промени големината на апликацијава"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ml/strings.xml b/libs/WindowManager/Shell/res/values-ml/strings.xml
index a77c203..d51c3fb 100644
--- a/libs/WindowManager/Shell/res/values-ml/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ml/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"സ്ക്രീൻഷോട്ട്"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"ബ്രൗസറിൽ തുറക്കുക"</string>
<string name="new_window_text" msgid="6318648868380652280">"പുതിയ വിന്ഡോ"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"വിൻഡോകൾ മാനേജ് ചെയ്യുക"</string>
<string name="close_text" msgid="4986518933445178928">"അടയ്ക്കുക"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"മെനു അടയ്ക്കുക"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"മെനു തുറക്കുക"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"സ്ക്രീൻ വലുതാക്കുക"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"സ്ക്രീൻ സ്നാപ്പ് ചെയ്യുക"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"ഈ ആപ്പിന്റെ വലുപ്പം മാറ്റാനാകില്ല"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-mn/strings.xml b/libs/WindowManager/Shell/res/values-mn/strings.xml
index 5c7f548..f7e6a6c 100644
--- a/libs/WindowManager/Shell/res/values-mn/strings.xml
+++ b/libs/WindowManager/Shell/res/values-mn/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"Дэлгэцийн агшин"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"Хөтчид нээх"</string>
<string name="new_window_text" msgid="6318648868380652280">"Шинэ цонх"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"Windows-г удирдах"</string>
<string name="close_text" msgid="4986518933445178928">"Хаах"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Цэсийг хаах"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Цэс нээх"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Дэлгэцийг томруулах"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Дэлгэцийг таллах"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Энэ аппын хэмжээг өөрчлөх боломжгүй"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-mr/strings.xml b/libs/WindowManager/Shell/res/values-mr/strings.xml
index a78b37b..4832284 100644
--- a/libs/WindowManager/Shell/res/values-mr/strings.xml
+++ b/libs/WindowManager/Shell/res/values-mr/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"स्क्रीनशॉट"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"ब्राउझरमध्ये उघडा"</string>
<string name="new_window_text" msgid="6318648868380652280">"नवीन विंडो"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"विंडो व्यवस्थापित करा"</string>
<string name="close_text" msgid="4986518933445178928">"बंद करा"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"मेनू बंद करा"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"मेनू उघडा"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"स्क्रीन मोठी करा"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"स्क्रीन स्नॅप करा"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"या अॅपचा आकार बदलला जाऊ शकत नाही"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ms/strings.xml b/libs/WindowManager/Shell/res/values-ms/strings.xml
index fa2c1c5..e510d72 100644
--- a/libs/WindowManager/Shell/res/values-ms/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ms/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"Tangkapan skrin"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"Buka dalam penyemak imbas"</string>
<string name="new_window_text" msgid="6318648868380652280">"Tetingkap Baharu"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"Urus Tetingkap"</string>
<string name="close_text" msgid="4986518933445178928">"Tutup"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Tutup Menu"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Buka Menu"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maksimumkan Skrin"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Tangkap Skrin"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Apl ini tidak boleh diubah saiz"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-my/strings.xml b/libs/WindowManager/Shell/res/values-my/strings.xml
index 48449c0..aac6f84 100644
--- a/libs/WindowManager/Shell/res/values-my/strings.xml
+++ b/libs/WindowManager/Shell/res/values-my/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"ဖန်သားပြင်ဓာတ်ပုံ"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"ဘရောင်ဇာတွင် ဖွင့်ရန်"</string>
<string name="new_window_text" msgid="6318648868380652280">"ဝင်းဒိုးအသစ်"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"ဝင်းဒိုးများ စီမံရန်"</string>
<string name="close_text" msgid="4986518933445178928">"ပိတ်ရန်"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"မီနူး ပိတ်ရန်"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"မီနူး ဖွင့်ရန်"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"စခရင်ကို ချဲ့မည်"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"စခရင်ကို ချုံ့မည်"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"ဤအက်ပ်ကို အရွယ်ပြင်၍ မရပါ"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-nb/strings.xml b/libs/WindowManager/Shell/res/values-nb/strings.xml
index 5697f0d..175133d 100644
--- a/libs/WindowManager/Shell/res/values-nb/strings.xml
+++ b/libs/WindowManager/Shell/res/values-nb/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"Skjermbilde"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"Åpne i nettleseren"</string>
<string name="new_window_text" msgid="6318648868380652280">"Nytt vindu"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"Administrer vinduene"</string>
<string name="close_text" msgid="4986518933445178928">"Lukk"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Lukk menyen"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Åpne menyen"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maksimer skjermen"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Fest skjermen"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Du kan ikke endre størrelse på denne appen"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ne/strings.xml b/libs/WindowManager/Shell/res/values-ne/strings.xml
index 365a3b3..d3a7e12 100644
--- a/libs/WindowManager/Shell/res/values-ne/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ne/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"स्क्रिनसट"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"ब्राउजरमा खोल्नुहोस्"</string>
<string name="new_window_text" msgid="6318648868380652280">"नयाँ विन्डो"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"विन्डोहरू व्यवस्थापन गर्नुहोस्"</string>
<string name="close_text" msgid="4986518933445178928">"बन्द गर्नुहोस्"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"मेनु बन्द गर्नुहोस्"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"मेनु खोल्नुहोस्"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"स्क्रिन ठुलो बनाउनुहोस्"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"स्क्रिन स्न्याप गर्नुहोस्"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"यो एपको आकार बदल्न मिल्दैन"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-nl/strings.xml b/libs/WindowManager/Shell/res/values-nl/strings.xml
index 9cf1551..747afe3 100644
--- a/libs/WindowManager/Shell/res/values-nl/strings.xml
+++ b/libs/WindowManager/Shell/res/values-nl/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"Screenshot"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"Openen in browser"</string>
<string name="new_window_text" msgid="6318648868380652280">"Nieuw venster"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"Vensters beheren"</string>
<string name="close_text" msgid="4986518933445178928">"Sluiten"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Menu sluiten"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Menu openen"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Scherm maximaliseren"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Scherm halveren"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Het formaat van deze app kan niet worden aangepast"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-or/strings.xml b/libs/WindowManager/Shell/res/values-or/strings.xml
index 9f7342c..a5adcbe 100644
--- a/libs/WindowManager/Shell/res/values-or/strings.xml
+++ b/libs/WindowManager/Shell/res/values-or/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"ସ୍କ୍ରିନସଟ"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"ବ୍ରାଉଜରରେ ଖୋଲନ୍ତୁ"</string>
<string name="new_window_text" msgid="6318648868380652280">"ନୂଆ ୱିଣ୍ଡୋ"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"ୱିଣ୍ଡୋଗୁଡ଼ିକୁ ପରିଚାଳନା କରନ୍ତୁ"</string>
<string name="close_text" msgid="4986518933445178928">"ବନ୍ଦ କରନ୍ତୁ"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"ମେନୁ ବନ୍ଦ କରନ୍ତୁ"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"ମେନୁ ଖୋଲନ୍ତୁ"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"ସ୍କ୍ରିନକୁ ବଡ଼ କରନ୍ତୁ"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"ସ୍କ୍ରିନକୁ ସ୍ନାପ କରନ୍ତୁ"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"ଏହି ଆପକୁ ରିସାଇଜ କରାଯାଇପାରିବ ନାହିଁ"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-pa/strings.xml b/libs/WindowManager/Shell/res/values-pa/strings.xml
index 48fa552..5a4e61a 100644
--- a/libs/WindowManager/Shell/res/values-pa/strings.xml
+++ b/libs/WindowManager/Shell/res/values-pa/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"ਸਕ੍ਰੀਨਸ਼ਾਟ"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ ਖੋਲ੍ਹੋ"</string>
<string name="new_window_text" msgid="6318648868380652280">"ਨਵੀਂ ਵਿੰਡੋ"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"ਵਿੰਡੋਆਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ"</string>
<string name="close_text" msgid="4986518933445178928">"ਬੰਦ ਕਰੋ"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"ਮੀਨੂ ਬੰਦ ਕਰੋ"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"ਮੀਨੂ ਖੋਲ੍ਹੋ"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"ਸਕ੍ਰੀਨ ਦਾ ਆਕਾਰ ਵਧਾਓ"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"ਸਕ੍ਰੀਨ ਨੂੰ ਸਨੈਪ ਕਰੋ"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"ਇਸ ਐਪ ਦਾ ਆਕਾਰ ਬਦਲਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-pl/strings.xml b/libs/WindowManager/Shell/res/values-pl/strings.xml
index 211ae98..a14bb99 100644
--- a/libs/WindowManager/Shell/res/values-pl/strings.xml
+++ b/libs/WindowManager/Shell/res/values-pl/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"Zrzut ekranu"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"Otwórz w przeglądarce"</string>
<string name="new_window_text" msgid="6318648868380652280">"Nowe okno"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"Zarządzaj oknami"</string>
<string name="close_text" msgid="4986518933445178928">"Zamknij"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Zamknij menu"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Otwórz menu"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maksymalizuj ekran"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Przyciągnij ekran"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Nie można zmienić rozmiaru tej aplikacji"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml b/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml
index dfae5d8..75c445c 100644
--- a/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml
+++ b/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"Captura de tela"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"Abrir no navegador"</string>
<string name="new_window_text" msgid="6318648868380652280">"Nova janela"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"Gerenciar janelas"</string>
<string name="close_text" msgid="4986518933445178928">"Fechar"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Fechar menu"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Abrir o menu"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Ampliar tela"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Ajustar tela"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Não é possível redimensionar o app"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml b/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml
index 1399b26..1d31d0d 100644
--- a/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml
+++ b/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml
@@ -126,8 +126,15 @@
<string name="manage_windows_text" msgid="5567366688493093920">"Faça a gestão das janelas"</string>
<string name="close_text" msgid="4986518933445178928">"Fechar"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Fechar menu"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Abrir menu"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximizar ecrã"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Encaixar ecrã"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Não é possível redimensionar esta app"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-pt/strings.xml b/libs/WindowManager/Shell/res/values-pt/strings.xml
index dfae5d8..75c445c 100644
--- a/libs/WindowManager/Shell/res/values-pt/strings.xml
+++ b/libs/WindowManager/Shell/res/values-pt/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"Captura de tela"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"Abrir no navegador"</string>
<string name="new_window_text" msgid="6318648868380652280">"Nova janela"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"Gerenciar janelas"</string>
<string name="close_text" msgid="4986518933445178928">"Fechar"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Fechar menu"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Abrir o menu"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Ampliar tela"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Ajustar tela"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Não é possível redimensionar o app"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ro/strings.xml b/libs/WindowManager/Shell/res/values-ro/strings.xml
index 2f458e9..3c763ea 100644
--- a/libs/WindowManager/Shell/res/values-ro/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ro/strings.xml
@@ -126,8 +126,15 @@
<string name="manage_windows_text" msgid="5567366688493093920">"Gestionează ferestrele"</string>
<string name="close_text" msgid="4986518933445178928">"Închide"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Închide meniul"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Deschide meniul"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximizează fereastra"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Micșorează fereastra și fixeaz-o"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Aplicația nu poate fi redimensionată"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ru/strings.xml b/libs/WindowManager/Shell/res/values-ru/strings.xml
index a7fdd41..a6c20ad 100644
--- a/libs/WindowManager/Shell/res/values-ru/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ru/strings.xml
@@ -126,8 +126,15 @@
<string name="manage_windows_text" msgid="5567366688493093920">"Управление окнами"</string>
<string name="close_text" msgid="4986518933445178928">"Закрыть"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Закрыть меню"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Открыть меню"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Развернуть на весь экран"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Свернуть"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Изменить размер приложения нельзя."</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-si/strings.xml b/libs/WindowManager/Shell/res/values-si/strings.xml
index bbfafb6..ed76269 100644
--- a/libs/WindowManager/Shell/res/values-si/strings.xml
+++ b/libs/WindowManager/Shell/res/values-si/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"තිර රුව"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"බ්රව්සරයේ විවෘත කරන්න"</string>
<string name="new_window_text" msgid="6318648868380652280">"නව කවුළුව"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"කවුළු කළමනාකරණය කරන්න"</string>
<string name="close_text" msgid="4986518933445178928">"වසන්න"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"මෙනුව වසන්න"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"මෙනුව විවෘත කරන්න"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"තිරය උපරිම කරන්න"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"ස්නැප් තිරය"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"මෙම යෙදුම ප්රතිප්රමාණ කළ නොහැක"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-sk/strings.xml b/libs/WindowManager/Shell/res/values-sk/strings.xml
index da7a834..529a693 100644
--- a/libs/WindowManager/Shell/res/values-sk/strings.xml
+++ b/libs/WindowManager/Shell/res/values-sk/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"Snímka obrazovky"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"Otvoriť v prehliadači"</string>
<string name="new_window_text" msgid="6318648868380652280">"Nové okno"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"Správa okien"</string>
<string name="close_text" msgid="4986518933445178928">"Zavrieť"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Zavrieť ponuku"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Otvoriť ponuku"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximalizovať obrazovku"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Zobraziť polovicu obrazovky"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Veľkosť tejto aplikácie sa nedá zmeniť"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-sl/strings.xml b/libs/WindowManager/Shell/res/values-sl/strings.xml
index 0434e54..fe08e04 100644
--- a/libs/WindowManager/Shell/res/values-sl/strings.xml
+++ b/libs/WindowManager/Shell/res/values-sl/strings.xml
@@ -126,8 +126,15 @@
<string name="manage_windows_text" msgid="5567366688493093920">"Upravljanje oken"</string>
<string name="close_text" msgid="4986518933445178928">"Zapri"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Zapri meni"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Odpri meni"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maksimiraj zaslon"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Pripni zaslon"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Velikosti te aplikacije ni mogoče spremeniti"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-sq/strings.xml b/libs/WindowManager/Shell/res/values-sq/strings.xml
index 65a270d..a4a7e74 100644
--- a/libs/WindowManager/Shell/res/values-sq/strings.xml
+++ b/libs/WindowManager/Shell/res/values-sq/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"Pamja e ekranit"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"Hape në shfletues"</string>
<string name="new_window_text" msgid="6318648868380652280">"Dritare e re"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"Menaxho dritaret"</string>
<string name="close_text" msgid="4986518933445178928">"Mbyll"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Mbyll menynë"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Hap menynë"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maksimizo ekranin"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Regjistro ekranin"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Përmasat e këtij aplikacioni nuk mund të ndryshohen"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-sr/strings.xml b/libs/WindowManager/Shell/res/values-sr/strings.xml
index caa9c7d..9545ccf 100644
--- a/libs/WindowManager/Shell/res/values-sr/strings.xml
+++ b/libs/WindowManager/Shell/res/values-sr/strings.xml
@@ -126,8 +126,15 @@
<string name="manage_windows_text" msgid="5567366688493093920">"Управљајте прозорима"</string>
<string name="close_text" msgid="4986518933445178928">"Затворите"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Затворите мени"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Отворите мени"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Повећај екран"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Уклопи екран"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Величина ове апликације не може да се промени"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-sv/strings.xml b/libs/WindowManager/Shell/res/values-sv/strings.xml
index 681ef8b..c43f5df 100644
--- a/libs/WindowManager/Shell/res/values-sv/strings.xml
+++ b/libs/WindowManager/Shell/res/values-sv/strings.xml
@@ -126,8 +126,15 @@
<string name="manage_windows_text" msgid="5567366688493093920">"Hantera fönster"</string>
<string name="close_text" msgid="4986518933445178928">"Stäng"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Stäng menyn"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Öppna menyn"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximera skärmen"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Fäst skärmen"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Det går inte att ändra storlek på appen"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-sw/strings.xml b/libs/WindowManager/Shell/res/values-sw/strings.xml
index bb314a3..c6ce023 100644
--- a/libs/WindowManager/Shell/res/values-sw/strings.xml
+++ b/libs/WindowManager/Shell/res/values-sw/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"Picha ya skrini"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"Fungua katika kivinjari"</string>
<string name="new_window_text" msgid="6318648868380652280">"Dirisha Jipya"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"Dhibiti Windows"</string>
<string name="close_text" msgid="4986518933445178928">"Funga"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Funga Menyu"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Fungua Menyu"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Panua Dirisha kwenye Skrini"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Panga Madirisha kwenye Skrini"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Huwezi kubadilisha ukubwa wa programu hii"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ta/strings.xml b/libs/WindowManager/Shell/res/values-ta/strings.xml
index 686e705..2c2f319 100644
--- a/libs/WindowManager/Shell/res/values-ta/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ta/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"ஸ்கிரீன்ஷாட்"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"உலாவியில் திறக்கும்"</string>
<string name="new_window_text" msgid="6318648868380652280">"புதிய சாளரம்"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"சாளரங்களை நிர்வகிக்கலாம்"</string>
<string name="close_text" msgid="4986518933445178928">"மூடும்"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"மெனுவை மூடும்"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"மெனுவைத் திற"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"திரையைப் பெரிதாக்கு"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"திரையை ஸ்னாப் செய்"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"இந்த ஆப்ஸின் அளவை மாற்ற முடியாது"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-te/strings.xml b/libs/WindowManager/Shell/res/values-te/strings.xml
index 7b554d9..8691c9d 100644
--- a/libs/WindowManager/Shell/res/values-te/strings.xml
+++ b/libs/WindowManager/Shell/res/values-te/strings.xml
@@ -126,8 +126,15 @@
<string name="manage_windows_text" msgid="5567366688493093920">"విండోలను మేనేజ్ చేయండి"</string>
<string name="close_text" msgid="4986518933445178928">"మూసివేయండి"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"మెనూను మూసివేయండి"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"మెనూను తెరవండి"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"స్క్రీన్ సైజ్ను పెంచండి"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"స్క్రీన్ను స్నాప్ చేయండి"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"ఈ యాప్ సైజ్ను మార్చడం సాధ్యపడదు"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-th/strings.xml b/libs/WindowManager/Shell/res/values-th/strings.xml
index 59deabb..07e1416 100644
--- a/libs/WindowManager/Shell/res/values-th/strings.xml
+++ b/libs/WindowManager/Shell/res/values-th/strings.xml
@@ -126,8 +126,15 @@
<string name="manage_windows_text" msgid="5567366688493093920">"จัดการหน้าต่าง"</string>
<string name="close_text" msgid="4986518933445178928">"ปิด"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"ปิดเมนู"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"เปิดเมนู"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"ขยายหน้าจอให้ใหญ่สุด"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"สแนปหน้าจอ"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"ปรับขนาดแอปนี้ไม่ได้"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-tl/strings.xml b/libs/WindowManager/Shell/res/values-tl/strings.xml
index 79e968d..477700e 100644
--- a/libs/WindowManager/Shell/res/values-tl/strings.xml
+++ b/libs/WindowManager/Shell/res/values-tl/strings.xml
@@ -126,8 +126,15 @@
<string name="manage_windows_text" msgid="5567366688493093920">"Pamahalaan ang Mga Window"</string>
<string name="close_text" msgid="4986518933445178928">"Isara"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Isara ang Menu"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Buksan ang Menu"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"I-maximize ang Screen"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"I-snap ang Screen"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Hindi nare-resize ang app na ito"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-tr/strings.xml b/libs/WindowManager/Shell/res/values-tr/strings.xml
index e5bca20..b0c2539 100644
--- a/libs/WindowManager/Shell/res/values-tr/strings.xml
+++ b/libs/WindowManager/Shell/res/values-tr/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"Ekran görüntüsü"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"Tarayıcıda aç"</string>
<string name="new_window_text" msgid="6318648868380652280">"Yeni Pencere"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"Pencereleri yönet"</string>
<string name="close_text" msgid="4986518933445178928">"Kapat"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Menüyü kapat"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Menüyü Aç"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Ekranı Büyüt"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Ekranın Yarısına Tuttur"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Bu uygulama yeniden boyutlandırılamaz"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-uk/strings.xml b/libs/WindowManager/Shell/res/values-uk/strings.xml
index 0e877b0..dd64c66 100644
--- a/libs/WindowManager/Shell/res/values-uk/strings.xml
+++ b/libs/WindowManager/Shell/res/values-uk/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"Знімок екрана"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"Відкрити у вебпереглядачі"</string>
<string name="new_window_text" msgid="6318648868380652280">"Нове вікно"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"Керувати вікнами"</string>
<string name="close_text" msgid="4986518933445178928">"Закрити"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Закрити меню"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Відкрити меню"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Розгорнути екран"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Зафіксувати екран"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Розмір вікна цього додатка не можна змінити"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ur/strings.xml b/libs/WindowManager/Shell/res/values-ur/strings.xml
index 06807957..aa311c2 100644
--- a/libs/WindowManager/Shell/res/values-ur/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ur/strings.xml
@@ -126,8 +126,15 @@
<string name="manage_windows_text" msgid="5567366688493093920">"Windows کا نظم کریں"</string>
<string name="close_text" msgid="4986518933445178928">"بند کریں"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"مینیو بند کریں"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"مینو کھولیں"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"اسکرین کو بڑا کریں"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"اسکرین کا اسناپ شاٹ لیں"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"اس ایپ کا سائز تبدیل نہیں کیا جا سکتا"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-uz/strings.xml b/libs/WindowManager/Shell/res/values-uz/strings.xml
index 4e0eb53..8754629 100644
--- a/libs/WindowManager/Shell/res/values-uz/strings.xml
+++ b/libs/WindowManager/Shell/res/values-uz/strings.xml
@@ -126,8 +126,15 @@
<string name="manage_windows_text" msgid="5567366688493093920">"Oynalarni boshqarish"</string>
<string name="close_text" msgid="4986518933445178928">"Yopish"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Menyuni yopish"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Menyuni ochish"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Ekranni yoyish"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Ekranni biriktirish"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Bu ilova hajmini oʻzgartirish imkonsiz"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-vi/strings.xml b/libs/WindowManager/Shell/res/values-vi/strings.xml
index c5d76ea..abac3fe 100644
--- a/libs/WindowManager/Shell/res/values-vi/strings.xml
+++ b/libs/WindowManager/Shell/res/values-vi/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"Ảnh chụp màn hình"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"Mở trong trình duyệt"</string>
<string name="new_window_text" msgid="6318648868380652280">"Cửa sổ mới"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"Quản lý cửa sổ"</string>
<string name="close_text" msgid="4986518933445178928">"Đóng"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Đóng trình đơn"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Mở Trình đơn"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Mở rộng màn hình"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Điều chỉnh kích thước màn hình"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Không thể đổi kích thước của ứng dụng này"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml b/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml
index 1202168..5a61dec 100644
--- a/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml
+++ b/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"屏幕截图"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"在浏览器中打开"</string>
<string name="new_window_text" msgid="6318648868380652280">"新窗口"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"管理窗口"</string>
<string name="close_text" msgid="4986518933445178928">"关闭"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"关闭菜单"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"打开菜单"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"最大化屏幕"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"屏幕快照"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"无法调整此应用的大小"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml b/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml
index a23b147..e1c303e 100644
--- a/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml
+++ b/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"螢幕截圖"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"在瀏覽器中開啟"</string>
<string name="new_window_text" msgid="6318648868380652280">"新視窗"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"管理視窗"</string>
<string name="close_text" msgid="4986518933445178928">"關閉"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"關閉選單"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"打開選單"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"畫面最大化"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"貼齊畫面"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"此應用程式無法調整大小"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml b/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml
index e70a8ad..97e36c3 100644
--- a/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml
+++ b/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"螢幕截圖"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"在瀏覽器中開啟"</string>
<string name="new_window_text" msgid="6318648868380652280">"新視窗"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"管理視窗"</string>
<string name="close_text" msgid="4986518933445178928">"關閉"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"關閉選單"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"開啟選單"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"畫面最大化"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"貼齊畫面"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"這個應用程式無法調整大小"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/res/values-zu/strings.xml b/libs/WindowManager/Shell/res/values-zu/strings.xml
index 13a2a0f..74c7169 100644
--- a/libs/WindowManager/Shell/res/values-zu/strings.xml
+++ b/libs/WindowManager/Shell/res/values-zu/strings.xml
@@ -123,12 +123,18 @@
<string name="screenshot_text" msgid="1477704010087786671">"Isithombe-skrini"</string>
<string name="open_in_browser_text" msgid="9181692926376072904">"Vula kubhrawuza"</string>
<string name="new_window_text" msgid="6318648868380652280">"Iwindi Elisha"</string>
- <!-- no translation found for manage_windows_text (5567366688493093920) -->
- <skip />
+ <string name="manage_windows_text" msgid="5567366688493093920">"Phatha Amawindi"</string>
<string name="close_text" msgid="4986518933445178928">"Vala"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Vala Imenyu"</string>
- <string name="expand_menu_text" msgid="3847736164494181168">"Vula Imenyu"</string>
+ <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
+ <skip />
<string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Khulisa Isikrini Sifike Ekugcineni"</string>
<string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Thwebula Isikrini"</string>
<string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Le app ayikwazi ukushintshwa usayizi"</string>
+ <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+ <skip />
+ <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+ <skip />
</resources>
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultSurfaceAnimator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultSurfaceAnimator.java
new file mode 100644
index 0000000..a1a9ca9
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultSurfaceAnimator.java
@@ -0,0 +1,188 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.transition;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ValueAnimator;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.graphics.Insets;
+import android.graphics.Point;
+import android.graphics.Rect;
+import android.view.Choreographer;
+import android.view.SurfaceControl;
+import android.view.animation.Animation;
+import android.view.animation.Transformation;
+
+import com.android.wm.shell.common.ShellExecutor;
+import com.android.wm.shell.shared.TransactionPool;
+
+import java.util.ArrayList;
+
+public class DefaultSurfaceAnimator {
+
+ /** Builds an animator for the surface and adds it to the `animations` list. */
+ static void buildSurfaceAnimation(@NonNull ArrayList<Animator> animations,
+ @NonNull Animation anim, @NonNull SurfaceControl leash,
+ @NonNull Runnable finishCallback, @NonNull TransactionPool pool,
+ @NonNull ShellExecutor mainExecutor, @Nullable Point position, float cornerRadius,
+ @Nullable Rect clipRect, boolean isActivity) {
+ final DefaultAnimationAdapter adapter = new DefaultAnimationAdapter(anim, leash,
+ position, clipRect, cornerRadius, isActivity);
+ buildSurfaceAnimation(animations, anim, finishCallback, pool, mainExecutor, adapter);
+ }
+
+ /** Builds an animator for the surface and adds it to the `animations` list. */
+ static void buildSurfaceAnimation(@NonNull ArrayList<Animator> animations,
+ @NonNull Animation anim, @NonNull Runnable finishCallback,
+ @NonNull TransactionPool pool, @NonNull ShellExecutor mainExecutor,
+ @NonNull AnimationAdapter updateListener) {
+ final SurfaceControl.Transaction transaction = pool.acquire();
+ updateListener.setTransaction(transaction);
+ final ValueAnimator va = ValueAnimator.ofFloat(0f, 1f);
+ // Animation length is already expected to be scaled.
+ va.overrideDurationScale(1.0f);
+ va.setDuration(anim.computeDurationHint());
+ va.addUpdateListener(updateListener);
+ va.addListener(new AnimatorListenerAdapter() {
+ // It is possible for the end/cancel to be called more than once, which may cause
+ // issues if the animating surface has already been released. Track the finished
+ // state here to skip duplicate callbacks. See b/252872225.
+ private boolean mFinished;
+
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ onFinish();
+ }
+
+ @Override
+ public void onAnimationCancel(Animator animation) {
+ onFinish();
+ }
+
+ private void onFinish() {
+ if (mFinished) return;
+ mFinished = true;
+ // Apply transformation of end state in case the animation is canceled.
+ if (va.getAnimatedFraction() < 1f) {
+ va.setCurrentFraction(1f);
+ }
+
+ pool.release(transaction);
+ mainExecutor.execute(() -> {
+ animations.remove(va);
+ finishCallback.run();
+ });
+ // The update listener can continue to be called after the animation has ended if
+ // end() is called manually again before the finisher removes the animation.
+ // Remove it manually here to prevent animating a released surface.
+ // See b/252872225.
+ va.removeUpdateListener(updateListener);
+ }
+ });
+ animations.add(va);
+ }
+
+ /** The animation adapter for buildSurfaceAnimation. */
+ abstract static class AnimationAdapter implements ValueAnimator.AnimatorUpdateListener {
+ @NonNull final SurfaceControl mLeash;
+ @NonNull SurfaceControl.Transaction mTransaction;
+ private Choreographer mChoreographer;
+
+ AnimationAdapter(@NonNull SurfaceControl leash) {
+ mLeash = leash;
+ }
+
+ void setTransaction(@NonNull SurfaceControl.Transaction transaction) {
+ mTransaction = transaction;
+ }
+
+ @Override
+ public void onAnimationUpdate(@NonNull ValueAnimator animator) {
+ // The finish callback in buildSurfaceAnimation will ensure that the animation ends
+ // with fraction 1.
+ final long currentPlayTime = animator.getAnimatedFraction() >= 1f
+ ? animator.getDuration()
+ : Math.min(animator.getDuration(), animator.getCurrentPlayTime());
+ applyTransformation(animator, currentPlayTime);
+ if (mChoreographer == null) {
+ mChoreographer = Choreographer.getInstance();
+ }
+ mTransaction.setFrameTimelineVsync(mChoreographer.getVsyncId());
+ mTransaction.apply();
+ }
+
+ abstract void applyTransformation(@NonNull ValueAnimator animator, long currentPlayTime);
+ }
+
+ private static class DefaultAnimationAdapter extends AnimationAdapter {
+ final Transformation mTransformation = new Transformation();
+ final float[] mMatrix = new float[9];
+ @NonNull final Animation mAnim;
+ @Nullable final Point mPosition;
+ @Nullable final Rect mClipRect;
+ final float mCornerRadius;
+ final boolean mIsActivity;
+
+ DefaultAnimationAdapter(@NonNull Animation anim, @NonNull SurfaceControl leash,
+ @Nullable Point position, @Nullable Rect clipRect, float cornerRadius,
+ boolean isActivity) {
+ super(leash);
+ mAnim = anim;
+ mPosition = (position != null && (position.x != 0 || position.y != 0))
+ ? position : null;
+ mClipRect = (clipRect != null && !clipRect.isEmpty()) ? clipRect : null;
+ mCornerRadius = cornerRadius;
+ mIsActivity = isActivity;
+ }
+
+ @Override
+ void applyTransformation(@NonNull ValueAnimator animator, long currentPlayTime) {
+ final Transformation transformation = mTransformation;
+ final SurfaceControl.Transaction t = mTransaction;
+ final SurfaceControl leash = mLeash;
+ transformation.clear();
+ mAnim.getTransformation(currentPlayTime, transformation);
+ if (com.android.graphics.libgui.flags.Flags.edgeExtensionShader()
+ && mIsActivity && mAnim.getExtensionEdges() != 0) {
+ t.setEdgeExtensionEffect(leash, mAnim.getExtensionEdges());
+ }
+ if (mPosition != null) {
+ transformation.getMatrix().postTranslate(mPosition.x, mPosition.y);
+ }
+ t.setMatrix(leash, transformation.getMatrix(), mMatrix);
+ t.setAlpha(leash, transformation.getAlpha());
+
+ if (mClipRect != null) {
+ Rect clipRect = mClipRect;
+ final Insets extensionInsets = Insets.min(transformation.getInsets(), Insets.NONE);
+ if (!extensionInsets.equals(Insets.NONE)) {
+ // Clip out any overflowing edge extension.
+ clipRect = new Rect(mClipRect);
+ clipRect.inset(extensionInsets);
+ t.setCrop(leash, clipRect);
+ }
+ if (mCornerRadius > 0 && mAnim.hasRoundedCorners()) {
+ // Rounded corner can only be applied if a crop is set.
+ t.setCrop(leash, clipRect);
+ t.setCornerRadius(leash, mCornerRadius);
+ }
+ }
+ }
+ }
+}
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 f40e0ba..d3bed59 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
@@ -826,6 +826,11 @@
@NonNull Runnable finishCallback, @NonNull TransactionPool pool,
@NonNull ShellExecutor mainExecutor, @Nullable Point position, float cornerRadius,
@Nullable Rect clipRect, boolean isActivity) {
+ if (Flags.commonSurfaceAnimator()) {
+ DefaultSurfaceAnimator.buildSurfaceAnimation(animations, anim, leash, finishCallback,
+ pool, mainExecutor, position, cornerRadius, clipRect, isActivity);
+ return;
+ }
final SurfaceControl.Transaction transaction = pool.acquire();
final ValueAnimator va = ValueAnimator.ofFloat(0f, 1f);
final Transformation transformation = new Transformation();
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHandleViewHolder.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHandleViewHolder.kt
index 9c7d644..8c102eb 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHandleViewHolder.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHandleViewHolder.kt
@@ -22,6 +22,7 @@
import android.graphics.Color
import android.graphics.Point
import android.hardware.input.InputManager
+import android.os.Bundle
import android.os.Handler
import android.view.MotionEvent.ACTION_DOWN
import android.view.SurfaceControl
@@ -29,7 +30,12 @@
import android.view.View.OnClickListener
import android.view.WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS
import android.view.WindowManager
+import android.view.accessibility.AccessibilityEvent
+import android.view.accessibility.AccessibilityNodeInfo
+import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction
import android.widget.ImageButton
+import androidx.core.view.ViewCompat
+import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat
import com.android.internal.policy.SystemBarUtils
import com.android.window.flags.Flags
import com.android.wm.shell.R
@@ -67,6 +73,20 @@
captionView.setOnTouchListener(onCaptionTouchListener)
captionHandle.setOnTouchListener(onCaptionTouchListener)
captionHandle.setOnClickListener(onCaptionButtonClickListener)
+ captionHandle.accessibilityDelegate = object : View.AccessibilityDelegate() {
+ override fun sendAccessibilityEvent(host: View, eventType: Int) {
+ when (eventType) {
+ AccessibilityEvent.TYPE_VIEW_HOVER_ENTER,
+ AccessibilityEvent.TYPE_VIEW_HOVER_EXIT -> {
+ // Caption Handle itself can't get a11y focus because it's under the status
+ // bar, so pass through TYPE_VIEW_HOVER a11y events to the status bar
+ // input layer, so that it can get a11y focus on the caption handle's behalf
+ statusBarInputLayer?.view?.sendAccessibilityEvent(eventType)
+ }
+ else -> super.sendAccessibilityEvent(host, eventType)
+ }
+ }
+ }
}
override fun bindData(
@@ -134,9 +154,53 @@
captionHandle.dispatchTouchEvent(event)
return@setOnTouchListener true
}
+ setupAppHandleA11y(view)
windowManagerWrapper.updateViewLayout(view, lp)
}
+ private fun setupAppHandleA11y(view: View) {
+ view.accessibilityDelegate = object : View.AccessibilityDelegate() {
+ override fun onInitializeAccessibilityNodeInfo(
+ host: View,
+ info: AccessibilityNodeInfo
+ ) {
+ // Allow the status bar input layer to be a11y clickable so it can interact with
+ // a11y services on behalf of caption handle (due to being under status bar)
+ super.onInitializeAccessibilityNodeInfo(host, info)
+ info.addAction(AccessibilityAction.ACTION_CLICK)
+ host.isClickable = true
+ }
+
+ override fun performAccessibilityAction(
+ host: View,
+ action: Int,
+ args: Bundle?
+ ): Boolean {
+ // Passthrough the a11y click action so the caption handle, so that app handle menu
+ // is opened on a11y click, similar to a real click
+ if (action == AccessibilityAction.ACTION_CLICK.id) {
+ captionHandle.performClick()
+ }
+ return super.performAccessibilityAction(host, action, args)
+ }
+
+ override fun onPopulateAccessibilityEvent(host: View, event: AccessibilityEvent) {
+ super.onPopulateAccessibilityEvent(host, event)
+ // When the status bar input layer is focused, use the content description of the
+ // caption handle so that it appears as "App handle" and not "Unlabelled view"
+ if (event.eventType == AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED) {
+ event.text.add(captionHandle.contentDescription)
+ }
+ }
+ }
+
+ // Update a11y action text so that Talkback announces "Press double tap to open app handle
+ // menu" while focused on status bar input layer
+ ViewCompat.replaceAccessibilityAction(
+ view, AccessibilityActionCompat.ACTION_CLICK, "Open app handle menu", null
+ )
+ }
+
private fun updateStatusBarInputLayer(globalPosition: Point) {
statusBarInputLayer?.setPosition(
SurfaceControl.Transaction(),
@@ -173,7 +237,8 @@
return taskInfo.taskDescription
?.let { taskDescription ->
if (Color.alpha(taskDescription.statusBarColor) != 0 &&
- taskInfo.windowingMode == WINDOWING_MODE_FREEFORM) {
+ taskInfo.windowingMode == WINDOWING_MODE_FREEFORM
+ ) {
Color.valueOf(taskDescription.statusBarColor).luminance() < 0.5
} else {
taskDescription.systemBarsAppearance and APPEARANCE_LIGHT_STATUS_BARS == 0
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/ShellTestCase.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/ShellTestCase.java
index a2df22c..40b685c 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/ShellTestCase.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/ShellTestCase.java
@@ -17,6 +17,7 @@
package com.android.wm.shell;
import static android.view.Display.DEFAULT_DISPLAY;
+
import static org.junit.Assume.assumeTrue;
import android.content.Context;
@@ -45,6 +46,9 @@
// Disable protolog tool when running the tests from studio
ProtoLog.REQUIRE_PROTOLOGTOOL = false;
+ // Make sure ProtoLog is initialized before any logging occurs.
+ ProtoLog.init();
+
MockitoAnnotations.initMocks(this);
final Context context =
InstrumentationRegistry.getInstrumentation().getTargetContext();
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/DefaultTransitionHandlerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/DefaultTransitionHandlerTest.java
index 0c18229..e540322 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/DefaultTransitionHandlerTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/DefaultTransitionHandlerTest.java
@@ -25,11 +25,14 @@
import static android.window.TransitionInfo.FLAG_SYNC;
import static android.window.TransitionInfo.FLAG_TRANSLUCENT;
+import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
+import android.animation.Animator;
+import android.animation.ValueAnimator;
import android.app.ActivityManager.RunningTaskInfo;
import android.content.Context;
import android.os.Binder;
@@ -37,6 +40,7 @@
import android.os.IBinder;
import android.os.Looper;
import android.view.SurfaceControl;
+import android.view.animation.AlphaAnimation;
import android.window.TransitionInfo;
import android.window.WindowContainerToken;
@@ -56,6 +60,8 @@
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.util.ArrayList;
+
/**
* Tests for the default animation handler that is used if no other special-purpose handler picks
* up an animation request.
@@ -187,6 +193,34 @@
}
@Test
+ public void testBuildSurfaceAnimation() {
+ final ArrayList<Animator> animators = new ArrayList<>();
+ final AlphaAnimation animation = new AlphaAnimation(0, 1);
+ final long durationMs = 500;
+ animation.setDuration(durationMs);
+ final long[] lastCurrentPlayTime = new long[1];
+ final int[] finishCount = new int[1];
+ final Runnable finishCallback = () -> finishCount[0]++;
+ DefaultSurfaceAnimator.buildSurfaceAnimation(animators, animation, finishCallback,
+ mTransactionPool, mMainExecutor,
+ new DefaultSurfaceAnimator.AnimationAdapter(mock(SurfaceControl.class)) {
+ @Override
+ void applyTransformation(ValueAnimator animator, long currentPlayTime) {
+ lastCurrentPlayTime[0] = currentPlayTime;
+ }
+ });
+ final ValueAnimator animator = (ValueAnimator) animators.get(0);
+ mAnimExecutor.execute(() -> {
+ animator.start();
+ animator.end();
+ });
+ flushHandlers();
+ assertEquals(durationMs, lastCurrentPlayTime[0]);
+ assertEquals(1f, animator.getAnimatedFraction(), 0f /* delta */);
+ assertEquals(1, finishCount[0]);
+ }
+
+ @Test
public void startAnimation_freeformOpenChange_doesntReparentTask() {
final TransitionInfo.Change openChange = new ChangeBuilder(TRANSIT_OPEN)
.setTask(createTaskInfo(
diff --git a/libs/appfunctions/tests/Android.bp b/libs/appfunctions/tests/Android.bp
new file mode 100644
index 0000000..6f5eff3
--- /dev/null
+++ b/libs/appfunctions/tests/Android.bp
@@ -0,0 +1,41 @@
+// 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 {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+android_test {
+ name: "AppFunctionsSidecarTestCases",
+ team: "trendy_team_system_intelligence",
+ static_libs: [
+ "androidx.test.runner",
+ "androidx.test.rules",
+ "androidx.test.ext.junit",
+ "androidx.core_core-ktx",
+ "com.google.android.appfunctions.sidecar.impl",
+ "junit",
+ "kotlin-test",
+ "mockito-target-extended-minus-junit4",
+ "platform-test-annotations",
+ "testables",
+ "testng",
+ "truth",
+ ],
+ srcs: [
+ "src/**/*.java",
+ "src/**/*.kt",
+ ],
+}
diff --git a/libs/appfunctions/tests/AndroidManifest.xml b/libs/appfunctions/tests/AndroidManifest.xml
new file mode 100644
index 0000000..9a7d460
--- /dev/null
+++ b/libs/appfunctions/tests/AndroidManifest.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2024 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.google.android.appfunctions.sidecar.tests">
+ <application android:debuggable="true">
+ <uses-library android:name="android.test.mock" />
+ <uses-library android:name="android.test.runner" />
+ </application>
+ <instrumentation
+ android:name="androidx.test.runner.AndroidJUnitRunner"
+ android:targetPackage="com.google.android.appfunctions.sidecar.tests">
+ </instrumentation>
+</manifest>
diff --git a/libs/appfunctions/tests/AndroidTest.xml b/libs/appfunctions/tests/AndroidTest.xml
new file mode 100644
index 0000000..8251212
--- /dev/null
+++ b/libs/appfunctions/tests/AndroidTest.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2024 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<configuration description="Config for AppFunctions Sidecar Tests">
+ <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
+ <option name="cleanup-apks" value="true" />
+ <option name="test-file-name" value="AppFunctionsSidecarTestCases.apk" />
+ </target_preparer>
+ <option name="test-tag" value="AppFunctionsSidecarTestCases" />
+ <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
+ <option name="package" value="com.google.android.appfunctions.sidecar.tests" />
+ <option name="runner" value="androidx.test.runner.AndroidJUnitRunner" />
+ <option name="hidden-api-checks" value="false"/>
+ </test>
+</configuration>
diff --git a/libs/appfunctions/tests/src/com/google/android/appfunctions/sidecar/tests/SidecarConverterTest.kt b/libs/appfunctions/tests/src/com/google/android/appfunctions/sidecar/tests/SidecarConverterTest.kt
new file mode 100644
index 0000000..1f9fddd
--- /dev/null
+++ b/libs/appfunctions/tests/src/com/google/android/appfunctions/sidecar/tests/SidecarConverterTest.kt
@@ -0,0 +1,172 @@
+/*
+ * 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.google.android.appfunctions.sidecar.tests
+
+import android.app.appfunctions.ExecuteAppFunctionRequest
+import android.app.appfunctions.ExecuteAppFunctionResponse
+import android.app.appsearch.GenericDocument
+import android.os.Bundle
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.google.android.appfunctions.sidecar.SidecarConverter
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+class SidecarConverterTest {
+ @Test
+ fun getSidecarExecuteAppFunctionRequest_sameContents() {
+ val extras = Bundle()
+ extras.putString("extra", "value")
+ val parameters: GenericDocument =
+ GenericDocument.Builder<GenericDocument.Builder<*>>("", "", "")
+ .setPropertyLong("testLong", 23)
+ .build()
+ val platformRequest: ExecuteAppFunctionRequest =
+ ExecuteAppFunctionRequest.Builder("targetPkg", "targetFunctionId")
+ .setExtras(extras)
+ .setParameters(parameters)
+ .build()
+
+ val sidecarRequest = SidecarConverter.getSidecarExecuteAppFunctionRequest(platformRequest)
+
+ assertThat(sidecarRequest.targetPackageName).isEqualTo("targetPkg")
+ assertThat(sidecarRequest.functionIdentifier).isEqualTo("targetFunctionId")
+ assertThat(sidecarRequest.parameters).isEqualTo(parameters)
+ assertThat(sidecarRequest.extras.size()).isEqualTo(1)
+ assertThat(sidecarRequest.extras.getString("extra")).isEqualTo("value")
+ }
+
+ @Test
+ fun getPlatformExecuteAppFunctionRequest_sameContents() {
+ val extras = Bundle()
+ extras.putString("extra", "value")
+ val parameters: GenericDocument =
+ GenericDocument.Builder<GenericDocument.Builder<*>>("", "", "")
+ .setPropertyLong("testLong", 23)
+ .build()
+ val sidecarRequest =
+ com.google.android.appfunctions.sidecar.ExecuteAppFunctionRequest.Builder(
+ "targetPkg",
+ "targetFunctionId"
+ )
+ .setExtras(extras)
+ .setParameters(parameters)
+ .build()
+
+ val platformRequest = SidecarConverter.getPlatformExecuteAppFunctionRequest(sidecarRequest)
+
+ assertThat(platformRequest.targetPackageName).isEqualTo("targetPkg")
+ assertThat(platformRequest.functionIdentifier).isEqualTo("targetFunctionId")
+ assertThat(platformRequest.parameters).isEqualTo(parameters)
+ assertThat(platformRequest.extras.size()).isEqualTo(1)
+ assertThat(platformRequest.extras.getString("extra")).isEqualTo("value")
+ }
+
+ @Test
+ fun getSidecarExecuteAppFunctionResponse_successResponse_sameContents() {
+ val resultGd: GenericDocument =
+ GenericDocument.Builder<GenericDocument.Builder<*>>("", "", "")
+ .setPropertyBoolean(ExecuteAppFunctionResponse.PROPERTY_RETURN_VALUE, true)
+ .build()
+ val platformResponse = ExecuteAppFunctionResponse.newSuccess(resultGd, null)
+
+ val sidecarResponse = SidecarConverter.getSidecarExecuteAppFunctionResponse(
+ platformResponse
+ )
+
+ assertThat(sidecarResponse.isSuccess).isTrue()
+ assertThat(
+ sidecarResponse.resultDocument.getProperty(
+ ExecuteAppFunctionResponse.PROPERTY_RETURN_VALUE
+ )
+ )
+ .isEqualTo(booleanArrayOf(true))
+ assertThat(sidecarResponse.resultCode).isEqualTo(ExecuteAppFunctionResponse.RESULT_OK)
+ assertThat(sidecarResponse.errorMessage).isNull()
+ }
+
+ @Test
+ fun getSidecarExecuteAppFunctionResponse_errorResponse_sameContents() {
+ val emptyGd = GenericDocument.Builder<GenericDocument.Builder<*>>("", "", "").build()
+ val platformResponse =
+ ExecuteAppFunctionResponse.newFailure(
+ ExecuteAppFunctionResponse.RESULT_INTERNAL_ERROR,
+ null,
+ null
+ )
+
+ val sidecarResponse = SidecarConverter.getSidecarExecuteAppFunctionResponse(
+ platformResponse
+ )
+
+ assertThat(sidecarResponse.isSuccess).isFalse()
+ assertThat(sidecarResponse.resultDocument.namespace).isEqualTo(emptyGd.namespace)
+ assertThat(sidecarResponse.resultDocument.id).isEqualTo(emptyGd.id)
+ assertThat(sidecarResponse.resultDocument.schemaType).isEqualTo(emptyGd.schemaType)
+ assertThat(sidecarResponse.resultCode)
+ .isEqualTo(ExecuteAppFunctionResponse.RESULT_INTERNAL_ERROR)
+ assertThat(sidecarResponse.errorMessage).isNull()
+ }
+
+ @Test
+ fun getPlatformExecuteAppFunctionResponse_successResponse_sameContents() {
+ val resultGd: GenericDocument =
+ GenericDocument.Builder<GenericDocument.Builder<*>>("", "", "")
+ .setPropertyBoolean(ExecuteAppFunctionResponse.PROPERTY_RETURN_VALUE, true)
+ .build()
+ val sidecarResponse = com.google.android.appfunctions.sidecar.ExecuteAppFunctionResponse
+ .newSuccess(resultGd, null)
+
+ val platformResponse = SidecarConverter.getPlatformExecuteAppFunctionResponse(
+ sidecarResponse
+ )
+
+ assertThat(platformResponse.isSuccess).isTrue()
+ assertThat(
+ platformResponse.resultDocument.getProperty(
+ ExecuteAppFunctionResponse.PROPERTY_RETURN_VALUE
+ )
+ )
+ .isEqualTo(booleanArrayOf(true))
+ assertThat(platformResponse.resultCode).isEqualTo(ExecuteAppFunctionResponse.RESULT_OK)
+ assertThat(platformResponse.errorMessage).isNull()
+ }
+
+ @Test
+ fun getPlatformExecuteAppFunctionResponse_errorResponse_sameContents() {
+ val emptyGd = GenericDocument.Builder<GenericDocument.Builder<*>>("", "", "").build()
+ val sidecarResponse =
+ com.google.android.appfunctions.sidecar.ExecuteAppFunctionResponse.newFailure(
+ ExecuteAppFunctionResponse.RESULT_INTERNAL_ERROR,
+ null,
+ null
+ )
+
+ val platformResponse = SidecarConverter.getPlatformExecuteAppFunctionResponse(
+ sidecarResponse
+ )
+
+ assertThat(platformResponse.isSuccess).isFalse()
+ assertThat(platformResponse.resultDocument.namespace).isEqualTo(emptyGd.namespace)
+ assertThat(platformResponse.resultDocument.id).isEqualTo(emptyGd.id)
+ assertThat(platformResponse.resultDocument.schemaType).isEqualTo(emptyGd.schemaType)
+ assertThat(platformResponse.resultCode)
+ .isEqualTo(ExecuteAppFunctionResponse.RESULT_INTERNAL_ERROR)
+ assertThat(platformResponse.errorMessage).isNull()
+ }
+}
diff --git a/packages/SettingsLib/ActionButtonsPreference/Android.bp b/packages/SettingsLib/ActionButtonsPreference/Android.bp
index 71ecb4c..37a0e79 100644
--- a/packages/SettingsLib/ActionButtonsPreference/Android.bp
+++ b/packages/SettingsLib/ActionButtonsPreference/Android.bp
@@ -19,6 +19,7 @@
static_libs: [
"androidx.preference_preference",
+ "SettingsLibSettingsTheme",
],
sdk_version: "system_current",
diff --git a/packages/SettingsLib/ActionButtonsPreference/res/layout-v35/settingslib_expressive_action_buttons.xml b/packages/SettingsLib/ActionButtonsPreference/res/layout-v35/settingslib_expressive_action_buttons.xml
new file mode 100644
index 0000000..fc63c0f
--- /dev/null
+++ b/packages/SettingsLib/ActionButtonsPreference/res/layout-v35/settingslib_expressive_action_buttons.xml
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2024 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_margin="@dimen/settingslib_expressive_space_extrasmall4"
+ android:paddingHorizontal="@dimen/settingslib_expressive_space_extrasmall4"
+ android:orientation="horizontal">
+
+ <LinearLayout
+ android:id="@+id/action1"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:orientation="vertical">
+
+ <com.google.android.material.button.MaterialButton
+ android:id="@+id/button1"
+ style="@style/SettingsLibActionButton.Expressive"
+ android:layout_width="@dimen/settingslib_expressive_space_large3"
+ android:layout_height="@dimen/settingslib_expressive_space_medium5"
+ android:layout_gravity="center_horizontal" />
+ <TextView
+ android:id="@+id/text1"
+ style="@style/SettingsLibActionButton.Expressive.Label"
+ android:layout_marginTop="@dimen/settingslib_expressive_space_extrasmall3"/>
+
+ </LinearLayout>
+
+ <LinearLayout
+ android:id="@+id/action2"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:orientation="vertical">
+
+ <com.google.android.material.button.MaterialButton
+ android:id="@+id/button2"
+ style="@style/SettingsLibActionButton.Expressive"
+ android:layout_width="@dimen/settingslib_expressive_space_large3"
+ android:layout_height="@dimen/settingslib_expressive_space_medium5"
+ android:layout_gravity="center_horizontal" />
+ <TextView
+ android:id="@+id/text2"
+ style="@style/SettingsLibActionButton.Expressive.Label"
+ android:layout_marginTop="@dimen/settingslib_expressive_space_extrasmall3"/>
+
+ </LinearLayout>
+
+ <LinearLayout
+ android:id="@+id/action3"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:orientation="vertical">
+
+ <com.google.android.material.button.MaterialButton
+ android:id="@+id/button3"
+ style="@style/SettingsLibActionButton.Expressive"
+ android:layout_width="@dimen/settingslib_expressive_space_large3"
+ android:layout_height="@dimen/settingslib_expressive_space_medium5"
+ android:layout_gravity="center_horizontal" />
+ <TextView
+ android:id="@+id/text3"
+ style="@style/SettingsLibActionButton.Expressive.Label"
+ android:layout_marginTop="@dimen/settingslib_expressive_space_extrasmall3"/>
+
+ </LinearLayout>
+
+ <LinearLayout
+ android:id="@+id/action4"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:orientation="vertical">
+
+ <com.google.android.material.button.MaterialButton
+ android:id="@+id/button4"
+ style="@style/SettingsLibActionButton.Expressive"
+ android:layout_width="@dimen/settingslib_expressive_space_large3"
+ android:layout_height="@dimen/settingslib_expressive_space_medium5"
+ android:layout_gravity="center_horizontal" />
+ <TextView
+ android:id="@+id/text4"
+ style="@style/SettingsLibActionButton.Expressive.Label"
+ android:layout_marginTop="@dimen/settingslib_expressive_space_extrasmall3"/>
+ </LinearLayout>
+</LinearLayout>
diff --git a/packages/SettingsLib/ActionButtonsPreference/res/values-v35/styles_expressive.xml b/packages/SettingsLib/ActionButtonsPreference/res/values-v35/styles_expressive.xml
new file mode 100644
index 0000000..cc948a6
--- /dev/null
+++ b/packages/SettingsLib/ActionButtonsPreference/res/values-v35/styles_expressive.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2024 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources>
+ <style name="SettingsLibActionButton.Expressive" parent="SettingsLibButtonStyle.Expressive.Tonal">
+ <item name="android:backgroundTint">@color/settingslib_materialColorPrimaryContainer</item>
+ <item name="iconTint">@color/settingslib_materialColorOnPrimaryContainer</item>
+ <item name="iconGravity">textTop</item>
+ </style>
+
+ <style name="SettingsLibActionButton.Expressive.Label" parent="SettingsLibTextAppearance.Emphasized.Title.Small">
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:minWidth">@dimen/settingslib_expressive_space_small3</item>
+ <item name="android:minHeight">@dimen/settingslib_expressive_space_small3</item>
+ <item name="android:textColor">@color/settingslib_materialColorOnSurface</item>
+ <item name="android:layout_gravity">center</item>
+ </style>
+
+</resources>
diff --git a/packages/SettingsLib/ActionButtonsPreference/src/com/android/settingslib/widget/ActionButtonsPreference.java b/packages/SettingsLib/ActionButtonsPreference/src/com/android/settingslib/widget/ActionButtonsPreference.java
index 5dc11cf..f011039 100644
--- a/packages/SettingsLib/ActionButtonsPreference/src/com/android/settingslib/widget/ActionButtonsPreference.java
+++ b/packages/SettingsLib/ActionButtonsPreference/src/com/android/settingslib/widget/ActionButtonsPreference.java
@@ -26,6 +26,8 @@
import android.util.Log;
import android.view.View;
import android.widget.Button;
+import android.widget.LinearLayout;
+import android.widget.TextView;
import androidx.annotation.DrawableRes;
import androidx.annotation.StringRes;
@@ -34,6 +36,8 @@
import com.android.settingslib.widget.preference.actionbuttons.R;
+import com.google.android.material.button.MaterialButton;
+
import java.util.ArrayList;
import java.util.List;
@@ -98,7 +102,10 @@
}
private void init() {
- setLayoutResource(R.layout.settingslib_action_buttons);
+ int resId = SettingsThemeHelper.isExpressiveTheme(getContext())
+ ? R.layout.settingslib_expressive_action_buttons
+ : R.layout.settingslib_action_buttons;
+ setLayoutResource(resId);
setSelectable(false);
final Resources res = getContext().getResources();
@@ -127,6 +134,21 @@
mButton3Info.mButton = (Button) holder.findViewById(R.id.button3);
mButton4Info.mButton = (Button) holder.findViewById(R.id.button4);
+ if (SettingsThemeHelper.isExpressiveTheme(getContext())) {
+ mButton1Info.mIsExpressive = true;
+ mButton1Info.mTextView = (TextView) holder.findViewById(R.id.text1);
+ mButton1Info.mActionLayout = (LinearLayout) holder.findViewById(R.id.action1);
+ mButton2Info.mIsExpressive = true;
+ mButton2Info.mTextView = (TextView) holder.findViewById(R.id.text2);
+ mButton2Info.mActionLayout = (LinearLayout) holder.findViewById(R.id.action2);
+ mButton3Info.mIsExpressive = true;
+ mButton3Info.mTextView = (TextView) holder.findViewById(R.id.text3);
+ mButton3Info.mActionLayout = (LinearLayout) holder.findViewById(R.id.action3);
+ mButton4Info.mIsExpressive = true;
+ mButton4Info.mTextView = (TextView) holder.findViewById(R.id.text4);
+ mButton4Info.mActionLayout = (LinearLayout) holder.findViewById(R.id.action4);
+ }
+
mDivider1 = holder.findViewById(R.id.divider1);
mDivider2 = holder.findViewById(R.id.divider2);
mDivider3 = holder.findViewById(R.id.divider3);
@@ -169,45 +191,47 @@
mVisibleButtonInfos.add(mButton4Info);
}
- final boolean isRtl = getContext().getResources().getConfiguration()
- .getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
- switch (mVisibleButtonInfos.size()) {
- case SINGLE_BUTTON_STYLE :
- if (isRtl) {
- setupRtlBackgrounds(mVisibleButtonInfos, mBtnBackgroundStyle1);
- } else {
- setupBackgrounds(mVisibleButtonInfos, mBtnBackgroundStyle1);
- }
- break;
- case TWO_BUTTONS_STYLE :
- if (isRtl) {
- setupRtlBackgrounds(mVisibleButtonInfos, mBtnBackgroundStyle2);
- } else {
- setupBackgrounds(mVisibleButtonInfos, mBtnBackgroundStyle2);
- }
- break;
- case THREE_BUTTONS_STYLE :
- if (isRtl) {
- setupRtlBackgrounds(mVisibleButtonInfos, mBtnBackgroundStyle3);
- } else {
- setupBackgrounds(mVisibleButtonInfos, mBtnBackgroundStyle3);
- }
- break;
- case FOUR_BUTTONS_STYLE :
- if (isRtl) {
- setupRtlBackgrounds(mVisibleButtonInfos, mBtnBackgroundStyle4);
- } else {
- setupBackgrounds(mVisibleButtonInfos, mBtnBackgroundStyle4);
- }
- break;
- default:
- Log.e(TAG, "No visible buttons info, skip background settings.");
- break;
- }
+ if (!SettingsThemeHelper.isExpressiveTheme(getContext())) {
+ final boolean isRtl = getContext().getResources().getConfiguration()
+ .getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
+ switch (mVisibleButtonInfos.size()) {
+ case SINGLE_BUTTON_STYLE :
+ if (isRtl) {
+ setupRtlBackgrounds(mVisibleButtonInfos, mBtnBackgroundStyle1);
+ } else {
+ setupBackgrounds(mVisibleButtonInfos, mBtnBackgroundStyle1);
+ }
+ break;
+ case TWO_BUTTONS_STYLE :
+ if (isRtl) {
+ setupRtlBackgrounds(mVisibleButtonInfos, mBtnBackgroundStyle2);
+ } else {
+ setupBackgrounds(mVisibleButtonInfos, mBtnBackgroundStyle2);
+ }
+ break;
+ case THREE_BUTTONS_STYLE :
+ if (isRtl) {
+ setupRtlBackgrounds(mVisibleButtonInfos, mBtnBackgroundStyle3);
+ } else {
+ setupBackgrounds(mVisibleButtonInfos, mBtnBackgroundStyle3);
+ }
+ break;
+ case FOUR_BUTTONS_STYLE :
+ if (isRtl) {
+ setupRtlBackgrounds(mVisibleButtonInfos, mBtnBackgroundStyle4);
+ } else {
+ setupBackgrounds(mVisibleButtonInfos, mBtnBackgroundStyle4);
+ }
+ break;
+ default:
+ Log.e(TAG, "No visible buttons info, skip background settings.");
+ break;
+ }
- setupDivider1();
- setupDivider2();
- setupDivider3();
+ setupDivider1();
+ setupDivider2();
+ setupDivider3();
+ }
}
private void setupBackgrounds(
@@ -509,23 +533,43 @@
static class ButtonInfo {
private Button mButton;
+ private TextView mTextView;
+ private LinearLayout mActionLayout;
private CharSequence mText;
private Drawable mIcon;
private View.OnClickListener mListener;
private boolean mIsEnabled = true;
private boolean mIsVisible = true;
+ private boolean mIsExpressive = false;
void setUpButton() {
- mButton.setText(mText);
+ if (mIsExpressive) {
+ mTextView.setText(mText);
+ if (mButton instanceof MaterialButton) {
+ ((MaterialButton) mButton).setIcon(mIcon);
+ }
+ } else {
+ mButton.setText(mText);
+ mButton.setCompoundDrawablesWithIntrinsicBounds(
+ null /* left */, mIcon /* top */, null /* right */, null /* bottom */);
+ }
+
mButton.setOnClickListener(mListener);
mButton.setEnabled(mIsEnabled);
- mButton.setCompoundDrawablesWithIntrinsicBounds(
- null /* left */, mIcon /* top */, null /* right */, null /* bottom */);
+
if (shouldBeVisible()) {
mButton.setVisibility(View.VISIBLE);
+ if (mIsExpressive) {
+ mTextView.setVisibility(View.VISIBLE);
+ mActionLayout.setVisibility(View.VISIBLE);
+ }
} else {
mButton.setVisibility(View.GONE);
+ if (mIsExpressive) {
+ mTextView.setVisibility(View.GONE);
+ mActionLayout.setVisibility(View.GONE);
+ }
}
}
diff --git a/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceHierarchy.kt b/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceHierarchy.kt
index 4503738..6992005 100644
--- a/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceHierarchy.kt
+++ b/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceHierarchy.kt
@@ -54,6 +54,20 @@
children.add(PreferenceHierarchyNode(metadata))
}
+ /** Adds a preference to the hierarchy before a specific preference. */
+ fun addBefore(key: String, metadata: PreferenceMetadata) {
+ var foundIndex = children.indexOfFirst { it.metadata.key == key }
+ if (foundIndex == -1) foundIndex = children.size
+ children.add(foundIndex, PreferenceHierarchyNode(metadata))
+ }
+
+ /** Adds a preference to the hierarchy after a specific preference. */
+ fun addAfter(key: String, metadata: PreferenceMetadata) {
+ var foundIndex = children.indexOfFirst { it.metadata.key == key }
+ if (foundIndex == -1) foundIndex = children.size else foundIndex++
+ children.add(foundIndex, PreferenceHierarchyNode(metadata))
+ }
+
/** Adds a preference group to the hierarchy. */
operator fun PreferenceGroup.unaryPlus() = PreferenceHierarchy(this).also { children.add(it) }
diff --git a/packages/SettingsLib/SettingsTheme/res/values-v35/dimens_expressive.xml b/packages/SettingsLib/SettingsTheme/res/values-v35/dimens_expressive.xml
index 2320aab..0542c51 100644
--- a/packages/SettingsLib/SettingsTheme/res/values-v35/dimens_expressive.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values-v35/dimens_expressive.xml
@@ -48,6 +48,7 @@
<dimen name="settingslib_expressive_space_medium2">36dp</dimen>
<dimen name="settingslib_expressive_space_medium3">40dp</dimen>
<dimen name="settingslib_expressive_space_medium4">48dp</dimen>
+ <dimen name="settingslib_expressive_space_medium5">56dp</dimen>
<dimen name="settingslib_expressive_space_large1">60dp</dimen>
<dimen name="settingslib_expressive_space_large2">64dp</dimen>
<dimen name="settingslib_expressive_space_large3">72dp</dimen>
diff --git a/packages/SettingsLib/SettingsTheme/res/values-v35/styles_expressive.xml b/packages/SettingsLib/SettingsTheme/res/values-v35/styles_expressive.xml
index 04ae80e..442def9 100644
--- a/packages/SettingsLib/SettingsTheme/res/values-v35/styles_expressive.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values-v35/styles_expressive.xml
@@ -169,4 +169,23 @@
<item name="android:focusable">false</item>
<item name="thumbIcon">@drawable/settingslib_expressive_switch_thumb_icon</item>
</style>
+
+ <style name="SettingsLibButtonStyle.Expressive.Tonal"
+ parent="@style/Widget.Material3.Button.TonalButton">
+ <item name="android:theme">@style/Theme.Material3.DynamicColors.DayNight</item>
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:gravity">center</item>
+ <item name="android:minWidth">@dimen/settingslib_expressive_space_medium4</item>
+ <item name="android:minHeight">@dimen/settingslib_expressive_space_medium4</item>
+ <item name="android:paddingVertical">@dimen/settingslib_expressive_space_extrasmall5</item>
+ <item name="android:paddingHorizontal">@dimen/settingslib_expressive_space_small1</item>
+ <item name="android:backgroundTint">@color/settingslib_materialColorSecondaryContainer</item>
+ <item name="android:textAppearance">@android:style/TextAppearance.DeviceDefault.Medium</item>
+ <item name="android:textColor">@color/settingslib_materialColorOnSecondaryContainer</item>
+ <item name="android:textSize">14sp</item>
+ <item name="iconGravity">textStart</item>
+ <item name="iconTint">@color/settingslib_materialColorOnSecondaryContainer</item>
+ <item name="iconSize">@dimen/settingslib_expressive_space_small4</item>
+ </style>
</resources>
\ No newline at end of file
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/SliderPage.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/SliderPage.kt
deleted file mode 100644
index 1051549..0000000
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/SliderPage.kt
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settingslib.spa.gallery.page
-
-import android.os.Bundle
-import androidx.compose.material.icons.Icons
-import androidx.compose.material.icons.outlined.AccessAlarm
-import androidx.compose.material.icons.outlined.MusicNote
-import androidx.compose.material.icons.outlined.MusicOff
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.remember
-import androidx.compose.runtime.setValue
-import androidx.compose.ui.tooling.preview.Preview
-import com.android.settingslib.spa.framework.common.SettingsEntry
-import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
-import com.android.settingslib.spa.framework.common.SettingsPageProvider
-import com.android.settingslib.spa.framework.common.createSettingsPage
-import com.android.settingslib.spa.framework.compose.navigator
-import com.android.settingslib.spa.framework.theme.SettingsTheme
-import com.android.settingslib.spa.widget.preference.SliderPreference
-import com.android.settingslib.spa.widget.preference.SliderPreferenceModel
-import com.android.settingslib.spa.widget.preference.Preference
-import com.android.settingslib.spa.widget.preference.PreferenceModel
-
-private const val TITLE = "Sample Slider"
-
-object SliderPageProvider : SettingsPageProvider {
- override val name = "Slider"
- private val owner = createSettingsPage()
-
- override fun buildEntry(arguments: Bundle?): List<SettingsEntry> {
- val entryList = mutableListOf<SettingsEntry>()
- entryList.add(
- SettingsEntryBuilder.create("Simple Slider", owner)
- .setUiLayoutFn {
- SliderPreference(object : SliderPreferenceModel {
- override val title = "Simple Slider"
- override val initValue = 40
- })
- }.build()
- )
- entryList.add(
- SettingsEntryBuilder.create("Slider with icon", owner)
- .setUiLayoutFn {
- SliderPreference(object : SliderPreferenceModel {
- override val title = "Slider with icon"
- override val initValue = 30
- override val onValueChangeFinished = {
- println("onValueChangeFinished")
- }
- override val icon = Icons.Outlined.AccessAlarm
- })
- }.build()
- )
- entryList.add(
- SettingsEntryBuilder.create("Slider with changeable icon", owner)
- .setUiLayoutFn {
- val initValue = 0
- var icon by remember { mutableStateOf(Icons.Outlined.MusicOff) }
- var sliderPosition by remember { mutableStateOf(initValue) }
- SliderPreference(object : SliderPreferenceModel {
- override val title = "Slider with changeable icon"
- override val initValue = initValue
- override val onValueChange = { it: Int ->
- sliderPosition = it
- icon = if (it > 0) Icons.Outlined.MusicNote else Icons.Outlined.MusicOff
- }
- override val onValueChangeFinished = {
- println("onValueChangeFinished: the value is $sliderPosition")
- }
- override val icon = icon
- })
- }.build()
- )
- entryList.add(
- SettingsEntryBuilder.create("Slider with steps", owner)
- .setUiLayoutFn {
- SliderPreference(object : SliderPreferenceModel {
- override val title = "Slider with steps"
- override val initValue = 2
- override val valueRange = 1..5
- override val showSteps = true
- })
- }.build()
- )
-
- return entryList
- }
-
- fun buildInjectEntry(): SettingsEntryBuilder {
- return SettingsEntryBuilder.createInject(owner)
- .setUiLayoutFn {
- Preference(object : PreferenceModel {
- override val title = TITLE
- override val onClick = navigator(name)
- })
- }
- }
-
- override fun getTitle(arguments: Bundle?): String {
- return TITLE
- }
-}
-
-@Preview(showBackground = true)
-@Composable
-private fun SliderPagePreview() {
- SettingsTheme {
- SliderPageProvider.Page(null)
- }
-}
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/SliderPageProvider.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/SliderPageProvider.kt
new file mode 100644
index 0000000..89b10ee
--- /dev/null
+++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/SliderPageProvider.kt
@@ -0,0 +1,140 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.spa.gallery.page
+
+import android.os.Bundle
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.outlined.AccessAlarm
+import androidx.compose.material.icons.outlined.MusicNote
+import androidx.compose.material.icons.outlined.MusicOff
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.tooling.preview.Preview
+import com.android.settingslib.spa.framework.common.SettingsEntry
+import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
+import com.android.settingslib.spa.framework.common.SettingsPageProvider
+import com.android.settingslib.spa.framework.common.createSettingsPage
+import com.android.settingslib.spa.framework.compose.navigator
+import com.android.settingslib.spa.framework.theme.SettingsTheme
+import com.android.settingslib.spa.widget.preference.Preference
+import com.android.settingslib.spa.widget.preference.PreferenceModel
+import com.android.settingslib.spa.widget.preference.SliderPreference
+import com.android.settingslib.spa.widget.preference.SliderPreferenceModel
+
+private const val TITLE = "Sample Slider"
+
+object SliderPageProvider : SettingsPageProvider {
+ override val name = "Slider"
+ private val owner = createSettingsPage()
+
+ override fun buildEntry(arguments: Bundle?): List<SettingsEntry> {
+ val entryList = mutableListOf<SettingsEntry>()
+ entryList.add(
+ SettingsEntryBuilder.create("Simple Slider", owner)
+ .setUiLayoutFn {
+ SliderPreference(
+ object : SliderPreferenceModel {
+ override val title = "Simple Slider"
+ override val initValue = 40
+ }
+ )
+ }
+ .build()
+ )
+ entryList.add(
+ SettingsEntryBuilder.create("Slider with icon", owner)
+ .setUiLayoutFn {
+ SliderPreference(
+ object : SliderPreferenceModel {
+ override val title = "Slider with icon"
+ override val initValue = 30
+ override val onValueChangeFinished = {
+ println("onValueChangeFinished")
+ }
+ override val iconStart = Icons.Outlined.AccessAlarm
+ }
+ )
+ }
+ .build()
+ )
+ entryList.add(
+ SettingsEntryBuilder.create("Slider with changeable icon", owner)
+ .setUiLayoutFn {
+ val initValue = 0
+ var icon by remember { mutableStateOf(Icons.Outlined.MusicOff) }
+ var sliderPosition by remember { mutableStateOf(initValue) }
+ SliderPreference(
+ object : SliderPreferenceModel {
+ override val title = "Slider with changeable icon"
+ override val initValue = initValue
+ override val onValueChange = { it: Int ->
+ sliderPosition = it
+ icon =
+ if (it > 0) Icons.Outlined.MusicNote
+ else Icons.Outlined.MusicOff
+ }
+ override val onValueChangeFinished = {
+ println("onValueChangeFinished: the value is $sliderPosition")
+ }
+ override val iconEnd = icon
+ }
+ )
+ }
+ .build()
+ )
+ entryList.add(
+ SettingsEntryBuilder.create("Slider with steps", owner)
+ .setUiLayoutFn {
+ SliderPreference(
+ object : SliderPreferenceModel {
+ override val title = "Slider with steps"
+ override val initValue = 2
+ override val valueRange = 1..5
+ override val showSteps = true
+ }
+ )
+ }
+ .build()
+ )
+
+ return entryList
+ }
+
+ fun buildInjectEntry(): SettingsEntryBuilder {
+ return SettingsEntryBuilder.createInject(owner).setUiLayoutFn {
+ Preference(
+ object : PreferenceModel {
+ override val title = TITLE
+ override val onClick = navigator(name)
+ }
+ )
+ }
+ }
+
+ override fun getTitle(arguments: Bundle?): String {
+ return TITLE
+ }
+}
+
+@Preview(showBackground = true)
+@Composable
+private fun SliderPagePreview() {
+ SettingsTheme { SliderPageProvider.Page(null) }
+}
diff --git a/packages/SettingsLib/Spa/screenshot/src/com/android/settingslib/spa/screenshot/widget/preference/SliderPreferenceScreenshotTest.kt b/packages/SettingsLib/Spa/screenshot/src/com/android/settingslib/spa/screenshot/widget/preference/SliderPreferenceScreenshotTest.kt
index 3a96a70..ca36e5b 100644
--- a/packages/SettingsLib/Spa/screenshot/src/com/android/settingslib/spa/screenshot/widget/preference/SliderPreferenceScreenshotTest.kt
+++ b/packages/SettingsLib/Spa/screenshot/src/com/android/settingslib/spa/screenshot/widget/preference/SliderPreferenceScreenshotTest.kt
@@ -60,7 +60,7 @@
override val onValueChangeFinished = {
println("onValueChangeFinished")
}
- override val icon = Icons.Outlined.AccessAlarm
+ override val iconStart = Icons.Outlined.AccessAlarm
})
SliderPreference(object : SliderPreferenceModel {
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/SliderPreference.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/SliderPreference.kt
index 7bca38f..b2a3aac 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/SliderPreference.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/SliderPreference.kt
@@ -16,6 +16,10 @@
package com.android.settingslib.spa.widget.preference
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.AccessAlarm
import androidx.compose.material.icons.outlined.MusicNote
@@ -27,30 +31,25 @@
import androidx.compose.runtime.remember
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 androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.dp
+import com.android.settingslib.spa.framework.theme.SettingsDimension
import com.android.settingslib.spa.framework.theme.SettingsTheme
import com.android.settingslib.spa.framework.util.EntryHighlight
import com.android.settingslib.spa.widget.ui.SettingsSlider
-/**
- * The widget model for [SliderPreference] widget.
- */
+/** The widget model for [SliderPreference] widget. */
interface SliderPreferenceModel {
- /**
- * The title of this [SliderPreference].
- */
+ /** The title of this [SliderPreference]. */
val title: String
- /**
- * The initial position of the [SliderPreference].
- */
+ /** The initial position of the [SliderPreference]. */
val initValue: Int
- /**
- * The value range for this [SliderPreference].
- */
+ /** The value range for this [SliderPreference]. */
val valueRange: IntRange
get() = 0..100
@@ -69,15 +68,23 @@
get() = null
/**
- * The icon image for [SliderPreference]. If not specified, the slider hides the icon by default.
+ * The start icon image for [SliderPreference]. If not specified, the slider hides the icon by
+ * default.
*/
- val icon: ImageVector?
+ val iconStart: ImageVector?
get() = null
/**
- * Indicates whether to show step marks. If show step marks, when user finish sliding,
- * the slider will automatically jump to the nearest step mark. Otherwise, the slider hides
- * the step marks by default.
+ * The end icon image for [SliderPreference]. If not specified, the slider hides the icon by
+ * default.
+ */
+ val iconEnd: ImageVector?
+ get() = null
+
+ /**
+ * Indicates whether to show step marks. If show step marks, when user finish sliding, the
+ * slider will automatically jump to the nearest step mark. Otherwise, the slider hides the step
+ * marks by default.
*
* The step is fixed to 1.
*/
@@ -99,7 +106,8 @@
valueRange = model.valueRange,
onValueChange = model.onValueChange,
onValueChangeFinished = model.onValueChangeFinished,
- icon = model.icon,
+ iconStart = model.iconStart,
+ iconEnd = model.iconEnd,
showSteps = model.showSteps,
)
}
@@ -113,27 +121,45 @@
valueRange: IntRange = 0..100,
onValueChange: ((value: Int) -> Unit)? = null,
onValueChangeFinished: (() -> Unit)? = null,
- icon: ImageVector? = null,
+ iconStart: ImageVector? = null,
+ iconEnd: ImageVector? = null,
showSteps: Boolean = false,
) {
+
BaseLayout(
title = title,
subTitle = {
- SettingsSlider(
- initValue,
- modifier,
- valueRange,
- onValueChange,
- onValueChangeFinished,
- showSteps
- )
+ Row(verticalAlignment = Alignment.CenterVertically) {
+ if (iconStart != null) {
+ SliderIcon(icon = iconStart)
+ Spacer(Modifier.padding(SettingsDimension.paddingSmall))
+ }
+ Box(Modifier.weight(1f)) {
+ SettingsSlider(
+ initValue,
+ modifier,
+ valueRange,
+ onValueChange,
+ onValueChangeFinished,
+ showSteps,
+ )
+ }
+ if (iconEnd != null) {
+ Spacer(Modifier.padding(SettingsDimension.paddingSmall))
+ SliderIcon(icon = iconEnd)
+ }
+ }
},
- icon = if (icon != null) ({
- Icon(imageVector = icon, contentDescription = null)
- }) else null,
)
}
+@Composable
+fun SliderIcon(icon: ImageVector) {
+ Box(modifier = Modifier.padding(8.dp), contentAlignment = Alignment.Center) {
+ Icon(imageVector = icon, contentDescription = null)
+ }
+}
+
@Preview
@Composable
private fun SliderPreferencePreview() {
@@ -147,7 +173,7 @@
onValueChangeFinished = {
println("onValueChangeFinished: the value is $sliderPosition")
},
- icon = Icons.Outlined.AccessAlarm,
+ iconStart = Icons.Outlined.AccessAlarm,
)
}
}
@@ -163,7 +189,22 @@
onValueChange = { it: Int ->
icon = if (it > 0) Icons.Outlined.MusicNote else Icons.Outlined.MusicOff
},
- icon = icon,
+ iconEnd = icon,
+ )
+ }
+}
+
+@Preview
+@Composable
+private fun SliderPreferenceTwoIconPreview() {
+ SettingsTheme {
+ val iconStart by remember { mutableStateOf(Icons.Outlined.MusicNote) }
+ val iconEnd by remember { mutableStateOf(Icons.Outlined.MusicOff) }
+ SliderPreference(
+ title = "Media Volume",
+ initValue = 40,
+ iconStart = iconStart,
+ iconEnd = iconEnd,
)
}
}
@@ -172,11 +213,6 @@
@Composable
private fun SliderPreferenceStepsPreview() {
SettingsTheme {
- SliderPreference(
- title = "Display Text",
- initValue = 2,
- valueRange = 1..5,
- showSteps = true,
- )
+ SliderPreference(title = "Display Text", initValue = 2, valueRange = 1..5, showSteps = true)
}
}
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/TwoTargetPreference.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/TwoTargetPreference.kt
index 3f68804..92b1005 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/TwoTargetPreference.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/TwoTargetPreference.kt
@@ -17,18 +17,27 @@
package com.android.settingslib.spa.widget.preference
import androidx.compose.foundation.background
+import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Row
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.filled.ChevronRight
+import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import com.android.settingslib.spa.framework.theme.SettingsDimension
+import com.android.settingslib.spa.framework.theme.SettingsOpacity.alphaForEnabled
import com.android.settingslib.spa.framework.theme.divider
+import com.android.settingslib.spa.framework.theme.isSpaExpressiveEnabled
+import com.android.settingslib.spa.framework.util.wrapOnClickWithLog
@Composable
internal fun TwoTargetPreference(
@@ -40,21 +49,45 @@
widget: @Composable () -> Unit,
) {
Row(
- modifier = Modifier
- .fillMaxWidth()
- .padding(end = SettingsDimension.itemPaddingEnd),
+ modifier = Modifier.fillMaxWidth().padding(end = SettingsDimension.itemPaddingEnd),
verticalAlignment = Alignment.CenterVertically,
) {
- Box(modifier = Modifier.weight(1f)) {
- Preference(
- object : PreferenceModel {
- override val title = title
- override val summary = summary
- override val icon = icon
- override val enabled = primaryEnabled
- override val onClick = primaryOnClick
+ if (isSpaExpressiveEnabled) {
+ val onClickWithLog = wrapOnClickWithLog(primaryOnClick)
+ val enabled = primaryEnabled()
+ val modifier =
+ if (onClickWithLog != null) {
+ Modifier.clickable(enabled = enabled, onClick = onClickWithLog)
+ } else Modifier
+ Box(modifier = Modifier.weight(1f)) {
+ BasePreference(
+ title = title,
+ summary = summary,
+ icon = icon,
+ enabled = primaryEnabled,
+ modifier = modifier,
+ paddingEnd = 0.dp,
+ ) {
+ val alphaModifier = Modifier.alphaForEnabled(primaryEnabled())
+ Icon(
+ imageVector = Icons.Filled.ChevronRight,
+ contentDescription = null,
+ modifier = alphaModifier.size(18.dp),
+ )
}
- )
+ }
+ } else {
+ Box(modifier = Modifier.weight(1f)) {
+ Preference(
+ object : PreferenceModel {
+ override val title = title
+ override val summary = summary
+ override val icon = icon
+ override val enabled = primaryEnabled
+ override val onClick = primaryOnClick
+ }
+ )
+ }
}
PreferenceDivider()
widget()
@@ -64,8 +97,7 @@
@Composable
private fun PreferenceDivider() {
Box(
- Modifier
- .padding(horizontal = SettingsDimension.itemPaddingEnd)
+ Modifier.padding(horizontal = SettingsDimension.itemPaddingEnd)
.size(width = 1.dp, height = SettingsDimension.itemDividerHeight)
.background(color = MaterialTheme.colorScheme.divider)
)
diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml
index 0c9ed5c..66644cb 100644
--- a/packages/SettingsLib/res/values-am/strings.xml
+++ b/packages/SettingsLib/res/values-am/strings.xml
@@ -582,8 +582,7 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"ልክ አሁን"</string>
<string name="media_transfer_this_device_name" msgid="2357329267148436433">"ይህ ስልክ"</string>
<string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"ይህ ጡባዊ"</string>
- <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
- <skip />
+ <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"ይህ ኮምፒውተር (ውስጣዊ)"</string>
<!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
<skip />
<string name="media_transfer_internal_mic" msgid="797333824290228595">"ማይክሮፎን (ውስጣዊ)"</string>
@@ -687,12 +686,9 @@
<string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"ተሰናክሏል"</string>
<string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"ነቅቷል"</string>
<string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"የእርስዎን መሣሪያ ይህ ለው ለማመልከት እንደገና መነሣት አለበት። አሁን እንደገና ያስነሡ ወይም ይተዉት።"</string>
- <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
- <skip />
- <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
- <skip />
- <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
- <skip />
+ <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"ባለገመድ የራስ ላይ ማዳመጫ"</string>
+ <string name="media_transfer_headphone_name" msgid="1131962659136578852">"የጆሮ ማዳመጫ"</string>
+ <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB ድምፅ ማውጫ"</string>
<string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"የማይክሮፎን መሰኪያ"</string>
<string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB ማይክሮፎን"</string>
<string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"አብራ"</string>
diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml
index 46e4c76..e241c8a 100644
--- a/packages/SettingsLib/res/values-ar/strings.xml
+++ b/packages/SettingsLib/res/values-ar/strings.xml
@@ -582,8 +582,7 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"للتو"</string>
<string name="media_transfer_this_device_name" msgid="2357329267148436433">"هذا الهاتف"</string>
<string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"هذا الجهاز اللوحي"</string>
- <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
- <skip />
+ <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"هذا الكمبيوتر (داخلي)"</string>
<!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
<skip />
<string name="media_transfer_internal_mic" msgid="797333824290228595">"ميكروفون (داخلي)"</string>
@@ -687,12 +686,9 @@
<string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"غير مفعّل"</string>
<string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"مفعّل"</string>
<string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"يجب إعادة تشغيل جهازك ليتم تطبيق هذا التغيير. يمكنك إعادة التشغيل الآن أو إلغاء التغيير."</string>
- <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
- <skip />
- <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
- <skip />
- <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
- <skip />
+ <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"سماعات رأس سلكية"</string>
+ <string name="media_transfer_headphone_name" msgid="1131962659136578852">"سماعات رأس"</string>
+ <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"مكبّر صوت USB"</string>
<string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"مقبس الميكروفون"</string>
<string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"ميكروفون بمنفذ USB"</string>
<string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"مفعّلة"</string>
diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml
index 82cd91c..4e734b9 100644
--- a/packages/SettingsLib/res/values-as/strings.xml
+++ b/packages/SettingsLib/res/values-as/strings.xml
@@ -582,8 +582,7 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"এই মাত্ৰ"</string>
<string name="media_transfer_this_device_name" msgid="2357329267148436433">"এই ফ’নটো"</string>
<string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"এই টেবলেটটো"</string>
- <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
- <skip />
+ <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"এই কম্পিউটাৰ (অভ্যন্তৰীণ)"</string>
<!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
<skip />
<string name="media_transfer_internal_mic" msgid="797333824290228595">"মাইক্ৰ’ফ’ন (অভ্যন্তৰীণ)"</string>
@@ -687,12 +686,9 @@
<string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"অক্ষম কৰা আছে"</string>
<string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"সক্ষম কৰা আছে"</string>
<string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"এই সলনিটো কার্যকৰী হ’বলৈ আপোনাৰ ডিভাইচটো ৰিবুট কৰিবই লাগিব। এতিয়াই ৰিবুট কৰক অথবা বাতিল কৰক।"</string>
- <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
- <skip />
- <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
- <skip />
- <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
- <skip />
+ <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"তাঁৰযুক্ত হেডফ’ন"</string>
+ <string name="media_transfer_headphone_name" msgid="1131962659136578852">"হেডফ’ন"</string>
+ <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB স্পীকাৰ"</string>
<string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"মাইকৰ জেক"</string>
<string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"ইউএছবি মাইক"</string>
<string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"অন"</string>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
index 5da1c69..fdd969d 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
@@ -582,8 +582,7 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Upravo"</string>
<string name="media_transfer_this_device_name" msgid="2357329267148436433">"Ovaj telefon"</string>
<string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Ovaj tablet"</string>
- <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
- <skip />
+ <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Ovaj računar (interno)"</string>
<!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
<skip />
<string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofon (interni)"</string>
@@ -687,12 +686,9 @@
<string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Onemogućeno"</string>
<string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Omogućeno"</string>
<string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Morate da restartujete uređaj da bi se ova promena primenila. Restartujte ga odmah ili otkažite."</string>
- <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
- <skip />
- <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
- <skip />
- <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
- <skip />
+ <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Žičane slušalice"</string>
+ <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Slušalice"</string>
+ <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB zvučnik"</string>
<string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Utikač za mikrofon"</string>
<string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB mikrofon"</string>
<string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Uključeno"</string>
diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml
index e782aa1..e7b9723 100644
--- a/packages/SettingsLib/res/values-bn/strings.xml
+++ b/packages/SettingsLib/res/values-bn/strings.xml
@@ -376,7 +376,7 @@
<string name="strict_mode_summary" msgid="1838248687233554654">"মুখ্য থ্রেডে অ্যাপগুলির দীর্ঘ কার্যকলাপের ক্ষেত্রে স্ক্রিন ফ্ল্যাশ করে"</string>
<string name="pointer_location" msgid="7516929526199520173">"পয়েন্টারের লোকেশন"</string>
<string name="pointer_location_summary" msgid="957120116989798464">"স্ক্রিন ওভারলে বর্তমান স্পর্শ ডেটা দেখাচ্ছে"</string>
- <string name="show_touches" msgid="8437666942161289025">"আলতো চাপ দেখান"</string>
+ <string name="show_touches" msgid="8437666942161289025">"ট্যাপ দেখান"</string>
<string name="show_touches_summary" msgid="3692861665994502193">"আলতো চাপ দিলে ভিজ্যুয়াল প্রতিক্রিয়া দেখান"</string>
<string name="show_key_presses" msgid="6360141722735900214">"প্রেস করা কী দেখুন"</string>
<string name="show_key_presses_summary" msgid="725387457373015024">"ফিজিক্যাল কী প্রেস করা হলে ভিজুয়াল ফিডব্যাক দেখুন"</string>
diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml
index bddced5..e8d4a7c 100644
--- a/packages/SettingsLib/res/values-bs/strings.xml
+++ b/packages/SettingsLib/res/values-bs/strings.xml
@@ -582,8 +582,7 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Upravo"</string>
<string name="media_transfer_this_device_name" msgid="2357329267148436433">"Ovaj telefon"</string>
<string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Ovaj tablet"</string>
- <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
- <skip />
+ <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Ovo računalo (interno)"</string>
<!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
<skip />
<string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofon (interni)"</string>
@@ -687,12 +686,9 @@
<string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Onemogućeno"</string>
<string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Omogućeno"</string>
<string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Morate ponovo pokrenuti uređaj da se ova promjena primijeni. Ponovo pokrenite odmah ili otkažite."</string>
- <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
- <skip />
- <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
- <skip />
- <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
- <skip />
+ <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Žičane slušalice"</string>
+ <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Slušalice"</string>
+ <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB zvučnik"</string>
<string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Priključak za mikrofon"</string>
<string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB mikrofon"</string>
<string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Uključi"</string>
diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml
index 89f8f5a..d75e314 100644
--- a/packages/SettingsLib/res/values-ca/strings.xml
+++ b/packages/SettingsLib/res/values-ca/strings.xml
@@ -582,8 +582,7 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Ara mateix"</string>
<string name="media_transfer_this_device_name" msgid="2357329267148436433">"Aquest telèfon"</string>
<string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Aquesta tauleta"</string>
- <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
- <skip />
+ <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Aquest ordinador (intern)"</string>
<!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
<skip />
<string name="media_transfer_internal_mic" msgid="797333824290228595">"Micròfon (intern)"</string>
@@ -687,12 +686,9 @@
<string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Desactivat"</string>
<string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Activat"</string>
<string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Has de reiniciar el teu dispositiu perquè s\'apliquin els canvis. Reinicia\'l ara o cancel·la."</string>
- <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
- <skip />
- <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
- <skip />
- <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
- <skip />
+ <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Auriculars amb cable"</string>
+ <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Auriculars"</string>
+ <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"Altaveu USB"</string>
<string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Connector per al micròfon"</string>
<string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Micròfon USB"</string>
<string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Activa"</string>
diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml
index ac46bb6..9ba5b50 100644
--- a/packages/SettingsLib/res/values-de/strings.xml
+++ b/packages/SettingsLib/res/values-de/strings.xml
@@ -586,8 +586,7 @@
<skip />
<!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
<skip />
- <!-- no translation found for media_transfer_internal_mic (797333824290228595) -->
- <skip />
+ <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofon (intern)"</string>
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Dock-Lautsprecher"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Externes Gerät"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Verbundenes Gerät"</string>
@@ -694,10 +693,8 @@
<skip />
<!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
<skip />
- <!-- no translation found for media_transfer_wired_device_mic_name (7417067197803840965) -->
- <skip />
- <!-- no translation found for media_transfer_usb_device_mic_name (9189914846215516322) -->
- <skip />
+ <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Mikrofonanschluss"</string>
+ <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB‑Mikrofon"</string>
<string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"An"</string>
<string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Aus"</string>
<string name="carrier_network_change_mode" msgid="4257621815706644026">"Mobilfunknetzwerk wird gewechselt"</string>
diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml
index 961f0e7..d4e01de 100644
--- a/packages/SettingsLib/res/values-en-rAU/strings.xml
+++ b/packages/SettingsLib/res/values-en-rAU/strings.xml
@@ -582,8 +582,7 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Just now"</string>
<string name="media_transfer_this_device_name" msgid="2357329267148436433">"This phone"</string>
<string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"This tablet"</string>
- <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
- <skip />
+ <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"This computer (internal)"</string>
<!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
<skip />
<string name="media_transfer_internal_mic" msgid="797333824290228595">"Microphone (internal)"</string>
@@ -687,12 +686,9 @@
<string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Disabled"</string>
<string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Enabled"</string>
<string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Your device must be rebooted for this change to apply. Reboot now or cancel."</string>
- <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
- <skip />
- <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
- <skip />
- <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
- <skip />
+ <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Wired headphones"</string>
+ <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Headphone"</string>
+ <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB speaker"</string>
<string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Mic jack"</string>
<string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB mic"</string>
<string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"On"</string>
diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml
index 6c2f45e..602a0ed 100644
--- a/packages/SettingsLib/res/values-en-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-en-rCA/strings.xml
@@ -582,8 +582,7 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Just now"</string>
<string name="media_transfer_this_device_name" msgid="2357329267148436433">"This phone"</string>
<string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"This tablet"</string>
- <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
- <skip />
+ <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"This computer (internal)"</string>
<!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
<skip />
<string name="media_transfer_internal_mic" msgid="797333824290228595">"Microphone (internal)"</string>
@@ -687,12 +686,9 @@
<string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Disabled"</string>
<string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Enabled"</string>
<string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Your device must be rebooted for this change to apply. Reboot now or cancel."</string>
- <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
- <skip />
- <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
- <skip />
- <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
- <skip />
+ <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Wired headphone"</string>
+ <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Headphone"</string>
+ <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB speaker"</string>
<string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Mic jack"</string>
<string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB mic"</string>
<string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"On"</string>
diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml
index 961f0e7..d4e01de 100644
--- a/packages/SettingsLib/res/values-en-rGB/strings.xml
+++ b/packages/SettingsLib/res/values-en-rGB/strings.xml
@@ -582,8 +582,7 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Just now"</string>
<string name="media_transfer_this_device_name" msgid="2357329267148436433">"This phone"</string>
<string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"This tablet"</string>
- <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
- <skip />
+ <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"This computer (internal)"</string>
<!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
<skip />
<string name="media_transfer_internal_mic" msgid="797333824290228595">"Microphone (internal)"</string>
@@ -687,12 +686,9 @@
<string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Disabled"</string>
<string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Enabled"</string>
<string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Your device must be rebooted for this change to apply. Reboot now or cancel."</string>
- <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
- <skip />
- <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
- <skip />
- <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
- <skip />
+ <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Wired headphones"</string>
+ <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Headphone"</string>
+ <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB speaker"</string>
<string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Mic jack"</string>
<string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB mic"</string>
<string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"On"</string>
diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml
index 961f0e7..d4e01de 100644
--- a/packages/SettingsLib/res/values-en-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-en-rIN/strings.xml
@@ -582,8 +582,7 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Just now"</string>
<string name="media_transfer_this_device_name" msgid="2357329267148436433">"This phone"</string>
<string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"This tablet"</string>
- <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
- <skip />
+ <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"This computer (internal)"</string>
<!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
<skip />
<string name="media_transfer_internal_mic" msgid="797333824290228595">"Microphone (internal)"</string>
@@ -687,12 +686,9 @@
<string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Disabled"</string>
<string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Enabled"</string>
<string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Your device must be rebooted for this change to apply. Reboot now or cancel."</string>
- <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
- <skip />
- <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
- <skip />
- <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
- <skip />
+ <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Wired headphones"</string>
+ <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Headphone"</string>
+ <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB speaker"</string>
<string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Mic jack"</string>
<string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB mic"</string>
<string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"On"</string>
diff --git a/packages/SettingsLib/res/values-en-rXC/strings.xml b/packages/SettingsLib/res/values-en-rXC/strings.xml
index a9ed4a4..0731b72 100644
--- a/packages/SettingsLib/res/values-en-rXC/strings.xml
+++ b/packages/SettingsLib/res/values-en-rXC/strings.xml
@@ -582,8 +582,7 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Just now"</string>
<string name="media_transfer_this_device_name" msgid="2357329267148436433">"This phone"</string>
<string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"This tablet"</string>
- <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
- <skip />
+ <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"This computer (internal)"</string>
<!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
<skip />
<string name="media_transfer_internal_mic" msgid="797333824290228595">"Microphone (internal)"</string>
@@ -687,12 +686,9 @@
<string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Disabled"</string>
<string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Enabled"</string>
<string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Your device must be rebooted for this change to apply. Reboot now or cancel."</string>
- <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
- <skip />
- <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
- <skip />
- <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
- <skip />
+ <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Wired headphone"</string>
+ <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Headphone"</string>
+ <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB speaker"</string>
<string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Mic jack"</string>
<string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB mic"</string>
<string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"On"</string>
diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml
index 8fcb49c..b0d360d 100644
--- a/packages/SettingsLib/res/values-es-rUS/strings.xml
+++ b/packages/SettingsLib/res/values-es-rUS/strings.xml
@@ -586,8 +586,7 @@
<skip />
<!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
<skip />
- <!-- no translation found for media_transfer_internal_mic (797333824290228595) -->
- <skip />
+ <string name="media_transfer_internal_mic" msgid="797333824290228595">"Micrófono (interno)"</string>
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Bocina de la estación de carga"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Dispositivo externo"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Dispositivo conectado"</string>
@@ -694,10 +693,8 @@
<skip />
<!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
<skip />
- <!-- no translation found for media_transfer_wired_device_mic_name (7417067197803840965) -->
- <skip />
- <!-- no translation found for media_transfer_usb_device_mic_name (9189914846215516322) -->
- <skip />
+ <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Conector para micrófono"</string>
+ <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Micrófono USB"</string>
<string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Activar"</string>
<string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Desactivar"</string>
<string name="carrier_network_change_mode" msgid="4257621815706644026">"Cambio de proveedor de red"</string>
diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml
index db9a744f..3dc0e85 100644
--- a/packages/SettingsLib/res/values-fa/strings.xml
+++ b/packages/SettingsLib/res/values-fa/strings.xml
@@ -582,8 +582,7 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"هماکنون"</string>
<string name="media_transfer_this_device_name" msgid="2357329267148436433">"این تلفن"</string>
<string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"این رایانه لوحی"</string>
- <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
- <skip />
+ <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"این رایانه (داخلی)"</string>
<!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
<skip />
<string name="media_transfer_internal_mic" msgid="797333824290228595">"میکروفون (داخلی)"</string>
@@ -687,12 +686,9 @@
<string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"غیرفعال"</string>
<string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"فعال"</string>
<string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"برای اعمال این تغییر، دستگاه باید بازراهاندازی شود. یا اکنون بازراهاندازی کنید یا لغو کنید."</string>
- <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
- <skip />
- <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
- <skip />
- <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
- <skip />
+ <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"هدفون سیمی"</string>
+ <string name="media_transfer_headphone_name" msgid="1131962659136578852">"هدفون"</string>
+ <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"بلندگوی USB"</string>
<string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"فیش میکروفون"</string>
<string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"میکروفون USB"</string>
<string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"روشن"</string>
diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml
index 1f09856..0df9489 100644
--- a/packages/SettingsLib/res/values-fr/strings.xml
+++ b/packages/SettingsLib/res/values-fr/strings.xml
@@ -586,8 +586,7 @@
<skip />
<!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
<skip />
- <!-- no translation found for media_transfer_internal_mic (797333824290228595) -->
- <skip />
+ <string name="media_transfer_internal_mic" msgid="797333824290228595">"Micro (interne)"</string>
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Haut-parleur station d\'accueil"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Appareil externe"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Appareil connecté"</string>
@@ -694,10 +693,8 @@
<skip />
<!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
<skip />
- <!-- no translation found for media_transfer_wired_device_mic_name (7417067197803840965) -->
- <skip />
- <!-- no translation found for media_transfer_usb_device_mic_name (9189914846215516322) -->
- <skip />
+ <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Connecteur micro"</string>
+ <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Micro USB"</string>
<string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Allumé"</string>
<string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Éteint"</string>
<string name="carrier_network_change_mode" msgid="4257621815706644026">"Modification du réseau de l\'opérateur"</string>
diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml
index 0455dff..aa768f8 100644
--- a/packages/SettingsLib/res/values-gu/strings.xml
+++ b/packages/SettingsLib/res/values-gu/strings.xml
@@ -582,8 +582,7 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"હમણાં જ"</string>
<string name="media_transfer_this_device_name" msgid="2357329267148436433">"આ ફોન"</string>
<string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"આ ટૅબ્લેટ"</string>
- <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
- <skip />
+ <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"આ કમ્પ્યૂટર (આંતરિક)"</string>
<!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
<skip />
<string name="media_transfer_internal_mic" msgid="797333824290228595">"માઇક્રોફોન (આંતરિક)"</string>
@@ -687,12 +686,9 @@
<string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"બંધ છે"</string>
<string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"ચાલુ છે"</string>
<string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"આ ફેરફારને લાગુ કરવા માટે તમારા ડિવાઇસને રીબૂટ કરવાની જરૂર છે. હમણાં જ રીબૂટ કરો કે રદ કરો."</string>
- <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
- <skip />
- <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
- <skip />
- <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
- <skip />
+ <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"વાયરવાળો હૅડફોન"</string>
+ <string name="media_transfer_headphone_name" msgid="1131962659136578852">"હૅડફોન"</string>
+ <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB સ્પીકર"</string>
<string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"માઇક જૅક"</string>
<string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB માઇક"</string>
<string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"ચાલુ"</string>
diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml
index 6f0fde3..b8e55b5 100644
--- a/packages/SettingsLib/res/values-hi/strings.xml
+++ b/packages/SettingsLib/res/values-hi/strings.xml
@@ -582,8 +582,7 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"अभी-अभी"</string>
<string name="media_transfer_this_device_name" msgid="2357329267148436433">"यह फ़ोन"</string>
<string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"यह टैबलेट"</string>
- <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
- <skip />
+ <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"इस कंप्यूटर पर (इंटरनल)"</string>
<!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
<skip />
<string name="media_transfer_internal_mic" msgid="797333824290228595">"माइक्रोफ़ोन (इंटरनल)"</string>
@@ -687,12 +686,9 @@
<string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"बंद है"</string>
<string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"चालू है"</string>
<string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"बदली गई सेटिंग को लागू करने के लिए, डिवाइस को रीस्टार्ट करना होगा. अपने डिवाइस को रीस्टार्ट करें या रद्द करें."</string>
- <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
- <skip />
- <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
- <skip />
- <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
- <skip />
+ <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"तार वाला हेडफ़ोन"</string>
+ <string name="media_transfer_headphone_name" msgid="1131962659136578852">"हेडफ़ोन"</string>
+ <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"यूएसबी स्पीकर"</string>
<string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"माइक्रोफ़ोन जैक"</string>
<string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"यूएसबी माइक्रोफ़ोन"</string>
<string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"चालू है"</string>
diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml
index 2045fe7..45ac8c2 100644
--- a/packages/SettingsLib/res/values-hr/strings.xml
+++ b/packages/SettingsLib/res/values-hr/strings.xml
@@ -582,8 +582,7 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Upravo sad"</string>
<string name="media_transfer_this_device_name" msgid="2357329267148436433">"Ovaj telefon"</string>
<string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Ovaj tablet"</string>
- <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
- <skip />
+ <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Ovo računalo (interno)"</string>
<!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
<skip />
<string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofon (ugrađeni)"</string>
@@ -687,12 +686,9 @@
<string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Onemogućeno"</string>
<string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Omogućeno"</string>
<string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Uređaj se mora ponovno pokrenuti da bi se ta promjena primijenila. Ponovo pokrenite uređaj odmah ili odustanite."</string>
- <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
- <skip />
- <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
- <skip />
- <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
- <skip />
+ <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Žičane slušalice"</string>
+ <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Slušalice"</string>
+ <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB zvučnik"</string>
<string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Utičnica za mikrofon"</string>
<string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB mikrofon"</string>
<string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Uključeno"</string>
diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml
index 60c6391..1436c17 100644
--- a/packages/SettingsLib/res/values-it/strings.xml
+++ b/packages/SettingsLib/res/values-it/strings.xml
@@ -586,8 +586,7 @@
<skip />
<!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
<skip />
- <!-- no translation found for media_transfer_internal_mic (797333824290228595) -->
- <skip />
+ <string name="media_transfer_internal_mic" msgid="797333824290228595">"Microfono (interno)"</string>
<string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Base con altoparlante"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"Dispositivo esterno"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"Dispositivo connesso"</string>
@@ -694,10 +693,8 @@
<skip />
<!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
<skip />
- <!-- no translation found for media_transfer_wired_device_mic_name (7417067197803840965) -->
- <skip />
- <!-- no translation found for media_transfer_usb_device_mic_name (9189914846215516322) -->
- <skip />
+ <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Jack per microfono"</string>
+ <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Microfono USB"</string>
<string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"On"</string>
<string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Off"</string>
<string name="carrier_network_change_mode" msgid="4257621815706644026">"Cambio della rete dell\'operatore"</string>
diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml
index bc8dee8..185c6c9 100644
--- a/packages/SettingsLib/res/values-ja/strings.xml
+++ b/packages/SettingsLib/res/values-ja/strings.xml
@@ -582,8 +582,7 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"たった今"</string>
<string name="media_transfer_this_device_name" msgid="2357329267148436433">"このデバイス"</string>
<string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"このタブレット"</string>
- <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
- <skip />
+ <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"このパソコン(内蔵)"</string>
<!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
<skip />
<string name="media_transfer_internal_mic" msgid="797333824290228595">"マイク(内蔵)"</string>
@@ -687,12 +686,9 @@
<string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"無効"</string>
<string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"有効"</string>
<string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"この変更を適用するには、デバイスの再起動が必要です。今すぐ再起動するか、キャンセルしてください。"</string>
- <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
- <skip />
- <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
- <skip />
- <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
- <skip />
+ <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"有線ヘッドフォン"</string>
+ <string name="media_transfer_headphone_name" msgid="1131962659136578852">"ヘッドフォン"</string>
+ <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB スピーカー"</string>
<string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"マイク差込口"</string>
<string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB マイク"</string>
<string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"ON"</string>
diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml
index a6151f3..9532c3a 100644
--- a/packages/SettingsLib/res/values-ka/strings.xml
+++ b/packages/SettingsLib/res/values-ka/strings.xml
@@ -582,8 +582,7 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"ახლახან"</string>
<string name="media_transfer_this_device_name" msgid="2357329267148436433">"ეს ტელეფონი"</string>
<string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"ამ ტაბლეტზე"</string>
- <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
- <skip />
+ <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"ეს კომპიუტერი (შიდა)"</string>
<!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
<skip />
<string name="media_transfer_internal_mic" msgid="797333824290228595">"მიკროფონი (შიდა)"</string>
@@ -687,12 +686,9 @@
<string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"გათიშული"</string>
<string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"ჩართული"</string>
<string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"ამ ცვლილების ასამოქმედებლად თქვენი მოწყობილობა უნდა გადაიტვირთოს. გადატვირთეთ ახლავე ან გააუქმეთ."</string>
- <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
- <skip />
- <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
- <skip />
- <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
- <skip />
+ <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"სადენიანი ყურსასმენი"</string>
+ <string name="media_transfer_headphone_name" msgid="1131962659136578852">"ყურსასმენი"</string>
+ <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB დინამიკი"</string>
<string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"მიკროფონის ჯეკი"</string>
<string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB მიკროფონი"</string>
<string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"ჩართვა"</string>
diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml
index 933dee7..43807a0 100644
--- a/packages/SettingsLib/res/values-km/strings.xml
+++ b/packages/SettingsLib/res/values-km/strings.xml
@@ -582,8 +582,7 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"អម្បាញ់មិញ"</string>
<string name="media_transfer_this_device_name" msgid="2357329267148436433">"ទូរសព្ទនេះ"</string>
<string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"ថេប្លេតនេះ"</string>
- <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
- <skip />
+ <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"កុំព្យូទ័រនេះ (ខាងក្នុង)"</string>
<!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
<skip />
<string name="media_transfer_internal_mic" msgid="797333824290228595">"មីក្រូហ្វូន (ខាងក្នុង)"</string>
@@ -687,12 +686,9 @@
<string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"បានបិទ"</string>
<string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"បានបើក"</string>
<string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"ត្រូវតែចាប់ផ្ដើមឧបករណ៍របស់អ្នកឡើងវិញ ដើម្បីឱ្យការផ្លាស់ប្ដូរនេះមានប្រសិទ្ធភាព។ ចាប់ផ្ដើមឡើងវិញឥឡូវនេះ ឬបោះបង់។"</string>
- <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
- <skip />
- <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
- <skip />
- <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
- <skip />
+ <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"កាសមានខ្សែ"</string>
+ <string name="media_transfer_headphone_name" msgid="1131962659136578852">"កាស"</string>
+ <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"ឧបករណ៍បំពងសំឡេង USB"</string>
<string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"ឌុយមីក្រូហ្វូន"</string>
<string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"មីក្រូហ្វូន USB"</string>
<string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"បើក"</string>
diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml
index a8eb607..ea9ff6c 100644
--- a/packages/SettingsLib/res/values-mk/strings.xml
+++ b/packages/SettingsLib/res/values-mk/strings.xml
@@ -582,8 +582,7 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Пред малку"</string>
<string name="media_transfer_this_device_name" msgid="2357329267148436433">"Овој телефон"</string>
<string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Овој таблет"</string>
- <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
- <skip />
+ <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Овој компјуер (внатрешен)"</string>
<!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
<skip />
<string name="media_transfer_internal_mic" msgid="797333824290228595">"Микрофон (внатрешен)"</string>
@@ -687,12 +686,9 @@
<string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Оневозможено"</string>
<string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Овозможено"</string>
<string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"За да се примени променава, уредот мора да се рестартира. Рестартирајте сега или откажете."</string>
- <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
- <skip />
- <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
- <skip />
- <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
- <skip />
+ <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Жичени слушалки"</string>
+ <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Слушалка"</string>
+ <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB-звучник"</string>
<string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Приклучок за микрофон"</string>
<string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB-микрофон"</string>
<string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Вклучено"</string>
diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml
index 753aa32..7af53aa 100644
--- a/packages/SettingsLib/res/values-ml/strings.xml
+++ b/packages/SettingsLib/res/values-ml/strings.xml
@@ -582,8 +582,7 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"ഇപ്പോൾ"</string>
<string name="media_transfer_this_device_name" msgid="2357329267148436433">"ഈ ഫോൺ"</string>
<string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"ഈ ടാബ്ലെറ്റ്"</string>
- <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
- <skip />
+ <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"ഈ കമ്പ്യൂട്ടർ (ഇന്റേണൽ)"</string>
<!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
<skip />
<string name="media_transfer_internal_mic" msgid="797333824290228595">"മൈക്രോഫോൺ (ഇന്റേണൽ)"</string>
@@ -687,12 +686,9 @@
<string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"പ്രവർത്തനരഹിതമാക്കി"</string>
<string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"പ്രവർത്തനക്ഷമമാക്കി"</string>
<string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"ഈ മാറ്റം ബാധകമാകുന്നതിന് നിങ്ങളുടെ ഉപകരണം റീബൂട്ട് ചെയ്യേണ്ടതുണ്ട്. ഇപ്പോൾ റീബൂട്ട് ചെയ്യുകയോ റദ്ദാക്കുകയോ ചെയ്യുക."</string>
- <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
- <skip />
- <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
- <skip />
- <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
- <skip />
+ <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"വയേർഡ് ഹെഡ്ഫോൺ"</string>
+ <string name="media_transfer_headphone_name" msgid="1131962659136578852">"ഹെഡ്ഫോൺ"</string>
+ <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB സ്പീക്കർ"</string>
<string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"മൈക്ക് ജാക്ക്"</string>
<string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB മൈക്ക്"</string>
<string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"ഓണാണ്"</string>
diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml
index 483936a..581545d 100644
--- a/packages/SettingsLib/res/values-mr/strings.xml
+++ b/packages/SettingsLib/res/values-mr/strings.xml
@@ -582,8 +582,7 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"आत्ताच"</string>
<string name="media_transfer_this_device_name" msgid="2357329267148436433">"हा फोन"</string>
<string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"हा टॅबलेट"</string>
- <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
- <skip />
+ <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"हा काँप्युटर (अंतर्गत)"</string>
<!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
<skip />
<string name="media_transfer_internal_mic" msgid="797333824290228595">"मायक्रोफोन (अंतर्गत)"</string>
@@ -687,12 +686,9 @@
<string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"बंद केले आहे"</string>
<string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"सुरू केले आहे"</string>
<string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"हा बदल लागू करण्यासाठी तुमचे डिव्हाइस रीबूट करणे आवश्यक आहे. आता रीबूट करा किंवा रद्द करा."</string>
- <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
- <skip />
- <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
- <skip />
- <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
- <skip />
+ <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"वायर्ड हेडफोन"</string>
+ <string name="media_transfer_headphone_name" msgid="1131962659136578852">"हेडफोन"</string>
+ <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB स्पीकर"</string>
<string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"माइक जॅक"</string>
<string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB माइक"</string>
<string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"सुरू करा"</string>
diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml
index dbe745d..7990e04 100644
--- a/packages/SettingsLib/res/values-ms/strings.xml
+++ b/packages/SettingsLib/res/values-ms/strings.xml
@@ -582,8 +582,7 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Sebentar tadi"</string>
<string name="media_transfer_this_device_name" msgid="2357329267148436433">"Telefon ini"</string>
<string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Tablet ini"</string>
- <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
- <skip />
+ <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Komputer ini (dalaman)"</string>
<!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
<skip />
<string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofon (dalaman)"</string>
@@ -687,12 +686,9 @@
<string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Dilumpuhkan"</string>
<string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Didayakan"</string>
<string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Peranti anda mesti dibut semula supaya perubahan ini berlaku. But semula sekarang atau batalkan."</string>
- <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
- <skip />
- <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
- <skip />
- <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
- <skip />
+ <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Fon kepala berwayar"</string>
+ <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Fon kepala"</string>
+ <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"Pembesar suara USB"</string>
<string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Bicu mikrofon"</string>
<string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Mikrofon USB"</string>
<string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Hidup"</string>
diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml
index 09240f0..916aba9 100644
--- a/packages/SettingsLib/res/values-ne/strings.xml
+++ b/packages/SettingsLib/res/values-ne/strings.xml
@@ -582,8 +582,7 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"अहिले भर्खरै"</string>
<string name="media_transfer_this_device_name" msgid="2357329267148436433">"यो फोन"</string>
<string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"यो ट्याब्लेट"</string>
- <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
- <skip />
+ <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"यो कम्प्युटर (आन्तरिक)"</string>
<!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
<skip />
<string name="media_transfer_internal_mic" msgid="797333824290228595">"माइक्रोफोन (आन्तरिक)"</string>
@@ -687,12 +686,9 @@
<string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"असक्षम पारिएको छ"</string>
<string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"सक्षम पारिएको छ"</string>
<string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"यो परिवर्तन लागू गर्न तपाईंको यन्त्र अनिवार्य रूपमा रिबुट गर्नु पर्छ। अहिले रिबुट गर्नुहोस् वा रद्द गर्नुहोस्।"</string>
- <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
- <skip />
- <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
- <skip />
- <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
- <skip />
+ <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"तारयुक्त हेडफोन"</string>
+ <string name="media_transfer_headphone_name" msgid="1131962659136578852">"हेडफोन"</string>
+ <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB स्पिकर"</string>
<string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"माइकको ज्याक"</string>
<string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB माइक"</string>
<string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"अन छ"</string>
diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml
index 0117acf..78dfd35 100644
--- a/packages/SettingsLib/res/values-nl/strings.xml
+++ b/packages/SettingsLib/res/values-nl/strings.xml
@@ -582,8 +582,7 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Zojuist"</string>
<string name="media_transfer_this_device_name" msgid="2357329267148436433">"Deze telefoon"</string>
<string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Deze tablet"</string>
- <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
- <skip />
+ <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Deze computer (intern)"</string>
<!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
<skip />
<string name="media_transfer_internal_mic" msgid="797333824290228595">"Microfoon (intern)"</string>
@@ -687,12 +686,9 @@
<string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Uit"</string>
<string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Aan"</string>
<string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Je apparaat moet opnieuw worden opgestart om deze wijziging toe te passen. Start nu opnieuw op of annuleer de wijziging."</string>
- <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
- <skip />
- <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
- <skip />
- <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
- <skip />
+ <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Bedrade koptelefoon"</string>
+ <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Koptelefoon"</string>
+ <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB-speaker"</string>
<string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Microfoonaansluiting"</string>
<string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB-microfoon"</string>
<string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Aan"</string>
diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml
index 7e90b78..bb8fe2e 100644
--- a/packages/SettingsLib/res/values-pl/strings.xml
+++ b/packages/SettingsLib/res/values-pl/strings.xml
@@ -582,8 +582,7 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Przed chwilą"</string>
<string name="media_transfer_this_device_name" msgid="2357329267148436433">"Ten telefon"</string>
<string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Ten tablet"</string>
- <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
- <skip />
+ <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Ten komputer (wewnętrzny)"</string>
<!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
<skip />
<string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofon (wewnętrzny)"</string>
@@ -687,12 +686,9 @@
<string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Wyłączono"</string>
<string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Włączono"</string>
<string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Wprowadzenie zmiany wymaga ponownego uruchomienia urządzenia. Uruchom ponownie teraz lub anuluj."</string>
- <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
- <skip />
- <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
- <skip />
- <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
- <skip />
+ <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Słuchawki przewodowe"</string>
+ <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Słuchawki"</string>
+ <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"Głośnik USB"</string>
<string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Gniazdo mikrofonu"</string>
<string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Mikrofon USB"</string>
<string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Włączono"</string>
diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml
index e10ad07..7f5bb0f 100644
--- a/packages/SettingsLib/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml
@@ -582,8 +582,7 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Agora"</string>
<string name="media_transfer_this_device_name" msgid="2357329267148436433">"Este telefone"</string>
<string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Este tablet"</string>
- <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
- <skip />
+ <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Este computador (interno)"</string>
<!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
<skip />
<string name="media_transfer_internal_mic" msgid="797333824290228595">"Microfone (interno)"</string>
@@ -687,12 +686,9 @@
<string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Desativado"</string>
<string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Ativado"</string>
<string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"É necessário reinicializar o dispositivo para que a mudança seja aplicada. Faça isso agora ou cancele."</string>
- <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
- <skip />
- <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
- <skip />
- <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
- <skip />
+ <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Fones de ouvido com fio"</string>
+ <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Fone de ouvido"</string>
+ <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"Alto-falante USB"</string>
<string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Entrada para microfone"</string>
<string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Microfone USB"</string>
<string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Ativado"</string>
diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml
index e10ad07..7f5bb0f 100644
--- a/packages/SettingsLib/res/values-pt/strings.xml
+++ b/packages/SettingsLib/res/values-pt/strings.xml
@@ -582,8 +582,7 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Agora"</string>
<string name="media_transfer_this_device_name" msgid="2357329267148436433">"Este telefone"</string>
<string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Este tablet"</string>
- <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
- <skip />
+ <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Este computador (interno)"</string>
<!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
<skip />
<string name="media_transfer_internal_mic" msgid="797333824290228595">"Microfone (interno)"</string>
@@ -687,12 +686,9 @@
<string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Desativado"</string>
<string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Ativado"</string>
<string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"É necessário reinicializar o dispositivo para que a mudança seja aplicada. Faça isso agora ou cancele."</string>
- <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
- <skip />
- <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
- <skip />
- <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
- <skip />
+ <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Fones de ouvido com fio"</string>
+ <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Fone de ouvido"</string>
+ <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"Alto-falante USB"</string>
<string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Entrada para microfone"</string>
<string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Microfone USB"</string>
<string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Ativado"</string>
diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml
index 009e071..1cdef05 100644
--- a/packages/SettingsLib/res/values-ru/strings.xml
+++ b/packages/SettingsLib/res/values-ru/strings.xml
@@ -582,8 +582,7 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Только что"</string>
<string name="media_transfer_this_device_name" msgid="2357329267148436433">"Этот смартфон"</string>
<string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Этот планшет"</string>
- <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
- <skip />
+ <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Встроенный динамик компьютера"</string>
<!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
<skip />
<string name="media_transfer_internal_mic" msgid="797333824290228595">"Микрофон (встроенный)"</string>
@@ -687,12 +686,9 @@
<string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Отключено"</string>
<string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Включено"</string>
<string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Чтобы изменение вступило в силу, необходимо перезапустить устройство. Вы можете сделать это сейчас или позже."</string>
- <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
- <skip />
- <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
- <skip />
- <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
- <skip />
+ <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Проводные наушники"</string>
+ <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Наушники"</string>
+ <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB-колонка"</string>
<string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Микрофонный разъем"</string>
<string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB-микрофон"</string>
<string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Вкл."</string>
diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml
index 27154f6..980f9c8 100644
--- a/packages/SettingsLib/res/values-si/strings.xml
+++ b/packages/SettingsLib/res/values-si/strings.xml
@@ -582,8 +582,7 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"මේ දැන්"</string>
<string name="media_transfer_this_device_name" msgid="2357329267148436433">"මෙම දුරකථනය"</string>
<string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"මෙම ටැබ්ලටය"</string>
- <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
- <skip />
+ <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"මෙම පරිගණකය (අභ්යන්තර)"</string>
<!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
<skip />
<string name="media_transfer_internal_mic" msgid="797333824290228595">"මයික්රෆෝනය (අභ්යන්තර)"</string>
@@ -687,12 +686,9 @@
<string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"අබල කළා"</string>
<string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"සබලයි"</string>
<string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"මෙම වෙනස යෙදීමට ඔබේ උපාංගය නැවත පණ ගැන්විය යුතුය. දැන් නැවත පණ ගන්වන්න හෝ අවලංගු කරන්න."</string>
- <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
- <skip />
- <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
- <skip />
- <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
- <skip />
+ <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"රැහැන්ගත හෙඩ්ෆෝන්"</string>
+ <string name="media_transfer_headphone_name" msgid="1131962659136578852">"හෙඩ්ෆෝන්"</string>
+ <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB ස්පීකරය"</string>
<string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"මයික් ජැක්කුව"</string>
<string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB මයික්"</string>
<string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"ක්රියාත්මකයි"</string>
diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml
index 4ca5c48..2ee1241 100644
--- a/packages/SettingsLib/res/values-sl/strings.xml
+++ b/packages/SettingsLib/res/values-sl/strings.xml
@@ -582,8 +582,7 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Pravkar"</string>
<string name="media_transfer_this_device_name" msgid="2357329267148436433">"Ta telefon"</string>
<string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Ta tablični računalnik"</string>
- <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
- <skip />
+ <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Ta računalnik (notranji)"</string>
<!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
<skip />
<string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofon (notranji)"</string>
@@ -687,12 +686,9 @@
<string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Onemogočeno"</string>
<string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Omogočeno"</string>
<string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Napravo je treba znova zagnati, da bo ta sprememba uveljavljena. Znova zaženite zdaj ali prekličite."</string>
- <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
- <skip />
- <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
- <skip />
- <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
- <skip />
+ <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Žične slušalke"</string>
+ <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Slušalke"</string>
+ <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"Zvočnik USB"</string>
<string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Vtič za mikrofon"</string>
<string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Mikrofon USB"</string>
<string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Vklop"</string>
diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml
index cc7c69d..34ccdaf 100644
--- a/packages/SettingsLib/res/values-sr/strings.xml
+++ b/packages/SettingsLib/res/values-sr/strings.xml
@@ -582,8 +582,7 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Управо"</string>
<string name="media_transfer_this_device_name" msgid="2357329267148436433">"Овај телефон"</string>
<string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Овај таблет"</string>
- <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
- <skip />
+ <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Овај рачунар (интерно)"</string>
<!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
<skip />
<string name="media_transfer_internal_mic" msgid="797333824290228595">"Микрофон (интерни)"</string>
@@ -687,12 +686,9 @@
<string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Онемогућено"</string>
<string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Омогућено"</string>
<string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Морате да рестартујете уређај да би се ова промена применила. Рестартујте га одмах или откажите."</string>
- <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
- <skip />
- <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
- <skip />
- <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
- <skip />
+ <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Жичане слушалице"</string>
+ <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Слушалице"</string>
+ <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB звучник"</string>
<string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Утикач за микрофон"</string>
<string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB микрофон"</string>
<string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Укључено"</string>
diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml
index 5fb829d..56d0a7d 100644
--- a/packages/SettingsLib/res/values-te/strings.xml
+++ b/packages/SettingsLib/res/values-te/strings.xml
@@ -582,8 +582,7 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"ఇప్పుడే"</string>
<string name="media_transfer_this_device_name" msgid="2357329267148436433">"ఈ ఫోన్"</string>
<string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"ఈ టాబ్లెట్"</string>
- <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
- <skip />
+ <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"ఈ కంప్యూటర్ (ఇంటర్నల్)"</string>
<!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
<skip />
<string name="media_transfer_internal_mic" msgid="797333824290228595">"మైక్రోఫోన్ (అంతర్గతం)"</string>
@@ -687,12 +686,9 @@
<string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"డిజేబుల్ చేయబడింది"</string>
<string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"ఎనేబుల్ చేయబడింది"</string>
<string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"ఈ మార్పును వర్తింపజేయాలంటే మీరు మీ పరికరాన్ని తప్పనిసరిగా రీబూట్ చేయాలి. ఇప్పుడే రీబూట్ చేయండి లేదా రద్దు చేయండి."</string>
- <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
- <skip />
- <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
- <skip />
- <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
- <skip />
+ <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"వైర్ ఉన్న హెడ్ఫోన్"</string>
+ <string name="media_transfer_headphone_name" msgid="1131962659136578852">"హెడ్ఫోన్"</string>
+ <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB స్పీకర్"</string>
<string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"మైక్ జాక్"</string>
<string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB మైక్"</string>
<string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"ఆన్లో ఉంది"</string>
diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml
index aa23a44..28a0d64 100644
--- a/packages/SettingsLib/res/values-th/strings.xml
+++ b/packages/SettingsLib/res/values-th/strings.xml
@@ -582,8 +582,7 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"เมื่อสักครู่"</string>
<string name="media_transfer_this_device_name" msgid="2357329267148436433">"โทรศัพท์เครื่องนี้"</string>
<string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"แท็บเล็ตเครื่องนี้"</string>
- <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
- <skip />
+ <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"คอมพิวเตอร์เครื่องนี้ (ภายใน)"</string>
<!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
<skip />
<string name="media_transfer_internal_mic" msgid="797333824290228595">"ไมโครโฟน (ภายใน)"</string>
@@ -687,12 +686,9 @@
<string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"ปิดใช้"</string>
<string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"เปิดใช้"</string>
<string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"คุณต้องรีบูตอุปกรณ์เพื่อให้การเปลี่ยนแปลงนี้มีผล รีบูตเลยหรือยกเลิก"</string>
- <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
- <skip />
- <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
- <skip />
- <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
- <skip />
+ <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"หูฟังแบบใช้สาย"</string>
+ <string name="media_transfer_headphone_name" msgid="1131962659136578852">"หูฟัง"</string>
+ <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"ลำโพง USB"</string>
<string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"ช่องเสียบไมค์"</string>
<string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"ไมค์ USB"</string>
<string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"เปิด"</string>
diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml
index 5a1d4d7..926ce8f 100644
--- a/packages/SettingsLib/res/values-tl/strings.xml
+++ b/packages/SettingsLib/res/values-tl/strings.xml
@@ -582,8 +582,7 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Ngayon lang"</string>
<string name="media_transfer_this_device_name" msgid="2357329267148436433">"Ang teleponong ito"</string>
<string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Ang tablet na ito"</string>
- <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
- <skip />
+ <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Sa computer na ito (internal)"</string>
<!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
<skip />
<string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikropono (internal)"</string>
@@ -687,12 +686,9 @@
<string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Naka-disable"</string>
<string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Na-enable"</string>
<string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Dapat i-reboot ang iyong device para mailapat ang pagbabagong ito. Mag-reboot ngayon o kanselahin."</string>
- <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
- <skip />
- <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
- <skip />
- <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
- <skip />
+ <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Wired na headphone"</string>
+ <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Headphone"</string>
+ <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB speaker"</string>
<string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Jack ng mikropono"</string>
<string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB na mikropono"</string>
<string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Naka-on"</string>
diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml
index 2de4c09..3ccbcf2 100644
--- a/packages/SettingsLib/res/values-uk/strings.xml
+++ b/packages/SettingsLib/res/values-uk/strings.xml
@@ -287,8 +287,8 @@
<string name="oem_unlock_enable_summary" msgid="5857388174390953829">"Дозволити розблокування завантажувача"</string>
<string name="confirm_enable_oem_unlock_title" msgid="8249318129774367535">"Дозволити виробникові розблоковувати пристрій?"</string>
<string name="confirm_enable_oem_unlock_text" msgid="854131050791011970">"ЗАСТЕРЕЖЕННЯ. Функції захисту пристрою не працюватимуть, поки ввімкнено це налаштування."</string>
- <string name="mock_location_app" msgid="6269380172542248304">"Вибрати додаток для фіктивних місцезнаходжень"</string>
- <string name="mock_location_app_not_set" msgid="6972032787262831155">"Додаток для фіктивних місцезнаходжень не вибрано"</string>
+ <string name="mock_location_app" msgid="6269380172542248304">"Вибрати додаток для фіктивних місцеположень"</string>
+ <string name="mock_location_app_not_set" msgid="6972032787262831155">"Додаток для фіктивних місцеположень не вибрано"</string>
<string name="mock_location_app_set" msgid="4706722469342913843">"Додаток для фіктивних місцезнаходжень: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="debug_networking_category" msgid="6829757985772659599">"Мережі"</string>
<string name="wifi_display_certification" msgid="1805579519992520381">"Сертифікація бездрот. екрана"</string>
diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml
index e2fbfab..2157f63 100644
--- a/packages/SettingsLib/res/values-ur/strings.xml
+++ b/packages/SettingsLib/res/values-ur/strings.xml
@@ -582,8 +582,7 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"ابھی ابھی"</string>
<string name="media_transfer_this_device_name" msgid="2357329267148436433">"یہ فون"</string>
<string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"یہ ٹیبلیٹ"</string>
- <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
- <skip />
+ <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"یہ کمپیوٹر (داخلی)"</string>
<!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
<skip />
<string name="media_transfer_internal_mic" msgid="797333824290228595">"مائیکروفون (داخلی)"</string>
@@ -687,12 +686,9 @@
<string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"غیر فعال"</string>
<string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"فعال"</string>
<string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"اس تبدیلی کو لاگو کرنے کے ليے آپ کے آلہ کو ریبوٹ کرنا ضروری ہے۔ ابھی ریبوٹ کریں یا منسوخ کریں۔"</string>
- <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
- <skip />
- <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
- <skip />
- <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
- <skip />
+ <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"تار والا ہیڈ فون"</string>
+ <string name="media_transfer_headphone_name" msgid="1131962659136578852">"ہیڈ فون"</string>
+ <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB اسپیکر"</string>
<string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"مائیک جیک"</string>
<string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB مائیک"</string>
<string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"آن"</string>
diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml
index 533a53f..736a30d 100644
--- a/packages/SettingsLib/res/values-zh-rHK/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml
@@ -100,7 +100,7 @@
<string name="bluetooth_active_battery_level_untethered_right" msgid="7407517998880370179">"使用中。右側:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> 電量。"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"電量:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"電量:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="1616774716076301755">"左側:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>,右側:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> 電量。"</string>
+ <string name="bluetooth_battery_level_untethered" msgid="1616774716076301755">"左:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>,右:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> 電量。"</string>
<string name="bluetooth_battery_level_untethered_left" msgid="5725764679536058365">"左側:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> 電量"</string>
<string name="bluetooth_battery_level_untethered_right" msgid="8377995536997790142">"右側:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> 電量。"</string>
<string name="tv_bluetooth_battery_level_untethered_left" msgid="337629670583744410">"左耳機:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/src/com/android/settingslib/DeviceInfoUtils.java b/packages/SettingsLib/src/com/android/settingslib/DeviceInfoUtils.java
index ff00fb3..c634216 100644
--- a/packages/SettingsLib/src/com/android/settingslib/DeviceInfoUtils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/DeviceInfoUtils.java
@@ -33,6 +33,8 @@
import android.text.format.DateFormat;
import android.util.Log;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import java.io.BufferedReader;
@@ -153,13 +155,19 @@
return null;
}
- public static String getSecurityPatch() {
+ /** Returns security patch in default locale. */
+ public static @Nullable String getSecurityPatch() {
+ return getSecurityPatch(Locale.getDefault());
+ }
+
+ /** Returns security patch in given locale. */
+ public static @Nullable String getSecurityPatch(@NonNull Locale locale) {
String patch = Build.VERSION.SECURITY_PATCH;
if (!"".equals(patch)) {
try {
SimpleDateFormat template = new SimpleDateFormat("yyyy-MM-dd");
Date patchDate = template.parse(patch);
- String format = DateFormat.getBestDateTimePattern(Locale.getDefault(), "dMMMMyyyy");
+ String format = DateFormat.getBestDateTimePattern(locale, "dMMMMyyyy");
patch = DateFormat.format(format, patchDate).toString();
} catch (ParseException e) {
// broken parse; fall through and use the raw string
diff --git a/packages/SettingsLib/src/com/android/settingslib/media/InputRouteManager.java b/packages/SettingsLib/src/com/android/settingslib/media/InputRouteManager.java
index 0c50166..9164b64 100644
--- a/packages/SettingsLib/src/com/android/settingslib/media/InputRouteManager.java
+++ b/packages/SettingsLib/src/com/android/settingslib/media/InputRouteManager.java
@@ -25,6 +25,7 @@
import android.media.AudioManager;
import android.media.MediaRecorder;
import android.os.Handler;
+import android.os.HandlerExecutor;
import android.util.Slog;
import androidx.annotation.NonNull;
@@ -46,6 +47,16 @@
static final AudioAttributes INPUT_ATTRIBUTES =
new AudioAttributes.Builder().setCapturePreset(MediaRecorder.AudioSource.MIC).build();
+ @VisibleForTesting
+ static final int[] PRESETS = {
+ MediaRecorder.AudioSource.MIC,
+ MediaRecorder.AudioSource.CAMCORDER,
+ MediaRecorder.AudioSource.VOICE_RECOGNITION,
+ MediaRecorder.AudioSource.VOICE_COMMUNICATION,
+ MediaRecorder.AudioSource.UNPROCESSED,
+ MediaRecorder.AudioSource.VOICE_PERFORMANCE
+ };
+
private final Context mContext;
private final AudioManager mAudioManager;
@@ -55,6 +66,7 @@
private MediaDevice mSelectedInputDevice;
private final Collection<InputDeviceCallback> mCallbacks = new CopyOnWriteArrayList<>();
+ private final Object mCallbackLock = new Object();
@VisibleForTesting
final AudioDeviceCallback mAudioDeviceCallback =
@@ -76,17 +88,33 @@
Handler handler = new Handler(context.getMainLooper());
mAudioManager.registerAudioDeviceCallback(mAudioDeviceCallback, handler);
+
+ mAudioManager.addOnPreferredDevicesForCapturePresetChangedListener(
+ new HandlerExecutor(handler),
+ this::onPreferredDevicesForCapturePresetChangedListener);
}
- public void registerCallback(@NonNull InputDeviceCallback callback) {
- if (!mCallbacks.contains(callback)) {
- mCallbacks.add(callback);
+ private void onPreferredDevicesForCapturePresetChangedListener(
+ @MediaRecorder.SystemSource int capturePreset,
+ @NonNull List<AudioDeviceAttributes> devices) {
+ if (capturePreset == MediaRecorder.AudioSource.MIC) {
dispatchInputDeviceListUpdate();
}
}
+ public void registerCallback(@NonNull InputDeviceCallback callback) {
+ synchronized (mCallbackLock) {
+ if (!mCallbacks.contains(callback)) {
+ mCallbacks.add(callback);
+ dispatchInputDeviceListUpdate();
+ }
+ }
+ }
+
public void unregisterCallback(@NonNull InputDeviceCallback callback) {
- mCallbacks.remove(callback);
+ synchronized (mCallbackLock) {
+ mCallbacks.remove(callback);
+ }
}
public @Nullable MediaDevice getSelectedInputDevice() {
@@ -134,8 +162,51 @@
}
final List<MediaDevice> inputMediaDevices = new ArrayList<>(mInputMediaDevices);
- for (InputDeviceCallback callback : mCallbacks) {
- callback.onInputDeviceListUpdated(inputMediaDevices);
+ synchronized (mCallbackLock) {
+ for (InputDeviceCallback callback : mCallbacks) {
+ callback.onInputDeviceListUpdated(inputMediaDevices);
+ }
+ }
+ }
+
+ public void selectDevice(@NonNull MediaDevice device) {
+ if (!(device instanceof InputMediaDevice)) {
+ Slog.w(TAG, "This device is not an InputMediaDevice: " + device.getName());
+ return;
+ }
+
+ if (device.equals(mSelectedInputDevice)) {
+ Slog.w(TAG, "This device is already selected: " + device.getName());
+ return;
+ }
+
+ // Handle edge case where the targeting device is not available, e.g. disconnected.
+ if (!mInputMediaDevices.contains(device)) {
+ Slog.w(TAG, "This device is not available: " + device.getName());
+ return;
+ }
+
+ // TODO(b/355684672): apply address for BT devices.
+ AudioDeviceAttributes deviceAttributes =
+ new AudioDeviceAttributes(
+ AudioDeviceAttributes.ROLE_INPUT,
+ ((InputMediaDevice) device).getAudioDeviceInfoType(),
+ /* address= */ "");
+ try {
+ setPreferredDeviceForAllPresets(deviceAttributes);
+ } catch (IllegalArgumentException e) {
+ Slog.e(
+ TAG,
+ "Illegal argument exception while setPreferredDeviceForAllPreset: "
+ + device.getName(),
+ e);
+ }
+ }
+
+ private void setPreferredDeviceForAllPresets(@NonNull AudioDeviceAttributes deviceAttributes) {
+ // The input routing via system setting takes effect on all capture presets.
+ for (@MediaRecorder.Source int preset : PRESETS) {
+ mAudioManager.setPreferredDeviceForCapturePreset(preset, deviceAttributes);
}
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/notification/data/repository/FakeZenModeRepository.kt b/packages/SettingsLib/src/com/android/settingslib/notification/data/repository/FakeZenModeRepository.kt
index c686708..43d7946 100644
--- a/packages/SettingsLib/src/com/android/settingslib/notification/data/repository/FakeZenModeRepository.kt
+++ b/packages/SettingsLib/src/com/android/settingslib/notification/data/repository/FakeZenModeRepository.kt
@@ -74,6 +74,10 @@
mutableModesFlow.value = mutableModesFlow.value.filter { it.id != id }
}
+ fun replaceMode(modeId: String, mode: ZenMode) {
+ mutableModesFlow.value = (mutableModesFlow.value.filter { it.id != modeId }) + mode
+ }
+
fun getMode(id: String): ZenMode? {
return mutableModesFlow.value.find { it.id == id }
}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InputRouteManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InputRouteManagerTest.java
index 8a18d07..16c0c1c 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InputRouteManagerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InputRouteManagerTest.java
@@ -17,17 +17,21 @@
package com.android.settingslib.media;
import static com.android.settingslib.media.InputRouteManager.INPUT_ATTRIBUTES;
+import static com.android.settingslib.media.InputRouteManager.PRESETS;
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.Context;
import android.media.AudioDeviceAttributes;
import android.media.AudioDeviceInfo;
import android.media.AudioManager;
+import android.media.MediaRecorder;
import com.android.settingslib.testutils.shadow.ShadowRouter2Manager;
@@ -51,6 +55,9 @@
private static final int INPUT_USB_DEVICE_ID = 3;
private static final int INPUT_USB_HEADSET_ID = 4;
private static final int INPUT_USB_ACCESSORY_ID = 5;
+ private static final int MAX_VOLUME = 1;
+ private static final int CURRENT_VOLUME = 0;
+ private static final boolean VOLUME_FIXED_TRUE = true;
private final Context mContext = spy(RuntimeEnvironment.application);
private InputRouteManager mInputRouteManager;
@@ -222,6 +229,31 @@
}
@Test
+ public void selectDevice() {
+ final AudioManager audioManager = mock(AudioManager.class);
+ InputRouteManager inputRouteManager = new InputRouteManager(mContext, audioManager);
+ final MediaDevice inputMediaDevice =
+ InputMediaDevice.create(
+ mContext,
+ String.valueOf(BUILTIN_MIC_ID),
+ AudioDeviceInfo.TYPE_BUILTIN_MIC,
+ MAX_VOLUME,
+ CURRENT_VOLUME,
+ VOLUME_FIXED_TRUE);
+ inputRouteManager.selectDevice(inputMediaDevice);
+
+ AudioDeviceAttributes deviceAttributes =
+ new AudioDeviceAttributes(
+ AudioDeviceAttributes.ROLE_INPUT,
+ AudioDeviceInfo.TYPE_BUILTIN_MIC,
+ /* address= */ "");
+ for (@MediaRecorder.Source int preset : PRESETS) {
+ verify(audioManager, atLeastOnce())
+ .setPreferredDeviceForCapturePreset(preset, deviceAttributes);
+ }
+ }
+
+ @Test
public void getMaxInputGain_returnMaxInputGain() {
assertThat(mInputRouteManager.getMaxInputGain()).isEqualTo(15);
}
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index 157af7d..9726ecf 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -1013,6 +1013,7 @@
android:excludeFromRecents="true"
android:autoRemoveFromRecents="true"
android:launchMode="singleTop"
+ android:showForAllUsers="true"
android:exported="false">
</activity>
diff --git a/packages/SystemUI/TEST_OWNERS b/packages/SystemUI/TEST_OWNERS
new file mode 100644
index 0000000..eadc86e
--- /dev/null
+++ b/packages/SystemUI/TEST_OWNERS
@@ -0,0 +1,5 @@
+# Test maintainers for system UI
+# usernames listed here are able to approve changes to sysui unit tests,
+# for restructuring and test maintenance only
+
+saff@google.com
diff --git a/packages/SystemUI/animation/lib/Android.bp b/packages/SystemUI/animation/lib/Android.bp
index 4324d463..d9230ec 100644
--- a/packages/SystemUI/animation/lib/Android.bp
+++ b/packages/SystemUI/animation/lib/Android.bp
@@ -33,6 +33,20 @@
],
}
+// This is the core animation library written in java and can be depended by java sdk libraries.
+// Please don't introduce kotlin code in this target since kotlin is incompatible with sdk
+// libraries.
+java_library {
+ name: "PlatformAnimationLib-core",
+ srcs: [
+ "src/com/android/systemui/animation/*.java",
+ ":PlatformAnimationLib-aidl",
+ ],
+ static_libs: [
+ "WindowManager-Shell-shared",
+ ],
+}
+
filegroup {
name: "PlatformAnimationLib-aidl",
srcs: [
diff --git a/packages/SystemUI/animation/lib/src/com/android/systemui/animation/OriginTransitionSession.java b/packages/SystemUI/animation/lib/src/com/android/systemui/animation/OriginTransitionSession.java
new file mode 100644
index 0000000..64bedd3
--- /dev/null
+++ b/packages/SystemUI/animation/lib/src/com/android/systemui/animation/OriginTransitionSession.java
@@ -0,0 +1,281 @@
+/*
+ * 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.animation;
+
+import android.annotation.IntDef;
+import android.annotation.Nullable;
+import android.app.ActivityOptions;
+import android.app.ActivityOptions.LaunchCookie;
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Build;
+import android.os.RemoteException;
+import android.util.Log;
+import android.window.IRemoteTransition;
+import android.window.RemoteTransition;
+
+import com.android.systemui.animation.shared.IOriginTransitions;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Predicate;
+import java.util.function.Supplier;
+
+/**
+ * A session object that holds origin transition states for starting an activity from an on-screen
+ * UI component and smoothly transitioning back from the activity to the same UI component.
+ */
+public class OriginTransitionSession {
+ private static final String TAG = "OriginTransitionSession";
+ static final boolean DEBUG = Build.IS_USERDEBUG || Log.isLoggable(TAG, Log.DEBUG);
+
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(value = {NOT_STARTED, STARTED, CANCELLED})
+ private @interface State {}
+
+ @State private static final int NOT_STARTED = 0;
+ @State private static final int STARTED = 1;
+ @State private static final int CANCELLED = 5;
+
+ private final String mName;
+ @Nullable private final IOriginTransitions mOriginTransitions;
+ private final Predicate<RemoteTransition> mIntentStarter;
+ @Nullable private final IRemoteTransition mEntryTransition;
+ @Nullable private final IRemoteTransition mExitTransition;
+ private final AtomicInteger mState = new AtomicInteger(NOT_STARTED);
+
+ @Nullable private RemoteTransition mOriginTransition;
+
+ private OriginTransitionSession(
+ String name,
+ @Nullable IOriginTransitions originTransitions,
+ Predicate<RemoteTransition> intentStarter,
+ @Nullable IRemoteTransition entryTransition,
+ @Nullable IRemoteTransition exitTransition) {
+ mName = name;
+ mOriginTransitions = originTransitions;
+ mIntentStarter = intentStarter;
+ mEntryTransition = entryTransition;
+ mExitTransition = exitTransition;
+ if (hasExitTransition() && !hasEntryTransition()) {
+ throw new IllegalArgumentException(
+ "Entry transition must be supplied if you want to play an exit transition!");
+ }
+ }
+
+ /**
+ * Launch the target intent with the supplied entry transition. After this method, the entry
+ * transition is expected to receive callbacks. The exit transition will be registered and
+ * triggered when the system detects a return from the launched activity to the launching
+ * activity.
+ */
+ public boolean start() {
+ if (!mState.compareAndSet(NOT_STARTED, STARTED)) {
+ logE("start: illegal state - " + stateToString(mState.get()));
+ return false;
+ }
+
+ RemoteTransition remoteTransition = null;
+ if (hasEntryTransition() && hasExitTransition()) {
+ logD("start: starting with entry and exit transition.");
+ try {
+ remoteTransition =
+ mOriginTransition =
+ mOriginTransitions.makeOriginTransition(
+ new RemoteTransition(mEntryTransition, mName + "-entry"),
+ new RemoteTransition(mExitTransition, mName + "-exit"));
+ } catch (RemoteException e) {
+ logE("Unable to create origin transition!", e);
+ }
+ } else if (hasEntryTransition()) {
+ logD("start: starting with entry transition.");
+ remoteTransition = new RemoteTransition(mEntryTransition, mName + "-entry");
+
+ } else {
+ logD("start: starting without transition.");
+ }
+ if (mIntentStarter.test(remoteTransition)) {
+ return true;
+ } else {
+ // Animation is cancelled by intent starter.
+ logD("start: cancelled by intent starter!");
+ cancel();
+ return false;
+ }
+ }
+
+ /**
+ * Cancel the current transition and the registered exit transition if it exists. After this
+ * method, this session object can no longer be used. Clients need to create a new session
+ * object if they want to launch another intent with origin transition.
+ */
+ public void cancel() {
+ final int lastState = mState.getAndSet(CANCELLED);
+ if (lastState == CANCELLED || lastState == NOT_STARTED) {
+ return;
+ }
+ logD("cancel: cancelled transition. Last state: " + stateToString(lastState));
+ if (mOriginTransition != null) {
+ try {
+ mOriginTransitions.cancelOriginTransition(mOriginTransition);
+ mOriginTransition = null;
+ } catch (RemoteException e) {
+ logE("Unable to cancel origin transition!", e);
+ }
+ }
+ }
+
+ private boolean hasEntryTransition() {
+ return mEntryTransition != null;
+ }
+
+ private boolean hasExitTransition() {
+ return mOriginTransitions != null && mExitTransition != null;
+ }
+
+ private void logD(String msg) {
+ if (DEBUG) {
+ Log.d(TAG, "Session[" + mName + "] - " + msg);
+ }
+ }
+
+ private void logE(String msg) {
+ Log.e(TAG, "Session[" + mName + "] - " + msg);
+ }
+
+ private void logE(String msg, Throwable e) {
+ Log.e(TAG, "Session[" + mName + "] - " + msg, e);
+ }
+
+ private static String stateToString(@State int state) {
+ switch (state) {
+ case NOT_STARTED:
+ return "NOT_STARTED";
+ case STARTED:
+ return "STARTED";
+ case CANCELLED:
+ return "CANCELLED";
+ default:
+ return "UNKNOWN(" + state + ")";
+ }
+ }
+
+ /** A builder to build a {@link OriginTransitionSession}. */
+ public static class Builder {
+ private final Context mContext;
+ @Nullable private final IOriginTransitions mOriginTransitions;
+ @Nullable private Supplier<IRemoteTransition> mEntryTransitionSupplier;
+ @Nullable private Supplier<IRemoteTransition> mExitTransitionSupplier;
+ private String mName;
+ @Nullable private Predicate<RemoteTransition> mIntentStarter;
+
+ /** Create a builder that only supports entry transition. */
+ public Builder(Context context) {
+ this(context, /* originTransitions= */ null);
+ }
+
+ /** Create a builder that supports both entry and return transition. */
+ public Builder(Context context, @Nullable IOriginTransitions originTransitions) {
+ mContext = context;
+ mOriginTransitions = originTransitions;
+ mName = context.getPackageName();
+ }
+
+ /** Specify a name that is used in logging. */
+ public Builder withName(String name) {
+ mName = name;
+ return this;
+ }
+
+ /** Specify an intent that will be launched when the session started. */
+ public Builder withIntent(Intent intent) {
+ return withIntentStarter(
+ transition -> {
+ mContext.startActivity(
+ intent, createDefaultActivityOptions(transition).toBundle());
+ return true;
+ });
+ }
+
+ /** Specify a pending intent that will be launched when the session started. */
+ public Builder withPendingIntent(PendingIntent pendingIntent) {
+ return withIntentStarter(
+ transition -> {
+ try {
+ pendingIntent.send(createDefaultActivityOptions(transition).toBundle());
+ return true;
+ } catch (PendingIntent.CanceledException e) {
+ Log.e(TAG, "Failed to launch pending intent!", e);
+ return false;
+ }
+ });
+ }
+
+ private static ActivityOptions createDefaultActivityOptions(
+ @Nullable RemoteTransition transition) {
+ ActivityOptions options =
+ transition == null
+ ? ActivityOptions.makeBasic()
+ : ActivityOptions.makeRemoteTransition(transition);
+ LaunchCookie cookie = new LaunchCookie();
+ options.setLaunchCookie(cookie);
+ return options;
+ }
+
+ /**
+ * Specify an intent starter function that will be called to start an activity. The function
+ * accepts an optional {@link RemoteTransition} object which can be used to create an {@link
+ * ActivityOptions} for the activity launch. The function can also return a {@code false}
+ * result to cancel the session.
+ *
+ * <p>Note: it's encouraged to use {@link #withIntent(Intent)} or {@link
+ * #withPendingIntent(PendingIntent)} instead of this method. Use it only if the default
+ * activity launch code doesn't satisfy your requirement.
+ */
+ public Builder withIntentStarter(Predicate<RemoteTransition> intentStarter) {
+ mIntentStarter = intentStarter;
+ return this;
+ }
+
+ /** Add an entry transition to the builder. */
+ public Builder withEntryTransition(IRemoteTransition transition) {
+ mEntryTransitionSupplier = () -> transition;
+ return this;
+ }
+
+ /** Add an exit transition to the builder. */
+ public Builder withExitTransition(IRemoteTransition transition) {
+ mExitTransitionSupplier = () -> transition;
+ return this;
+ }
+
+ /** Build an {@link OriginTransitionSession}. */
+ public OriginTransitionSession build() {
+ if (mIntentStarter == null) {
+ throw new IllegalArgumentException("No intent, pending intent, or intent starter!");
+ }
+ return new OriginTransitionSession(
+ mName,
+ mOriginTransitions,
+ mIntentStarter,
+ mEntryTransitionSupplier == null ? null : mEntryTransitionSupplier.get(),
+ mExitTransitionSupplier == null ? null : mExitTransitionSupplier.get());
+ }
+ }
+}
diff --git a/packages/SystemUI/animation/lib/tests/Android.bp b/packages/SystemUI/animation/lib/tests/Android.bp
new file mode 100644
index 0000000..c1a3e84
--- /dev/null
+++ b/packages/SystemUI/animation/lib/tests/Android.bp
@@ -0,0 +1,47 @@
+// Copyright (C) 2024 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package {
+ default_team: "trendy_team_system_ui_please_use_a_more_specific_subteam_if_possible_",
+ default_applicable_licenses: ["frameworks_base_packages_SystemUI_license"],
+}
+
+android_test {
+ name: "PlatformAnimationLibCoreTests",
+
+ defaults: [
+ "platform_app_defaults",
+ ],
+ srcs: [
+ "src/**/*.java",
+ ],
+
+ dxflags: ["--multi-dex"],
+ platform_apis: true,
+ test_suites: ["device-tests"],
+ static_libs: [
+ "PlatformAnimationLib-core",
+ "platform-test-rules",
+ "testables",
+ ],
+ compile_multilib: "both",
+ libs: [
+ "android.test.runner.stubs.system",
+ "android.test.base.stubs.system",
+ ],
+
+ certificate: "platform",
+
+ manifest: "AndroidManifest.xml",
+}
diff --git a/packages/SystemUI/animation/lib/tests/AndroidManifest.xml b/packages/SystemUI/animation/lib/tests/AndroidManifest.xml
new file mode 100644
index 0000000..1788abf
--- /dev/null
+++ b/packages/SystemUI/animation/lib/tests/AndroidManifest.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2024 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:sharedUserId="android.uid.system"
+ package="com.android.systemui.animation.core.tests" >
+
+ <application android:debuggable="true" android:testOnly="true">
+ <uses-library android:name="android.test.runner" />
+ </application>
+
+ <instrumentation android:name="android.testing.TestableInstrumentation"
+ android:targetPackage="com.android.systemui.animation.core.tests"
+ android:label="Tests for PlatformAnimationLib-core" />
+</manifest>
diff --git a/packages/SystemUI/animation/lib/tests/AndroidTest.xml b/packages/SystemUI/animation/lib/tests/AndroidTest.xml
new file mode 100644
index 0000000..0f37d7a
--- /dev/null
+++ b/packages/SystemUI/animation/lib/tests/AndroidTest.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2024 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<configuration description="Runs Tests for PlatformAnimationLib-core.">
+ <target_preparer class="com.android.tradefed.targetprep.TestAppInstallSetup">
+ <option name="test-file-name" value="PlatformAnimationLibCoreTests.apk" />
+ <option name="install-arg" value="-t" />
+ </target_preparer>
+
+ <!-- Among other reasons, root access is needed for screen recording artifacts. -->
+ <target_preparer class="com.android.tradefed.targetprep.RootTargetPreparer">
+ <option name="force-root" value="true" />
+ </target_preparer>
+
+ <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
+ <option name="package" value="com.android.systemui.animation.core.tests" />
+ <option name="runner" value="android.testing.TestableInstrumentation" />
+ <option name="test-filter-dir" value="/data/data/com.android.systemui.animation.core.tests" />
+ <option name="hidden-api-checks" value="false"/>
+ </test>
+
+ <metrics_collector class="com.android.tradefed.device.metric.FilePullerLogCollector">
+ <option name="directory-keys" value="/data/user/0/com.android.systemui.animation.core.tests/files" />
+ <option name="collect-on-run-ended-only" value="false" />
+ </metrics_collector>
+</configuration>
diff --git a/packages/SystemUI/animation/lib/tests/src/com/android/systemui/animation/OriginTransitionSessionTest.java b/packages/SystemUI/animation/lib/tests/src/com/android/systemui/animation/OriginTransitionSessionTest.java
new file mode 100644
index 0000000..287e53b
--- /dev/null
+++ b/packages/SystemUI/animation/lib/tests/src/com/android/systemui/animation/OriginTransitionSessionTest.java
@@ -0,0 +1,406 @@
+/*
+ * 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.animation;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.annotation.Nullable;
+import android.app.Instrumentation;
+import android.content.ComponentName;
+import android.content.Context;
+import android.os.Binder;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.util.ArrayMap;
+import android.view.SurfaceControl;
+import android.view.WindowManager;
+import android.window.IRemoteTransition;
+import android.window.IRemoteTransitionFinishedCallback;
+import android.window.RemoteTransition;
+import android.window.TransitionInfo;
+import android.window.WindowAnimationState;
+import android.window.WindowContainerTransaction;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import com.android.systemui.animation.shared.IOriginTransitions;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+import java.util.Map;
+import java.util.function.Predicate;
+
+/** Unit tests for {@link OriginTransitionSession}. */
+@SmallTest
+@RunWith(JUnit4.class)
+public final class OriginTransitionSessionTest {
+ private static final ComponentName TEST_ACTIVITY_1 = new ComponentName("test", "Activity1");
+ private static final ComponentName TEST_ACTIVITY_2 = new ComponentName("test", "Activity2");
+ private static final ComponentName TEST_ACTIVITY_3 = new ComponentName("test", "Activity3");
+
+ private FakeIOriginTransitions mIOriginTransitions;
+ private Instrumentation mInstrumentation;
+ private FakeIntentStarter mIntentStarter;
+ private Context mContext;
+
+ @Before
+ public void setUp() {
+ mInstrumentation = InstrumentationRegistry.getInstrumentation();
+ mContext = mInstrumentation.getTargetContext();
+ mIOriginTransitions = new FakeIOriginTransitions();
+ mIntentStarter = new FakeIntentStarter(TEST_ACTIVITY_1, TEST_ACTIVITY_2);
+ }
+
+ @Test
+ public void sessionStart_withEntryAndExitTransition_transitionsPlayed() {
+ FakeRemoteTransition entry = new FakeRemoteTransition();
+ FakeRemoteTransition exit = new FakeRemoteTransition();
+ OriginTransitionSession session =
+ new OriginTransitionSession.Builder(mContext, mIOriginTransitions)
+ .withIntentStarter(mIntentStarter)
+ .withEntryTransition(entry)
+ .withExitTransition(exit)
+ .build();
+
+ session.start();
+
+ assertThat(mIntentStarter.hasLaunched()).isTrue();
+ assertThat(entry.started()).isTrue();
+
+ runReturnTransition(mIntentStarter);
+
+ assertThat(exit.started()).isTrue();
+ }
+
+ @Test
+ public void sessionStart_withEntryTransition_transitionPlayed() {
+ FakeRemoteTransition entry = new FakeRemoteTransition();
+ OriginTransitionSession session =
+ new OriginTransitionSession.Builder(mContext, mIOriginTransitions)
+ .withIntentStarter(mIntentStarter)
+ .withEntryTransition(entry)
+ .build();
+
+ session.start();
+
+ assertThat(mIntentStarter.hasLaunched()).isTrue();
+ assertThat(entry.started()).isTrue();
+ assertThat(mIOriginTransitions.hasPendingReturnTransitions()).isFalse();
+ }
+
+ @Test
+ public void sessionStart_withoutTransition_launchedIntent() {
+ OriginTransitionSession session =
+ new OriginTransitionSession.Builder(mContext, mIOriginTransitions)
+ .withIntentStarter(mIntentStarter)
+ .build();
+
+ session.start();
+
+ assertThat(mIntentStarter.hasLaunched()).isTrue();
+ assertThat(mIOriginTransitions.hasPendingReturnTransitions()).isFalse();
+ }
+
+ @Test
+ public void sessionStart_cancelledByIntentStarter_transitionNotPlayed() {
+ FakeRemoteTransition entry = new FakeRemoteTransition();
+ FakeRemoteTransition exit = new FakeRemoteTransition();
+ mIntentStarter =
+ new FakeIntentStarter(TEST_ACTIVITY_1, TEST_ACTIVITY_2, /* result= */ false);
+ OriginTransitionSession session =
+ new OriginTransitionSession.Builder(mContext, mIOriginTransitions)
+ .withIntentStarter(mIntentStarter)
+ .withEntryTransition(entry)
+ .withExitTransition(exit)
+ .build();
+
+ session.start();
+
+ assertThat(mIntentStarter.hasLaunched()).isFalse();
+ assertThat(entry.started()).isFalse();
+ assertThat(exit.started()).isFalse();
+ assertThat(mIOriginTransitions.hasPendingReturnTransitions()).isFalse();
+ }
+
+ @Test
+ public void sessionStart_alreadyStarted_noOp() {
+ FakeRemoteTransition entry = new FakeRemoteTransition();
+ FakeRemoteTransition exit = new FakeRemoteTransition();
+ OriginTransitionSession session =
+ new OriginTransitionSession.Builder(mContext, mIOriginTransitions)
+ .withIntentStarter(mIntentStarter)
+ .withEntryTransition(entry)
+ .withExitTransition(exit)
+ .build();
+ session.start();
+ entry.reset();
+ mIntentStarter.reset();
+
+ session.start();
+
+ assertThat(mIntentStarter.hasLaunched()).isFalse();
+ assertThat(entry.started()).isFalse();
+ }
+
+ @Test
+ public void sessionStart_alreadyCancelled_noOp() {
+ FakeRemoteTransition entry = new FakeRemoteTransition();
+ FakeRemoteTransition exit = new FakeRemoteTransition();
+ OriginTransitionSession session =
+ new OriginTransitionSession.Builder(mContext, mIOriginTransitions)
+ .withIntentStarter(mIntentStarter)
+ .withEntryTransition(entry)
+ .withExitTransition(exit)
+ .build();
+ session.cancel();
+
+ session.start();
+
+ assertThat(mIntentStarter.hasLaunched()).isFalse();
+ assertThat(entry.started()).isFalse();
+ assertThat(mIOriginTransitions.hasPendingReturnTransitions()).isFalse();
+ }
+
+ @Test
+ public void sessionCancelled_returnTransitionNotPlayed() {
+ FakeRemoteTransition entry = new FakeRemoteTransition();
+ FakeRemoteTransition exit = new FakeRemoteTransition();
+ OriginTransitionSession session =
+ new OriginTransitionSession.Builder(mContext, mIOriginTransitions)
+ .withIntentStarter(mIntentStarter)
+ .withEntryTransition(entry)
+ .withExitTransition(exit)
+ .build();
+
+ session.start();
+ session.cancel();
+
+ assertThat(mIOriginTransitions.hasPendingReturnTransitions()).isFalse();
+ }
+
+ @Test
+ public void multipleSessionsStarted_allTransitionsPlayed() {
+ FakeRemoteTransition entry1 = new FakeRemoteTransition();
+ FakeRemoteTransition exit1 = new FakeRemoteTransition();
+ FakeIntentStarter starter1 = mIntentStarter;
+ OriginTransitionSession session1 =
+ new OriginTransitionSession.Builder(mContext, mIOriginTransitions)
+ .withIntentStarter(starter1)
+ .withEntryTransition(entry1)
+ .withExitTransition(exit1)
+ .build();
+ FakeRemoteTransition entry2 = new FakeRemoteTransition();
+ FakeRemoteTransition exit2 = new FakeRemoteTransition();
+ FakeIntentStarter starter2 = new FakeIntentStarter(TEST_ACTIVITY_2, TEST_ACTIVITY_3);
+ OriginTransitionSession session2 =
+ new OriginTransitionSession.Builder(mContext, mIOriginTransitions)
+ .withIntentStarter(starter2)
+ .withEntryTransition(entry2)
+ .withExitTransition(exit2)
+ .build();
+
+ session1.start();
+
+ assertThat(starter1.hasLaunched()).isTrue();
+ assertThat(entry1.started()).isTrue();
+
+ session2.start();
+
+ assertThat(starter2.hasLaunched()).isTrue();
+ assertThat(entry2.started()).isTrue();
+
+ runReturnTransition(starter2);
+
+ assertThat(exit2.started()).isTrue();
+
+ runReturnTransition(starter1);
+
+ assertThat(exit1.started()).isTrue();
+ }
+
+ private void runReturnTransition(FakeIntentStarter intentStarter) {
+ TransitionInfo info =
+ buildTransitionInfo(intentStarter.getToActivity(), intentStarter.getFromActivity());
+ mIOriginTransitions.runReturnTransition(intentStarter.getTransitionOfLastLaunch(), info);
+ }
+
+ private static TransitionInfo buildTransitionInfo(ComponentName from, ComponentName to) {
+ TransitionInfo info = new TransitionInfo(WindowManager.TRANSIT_OPEN, /* flags= */ 0);
+ TransitionInfo.Change c1 =
+ new TransitionInfo.Change(/* container= */ null, /* leash= */ null);
+ c1.setMode(WindowManager.TRANSIT_OPEN);
+ c1.setActivityComponent(to);
+ TransitionInfo.Change c2 =
+ new TransitionInfo.Change(/* container= */ null, /* leash= */ null);
+ c2.setMode(WindowManager.TRANSIT_CLOSE);
+ c2.setActivityComponent(from);
+ info.addChange(c2);
+ info.addChange(c1);
+ return info;
+ }
+
+ private static class FakeIntentStarter implements Predicate<RemoteTransition> {
+ private final ComponentName mFromActivity;
+ private final ComponentName mToActivity;
+ private final boolean mResult;
+
+ @Nullable private RemoteTransition mTransition;
+ private boolean mLaunched;
+
+ FakeIntentStarter(ComponentName from, ComponentName to) {
+ this(from, to, /* result= */ true);
+ }
+
+ FakeIntentStarter(ComponentName from, ComponentName to, boolean result) {
+ mFromActivity = from;
+ mToActivity = to;
+ mResult = result;
+ }
+
+ @Override
+ public boolean test(RemoteTransition transition) {
+ if (mResult) {
+ mLaunched = true;
+ mTransition = transition;
+ if (mTransition != null) {
+ TransitionInfo info = buildTransitionInfo(mFromActivity, mToActivity);
+ try {
+ transition
+ .getRemoteTransition()
+ .startAnimation(
+ new Binder(),
+ info,
+ new SurfaceControl.Transaction(),
+ new FakeFinishCallback());
+ } catch (RemoteException e) {
+
+ }
+ }
+ }
+ return mResult;
+ }
+
+ @Nullable
+ public RemoteTransition getTransitionOfLastLaunch() {
+ return mTransition;
+ }
+
+ public ComponentName getFromActivity() {
+ return mFromActivity;
+ }
+
+ public ComponentName getToActivity() {
+ return mToActivity;
+ }
+
+ public boolean hasLaunched() {
+ return mLaunched;
+ }
+
+ public void reset() {
+ mTransition = null;
+ mLaunched = false;
+ }
+ }
+
+ private static class FakeIOriginTransitions extends IOriginTransitions.Stub {
+ private final Map<RemoteTransition, RemoteTransition> mRecords = new ArrayMap<>();
+
+ @Override
+ public RemoteTransition makeOriginTransition(
+ RemoteTransition launchTransition, RemoteTransition returnTransition) {
+ mRecords.put(launchTransition, returnTransition);
+ return launchTransition;
+ }
+
+ @Override
+ public void cancelOriginTransition(RemoteTransition originTransition) {
+ mRecords.remove(originTransition);
+ }
+
+ public void runReturnTransition(RemoteTransition originTransition, TransitionInfo info) {
+ RemoteTransition transition = mRecords.remove(originTransition);
+ try {
+ transition
+ .getRemoteTransition()
+ .startAnimation(
+ new Binder(),
+ info,
+ new SurfaceControl.Transaction(),
+ new FakeFinishCallback());
+ } catch (RemoteException e) {
+
+ }
+ }
+
+ public boolean hasPendingReturnTransitions() {
+ return !mRecords.isEmpty();
+ }
+ }
+
+ private static class FakeFinishCallback extends IRemoteTransitionFinishedCallback.Stub {
+ @Override
+ public void onTransitionFinished(
+ WindowContainerTransaction wct, SurfaceControl.Transaction sct) {}
+ }
+
+ private static class FakeRemoteTransition extends IRemoteTransition.Stub {
+ private boolean mStarted;
+
+ @Override
+ public void startAnimation(
+ IBinder token,
+ TransitionInfo info,
+ SurfaceControl.Transaction t,
+ IRemoteTransitionFinishedCallback finishCallback)
+ throws RemoteException {
+ mStarted = true;
+ finishCallback.onTransitionFinished(null, null);
+ }
+
+ @Override
+ public void mergeAnimation(
+ IBinder transition,
+ TransitionInfo info,
+ SurfaceControl.Transaction t,
+ IBinder mergeTarget,
+ IRemoteTransitionFinishedCallback finishCallback) {}
+
+ @Override
+ public void takeOverAnimation(
+ IBinder transition,
+ TransitionInfo info,
+ SurfaceControl.Transaction t,
+ IRemoteTransitionFinishedCallback finishCallback,
+ WindowAnimationState[] states) {}
+
+ @Override
+ public void onTransitionConsumed(IBinder transition, boolean aborted) {}
+
+ public boolean started() {
+ return mStarted;
+ }
+
+ public void reset() {
+ mStarted = false;
+ }
+ }
+}
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/media/controls/ui/composable/MediaCarousel.kt b/packages/SystemUI/compose/features/src/com/android/systemui/media/controls/ui/composable/MediaCarousel.kt
index f4d9e82..3d8ca1e 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/media/controls/ui/composable/MediaCarousel.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/media/controls/ui/composable/MediaCarousel.kt
@@ -22,7 +22,9 @@
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
+import androidx.compose.material3.windowsizeclass.WindowHeightSizeClass
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.layout.approachLayout
import androidx.compose.ui.layout.layout
@@ -31,8 +33,12 @@
import androidx.compose.ui.viewinterop.AndroidView
import com.android.compose.animation.scene.MovableElementKey
import com.android.compose.animation.scene.SceneScope
+import com.android.compose.windowsizeclass.LocalWindowSizeClass
+import com.android.internal.R.attr.layout
+import com.android.systemui.media.controls.ui.composable.MediaCarouselStateLoader.stateForMediaCarouselContent
import com.android.systemui.media.controls.ui.controller.MediaCarouselController
import com.android.systemui.media.controls.ui.view.MediaHost
+import com.android.systemui.media.controls.ui.view.MediaHostState
import com.android.systemui.res.R
import com.android.systemui.util.animation.MeasurementInput
@@ -53,12 +59,20 @@
modifier: Modifier = Modifier,
carouselController: MediaCarouselController,
offsetProvider: (() -> IntOffset)? = null,
+ usingCollapsedLandscapeMedia: Boolean = false,
) {
if (!isVisible || carouselController.isLockedAndHidden()) {
return
}
- val mediaHeight = dimensionResource(R.dimen.qs_media_session_height_expanded)
+ val carouselState = remember { { stateForMediaCarouselContent() } }
+ val isCollapsed = usingCollapsedLandscapeMedia && isLandscape()
+ val mediaHeight =
+ if (isCollapsed && mediaHost.expansion == MediaHostState.COLLAPSED) {
+ dimensionResource(R.dimen.qs_media_session_height_collapsed)
+ } else {
+ dimensionResource(R.dimen.qs_media_session_height_expanded)
+ }
MovableElement(
key = MediaCarousel.Elements.Content,
@@ -95,6 +109,7 @@
}
},
factory = { context ->
+ MediaCarouselStateLoader.loadCarouselState(carouselController, carouselState())
FrameLayout(context).apply {
layoutParams =
FrameLayout.LayoutParams(
@@ -103,7 +118,10 @@
)
}
},
- update = { it.setView(carouselController.mediaFrame) },
+ update = {
+ MediaCarouselStateLoader.loadCarouselState(carouselController, carouselState())
+ it.setView(carouselController.mediaFrame)
+ },
onRelease = { it.removeAllViews() },
)
}
@@ -117,3 +135,8 @@
(view.parent as? ViewGroup)?.removeView(view)
addView(view)
}
+
+@Composable
+fun SceneScope.isLandscape(): Boolean {
+ return LocalWindowSizeClass.current.heightSizeClass == WindowHeightSizeClass.Compact
+}
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/media/controls/ui/composable/MediaCarouselStateLoader.kt b/packages/SystemUI/compose/features/src/com/android/systemui/media/controls/ui/composable/MediaCarouselStateLoader.kt
new file mode 100644
index 0000000..4a0136c
--- /dev/null
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/media/controls/ui/composable/MediaCarouselStateLoader.kt
@@ -0,0 +1,153 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.media.controls.ui.composable
+
+import com.android.compose.animation.scene.ContentKey
+import com.android.compose.animation.scene.SceneKey
+import com.android.compose.animation.scene.SceneScope
+import com.android.compose.animation.scene.content.state.TransitionState
+import com.android.systemui.media.controls.ui.controller.MediaCarouselController
+import com.android.systemui.media.controls.ui.controller.MediaHierarchyManager
+import com.android.systemui.media.controls.ui.controller.MediaLocation
+import com.android.systemui.scene.shared.model.Overlays
+import com.android.systemui.scene.shared.model.Scenes
+import kotlin.math.min
+
+object MediaCarouselStateLoader {
+
+ /** Sets current state for media carousel. */
+ fun loadCarouselState(carouselController: MediaCarouselController, state: State) {
+ if (state is State.Gone) return
+
+ carouselController.setCurrentState(
+ state.startLocation,
+ state.endLocation,
+ state.transitionProgress,
+ immediately = true,
+ )
+ }
+
+ /** Returns the corresponding media location for the given [scene] */
+ @MediaLocation
+ private fun getMediaLocation(scene: SceneKey): Int {
+ return when (scene) {
+ Scenes.QuickSettings -> MediaHierarchyManager.LOCATION_QS
+ Scenes.Shade -> MediaHierarchyManager.LOCATION_QQS
+ Scenes.Lockscreen -> MediaHierarchyManager.LOCATION_LOCKSCREEN
+ Scenes.Communal -> MediaHierarchyManager.LOCATION_COMMUNAL_HUB
+ else -> MediaHierarchyManager.LOCATION_UNKNOWN
+ }
+ }
+
+ /** Returns the corresponding media location for the given [content] */
+ @MediaLocation
+ private fun getMediaLocation(content: ContentKey): Int {
+ return when (content) {
+ Overlays.QuickSettingsShade -> MediaHierarchyManager.LOCATION_QS
+ Overlays.NotificationsShade -> MediaHierarchyManager.LOCATION_QQS
+ else -> MediaHierarchyManager.LOCATION_UNKNOWN
+ }
+ }
+
+ /** State for media carousel. */
+ sealed interface State {
+ val transitionProgress: Float
+ // TODO b/368368388: implement media squishiness
+ val squishFraction: () -> Float
+ @MediaLocation val startLocation: Int
+ @MediaLocation val endLocation: Int
+
+ /** State when media carousel is not visible on screen. */
+ data object Gone : State {
+ override val transitionProgress: Float = 1.0F
+ override val squishFraction: () -> Float = { 1.0F }
+ override val endLocation: Int = MediaHierarchyManager.LOCATION_UNKNOWN
+ override val startLocation: Int = MediaHierarchyManager.LOCATION_UNKNOWN
+ }
+
+ /** State when media carousel is moving from one media location to another */
+ data class InProgress(
+ override val transitionProgress: Float,
+ override val startLocation: Int,
+ override val endLocation: Int,
+ ) : State {
+ override val squishFraction = { 1.0F }
+ }
+
+ /** State when media carousel reached the end location. */
+ data class Idle(override val endLocation: Int) : State {
+ override val transitionProgress = 1.0F
+ override val startLocation = MediaHierarchyManager.LOCATION_UNKNOWN
+ override val squishFraction = { 1.0F }
+ }
+ }
+
+ /** Returns the state of media carousel */
+ fun SceneScope.stateForMediaCarouselContent(): State {
+ return when (val transitionState = layoutState.transitionState) {
+ is TransitionState.Idle -> {
+ if (MediaContentPicker.contents.contains(transitionState.currentScene)) {
+ State.Idle(getMediaLocation(transitionState.currentScene))
+ } else {
+ State.Gone
+ }
+ }
+ is TransitionState.Transition.ChangeScene ->
+ with(transitionState) {
+ if (
+ MediaContentPicker.contents.contains(toScene) &&
+ MediaContentPicker.contents.contains(fromScene)
+ ) {
+ State.InProgress(
+ min(progress, 1.0F),
+ getMediaLocation(fromScene),
+ getMediaLocation(toScene),
+ )
+ } else if (MediaContentPicker.contents.contains(toScene)) {
+ State.InProgress(
+ transitionProgress = 1.0F,
+ startLocation = MediaHierarchyManager.LOCATION_UNKNOWN,
+ getMediaLocation(toScene),
+ )
+ } else {
+ State.Gone
+ }
+ }
+ is TransitionState.Transition.OverlayTransition ->
+ with(transitionState) {
+ if (
+ MediaContentPicker.contents.contains(toContent) &&
+ MediaContentPicker.contents.contains(fromContent)
+ ) {
+ State.InProgress(
+ min(progress, 1.0F),
+ getMediaLocation(fromContent),
+ getMediaLocation(toContent),
+ )
+ } else if (MediaContentPicker.contents.contains(toContent)) {
+ State.InProgress(
+ transitionProgress = 1.0F,
+ startLocation = MediaHierarchyManager.LOCATION_UNKNOWN,
+ getMediaLocation(toContent),
+ )
+ } else {
+ State.Gone
+ }
+ }
+ }
+ }
+}
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt
index 0c69dbd..6304979 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt
@@ -48,7 +48,6 @@
import androidx.compose.foundation.layout.wrapContentHeight
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
-import androidx.compose.material3.windowsizeclass.WindowHeightSizeClass
import androidx.compose.material3.windowsizeclass.WindowWidthSizeClass
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
@@ -85,6 +84,7 @@
import com.android.systemui.lifecycle.ExclusiveActivatable
import com.android.systemui.lifecycle.rememberViewModel
import com.android.systemui.media.controls.ui.composable.MediaCarousel
+import com.android.systemui.media.controls.ui.composable.isLandscape
import com.android.systemui.media.controls.ui.controller.MediaCarouselController
import com.android.systemui.media.controls.ui.view.MediaHost
import com.android.systemui.media.dagger.MediaModule
@@ -288,9 +288,7 @@
// ############# Media ###############
val isMediaVisible by viewModel.isMediaVisible.collectAsStateWithLifecycle()
- val mediaInRow =
- isMediaVisible &&
- LocalWindowSizeClass.current.heightSizeClass == WindowHeightSizeClass.Compact
+ val mediaInRow = isMediaVisible && isLandscape()
val mediaOffset by
animateSceneDpAsState(value = InQS, key = MediaLandscapeTopOffset, canOverflow = false)
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsShadeOverlay.kt b/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsShadeOverlay.kt
index 8e6cb3f..54497f6 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsShadeOverlay.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsShadeOverlay.kt
@@ -124,8 +124,9 @@
}
}
+/** Column containing Brightness and QS tiles. */
@Composable
-private fun SceneScope.QuickSettingsLayout(
+fun SceneScope.QuickSettingsLayout(
viewModel: QuickSettingsContainerViewModel,
modifier: Modifier = Modifier,
) {
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt
index 8a59e20..7f2ee2a 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt
@@ -43,7 +43,6 @@
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.verticalScroll
-import androidx.compose.material3.windowsizeclass.WindowHeightSizeClass
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect
@@ -78,7 +77,6 @@
import com.android.compose.animation.scene.content.state.TransitionState
import com.android.compose.modifiers.padding
import com.android.compose.modifiers.thenIf
-import com.android.compose.windowsizeclass.LocalWindowSizeClass
import com.android.systemui.battery.BatteryMeterViewController
import com.android.systemui.common.ui.compose.windowinsets.CutoutLocation
import com.android.systemui.common.ui.compose.windowinsets.LocalDisplayCutout
@@ -89,6 +87,7 @@
import com.android.systemui.lifecycle.rememberViewModel
import com.android.systemui.media.controls.ui.composable.MediaCarousel
import com.android.systemui.media.controls.ui.composable.MediaContentPicker
+import com.android.systemui.media.controls.ui.composable.isLandscape
import com.android.systemui.media.controls.ui.composable.shouldElevateMedia
import com.android.systemui.media.controls.ui.controller.MediaCarouselController
import com.android.systemui.media.controls.ui.controller.MediaHierarchyManager
@@ -197,6 +196,8 @@
qsMediaHost = qsMediaHost,
modifier = modifier,
shadeSession = shadeSession,
+ usingCollapsedLandscapeMedia =
+ Utils.useCollapsedMediaInLandscape(LocalContext.current.resources),
)
init {
@@ -223,6 +224,7 @@
qsMediaHost: MediaHost,
modifier: Modifier = Modifier,
shadeSession: SaveableSession,
+ usingCollapsedLandscapeMedia: Boolean,
) {
val view = LocalView.current
LaunchedEffect(Unit) {
@@ -245,6 +247,7 @@
mediaHost = qqsMediaHost,
modifier = modifier,
shadeSession = shadeSession,
+ usingCollapsedLandscapeMedia = usingCollapsedLandscapeMedia,
)
is ShadeMode.Split ->
SplitShade(
@@ -275,14 +278,11 @@
mediaHost: MediaHost,
modifier: Modifier = Modifier,
shadeSession: SaveableSession,
+ usingCollapsedLandscapeMedia: Boolean,
) {
val cutoutLocation = LocalDisplayCutout.current.location
val cutoutInsets = WindowInsets.Companion.displayCutout
- val isLandscape = LocalWindowSizeClass.current.heightSizeClass == WindowHeightSizeClass.Compact
- val usingCollapsedLandscapeMedia =
- Utils.useCollapsedMediaInLandscape(LocalContext.current.resources)
- val isExpanded = !usingCollapsedLandscapeMedia || !isLandscape
- mediaHost.expansion = if (isExpanded) EXPANDED else COLLAPSED
+ mediaHost.expansion = if (usingCollapsedLandscapeMedia && isLandscape()) COLLAPSED else EXPANDED
var maxNotifScrimTop by remember { mutableIntStateOf(0) }
val tileSquishiness by
@@ -298,7 +298,7 @@
layoutState.isTransitioningBetween(Scenes.Gone, Scenes.Shade) ||
layoutState.isTransitioningBetween(Scenes.Lockscreen, Scenes.Shade)
// Media is visible and we are in landscape on a small height screen
- val mediaInRow = isMediaVisible && isLandscape
+ val mediaInRow = isMediaVisible && isLandscape()
val mediaOffset by
animateSceneDpAsState(value = InQQS, key = MediaLandscapeTopOffset, canOverflow = false)
@@ -380,6 +380,7 @@
mediaOffsetProvider = mediaOffsetProvider,
carouselController = mediaCarouselController,
modifier = Modifier.layoutId(SingleShadeMeasurePolicy.LayoutId.Media),
+ usingCollapsedLandscapeMedia = usingCollapsedLandscapeMedia,
)
NotificationScrollingStack(
@@ -636,6 +637,7 @@
carouselController: MediaCarouselController,
mediaOffsetProvider: ShadeMediaOffsetProvider,
modifier: Modifier = Modifier,
+ usingCollapsedLandscapeMedia: Boolean = false,
) {
MediaCarousel(
modifier = modifier.fillMaxWidth(),
@@ -648,5 +650,6 @@
} else {
{ mediaOffsetProvider.offset }
},
+ usingCollapsedLandscapeMedia = usingCollapsedLandscapeMedia,
)
}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityContainerTest.java b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityContainerTest.java
index 312e62d..94d3b2c 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityContainerTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityContainerTest.java
@@ -62,7 +62,9 @@
import com.android.systemui.res.R;
import com.android.systemui.statusbar.policy.UserSwitcherController;
import com.android.systemui.user.data.source.UserRecord;
+import com.android.systemui.util.concurrency.FakeExecutor;
import com.android.systemui.util.settings.GlobalSettings;
+import com.android.systemui.util.time.FakeSystemClock;
import org.junit.Before;
import org.junit.Rule;
@@ -96,6 +98,7 @@
private FalsingA11yDelegate mFalsingA11yDelegate;
private KeyguardSecurityContainer mKeyguardSecurityContainer;
+ private FakeExecutor mExecutor = new FakeExecutor(new FakeSystemClock());
@Before
public void setup() {
@@ -106,6 +109,7 @@
mSecurityViewFlipper = new KeyguardSecurityViewFlipper(getContext());
mSecurityViewFlipper.setId(View.generateViewId());
mKeyguardSecurityContainer = new KeyguardSecurityContainer(getContext());
+ mKeyguardSecurityContainer.setBackgroundExecutor(mExecutor);
mKeyguardSecurityContainer.setRight(VIEW_WIDTH);
mKeyguardSecurityContainer.setLeft(0);
mKeyguardSecurityContainer.setTop(0);
@@ -342,7 +346,7 @@
@Test
public void testTwoOrMoreUsersDoesAllowDropDown() {
- // GIVEN one user has been setup
+ // GIVEN two users have been setup
ArrayList<UserRecord> records = buildUserRecords(2);
when(mUserSwitcherController.getCurrentUserRecord()).thenReturn(records.get(0));
when(mUserSwitcherController.getUsers()).thenReturn(records);
@@ -350,7 +354,7 @@
// WHEN UserSwitcherViewMode is initialized
setupUserSwitcher();
- // THEN the UserSwitcher anchor should not be clickable
+ // THEN the UserSwitcher anchor should be clickable
ViewGroup anchor = mKeyguardSecurityContainer.findViewById(R.id.user_switcher_anchor);
assertThat(anchor.isClickable()).isTrue();
}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/back/domain/interactor/BackActionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/back/domain/interactor/BackActionInteractorTest.kt
index cbad133..8c7cd61 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/back/domain/interactor/BackActionInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/back/domain/interactor/BackActionInteractorTest.kt
@@ -114,14 +114,15 @@
private val backActionInteractor: BackActionInteractor by lazy {
BackActionInteractor(
- testScope.backgroundScope,
- statusBarStateController,
- statusBarKeyguardViewManager,
- shadeController,
- notificationShadeWindowController,
- windowRootViewVisibilityInteractor
- )
- .apply { this.setup(qsController, shadeBackActionInteractor) }
+ testScope.backgroundScope,
+ statusBarStateController,
+ statusBarKeyguardViewManager,
+ shadeController,
+ notificationShadeWindowController,
+ windowRootViewVisibilityInteractor,
+ shadeBackActionInteractor,
+ qsController,
+ )
}
private val powerInteractor = PowerInteractorFactory.create().powerInteractor
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AodBurnInViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AodBurnInViewModelTest.kt
index 40a9add..7f09370 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AodBurnInViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AodBurnInViewModelTest.kt
@@ -129,6 +129,53 @@
}
@Test
+ fun translationX_aodToLockscreen() =
+ testScope.runTest {
+ underTest.updateBurnInParams(burnInParameters.copy(translationX = { -100f }))
+ val movement by collectLastValue(underTest.movement)
+ assertThat(movement?.translationX).isEqualTo(0)
+
+ // Trigger a change to the burn-in model
+ burnInFlow.value = BurnInModel(translationX = 20, translationY = 30, scale = 0.5f)
+
+ // Set to not dozing (on lockscreen)
+ keyguardTransitionRepository.sendTransitionStep(
+ TransitionStep(
+ from = KeyguardState.AOD,
+ to = KeyguardState.LOCKSCREEN,
+ value = 0f,
+ transitionState = TransitionState.STARTED,
+ ),
+ validateStep = false,
+ )
+ // Set to not dozing (on lockscreen)
+ keyguardTransitionRepository.sendTransitionStep(
+ TransitionStep(
+ from = KeyguardState.AOD,
+ to = KeyguardState.LOCKSCREEN,
+ value = 0f,
+ transitionState = TransitionState.RUNNING,
+ ),
+ validateStep = false,
+ )
+ assertThat(movement?.translationX).isEqualTo(-100)
+ keyguardTransitionRepository.sendTransitionStep(
+ TransitionStep(
+ from = KeyguardState.AOD,
+ to = KeyguardState.LOCKSCREEN,
+ value = 1f,
+ transitionState = TransitionState.FINISHED,
+ ),
+ validateStep = false,
+ )
+
+ assertThat(movement?.translationX).isEqualTo(0)
+ assertThat(movement?.translationY).isEqualTo(0)
+ assertThat(movement?.scale).isEqualTo(1f)
+ assertThat(movement?.scaleClockOnly).isEqualTo(true)
+ }
+
+ @Test
fun translationAndScale_whenFullyDozing() =
testScope.runTest {
underTest.updateBurnInParams(burnInParameters.copy(minViewY = 100))
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 5d606c6..5186536 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
@@ -26,7 +26,6 @@
import com.android.compose.animation.scene.ObservableTransitionState
import com.android.systemui.Flags.FLAG_KEYGUARD_BOTTOM_AREA_REFACTOR
import com.android.systemui.Flags.FLAG_MIGRATE_CLOCKS_TO_BLUEPRINT
-import com.android.systemui.Flags.FLAG_NEW_AOD_TRANSITION
import com.android.systemui.SysuiTestCase
import com.android.systemui.communal.data.repository.communalSceneRepository
import com.android.systemui.communal.shared.model.CommunalScenes
@@ -74,11 +73,7 @@
@SmallTest
@RunWith(ParameterizedAndroidJunit4::class)
-@EnableFlags(
- FLAG_MIGRATE_CLOCKS_TO_BLUEPRINT,
- FLAG_NEW_AOD_TRANSITION,
- FLAG_KEYGUARD_BOTTOM_AREA_REFACTOR,
-)
+@EnableFlags(FLAG_MIGRATE_CLOCKS_TO_BLUEPRINT, FLAG_KEYGUARD_BOTTOM_AREA_REFACTOR)
class KeyguardRootViewModelTest(flags: FlagsParameterization) : SysuiTestCase() {
private val kosmos = testKosmos()
private val testScope = kosmos.testScope
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/OWNERS b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/OWNERS
index cd04e82..d3eec97 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/OWNERS
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/OWNERS
@@ -1,3 +1,4 @@
set noparent
include /packages/SystemUI/src/com/android/systemui/qs/OWNERS
+include /packages/SystemUI/TEST_OWNERS
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java
index 225adab..527aeaa 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java
@@ -136,6 +136,8 @@
@Mock
private ViewTreeObserver mViewTreeObserver;
+ private boolean mPagedTileLayoutListening = false;
+
private TestableLongPressEffectProvider mLongPressEffectProvider =
new TestableLongPressEffectProvider();
@@ -213,6 +215,11 @@
return null;
}).when(mQSPanel).setListening(anyBoolean());
+ doAnswer(invocation -> {
+ mPagedTileLayoutListening = invocation.getArgument(0);
+ return null;
+ }).when(mPagedTileLayout).setListening(anyBoolean(), any());
+
mController = new TestableQSPanelControllerBase(mQSPanel, mQSHost,
mQSCustomizerController, mMediaHost,
mMetricsLogger, mUiEventLogger, mQSLogger, mDumpManager);
@@ -571,6 +578,33 @@
assertThat(mController.mRecords).isEmpty();
}
+ @Test
+ public void listening_dettach_reAttach_listeningSetAgain() {
+ mController.setListening(true);
+
+ assertThat(mPagedTileLayoutListening).isTrue();
+
+ mController.onViewDetached();
+ assertThat(mPagedTileLayoutListening).isFalse();
+
+ mController.onViewAttached();
+ assertThat(mPagedTileLayoutListening).isTrue();
+ }
+
+ @Test
+ public void notListening_dettach_reAttach_stillNotListening() {
+ mController.setListening(false);
+
+ assertThat(mPagedTileLayoutListening).isFalse();
+
+ mController.onViewDetached();
+ assertThat(mPagedTileLayoutListening).isFalse();
+
+ mController.onViewAttached();
+ assertThat(mPagedTileLayoutListening).isFalse();
+ }
+
+
private boolean usingMediaPlayer() {
return !SceneContainerFlag.isEnabled();
}
diff --git a/packages/SystemUI/plugin/Android.bp b/packages/SystemUI/plugin/Android.bp
index a26cf12..6212e2b 100644
--- a/packages/SystemUI/plugin/Android.bp
+++ b/packages/SystemUI/plugin/Android.bp
@@ -30,6 +30,9 @@
"src/**/*.java",
"src/**/*.kt",
],
+ exclude_srcs: [
+ "src/**/PluginProtectorStub.kt",
+ ],
optimize: {
proguard_flags_files: [
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/PluginProtectorStub.kt b/packages/SystemUI/plugin/src/com/android/systemui/plugins/PluginProtectorStub.kt
new file mode 100644
index 0000000..172b049
--- /dev/null
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/PluginProtectorStub.kt
@@ -0,0 +1,32 @@
+/*
+ * 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.plugins
+
+/**
+ * Stub version of PluginProtector that is normally generated by [ProtectedPluginProcessor].
+ * Intended for use in applications where kapt cannot be used, but disables the protection feature.
+ */
+class PluginProtector {
+ companion object {
+ @JvmStatic
+ fun <T> tryProtect(target: T, listener: ProtectedPluginListener): T? {
+ return null
+ }
+
+ @JvmStatic
+ fun <T> protectIfAble(target: T, listener: ProtectedPluginListener): T {
+ return target
+ }
+ }
+}
diff --git a/packages/SystemUI/plugin_core/Android.bp b/packages/SystemUI/plugin_core/Android.bp
index 31fbda5..98b5026 100644
--- a/packages/SystemUI/plugin_core/Android.bp
+++ b/packages/SystemUI/plugin_core/Android.bp
@@ -54,8 +54,6 @@
exclude_srcs: [
"src/**/annotations/*.java",
"src/**/annotations/*.kt",
- "src/**/processor/*.java",
- "src/**/processor/*.kt",
],
static_libs: [
"PluginAnnotationLib",
@@ -78,8 +76,8 @@
host_supported: true,
device_supported: false,
srcs: [
- "src/**/processor/*.java",
- "src/**/processor/*.kt",
+ "processor/src/**/*.java",
+ "processor/src/**/*.kt",
],
plugins: ["auto_service_plugin"],
static_libs: [
diff --git a/packages/SystemUI/plugin_core/src/com/android/systemui/plugins/processor/ProtectedPluginProcessor.kt b/packages/SystemUI/plugin_core/processor/src/com/android/systemui/plugins/processor/ProtectedPluginProcessor.kt
similarity index 100%
rename from packages/SystemUI/plugin_core/src/com/android/systemui/plugins/processor/ProtectedPluginProcessor.kt
rename to packages/SystemUI/plugin_core/processor/src/com/android/systemui/plugins/processor/ProtectedPluginProcessor.kt
diff --git a/packages/SystemUI/plugin_core/src/com/android/systemui/plugins/processor/TabbedWriter.kt b/packages/SystemUI/plugin_core/processor/src/com/android/systemui/plugins/processor/TabbedWriter.kt
similarity index 100%
rename from packages/SystemUI/plugin_core/src/com/android/systemui/plugins/processor/TabbedWriter.kt
rename to packages/SystemUI/plugin_core/processor/src/com/android/systemui/plugins/processor/TabbedWriter.kt
diff --git a/packages/SystemUI/res/layout/status_bar_no_notifications.xml b/packages/SystemUI/res/layout/status_bar_no_notifications.xml
index 856ba92..248e611 100644
--- a/packages/SystemUI/res/layout/status_bar_no_notifications.xml
+++ b/packages/SystemUI/res/layout/status_bar_no_notifications.xml
@@ -15,7 +15,7 @@
-->
<!-- Extends Framelayout -->
-<com.android.systemui.statusbar.EmptyShadeView
+<com.android.systemui.statusbar.notification.emptyshade.ui.view.EmptyShadeView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -46,4 +46,4 @@
android:textAppearance="?android:attr/textAppearanceButton"
android:text="@string/unlock_to_see_notif_text"/>
</LinearLayout>
-</com.android.systemui.statusbar.EmptyShadeView>
+</com.android.systemui.statusbar.notification.emptyshade.ui.view.EmptyShadeView>
diff --git a/packages/SystemUI/res/layout/super_notification_shade.xml b/packages/SystemUI/res/layout/super_notification_shade.xml
index fbb07be..22d34eb 100644
--- a/packages/SystemUI/res/layout/super_notification_shade.xml
+++ b/packages/SystemUI/res/layout/super_notification_shade.xml
@@ -58,14 +58,6 @@
android:layout_height="match_parent"
android:visibility="invisible" />
- <!-- Root for all keyguard content. It was previously located within the shade. -->
- <com.android.systemui.keyguard.ui.view.KeyguardRootView
- android:id="@id/keyguard_root_view"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:clipChildren="false"
- />
-
<!-- Shared container for the notification stack. Can be positioned by either
the keyguard_root_view or notification_panel -->
<com.android.systemui.statusbar.notification.stack.ui.view.SharedNotificationContainer
@@ -76,6 +68,14 @@
android:clipToPadding="false"
/>
+ <!-- Root for all keyguard content. It was previously located within the shade. -->
+ <com.android.systemui.keyguard.ui.view.KeyguardRootView
+ android:id="@id/keyguard_root_view"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:clipChildren="false"
+ />
+
<include layout="@layout/brightness_mirror_container" />
<com.android.systemui.scrim.ScrimView
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index 3fe4214..d7c1359 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -1293,8 +1293,7 @@
<string name="add" msgid="81036585205287996">"Voeg by"</string>
<string name="manage_users" msgid="1823875311934643849">"Bestuur gebruikers"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"Sleep na verdeelde skerm word nie vir hierdie kennisgewing gesteun nie"</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"Ligging is aktief"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑fi onbeskikbaar"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Prioriteitmodus"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Wekker gestel"</string>
@@ -1351,8 +1350,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"Pasmaak sluitskerm"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Ontsluit om sluitskerm te pasmaak"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-fi is nie beskikbaar nie"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Ligging is aktief"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera is geblokkeer"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera en mikrofoon is geblokkeer"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofoon is geblokkeer"</string>
@@ -1400,6 +1398,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1408,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Bekyk onlangse apps"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Klaar"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Gaan terug"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Swiep enige plek op die raakpaneel links of regs met drie vingers om terug te gaan.\n\nJy kan ook die kortpadsleutelhandeling + Esc hiervoor gebruik."</string>
@@ -1419,14 +1418,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Swiep enige tyd van die onderkant van jou skerm af op met drie vingers om na jou tuisskerm toe te gaan."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Mooi so!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Jy het die Gaan na Tuisskerm-gebaar voltooi."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Bekyk onlangse apps"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Swiep op en hou met drie vingers op jou raakpaneel."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Knap gedaan!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Jy het die Bekyk Onlangse Apps-gebaar voltooi."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"Handelingsleutel"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Druk die handelingsleutel op jou sleutelbord om toegang tot jou apps te kry."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"Geluk!"</string>
@@ -1450,14 +1445,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"Swiep op en hou met drie vingers. Tik om meer gebare te leer."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"Gebruik jou sleutelbord om alle apps te bekyk"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Druk enige tyd die handelingsleutel. Tik om meer gebare te leer."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Ekstra donker is nou deel van die helderheidglyer"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Jy kan nou die skerm ekstra donker maak deur die helderheidvlak nog laer te maak.\n\nAangesien hierdie kenmerk nou deel van die helderheidglyer is, word kortpaaie vir ekstra donker verwyder."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Verwyder kortpaaie vir ekstra donker"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Kortpaaie vir ekstra donker is verwyder"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Konnektiwiteit"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Toeganklikheid"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Nutsdienste"</string>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index 77da382..388601b 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -1179,10 +1179,8 @@
<string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
<string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"ድምፅ ማውጫዎች እና ማሳያዎች"</string>
<string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"የተጠቆሙ መሣሪያዎች"</string>
- <!-- no translation found for media_input_group_title (2057057473860783021) -->
- <skip />
- <!-- no translation found for media_output_group_title (6789001895863332576) -->
- <skip />
+ <string name="media_input_group_title" msgid="2057057473860783021">"ግብዓት"</string>
+ <string name="media_output_group_title" msgid="6789001895863332576">"ውጤት"</string>
<string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"ሚዲያን ወደ ሌላ መሣሪያ ለማንቀሳቀስ የተጋራውን ክፍለ ጊዜዎን ያቁሙ"</string>
<string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"አቁም"</string>
<string name="media_output_first_broadcast_title" msgid="6292237789860753022">"ማሰራጨት እንዴት እንደሚሠራ"</string>
@@ -1293,8 +1291,7 @@
<string name="add" msgid="81036585205287996">"አክል"</string>
<string name="manage_users" msgid="1823875311934643849">"ተጠቃሚዎችን ያስተዳድሩ"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"ይህ ማሳወቂያ ወደ የተከፈለ ማያ ገፅ መጎተትን አይደግፍም"</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"አካባቢ ገቢር ነው"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi አይገኝም"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"የቅድሚያ ሁነታ"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"ማንቂያ ተቀናብሯል"</string>
@@ -1351,8 +1348,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"ማያ ገፅ ቁልፍን አብጅ"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"የማያ ገጽ ቁልፍን ለማበጀት ይክፈቱ"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi አይገኝም"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"አካባቢ ገቢር ነው"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"ካሜራ ታግዷል"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"ካሜራ እና ማይክሮፎን ታግደዋል"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"ማይክሮፎን ታግዷል"</string>
@@ -1400,6 +1396,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1406,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"የቅርብ ጊዜ መተግበሪያዎችን አሳይ"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"ተከናውኗል"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"ወደኋላ ተመለስ"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"ወደኋላ ለመመለስ የመዳሰሻ ሰሌዳው ላይ የትኛውም ቦታ በሦስት ጣቶች ወደግራ ወይም ወደቀኝ ያንሸራትቱ።\n\nእንዲሁም የቁልፍ ሰሌዳ አቋራጭ + ESC ለዚህ መጠቀም ይችላሉ።"</string>
@@ -1419,14 +1416,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"በማንኛውም ጊዜ ወደ መነሻ ማያ ገፅዎ ለመሄድ ከማያ ገፅዎ ታች በሦስት ጣቶች ወደላይ ያሸብልሉ።"</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"አሪፍ!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"ወደ መነሻ ሂድ ምልክትን አጠናቅቀዋል።"</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"የቅርብ ጊዜ መተግበሪያዎችን አሳይ"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"የመዳሰሻ ሰሌዳዎ ላይ ሦስት ጣቶችን በመጠቀም ወደ ላይ ያንሸራትቱ እና ይያዙ።"</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"ጥሩ ሠርተዋል!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"የቅርብ ጊዜ መተግበሪያዎች አሳይ ምልክትን አጠናቅቀዋል።"</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"የተግባር ቁልፍ"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"መተግበሪያዎችዎን ለመድረስ በቁልፍ ሰሌዳዎ ላይ የእርምጃ ቁልፉን ይጫኑ።"</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"እንኳን ደስ አለዎት!"</string>
@@ -1450,14 +1443,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"ሦስት ጣቶችን በመጠቀም ወደላይ ያንሸራትቱ እና ይያዙ። ምልክቶችን የበለጠ ለማወቅ መታ ያድርጉ።"</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"ሁሉንም መተግበሪያዎች ለማየት የቁልፍ ሰሌዳዎን ይጠቀሙ"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"በማንኛውም ጊዜ የተግባር ቁልፍን ይጫኑ። ምልክቶችን የበለጠ ለማወቅ መታ ያድርጉ።"</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"ተጨማሪ ደብዛዛ አሁን የብሩህነት ተንሸራታች ክፍል ነው"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"አሁን ከማያ ገፅዎ በላይ የብሩህነት ደረጃውን ይበልጥ በመቀነስ ማያ ገፁን ተጨማሪ ደብዛዛ ማድረግ ይችላሉ።\n\nይህ ባህሪ አሁን የብሩህነት ተንሸራታች አካል ስለሆነ ተጨማሪ ደብዛዛ አቋራጮች እየተወገዱ ነው።"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"ተጨማሪ ደብዛዛ አቋራጮችን ያስወግዱ"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"ተጨማሪ ደብዛዛ አቋራጮች ተወግደዋል"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"ግንኙነት"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"ተደራሽነት"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"መገልገያዎች"</string>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index 64b0f0b..53b1dfb 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -1179,10 +1179,8 @@
<string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"%%<xliff:g id="PERCENTAGE">%1$d</xliff:g>"</string>
<string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"مكبّرات الصوت والشاشات"</string>
<string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"الأجهزة المقترَحة"</string>
- <!-- no translation found for media_input_group_title (2057057473860783021) -->
- <skip />
- <!-- no translation found for media_output_group_title (6789001895863332576) -->
- <skip />
+ <string name="media_input_group_title" msgid="2057057473860783021">"الإدخال"</string>
+ <string name="media_output_group_title" msgid="6789001895863332576">"الإخراج"</string>
<string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"أوقِف الجلسة المشتركة لنقل الوسائط إلى جهاز آخر."</string>
<string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"إيقاف"</string>
<string name="media_output_first_broadcast_title" msgid="6292237789860753022">"كيفية عمل البث"</string>
@@ -1293,8 +1291,7 @@
<string name="add" msgid="81036585205287996">"إضافة"</string>
<string name="manage_users" msgid="1823875311934643849">"إدارة المستخدمين"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"لا يتيح هذا الإشعار إمكانية السحب لتقسيم الشاشة."</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"الموقع الجغرافي نشط"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"شبكة Wi‑Fi غير متاحة"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"وضع الأولوية"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"تم ضبط المنبه."</string>
@@ -1351,8 +1348,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"تخصيص شاشة القفل"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"الفتح لتخصيص شاشة القفل"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"لا يتوفّر اتصال Wi-Fi."</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"الموقع الجغرافي نشط"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"استخدام الكاميرا محظور."</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"استخدام الكاميرا والميكروفون محظور."</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"استخدام الميكروفون محظور."</string>
@@ -1400,6 +1396,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1406,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"عرض التطبيقات المستخدَمة مؤخرًا"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"تم"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"رجوع"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"للرجوع، مرِّر سريعًا لليمين أو لليسار باستخدام ثلاثة أصابع في أي مكان على لوحة اللمس.\n\nيمكنك أيضًا الرجوع باستخدام اختصار لوحة المفاتيح \"مفتاح الإجراء + ESC\"."</string>
@@ -1419,14 +1416,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"للانتقال إلى الشاشة الرئيسية في أي وقت، مرِّر سريعًا من أسفل الشاشة إلى أعلاها بثلاثة أصابع."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"أحسنت"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"لقد أكملت التدريب على إيماءة الانتقال إلى الشاشة الرئيسية."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"عرض التطبيقات المستخدَمة مؤخرًا"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"مرِّر سريعًا للأعلى مع استمرار الضغط باستخدام ثلاثة أصابع على لوحة اللمس."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"أحسنت."</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"لقد أكملْت الدليل التوجيهي على إيماءة \"عرض التطبيقات المستخدَمة مؤخرًا\"."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"مفتاح الإجراء"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"للوصول إلى التطبيقات، اضغط على مفتاح الإجراء في لوحة المفاتيح."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"تهانينا!"</string>
@@ -1450,14 +1443,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"مرِّر سريعًا للأعلى مع استمرار الضغط باستخدام 3 أصابع. انقر للتعرّف على المزيد من الإيماءات."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"استخدِم لوحة المفاتيح لعرض جميع التطبيقات"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"اضغط على مفتاح الإجراء في أي وقت. انقر للتعرّف على المزيد من الإيماءات."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"أصبحت ميزة \"زيادة تعتيم الشاشة\" الآن جزءًا من شريط تمرير مستوى السطوع"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"يمكنك الآن زيادة تعتيم الشاشة عن طريق خفض مستوى السطوع بشكل أكبر.\n\nبما أنّ هذه الميزة أصبحت الآن جزءًا من شريط تمرير مستوى السطوع، يمكنك الآن إزالة اختصارات \"زيادة تعتيم الشاشة\"."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"إزالة اختصارات \"زيادة تعتيم الشاشة\""</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"تمّت إزالة اختصارات \"زيادة تعتيم الشاشة\""</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"إمكانية الاتصال"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"تسهيل الاستخدام"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"خدمات عامة"</string>
diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml
index 6e3ba23..04cb99c 100644
--- a/packages/SystemUI/res/values-as/strings.xml
+++ b/packages/SystemUI/res/values-as/strings.xml
@@ -1179,10 +1179,8 @@
<string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
<string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"স্পীকাৰ আৰু ডিছপ্লে’"</string>
<string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"পৰামৰ্শ হিচাপে পোৱা ডিভাইচ"</string>
- <!-- no translation found for media_input_group_title (2057057473860783021) -->
- <skip />
- <!-- no translation found for media_output_group_title (6789001895863332576) -->
- <skip />
+ <string name="media_input_group_title" msgid="2057057473860783021">"ইনপুট"</string>
+ <string name="media_output_group_title" msgid="6789001895863332576">"আউটপুট"</string>
<string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"মিডিয়া অন্য ডিভাইচলৈ স্থানান্তৰ কৰিবলৈ আপোনাৰ শ্বেয়াৰ কৰা ছেশ্বনটো বন্ধ কৰক"</string>
<string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"বন্ধ কৰক"</string>
<string name="media_output_first_broadcast_title" msgid="6292237789860753022">"সম্প্ৰচাৰ কৰাটোৱে কেনেকৈ কাম কৰে"</string>
@@ -1398,6 +1396,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index 33f1e74..85aa42f 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -1398,6 +1398,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index 4c25b4b..b838f7c 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -1179,10 +1179,8 @@
<string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
<string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Zvučnici i ekrani"</string>
<string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Predloženi uređaji"</string>
- <!-- no translation found for media_input_group_title (2057057473860783021) -->
- <skip />
- <!-- no translation found for media_output_group_title (6789001895863332576) -->
- <skip />
+ <string name="media_input_group_title" msgid="2057057473860783021">"Ulaz"</string>
+ <string name="media_output_group_title" msgid="6789001895863332576">"Izlaz"</string>
<string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Zaustavite deljenu sesiju da biste premestili medijski sadržaj na drugi uređaj"</string>
<string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Zaustavi"</string>
<string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Kako funkcioniše emitovanje"</string>
@@ -1293,8 +1291,7 @@
<string name="add" msgid="81036585205287996">"Dodaj"</string>
<string name="manage_users" msgid="1823875311934643849">"Upravljaj korisnicima"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"Ovo obaveštenje ne podržava prevlačenje na podeljeni ekran"</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"Lokacija je aktivna"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"WiFi nije dostupan"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Prioritetni režim"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarm je podešen"</string>
@@ -1351,8 +1348,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"Prilagodi zaključani ekran"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Otključajte da biste prilagodili zaključani ekran"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"WiFi nije dostupan"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Lokacija je aktivna"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera je blokirana"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera i mikrofon su blokirani"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon je blokiran"</string>
@@ -1400,6 +1396,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1406,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Prikaži nedavno korišćene aplikacije"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Gotovo"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Nazad"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Da biste se vratili, prevucite ulevo sa tri prsta bilo gde na tačpedu.\n\nMožete da koristite i tastersku prečicu Alt + ESC za ovo."</string>
@@ -1419,14 +1416,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Da biste otišli na početni ekran u bilo kom trenutku, prevucite nagore od dna ekrana pomoću tri prsta."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Svaka čast!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Dovršili ste pokret za povratak na početnu stranicu."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Prikaži nedavno korišćene aplikacije"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Prevucite nagore i zadržite pomoću tri prsta na tačpedu."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Odlično!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Dovršili ste pokret za prikazivanje nedavno korišćenih aplikacija."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"Taster radnji"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Da biste pristupili aplikacijama, pritisnite taster radnji na tastaturi."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"Čestitamo!"</string>
@@ -1450,14 +1443,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"Prevucite nagore i zadržite sa tri prsta. Dodirnite da biste videli više pokreta."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"Koristite tastaturu da biste pregledali sve aplikacije"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Pritisnite taster radnji u bilo kom trenutku. Dodirnite da biste videli više pokreta."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Dodatno zatamnjivanje je sada deo klizača za osvetljenost"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Sada možete dodatno da zatamnite ekran smanjivanjem nivoa osvetljenosti. \n\nOva funkcija je sada deo klizača za osvetljenost, pa se prečice za dodatno zatamnjivanje uklanjaju."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Ukloni prečice za dodatno zatamnjivanje"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Uklonjene su prečice za dodatno zatamnjivanje"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Povezivanje"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Pristupačnost"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Uslužne aplikacije"</string>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index 4a79cee..038732c 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -1293,8 +1293,7 @@
<string name="add" msgid="81036585205287996">"Дадаць"</string>
<string name="manage_users" msgid="1823875311934643849">"Кіраванне карыстальнікамі"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"Гэта апавяшчэнне нельга перацягнуць на падзелены экран."</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"Геаданыя ўключаны"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Сетка Wi‑Fi недаступная"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Прыярытэтны рэжым"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Будзільнік зададзены"</string>
@@ -1351,8 +1350,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"Наладзіць экран блакіроўкі"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Разблакіруйце, каб наладзіць экран блакіроўкі"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Сетка Wi-Fi недаступная"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Геаданыя ўключаны"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Камера заблакіравана"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Камера і мікрафон заблакіраваны"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Мікрафон заблакіраваны"</string>
@@ -1400,6 +1398,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1408,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Прагляд нядаўніх праграм"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Гатова"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Назад"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Каб вярнуцца, правядзіце трыма пальцамі ўлева ці ўправа ў любым месцы сэнсарнай панэлі.\n\nТаксама можна выкарыстоўваць спалучэнне \"клавіша дзеяння + ESC\"."</string>
@@ -1419,14 +1418,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Каб у любы момант перайсці на галоўны экран, правядзіце па экране трыма пальцамі знізу ўверх."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Выдатна!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Вы навучыліся рабіць жэст для пераходу на галоўны экран."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Прагляд нядаўніх праграм"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Правядзіце па сэнсарнай панэлі трыма пальцамі ўверх і затрымайце пальцы."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Выдатная праца!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Вы скончылі вывучэнне жэсту для прагляду нядаўніх праграм."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"Клавіша дзеяння"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Каб атрымаць доступ да праграм, націсніце клавішу дзеяння на клавіятуры."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"Віншуем!"</string>
@@ -1450,14 +1445,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"Правядзіце трыма пальцамі ўверх і затрымайце пальцы. Націсніце, каб азнаёміцца з іншымі жэстамі."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"Выкарыстайце клавіятуру для прагляду ўсіх праграм"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Можна націснуць на клавішу дзеяння ў любы момант. Націсніце, каб азнаёміцца з іншымі жэстамі."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Цяпер кіраваць дадатковым памяншэннем яркасці можна з дапамогай паўзунка яркасці"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Цяпер вы можаце дадаткова зацямніць экран, яшчэ больш панізіўшы ўзровень яркасці.\n\nПаколькі гэта функцыя цяпер уваходзіць у склад паўзунка яркасці, хуткія каманды для дадатковага памяншэння яркасці былі выдалены."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Выдаліць хуткія каманды для дадатковага памяншэння яркасці"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Хуткія каманды для дадатковага памяншэння яркасці выдалены"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Магчымасць падключэння"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Спецыяльныя магчымасці"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Утыліты"</string>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index 148bc1dc..17a8ed5 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -1293,8 +1293,7 @@
<string name="add" msgid="81036585205287996">"Добавяне"</string>
<string name="manage_users" msgid="1823875311934643849">"Потребители"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"Това известие не поддържа плъзгане за разделяне на екрана"</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"Местоположението е активно"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi не е налице"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Приоритетен режим"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Будилникът е зададен"</string>
@@ -1351,8 +1350,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"Персонализ. на заключения екран"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Отключете, за да персонализирате заключения екран"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi не е налице"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Местоположението е активно"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Достъпът до камерата е блокиран"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Достъпът до камерата и микрофона е блокиран"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Достъпът до микрофона е блокиран"</string>
@@ -1400,6 +1398,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1408,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Преглед на скорошните приложения"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Готово"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Назад"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"За да се върнете назад, прекарайте три пръста наляво или надясно по сензорния панел.\n\nЗа целта можете също да използвате комбинацията с клавиша за действия + ESC."</string>
@@ -1419,14 +1418,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"За да преминете към началния екран по всяко време, прекарайте три пръста нагоре от долната част на екрана."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Чудесно!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Изпълнихте жеста за преминаване към началния екран."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Преглед на скорошните приложения"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Плъзнете нагоре с три пръста по сензорния панел и задръжте."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Отлично!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Изпълнихте жеста за преглед на скорошните приложения."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"Клавиш за действия"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"За да осъществите достъп до приложенията, натиснете клавиша за действия на клавиатурата си."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"Поздравления!"</string>
@@ -1450,14 +1445,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"Плъзнете нагоре с три пръста и задръжте. Докоснете, за да научите повече жестове."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"Използвайте клавиатурата, за да прегледате всички приложения"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Натиснете клавиша за действия по всяко време. Докоснете, за да научите повече жестове."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Функцията за допълнително затъмняване вече е част от плъзгача за яркостта"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Вече можете да затъмнявате екрана допълнително, като намалите яркостта още повече.\n\nТъй като тази функция вече е част от плъзгача за яркостта, преките пътища за допълнително затъмняване се премахват."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Премахване на преките пътища за допълнително затъмняване"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Преките пътища за допълнително затъмняване са премахнати"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Свързаност"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Достъпност"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Помощни услуги"</string>
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index e7fde16..ebec652 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -1398,6 +1398,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index b687ccd..34e3d80 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -1179,10 +1179,8 @@
<string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
<string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Zvučnici i ekrani"</string>
<string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Predloženi uređaji"</string>
- <!-- no translation found for media_input_group_title (2057057473860783021) -->
- <skip />
- <!-- no translation found for media_output_group_title (6789001895863332576) -->
- <skip />
+ <string name="media_input_group_title" msgid="2057057473860783021">"Ulaz"</string>
+ <string name="media_output_group_title" msgid="6789001895863332576">"Izlaz"</string>
<string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Zaustavite dijeljenu sesiju da premjestite medij na drugi uređaj"</string>
<string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Zaustavi"</string>
<string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Kako funkcionira emitiranje"</string>
@@ -1293,8 +1291,7 @@
<string name="add" msgid="81036585205287996">"Dodaj"</string>
<string name="manage_users" msgid="1823875311934643849">"Upravljajte korisnicima"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"Ovo obavještenje ne podržava prevlačenje na podijeljeni ekran"</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"Lokacija je aktivna"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"WiFi je nedostupan"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Način rada Prioriteti"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarm je postavljen"</string>
@@ -1351,8 +1348,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"Prilagodi zaključani ekran"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Otključajte da prilagodite zaključani ekran"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"WiFi mreža nije dostupna"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Lokacija je aktivna"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera je blokirana"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera i mikrofon su blokirani"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon je blokiran"</string>
@@ -1400,6 +1396,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1406,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Prikaži nedavne aplikacije"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Gotovo"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Nazad"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Da se vratite, prevucite ulijevo ili udesno s tri prsta bilo gdje na dodirnoj podlozi.\n\nZa ovo možete koristiti i radnju za prečicu i Esc na tastaturi."</string>
@@ -1419,14 +1416,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Da odete na početni ekran bilo kada, prevucite s dna ekrana nagore s tri prsta."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Lijepo!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Savladali ste pokret za odlazak na početni ekran."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Prikaz nedavnih aplikacija"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Prevucite nagore i zadržite s tri prsta na dodirnoj podlozi."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Sjajno!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Izvršili ste pokret za prikaz nedavnih aplikacija."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"Tipka radnji"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Da pristupite aplikacijama, pritisnite tipku radnji na tastaturi."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"Čestitamo!"</string>
@@ -1450,14 +1443,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"Prevucite nagore i zadržite s tri prsta. Dodirnite da saznate za više pokreta."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"Koristite tastaturu da pregledate sve aplikacije"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Pritisnite tipku radnji bilo kada. Dodirnite da saznate za više pokreta."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Dodatno zatamnjenje je sada dio klizača za osvijetljenost"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Sada možete dodatno zatamniti ekran daljnjim smanjenjem nivoa osvijetljenosti.\n\nBudući da je ova funkcija sada dio klizača za osvijetljenost, prečice za dodatno zatamnjenje se uklanjaju."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Ukloni prečice za dodatno zatamnjenje"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Prečice za dodatno zatamnjenje su uklonjene"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Povezivost"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Pristupačnost"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Uslužni programi"</string>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 5b764a8..27f704d 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -1179,10 +1179,8 @@
<string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
<string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Altaveus i pantalles"</string>
<string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Dispositius suggerits"</string>
- <!-- no translation found for media_input_group_title (2057057473860783021) -->
- <skip />
- <!-- no translation found for media_output_group_title (6789001895863332576) -->
- <skip />
+ <string name="media_input_group_title" msgid="2057057473860783021">"Entrada"</string>
+ <string name="media_output_group_title" msgid="6789001895863332576">"Sortida"</string>
<string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Atura la sessió compartida per moure contingut multimèdia a un altre dispositiu"</string>
<string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Atura"</string>
<string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Com funciona l\'emissió"</string>
@@ -1293,8 +1291,7 @@
<string name="add" msgid="81036585205287996">"Afegeix"</string>
<string name="manage_users" msgid="1823875311934643849">"Gestiona usuaris"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"Aquesta notificació no es pot arrossegar a la pantalla dividida"</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"Ubicació activa"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi no disponible"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Mode Prioritat"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarma definida"</string>
@@ -1351,8 +1348,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"Personalitza pantalla de bloqueig"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Desbloqueja per personalitzar la pantalla de bloqueig"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"No hi ha cap Wi‑Fi disponible"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Ubicació activa"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"La càmera està bloquejada"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"La càmera i el micròfon estan bloquejats"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"El micròfon està bloquejat"</string>
@@ -1400,6 +1396,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1406,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Mostra les aplicacions recents"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Fet"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Torna"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Per tornar enrere, llisca cap a l\'esquerra o cap a la dreta amb tres dits en qualsevol lloc del ratolí tàctil.\n\nTambé pots utilitzar les tecles d\'accions de drecera+Esc."</string>
@@ -1419,14 +1416,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Per anar a la pantalla d\'inici en qualsevol moment, fes lliscar tres dits cap amunt des de la part inferior de la pantalla."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Molt bé!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Has completat el gest per anar a la pantalla d\'inici."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Mostra les aplicacions recents"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Llisca cap amunt amb tres dits i mantén premut al ratolí tàctil."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Ben fet!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Has completat el gest per veure les aplicacions recents."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"Tecla d\'acció"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Per accedir a les aplicacions, prem la tecla d\'acció al teclat."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"Enhorabona!"</string>
@@ -1450,14 +1443,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"Llisca cap amunt amb tres dits i mantén premut. Toca per aprendre més gestos."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"Utilitza el teclat per veure totes les aplicacions"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Prem la tecla d\'acció en qualsevol moment. Toca per aprendre més gestos."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"L\'atenuació extra ara forma part del control lliscant de brillantor"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Ara pots atenuar encara més la pantalla abaixant-ne el nivell de brillantor.\n\nCom que aquesta funció ara forma part del control lliscant de brillantor, les dreceres d\'atenuació extra se suprimiran."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Suprimeix les dreceres d\'atenuació extra"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"S\'han suprimit les dreceres d\'atenuació extra"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Connectivitat"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Accessibilitat"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Utilitats"</string>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index f609e2a..c824837 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -1293,8 +1293,7 @@
<string name="add" msgid="81036585205287996">"Přidat"</string>
<string name="manage_users" msgid="1823875311934643849">"Spravovat uživatele"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"Toto oznámení nepodporuje přetažení na rozdělenou obrazovku"</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"Určování polohy aktivní"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Síť Wi‑Fi není k dispozici"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Prioritní režim"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Je nastaven budík"</string>
@@ -1351,8 +1350,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"Přizpůsobit obrazovku uzamčení"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Obrazovku uzamčení upravíte, když zařízení odemknete"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Síť Wi-Fi není dostupná"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Určování polohy aktivní"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera je blokována"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera a mikrofon jsou blokovány"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon je blokován"</string>
@@ -1400,6 +1398,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1408,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Zobrazit nedávné aplikace"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Hotovo"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Zpět"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Pokud se chcete vrátit zpět, stačí kdekoli na touchpadu přejet třemi prsty doleva nebo doprava.\n\nMůžete také použít klávesovou zkratku Akce + ESC."</string>
@@ -1419,14 +1418,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Na plochu přejdete kdykoli přejetím třemi prsty ze spodní části obrazovky nahoru."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Skvělé!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Dokončili jste gesto pro přechod na plochu."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Zobrazit nedávné aplikace"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Přejeďte po touchpadu třemi prsty nahoru a podržte je."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Výborně!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Provedli jste gesto pro zobrazení nedávných aplikací."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"Akční klávesa"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Přístup k aplikacím získáte stisknutím akční klávesy na klávesnici."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"Gratulujeme!"</string>
@@ -1450,14 +1445,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"Přejeďte třemi prsty nahoru a podržte je. Další gesta zjistíte klepnutím."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"Zobrazení všech aplikací pomocí klávesnice"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Kdykoli stiskněte akční klávesu. Další gesta zjistíte klepnutím."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Na posuvníku jasu lze nově nastavit velmi tmavou obrazovku"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Obrazovku můžete nastavit jako velmi tmavou tím, že ještě víc snížíte jas.\n\nVzhledem k tomu, že je tato funkce nyní součástí posuvníku jasu, zkratky pro velmi tmavou obrazovku budou odstraněny."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Odstranit zkratky pro velmi tmavou obrazovku"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Zkratky pro velmi tmavou obrazovku byly odstraněny"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Připojení"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Přístupnost"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Nástroje"</string>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index 5d429af..feac02d 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -1293,8 +1293,7 @@
<string name="add" msgid="81036585205287996">"Tilføj"</string>
<string name="manage_users" msgid="1823875311934643849">"Administrer brugere"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"Denne notifikation kan ikke trækkes til en opdelt skærm"</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"Lokation er aktiv"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Ingen tilgængelig Wi-Fi-forbindelse"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Tilstanden Prioritet"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarmen er indstillet"</string>
@@ -1351,8 +1350,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"Tilpas låseskærm"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Lås op for at tilpasse låseskærmen"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi er ikke tilgængeligt"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Lokation er aktiv"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kameraet er blokeret"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Der er blokeret for kameraet og mikrofonen"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofonen er blokeret"</string>
@@ -1400,6 +1398,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1408,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Se seneste apps"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Udfør"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Gå tilbage"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Du kan gå tilbage ved at stryge mod venstre eller højre med tre fingre et vilkårligt sted på touchpladen.\n\nDu kan også bruge tastaturgenvejen Alt + Esc."</string>
@@ -1419,14 +1418,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Du kan til enhver tid stryge opad med tre fingre fra bunden af skærmen, hvis du vil gå til startskærmen."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Sådan!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Du har fuldført bevægelsen for Gå til startskærmen."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Se seneste apps"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Stryg opad, og hold tre fingre på touchpladen."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Godt klaret!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Du har udført bevægelsen for at se de seneste apps."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"Handlingstast"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Du kan tilgå alle dine apps ved at trykke på handlingstasten på dit tastatur."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"Tillykke!"</string>
@@ -1450,14 +1445,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"Stryg opad, og hold tre fingre nede. Tryk for at lære flere bevægelser."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"Brug dit tastatur til at se alle apps"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Tryk på handlingstasten når som helst. Tryk for at lære flere bevægelser."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Ekstra dæmpet belysning er nu en del af skyderen til lysstyrke"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Du kan nu dæmpe skærmens belysning ekstra meget ved at reducere lysstyrken endnu mere.\n\nDa denne funktion nu er en del af skyderen til lysstyrke, fjernes genveje til ekstra dæmpet belysning."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Fjern genveje til ekstra dæmpet belysning"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Genveje til ekstra dæmpet belysning er fjernet"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Forbindelse"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Hjælpefunktioner"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Værktøjer"</string>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index 7d5fed9..3235c3a 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -1400,6 +1400,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index ab65136..2187a17 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -1293,8 +1293,7 @@
<string name="add" msgid="81036585205287996">"Προσθήκη"</string>
<string name="manage_users" msgid="1823875311934643849">"Διαχ. χρηστών"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"Αυτή η ειδοποίηση δεν υποστηρίζει τη μεταφορά με σύρσιμο για τον διαχωρισμό οθόνης"</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"Τοποθεσία ενεργή"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Το Wi‑Fi δεν είναι διαθέσιμο"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Λειτουργία προτεραιότητας"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Το ξυπνητήρι ρυθμίστηκε"</string>
@@ -1351,8 +1350,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"Προσαρμογή οθόνης κλειδώματος"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Ξεκλειδώστε για προσαρμογή της οθόνης κλειδώματος"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Δεν υπάρχει διαθέσιμο δίκτυο Wi-Fi"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Τοποθεσία ενεργή"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Η κάμερα έχει αποκλειστεί"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Η κάμερα και το μικρόφωνο έχουν αποκλειστεί"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Το μικρόφωνο έχει αποκλειστεί"</string>
@@ -1400,6 +1398,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1408,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Προβολή πρόσφατων εφαρμογών"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Τέλος"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Επιστροφή"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Για να επιστρέψετε, σύρετε προς τα αριστερά ή προς τα δεξιά χρησιμοποιώντας τρία δάχτυλα σε οποιοδήποτε σημείο της επιφάνειας αφής.\n\nΜπορείτε επίσης να χρησιμοποιήσετε τη συντόμευση πληκτρολογίου Action + ESC."</string>
@@ -1419,14 +1418,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Για μετάβαση στην αρχική οθόνη ανά πάσα στιγμή, σύρετε προς τα επάνω με τρία δάχτυλα από το κάτω μέρος της οθόνης."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Ωραία!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Ολοκληρώσατε την κίνηση μετάβασης στην αρχική οθόνη."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Προβολή πρόσφατων εφαρμογών"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Σύρετε προς τα πάνω με τρία δάχτυλα στην επιφάνεια αφής και μην τα σηκώσετε."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Μπράβο!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Ολοκληρώσατε την κίνηση για την προβολή πρόσφατων εφαρμογών."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"Πλήκτρο ενέργειας"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Για να αποκτήσετε πρόσβαση στις εφαρμογές σας, πατήστε το πλήκτρο ενέργειας στο πληκτρολόγιό σας."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"Συγχαρητήρια!"</string>
@@ -1450,14 +1445,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"Σύρετε προς τα πάνω με τρία δάχτυλα και μην τα σηκώσετε. Πατήστε για να δείτε περισσότερες κινήσεις."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"Χρήση του πληκτρολογίου για προβολή όλων των εφαρμογών"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Πιέστε το πλήκτρο ενέργειας ανά πάσα στιγμή. Πατήστε για να μάθετε περισσότερες κινήσεις."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Η λειτουργία επιπλέον μείωσης φωτεινότητας είναι πλέον μέρος του ρυθμιστικού φωτεινότητας"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Τώρα μπορείτε να μειώσετε επιπλέον τη φωτεινότητα της οθόνης, χαμηλώνοντας το επίπεδο φωτεινότητας ακόμα περισσότερο.\n\nΕπειδή αυτή η λειτουργία είναι πλέον μέρος του ρυθμιστικού φωτεινότητας, οι συντομεύσεις για επιπλέον μείωση φωτεινότητας καταργήθηκαν."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Κατάργηση συντομεύσεων για επιπλέον μείωση φωτεινότητας"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Οι συντομεύσεις για επιπλέον μείωση φωτεινότητας καταργήθηκαν"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Συνδεσιμότητα"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Προσβασιμότητα"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Βοηθητικά προγράμματα"</string>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index 3f1a40c..3a961e2 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -1179,10 +1179,8 @@
<string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
<string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Speakers and displays"</string>
<string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Suggested devices"</string>
- <!-- no translation found for media_input_group_title (2057057473860783021) -->
- <skip />
- <!-- no translation found for media_output_group_title (6789001895863332576) -->
- <skip />
+ <string name="media_input_group_title" msgid="2057057473860783021">"Input"</string>
+ <string name="media_output_group_title" msgid="6789001895863332576">"Output"</string>
<string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Stop your shared session to move media to another device"</string>
<string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Stop"</string>
<string name="media_output_first_broadcast_title" msgid="6292237789860753022">"How broadcasting works"</string>
@@ -1293,8 +1291,7 @@
<string name="add" msgid="81036585205287996">"Add"</string>
<string name="manage_users" msgid="1823875311934643849">"Manage users"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"This notification does not support dragging to split screen"</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"Location active"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi unavailable"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Priority mode"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarm set"</string>
@@ -1351,8 +1348,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"Customise lock screen"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Unlock to customise lock screen"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi not available"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Location active"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Camera is blocked"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Camera and microphone blocked"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microphone is blocked"</string>
@@ -1400,6 +1396,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1406,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"View recent apps"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Done"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Go back"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"To go back, swipe left or right using three fingers anywhere on the touchpad.\n\nYou can also use the keyboard shortcut Action + Esc for this."</string>
@@ -1419,14 +1416,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"To go to your home screen at any time, swipe up with three fingers from the bottom of your screen."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Nice!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"You completed the go home gesture."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"View recent apps"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Swipe up and hold using three fingers on your touchpad."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Well done!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"You completed the view recent apps gesture."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"Action key"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"To access your apps, press the action key on your keyboard."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"Congratulations!"</string>
@@ -1450,14 +1443,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"Swipe up and hold using three fingers. Tap to learn more gestures."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"Use your keyboard to view all apps"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Press the action key at any time. Tap to learn more gestures."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Extra dim is now part of the brightness slider"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"You can now make the screen extra dim by lowering the brightness level even further.\n\nSince this feature is now part of the brightness slider, extra dim shortcuts are being removed."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Remove extra dim shortcuts"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Extra dim shortcuts removed"</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>
diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml
index 4ed330e..ba71ccf 100644
--- a/packages/SystemUI/res/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/strings.xml
@@ -1179,10 +1179,8 @@
<string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
<string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Speakers & Displays"</string>
<string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Suggested Devices"</string>
- <!-- no translation found for media_input_group_title (2057057473860783021) -->
- <skip />
- <!-- no translation found for media_output_group_title (6789001895863332576) -->
- <skip />
+ <string name="media_input_group_title" msgid="2057057473860783021">"Input"</string>
+ <string name="media_output_group_title" msgid="6789001895863332576">"Output"</string>
<string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Stop your shared session to move media to another device"</string>
<string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Stop"</string>
<string name="media_output_first_broadcast_title" msgid="6292237789860753022">"How broadcasting works"</string>
@@ -1398,6 +1396,7 @@
<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>
+ <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Drag handle"</string>
<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>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index 3f1a40c..3a961e2 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -1179,10 +1179,8 @@
<string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
<string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Speakers and displays"</string>
<string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Suggested devices"</string>
- <!-- no translation found for media_input_group_title (2057057473860783021) -->
- <skip />
- <!-- no translation found for media_output_group_title (6789001895863332576) -->
- <skip />
+ <string name="media_input_group_title" msgid="2057057473860783021">"Input"</string>
+ <string name="media_output_group_title" msgid="6789001895863332576">"Output"</string>
<string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Stop your shared session to move media to another device"</string>
<string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Stop"</string>
<string name="media_output_first_broadcast_title" msgid="6292237789860753022">"How broadcasting works"</string>
@@ -1293,8 +1291,7 @@
<string name="add" msgid="81036585205287996">"Add"</string>
<string name="manage_users" msgid="1823875311934643849">"Manage users"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"This notification does not support dragging to split screen"</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"Location active"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi unavailable"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Priority mode"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarm set"</string>
@@ -1351,8 +1348,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"Customise lock screen"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Unlock to customise lock screen"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi not available"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Location active"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Camera is blocked"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Camera and microphone blocked"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microphone is blocked"</string>
@@ -1400,6 +1396,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1406,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"View recent apps"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Done"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Go back"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"To go back, swipe left or right using three fingers anywhere on the touchpad.\n\nYou can also use the keyboard shortcut Action + Esc for this."</string>
@@ -1419,14 +1416,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"To go to your home screen at any time, swipe up with three fingers from the bottom of your screen."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Nice!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"You completed the go home gesture."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"View recent apps"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Swipe up and hold using three fingers on your touchpad."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Well done!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"You completed the view recent apps gesture."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"Action key"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"To access your apps, press the action key on your keyboard."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"Congratulations!"</string>
@@ -1450,14 +1443,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"Swipe up and hold using three fingers. Tap to learn more gestures."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"Use your keyboard to view all apps"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Press the action key at any time. Tap to learn more gestures."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Extra dim is now part of the brightness slider"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"You can now make the screen extra dim by lowering the brightness level even further.\n\nSince this feature is now part of the brightness slider, extra dim shortcuts are being removed."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Remove extra dim shortcuts"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Extra dim shortcuts removed"</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>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index 3f1a40c..3a961e2 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -1179,10 +1179,8 @@
<string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
<string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Speakers and displays"</string>
<string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Suggested devices"</string>
- <!-- no translation found for media_input_group_title (2057057473860783021) -->
- <skip />
- <!-- no translation found for media_output_group_title (6789001895863332576) -->
- <skip />
+ <string name="media_input_group_title" msgid="2057057473860783021">"Input"</string>
+ <string name="media_output_group_title" msgid="6789001895863332576">"Output"</string>
<string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Stop your shared session to move media to another device"</string>
<string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Stop"</string>
<string name="media_output_first_broadcast_title" msgid="6292237789860753022">"How broadcasting works"</string>
@@ -1293,8 +1291,7 @@
<string name="add" msgid="81036585205287996">"Add"</string>
<string name="manage_users" msgid="1823875311934643849">"Manage users"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"This notification does not support dragging to split screen"</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"Location active"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi unavailable"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Priority mode"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarm set"</string>
@@ -1351,8 +1348,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"Customise lock screen"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Unlock to customise lock screen"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi not available"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Location active"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Camera is blocked"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Camera and microphone blocked"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microphone is blocked"</string>
@@ -1400,6 +1396,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1406,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"View recent apps"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Done"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Go back"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"To go back, swipe left or right using three fingers anywhere on the touchpad.\n\nYou can also use the keyboard shortcut Action + Esc for this."</string>
@@ -1419,14 +1416,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"To go to your home screen at any time, swipe up with three fingers from the bottom of your screen."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Nice!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"You completed the go home gesture."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"View recent apps"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Swipe up and hold using three fingers on your touchpad."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Well done!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"You completed the view recent apps gesture."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"Action key"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"To access your apps, press the action key on your keyboard."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"Congratulations!"</string>
@@ -1450,14 +1443,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"Swipe up and hold using three fingers. Tap to learn more gestures."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"Use your keyboard to view all apps"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Press the action key at any time. Tap to learn more gestures."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Extra dim is now part of the brightness slider"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"You can now make the screen extra dim by lowering the brightness level even further.\n\nSince this feature is now part of the brightness slider, extra dim shortcuts are being removed."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Remove extra dim shortcuts"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Extra dim shortcuts removed"</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>
diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml
index fea4ebf..eb76a7e 100644
--- a/packages/SystemUI/res/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res/values-en-rXC/strings.xml
@@ -1179,10 +1179,8 @@
<string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
<string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Speakers & Displays"</string>
<string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Suggested Devices"</string>
- <!-- no translation found for media_input_group_title (2057057473860783021) -->
- <skip />
- <!-- no translation found for media_output_group_title (6789001895863332576) -->
- <skip />
+ <string name="media_input_group_title" msgid="2057057473860783021">"Input"</string>
+ <string name="media_output_group_title" msgid="6789001895863332576">"Output"</string>
<string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Stop your shared session to move media to another device"</string>
<string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Stop"</string>
<string name="media_output_first_broadcast_title" msgid="6292237789860753022">"How broadcasting works"</string>
@@ -1398,6 +1396,7 @@
<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>
+ <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Drag handle"</string>
<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>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index faf6ff8..b1d0c23 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -1400,6 +1400,8 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ícono de contraer"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ícono de expandir"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"o"</string>
+ <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <skip />
<string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navega con el teclado"</string>
<string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Aprende combinaciones de teclas"</string>
<string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navega con el panel táctil"</string>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index df9af2a..21b42ad 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -1293,8 +1293,7 @@
<string name="add" msgid="81036585205287996">"Añadir"</string>
<string name="manage_users" msgid="1823875311934643849">"Gestionar usuarios"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"Esta notificación no se puede arrastrar a la pantalla dividida"</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"Ubicación activa"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi no disponible"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Modo prioritario"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarma añadida"</string>
@@ -1351,8 +1350,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"Personalizar pantalla de bloqueo"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Desbloquea para personalizar la pantalla de bloqueo"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Red Wi-Fi no disponible"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Ubicación activa"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Cámara bloqueada"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Cámara y micrófono bloqueados"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Micrófono bloqueado"</string>
@@ -1400,6 +1398,8 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Icono de contraer"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Icono de desplegar"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"o"</string>
+ <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <skip />
<string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Desplázate con el teclado"</string>
<string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Aprende combinaciones de teclas"</string>
<string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Desplázate con el panel táctil"</string>
@@ -1408,8 +1408,7 @@
<string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Aprende gestos del panel táctil, combinaciones de teclas y más"</string>
<string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Gesto para volver"</string>
<string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Gesto para ir al inicio"</string>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Ver aplicaciones recientes"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Hecho"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Atrás"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Para volver, desliza con tres dedos hacia la izquierda o la derecha en cualquier parte del panel táctil.\n\nTambién puedes hacerlo con la combinación de teclas asignada + Esc."</string>
@@ -1419,14 +1418,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Para ir a la pantalla de inicio en cualquier momento, desliza hacia arriba con tres dedos desde la parte inferior de la pantalla."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"¡Muy bien!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Has completado el gesto para ir a la pantalla de inicio."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Ver aplicaciones recientes"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Desliza tres dedos hacia arriba y mantén pulsado en el panel táctil."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"¡Bien hecho!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Has completado el gesto para ver las aplicaciones recientes."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"Tecla de acción"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Para acceder a tus aplicaciones, pulsa la tecla de acción de tu teclado."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"¡Enhorabuena!"</string>
@@ -1450,14 +1445,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"Desliza hacia arriba y mantén pulsado con tres dedos. Toca para aprender a usar más gestos."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"Usa el teclado para ver todas las aplicaciones"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Pulsa la tecla de acción en cualquier momento. Toca para aprender a usar más gestos."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"La atenuación extra ahora forma parte del control deslizante de brillo"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Ahora puedes atenuar aún más tu pantalla reduciendo el nivel de brillo incluso más todavía.\n\nComo esta función ahora forma parte del control deslizante de brillo, se van a quitar los accesos directos de atenuación extra."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Eliminar accesos directos de atenuación extra"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Accesos directos de atenuación extra eliminados"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Conectividad"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Accesibilidad"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Utilidades"</string>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index 5c2e4db..c1807ad 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -1398,6 +1398,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index 5221ceb..50a55f9 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -1398,6 +1398,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index 0696752..8f413c8 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -1179,10 +1179,8 @@
<string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
<string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"بلندگوها و نمایشگرها"</string>
<string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"دستگاههای پیشنهادی"</string>
- <!-- no translation found for media_input_group_title (2057057473860783021) -->
- <skip />
- <!-- no translation found for media_output_group_title (6789001895863332576) -->
- <skip />
+ <string name="media_input_group_title" msgid="2057057473860783021">"ورودی"</string>
+ <string name="media_output_group_title" msgid="6789001895863332576">"برونداد"</string>
<string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"جلسه مشترک برای انتقال رسانه به دستگاهی دیگر متوقف میشود"</string>
<string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"توقف"</string>
<string name="media_output_first_broadcast_title" msgid="6292237789860753022">"همهفرتستی چطور کار میکند"</string>
@@ -1293,8 +1291,7 @@
<string name="add" msgid="81036585205287996">"افزودن"</string>
<string name="manage_users" msgid="1823875311934643849">"مدیریت کاربران"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"این اعلان از عملکرد کشیدن به صفحهٔ دونیمه پشتیبانی نمیکند"</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"مکان فعال است"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi دردسترس نیست"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"حالت اولویت"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"زنگ ساعت تنظیم شد"</string>
@@ -1351,8 +1348,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"سفارشیسازی صفحه قفل"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"برای سفارشیسازی صفحه قفل، قفل را باز کنید"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi دردسترس نیست"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"مکان فعال است"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"دوربین مسدود شده است"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"دوربین و میکروفون مسدود شدهاند"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"میکروفون مسدود شده است"</string>
@@ -1400,6 +1396,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1406,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"مشاهده کردن برنامههای اخیر"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"تمام"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"برگشتن"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"برای برگشتن، در هر جایی از صفحه لمسی، با سه انگشت تند بهچپ یا راست بکشید.\n\nبرای این کار میتوانید از میانبر صفحهکلید «کنش + گریز» هم استفاده کنید."</string>
@@ -1419,14 +1416,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"برای رفتن به صفحه اصلی در هرزمانی، با سه انگشت از پایین صفحهنمایش تند بهبالا بکشید."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"آفرین!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"اشاره رفتن به صفحه اصلی را تکمیل کردید."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"مشاهده کردن برنامههای اخیر"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"با سه انگشت روی صفحه لمسی تند بهبالا بکشید و نگه دارید."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"عالی است!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"اشاره مشاهده برنامههای اخیر را انجام دادید"</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"دکمه کنش"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"برای دسترسی به برنامههایتان، دکمه کنش در صفحهکلید را فشار دهید."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"تبریک!"</string>
@@ -1450,14 +1443,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"با سه انگشت تند بهبالا بکشید و نگه دارید. برای آشنایی با اشارههای بیشتر، تکضرب بزنید."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"برای مشاهده همه برنامهها، از صفحهکلید استفاده کنید"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"در هرزمانی دکمه کنش را فشار دهید. برای آشنایی با اشارههای بیشتر، تکضرب بزنید."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"«بسیار کمنور» اکنون بخشی از لغزنده روشنایی است"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"اکنون میتوانید با پایینتر آوردن سطح روشنایی، صفحهنمایش را بسیار کمنور کنید.\n\nاز آنجاییکه این ویژگی اکنون بخشی از لغزنده روشنایی است، میانبرهای بسیار کمنور برداشته میشوند."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"برداشتن میانبرهای بسیار کمنور"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"میانبرهای بسیار کمنور برداشته شدند"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"اتصالپذیری"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"دسترسپذیری"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"برنامههای کمکی"</string>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index 527d3c9..f8fa57d 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -1293,8 +1293,7 @@
<string name="add" msgid="81036585205287996">"Lisää"</string>
<string name="manage_users" msgid="1823875311934643849">"Ylläpidä käyttäjiä"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"Ilmoitus ei tue jaetulle näytölle vetämistä"</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"Aktiivinen sijainti"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi ei ole saatavilla"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Tärkeät-tila"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Hälytys asetettu"</string>
@@ -1351,8 +1350,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"Muokkaa lukitusnäyttöä"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Voit muokata lukitusnäyttöä, kun avaat lukituksen"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi-yhteys ei ole käytettävissä"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Aktiivinen sijainti"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera estetty"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera ja mikrofoni estetty"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofoni estetty"</string>
@@ -1400,6 +1398,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1408,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Katso viimeisimmät sovellukset"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Valmis"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Takaisin"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Jos haluat siirtyä takaisin, pyyhkäise kosketuslevyllä vasemmalle tai oikealle kolmella sormella.\n\nVoit myös käyttää pikanäppäinyhdistelmää toimintonäppäin + ESC."</string>
@@ -1419,14 +1418,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Voit siirtyä aloitusnäytölle milloin tahansa pyyhkäisemällä ylös näytön alareunasta kolmella sormella."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Hienoa!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Olet oppinut aloitusnäytölle palaamiseleen."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Katso viimeisimmät sovellukset"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Pyyhkäise ylös ja pidä kosketuslevyä painettuna kolmella sormella."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Hienoa!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Olet oppinut Katso viimeisimmät sovellukset ‑eleen."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"Toimintonäppäin"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Voit käyttää sovelluksia painamalla näppäimistön toimintonäppäintä."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"Onnittelut!"</string>
@@ -1450,14 +1445,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"Pyyhkäise ylös ja pidä kosketuslevyä painettuna kolmella sormella. Lue lisää eleistä napauttamalla."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"Kaikkien sovellusten näkeminen näppäimistön avulla"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Voit painaa toimintonäppäintä milloin tahansa. Lue lisää eleistä napauttamalla."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Erittäin himmeä on nyt osa kirkkauden liukusäädintä"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Voit nyt tehdä näytöstä erittäin himmeän vähentämällä kirkkautta entistäkin enemmän.\n\nKoska tämä ominaisuus on nyt osa kirkkauden liukusäädintä, erittäin himmeä ‑pikanäppäimet poistetaan."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Poista erittäin himmeä ‑pikanäppäimet"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Erittäin himmeä ‑pikanäppäimet poistettu"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Yhteydet"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Saavutettavuus"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Apusovellukset"</string>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index f7753ec..106af39f 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -1293,8 +1293,7 @@
<string name="add" msgid="81036585205287996">"Ajouter"</string>
<string name="manage_users" msgid="1823875311934643849">"Gérer utilisateurs"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"Cette notification ne prend pas en charge l\'écran partagé par glissement"</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"Position active"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi-Fi non disponible"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Mode priorité"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"L\'alarme a été réglée"</string>
@@ -1351,8 +1350,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"Personn. l\'écran de verrouillage"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Déverrouiller pour personnaliser l\'écran de verrouillage"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi non accessible"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Position active"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Appareil photo bloqué"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Appareil photo et microphone bloqués"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microphone bloqué"</string>
@@ -1400,6 +1398,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1408,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Afficher les applis récentes"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"OK"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Retour"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Pour revenir en arrière, balayez vers la gauche ou la droite en utilisant trois doigts n\'importe où sur le pavé tactile.\n\nVous pouvez également utiliser le raccourci clavier Action+Échap."</string>
@@ -1419,14 +1418,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Pour accéder à votre écran d\'accueil à tout moment, balayez l\'écran du bas vers le haut avec trois doigts."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Bien!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Vous avez appris le geste de retour à l\'écran d\'accueil."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Afficher les applis récentes"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Balayez l\'écran vers le haut avec trois doigts et maintenez-les en place sur votre pavé tactile."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Bon travail!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Vous avez effectué le geste pour afficher les applis récentes."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"Touche d\'action"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Pour accéder à vos applis, appuyez sur la touche d\'action de votre clavier."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"Félicitations!"</string>
@@ -1450,14 +1445,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"Balayez l\'écran vers le haut avec trois doigts et maintenez-les en place. Touchez pour apprendre d\'autres gestes."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"Utiliser votre clavier pour afficher toutes les applis"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Appuyez sur la touche d\'action à tout moment. Touchez pour apprendre d\'autres gestes."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"La réduction supplémentaire de la luminosité fait désormais partie du curseur de luminosité"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Vous pouvez désormais réduire la luminosité de l\'écran encore plus.\n\nÉtant donné que cette fonctionnalité fait désormais partie du curseur de luminosité, les raccourcis de la réduction supplémentaire de la luminosité sont retirés."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Retirer les raccourcis de la réduction supplémentaire de la luminosité"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Les raccourcis de la réduction supplémentaire de la luminosité ont été retirés"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Connectivité"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Accessibilité"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Utilitaires"</string>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index 8b5214e..ad7a875 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -1293,8 +1293,7 @@
<string name="add" msgid="81036585205287996">"Ajouter"</string>
<string name="manage_users" msgid="1823875311934643849">"Gérer utilisateurs"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"Impossible de faire glisser cette notification vers l\'écran partagé"</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"Position active"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi non disponible"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Mode Prioritaire"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarme réglée"</string>
@@ -1351,8 +1350,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"Personnaliser écran verrouillage"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Déverrouillez pour personnaliser l\'écran de verrouillage"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi non disponible"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Position active"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Caméra bloquée"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Caméra et micro bloqués"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Micro bloqué"</string>
@@ -1400,6 +1398,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <skip />
<string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Naviguer à l\'aide du clavier"</string>
<string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Découvrir les raccourcis clavier"</string>
<string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Naviguer à l\'aide de votre pavé tactile"</string>
@@ -1408,8 +1408,7 @@
<string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Découvrir les gestes au pavé tactile, les raccourcis clavier et plus encore"</string>
<string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Geste Retour"</string>
<string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Geste Accueil"</string>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Afficher les applis récentes"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"OK"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Retour"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Pour revenir en arrière, balayez vers la gauche ou vers la droite avec trois doigts n\'importe où sur le pavé tactile.\n\nVous pouvez aussi utiliser le raccourci clavier Action+Échap pour cela."</string>
@@ -1419,14 +1418,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Pour accéder à l\'écran d\'accueil à tout moment, balayez l\'écran du bas vers le haut avec trois doigts."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Bravo !"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Vous avez appris le geste pour revenir à l\'écran d\'accueil."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Afficher les applis récentes"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Avec trois doigts, balayez le pavé tactile vers le haut et maintenez la position."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Bravo !"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Vous avez appris le geste pour afficher les applis récentes"</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"Touche d\'action"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Pour accéder à vos applis, appuyez sur la touche d\'action de votre clavier."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"Félicitations !"</string>
@@ -1450,14 +1445,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"Balayez vers le haut en utilisant trois doigts et maintenez. Appuyez pour apprendre d\'autres gestes."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"Utilisez votre clavier pour afficher toutes les applis"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Appuyez sur la touche d\'action à tout moment. Appuyez pour apprendre d\'autres gestes."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Luminosité ultra-réduite fait désormais partie du curseur de luminosité"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Vous pouvez désormais rendre l\'écran encore plus sombre en abaissant davantage le niveau de luminosité.\n\nComme cette fonctionnalité fait désormais partie du curseur de luminosité, les raccourcis de luminosité ultra-réduite sont supprimés."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Supprimer les raccourcis de luminosité ultra-réduite"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Raccourcis de luminosité ultra-réduite supprimés"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Connectivité"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Accessibilité"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Utilitaires"</string>
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index 799e577..bfe5b58 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -1398,6 +1398,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index a0732d7..5d952ac 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -1179,10 +1179,8 @@
<string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
<string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"સ્પીકર અને ડિસ્પ્લે"</string>
<string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"સૂચવેલા ડિવાઇસ"</string>
- <!-- no translation found for media_input_group_title (2057057473860783021) -->
- <skip />
- <!-- no translation found for media_output_group_title (6789001895863332576) -->
- <skip />
+ <string name="media_input_group_title" msgid="2057057473860783021">"ઇનપુટ"</string>
+ <string name="media_output_group_title" msgid="6789001895863332576">"આઉટપુટ"</string>
<string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"મીડિયાને બીજા ડિવાઇસ પર ખસેડવા માટે તમારું શેર કરેલું સત્ર રોકો"</string>
<string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"રોકો"</string>
<string name="media_output_first_broadcast_title" msgid="6292237789860753022">"બ્રોડકાસ્ટ પ્રક્રિયાની કામ કરવાની રીત"</string>
@@ -1398,6 +1396,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 3984f71..03028b1 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -1179,10 +1179,8 @@
<string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
<string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"स्पीकर और डिसप्ले"</string>
<string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"सुझाए गए डिवाइस"</string>
- <!-- no translation found for media_input_group_title (2057057473860783021) -->
- <skip />
- <!-- no translation found for media_output_group_title (6789001895863332576) -->
- <skip />
+ <string name="media_input_group_title" msgid="2057057473860783021">"इनपुट"</string>
+ <string name="media_output_group_title" msgid="6789001895863332576">"आउटपुट"</string>
<string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"मीडिया को किसी दूसरे डिवाइस में ट्रांसफ़र करने के लिए, अपने शेयर किए गए सेशन को बंद करें"</string>
<string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"बंद करें"</string>
<string name="media_output_first_broadcast_title" msgid="6292237789860753022">"ब्रॉडकास्ट करने की सुविधा कैसे काम करती है"</string>
@@ -1398,6 +1396,7 @@
<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>
+ <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"खींचकर छोड़ने वाला हैंडल"</string>
<string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"कीबोर्ड का इस्तेमाल करके नेविगेट करें"</string>
<string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"कीबोर्ड शॉर्टकट के बारे में जानें"</string>
<string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"टचपैड का इस्तेमाल करके नेविगेट करें"</string>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index 545d1d1..4055e74 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -1179,10 +1179,8 @@
<string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
<string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Zvučnici i zasloni"</string>
<string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Predloženi uređaji"</string>
- <!-- no translation found for media_input_group_title (2057057473860783021) -->
- <skip />
- <!-- no translation found for media_output_group_title (6789001895863332576) -->
- <skip />
+ <string name="media_input_group_title" msgid="2057057473860783021">"Ulaz"</string>
+ <string name="media_output_group_title" msgid="6789001895863332576">"Izlaz"</string>
<string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Zaustavite dijeljenu sesiju da biste premjestili medij na drugi uređaj"</string>
<string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Zaustavi"</string>
<string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Kako emitiranje funkcionira"</string>
@@ -1293,8 +1291,7 @@
<string name="add" msgid="81036585205287996">"Dodaj"</string>
<string name="manage_users" msgid="1823875311934643849">"Upravljanje korisnicima"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"Ova obavijest ne podržava povlačenje na podijeljeni zaslon."</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"Lokacija je aktivna"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi nije dostupan"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Prioritetni način rada"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarm je postavljen"</string>
@@ -1351,8 +1348,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"Prilagodite zaključavanje zaslona"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Otključajte da biste prilagodili zaključani zaslon"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi nije dostupan"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Lokacija je aktivna"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera je blokirana"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Blokirani su kamera i mikrofon"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon je blokiran"</string>
@@ -1400,6 +1396,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1406,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Pregled nedavnih aplikacija"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Gotovo"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Natrag"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Da biste se vratili natrag, s tri prsta prijeđite ulijevo ili udesno bilo gdje na dodirnoj podlozi.\n\nZa to možete upotrijebiti i tipku za radnju tipkovnog prečaca + ESC."</string>
@@ -1419,14 +1416,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Da biste u bilo kojem trenutku otvorili početni zaslon, trima prstima prijeđite prema gore od dna zaslona."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Odlično!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Izvršili ste pokret za otvaranje početnog zaslona."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Pregled nedavnih aplikacija"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Prijeđite prema gore trima prstima na dodirnoj podlozi i zadržite pritisak."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Sjajno!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Izvršili ste pokret za prikaz nedavno korištenih aplikacija."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"Tipka za radnju"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Da biste pristupili svojim aplikacijama, pritisnite tipku za radnje na tipkovnici."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"Čestitamo!"</string>
@@ -1450,14 +1443,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"Prijeđite prema gore trima prstima i zadržite pritisak. Dodirnite da biste naučili više pokreta."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"Upotrijebite tipkovnicu za prikaz svih aplikacija"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Pritisnite tipku za radnju u bilo kojem trenutku. Dodirnite da biste naučili više pokreta."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Dodatno zatamnjenje sada je dio klizača za svjetlinu"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Zaslon možete dodatno zatamniti daljnjim smanjivanjem razine svjetline.\n\nBudući da je ta značajka sada dio klizača za svjetlinu, prečaci za dodatno zatamnjenje uklanjaju se."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Ukloni prečace za dodatno zatamnjenje"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Uklonjeni su prečaci za dodatno zatamnjenje"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Povezivost"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Pristupačnost"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Uslužni programi"</string>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index e0df7c4..685e219 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -1293,8 +1293,7 @@
<string name="add" msgid="81036585205287996">"Hozzáadás"</string>
<string name="manage_users" msgid="1823875311934643849">"Kezelés"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"Az értesítés nem támogatja az osztott képernyőre való áthúzást."</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"A helyinformáció aktív"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"A Wi‑Fi nem áll rendelkezésre"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Prioritás mód"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Ébresztő beállítva"</string>
@@ -1351,8 +1350,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"Lezárási képernyő testreszabása"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Oldja fel a zárolást a lezárási képernyő testreszabásához"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Nem áll rendelkezésre Wi-Fi"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"A helyinformáció aktív"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera letiltva"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera és mikrofon letiltva"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon letiltva"</string>
@@ -1400,6 +1398,7 @@
<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>
+ <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Fogópont"</string>
<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>
@@ -1408,8 +1407,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Legutóbbi alkalmazások megtekintése"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Kész"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Vissza"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"A visszalépéshez csúsztasson három ujjal balra vagy a jobbra az érintőpadon.\n\nEnnek végrehajtásához használhatja az Action + Esc billentyűparancsot is."</string>
@@ -1419,14 +1417,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Ha bármikor vissza szeretne térni a kezdőképernyőre, csúsztassa gyorsan felfelé három ujját a képernyő aljáról."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Remek!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Teljesítette a kezdőképernyőre lépés kézmozdulatát."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Legutóbbi alkalmazások megtekintése"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Csúsztasson felfelé három ujjal az érintőpadon, és tartsa lenyomva az ujjait."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Kiváló!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Teljesítette a legutóbbi alkalmazások megtekintésének kézmozdulatát."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"Műveletbillentyű"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Az alkalmazásokhoz való hozzáféréshez nyomja meg a billentyűzet műveletbillentyűjét."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"Gratulálunk!"</string>
@@ -1450,14 +1444,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"Gyúsztason felfelé három ujjal, és tartsa lenyomva az ujjait. Koppintson a további kézmozdulatokért."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"A billentyűzet használatával valamennyi alkalmazás megtekinthető"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"A műveletbillentyű bármikor használható. Koppintson a további kézmozdulatokért."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Az extrasötét funkció mostantól része a fényerő-beállítási csúszkának"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"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\nMivel az extrasötét funkció mostantól a fényerő-szabályozó csúszka része, eltávolítjuk a parancsikonjait."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Az extrasötét funkció parancsikonjainak eltávolítása"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Az extrasötét funkció parancsikonjai eltávolítva"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Kapcsolódás"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Kisegítő lehetőségek"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Segédprogramok"</string>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index db3553a..36d3e42 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -1293,8 +1293,7 @@
<string name="add" msgid="81036585205287996">"Ավելացնել"</string>
<string name="manage_users" msgid="1823875311934643849">"Կառավարել"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"Այս ծանուցումը հնարավոր չէ քաշել տրոհված էկրանի մեկ հատվածից մյուսը"</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"«Տեղադրություն» թույլտվությունն ակտիվ է"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi-ը հասանելի չէ"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Առաջնահերթության ռեժիմ"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Զարթուցիչը դրված է"</string>
@@ -1351,8 +1350,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"Անհատականացնել կողպէկրանը"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Ապակողպեք սարքը՝ կողպէկրանը կարգավորելու համար"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi ցանց հասանելի չէ"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"«Տեղադրություն» թույլտվությունն ակտիվ է"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Տեսախցիկն արգելափակված է"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Տեսախցիկն ու խոսափողը արգելափակված են"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Խոսափողն արգելափակված է"</string>
@@ -1400,6 +1398,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1408,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Դիտել վերջին հավելվածները"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Պատրաստ է"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Հետ գնալ"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Հետ գնալու համար հպահարթակի վրա երեք մատով սահեցրեք ձախ կամ աջ։\n\nԻնչպես նաև կարող եք օգտագործել ստեղնային դյուրանցման գործողությունը + Esc։"</string>
@@ -1419,14 +1418,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Հիմնական էկրան վերադառնալու համար երեք մատը էկրանի ներքևից սահեցրեք վերև։"</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Գերազանց է"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Դուք սովորեցիք հիմնական էկրան անցնելու ժեստը։"</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Դիտել վերջին հավելվածները"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Երեք մատը սահեցրեք վերև և սեղմած պահեք հպահարթակին։"</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Կեցցե՛ք։"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Դուք կատարեցիք վերջին օգտագործված հավելվածների դիտման ժեստը։"</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"Գործողության ստեղն"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Բոլոր հավելվածներն օգտագործելու համար սեղմեք գործողության ստեղնը ստեղնաշարի վրա"</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"Շնորհավո՛ր"</string>
@@ -1450,14 +1445,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"Երեք մատը սահեցրեք վերև և սեղմած պահեք։ Հպեք՝ ավելի շատ ժեստերի ծանոթանալու համար։"</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"Օգտագործեք ձեր ստեղնաշարը՝ բոլոր հավելվածները դիտելու համար"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Ցանկացած ժամանակ սեղմեք գործողության ստեղնը։ Հպեք՝ ավելի շատ ժեստերի ծանոթանալու համար։"</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Հավելյալ խամրեցումն այժմ պայծառության սահիչի մասն է"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Այժմ դուք կարող եք հավելյալ խամրեցնել էկրանը՝ էլ ավելի նվազեցնելով պայծառության մակարդակը։\n\nՔանի որ այս գործառույթն այժմ պայծառության սահիչի մասն է, հավելյալ խամրեցման դրյուրանցումները հեռացվում են։"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Հեռացնել հավելյալ խամրեցման դյուրանցումները"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Հավելյալ խամրեցման դյուրանցումները հեռացվել են"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Կապ"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Հատուկ գործառույթներ"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Կոմունալ ծառայություններ"</string>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index 97b0337..a531725 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -1293,8 +1293,7 @@
<string name="add" msgid="81036585205287996">"Tambahkan"</string>
<string name="manage_users" msgid="1823875311934643849">"Kelola pengguna"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"Notifikasi ini tidak mendukung fitur tarik ke layar terpisah"</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"Lokasi aktif"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi tidak tersedia"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Mode prioritas"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarm disetel"</string>
@@ -1351,8 +1350,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"Sesuaikan layar kunci"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Buka kunci untuk menyesuaikan layar kunci"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi tidak tersedia"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Lokasi aktif"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera diblokir"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera dan mikrofon diblokir"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon diblokir"</string>
@@ -1400,6 +1398,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1408,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Lihat aplikasi terbaru"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Selesai"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Kembali"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Untuk kembali, geser ke kiri atau kanan menggunakan tiga jari di touchpad.\n\nAnda juga dapat menggunakan pintasan keyboard Action + ECS untuk melakukannya."</string>
@@ -1419,14 +1418,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Untuk membuka layar utama kapan saja, geser ke atas menggunakan tiga jari dari bawah layar Anda."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Bagus!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Anda telah menyelesaikan gestur buka layar utama."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Lihat aplikasi terbaru"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Geser ke atas dan tahan menggunakan tiga jari di touchpad."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Bagus!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Anda telah menyelesaikan gestur untuk melihat aplikasi terbaru."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"Tombol tindakan"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Untuk mengakses aplikasi, tekan tombol tindakan di keyboard."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"Selamat!"</string>
@@ -1450,14 +1445,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"Geser ke atas dan tahan menggunakan tiga jari. Ketuk untuk mempelajari gestur lainnya."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"Gunakan keyboard untuk melihat semua aplikasi"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Tekan tombol tindakan kapan saja. Ketuk untuk mempelajari gestur lainnya."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Ekstra redup kini menjadi bagian dari penggeser kecerahan"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Anda kini dapat membuat layar menjadi ekstra redup dengan menurunkan tingkat kecerahan lebih banyak lagi.\n\nKarena fitur ini kini menjadi bagian dari penggeser kecerahan, pintasan ekstra redup akan dihapus."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Hapus pintasan ekstra redup"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Pintasan ekstra redup dihapus"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Konektivitas"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Aksesibilitas"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Utilitas"</string>
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index 7df9b2a..c2ada41 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -1398,6 +1398,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index f1bbc0a..4ff2eda 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -1293,8 +1293,7 @@
<string name="add" msgid="81036585205287996">"Aggiungi"</string>
<string name="manage_users" msgid="1823875311934643849">"Gestisci utenti"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"Non è possibile trascinare questa notifica tra le due parti dello schermo diviso"</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"Posizione attiva"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi non disponibile"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Modalità Priorità"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Sveglia impostata"</string>
@@ -1351,8 +1350,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"Personalizza schermata di blocco"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Sblocca per personalizzare la schermata di blocco"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi non disponibile"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Posizione attiva"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Videocamera bloccata"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Videocamera e microfono bloccati"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microfono bloccato"</string>
@@ -1400,6 +1398,8 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Icona Comprimi"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Icona Espandi"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"oppure"</string>
+ <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <skip />
<string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Naviga usando la tastiera"</string>
<string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Informazioni sulle scorciatoie da tastiera"</string>
<string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Naviga usando il touchpad"</string>
@@ -1408,8 +1408,7 @@
<string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Scopri gesti con il touchpad, scorciatoie da tastiera e altro ancora"</string>
<string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Gesto Indietro"</string>
<string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Gesto Home"</string>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Visualizza app recenti"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Fine"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Indietro"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Per tornare indietro, scorri verso sinistra o verso destra utilizzando tre dita in un punto qualsiasi del touchpad.\n\nPuoi usare anche la scorciatoia da tastiera Action + Esc per farlo."</string>
@@ -1419,14 +1418,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Per andare alla schermata Home, scorri verso l\'alto con tre dita dalla parte inferiore dello schermo."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Bene!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Hai completato il gesto Vai alla schermata Home."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Visualizza app recenti"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Scorri verso l\'alto e tieni premuto con tre dita sul touchpad."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Ottimo lavoro."</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Hai completato il gesto Visualizza app recenti."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"Tasto azione"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Per accedere alle tue app, premi il tasto azione sulla tastiera."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"Complimenti!"</string>
@@ -1450,14 +1445,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"Scorri verso l\'alto e tieni premuto con tre dita. Tocca per scoprire altri gesti."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"Usa la tastiera per visualizzare tutte le app"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Premi il tasto azione in qualsiasi momento. Tocca per scoprire altri gesti."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Ora l\'attenuazione extra è nel cursore della luminosità"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Ora puoi usare l\'attenuazione extra per lo schermo abbassando il livello di luminosità ancora di più.\n\nDato che questa funzionalità ora fa parte del cursore della luminosità, le scorciatoie per l\'attenuazione extra vengono rimosse."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Rimuovi scorciatoie attenuazione extra"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Scorciatoie attenuazione extra rimosse"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Connettività"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Accessibilità"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Utilità"</string>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index 2cf4f37..1c212e1 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -1293,8 +1293,7 @@
<string name="add" msgid="81036585205287996">"הוספה"</string>
<string name="manage_users" msgid="1823875311934643849">"ניהול משתמשים"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"ההתראה הזו לא תומכת בגרירה למסך מפוצל"</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"המיקום פעיל"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi לא זמין"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"מצב עדיפות"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"ההתראה מוגדרת"</string>
@@ -1351,8 +1350,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"התאמה אישית של מסך הנעילה"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"כדי להתאים אישית את מסך הנעילה, יש לבטל את הנעילה"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"ה-Wi-Fi לא זמין"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"המיקום פעיל"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"המצלמה חסומה"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"המצלמה והמיקרופון חסומים"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"המיקרופון חסום"</string>
@@ -1400,6 +1398,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1408,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"הצגת האפליקציות האחרונות"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"סיום"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"חזרה"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"כדי לחזור אחורה, מחליקים שמאלה או ימינה עם שלוש אצבעות בכל מקום על לוח המגע.\n\nאפשר לבצע את הפעולה הזו גם באמצעות קיצור הדרך לפעולה + מקש ESC."</string>
@@ -1419,14 +1418,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"כדי לעבור למסך הבית בכל שלב, צריך להחליק למעלה עם שלוש אצבעות מהחלק התחתון של המסך."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"איזה יופי!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"השלמת את תנועת המעבר למסך הבית."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"הצגת האפליקציות האחרונות"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"מחליקים למעלה ולוחצים לחיצה ארוכה עם שלוש אצבעות על לוח המגע."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"מעולה!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"השלמת את התנועה להצגת האפליקציות האחרונות."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"מקש הפעולה"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"כדי לגשת לאפליקציות, מקישים על מקש הפעולה במקלדת."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"כל הכבוד!"</string>
@@ -1450,14 +1445,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"מחליקים למעלה ולוחצים לחיצה ארוכה עם שלוש אצבעות. ניתן להקיש כדי לקבל מידע נוסף על התנועות."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"איך להשתמש במקלדת כדי לראות את כל האפליקציות"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"בכל שלב אפשר ללחוץ על מקש הפעולה. ניתן להקיש כדי לקבל מידע נוסף על התנועות."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"התכונה \'מעומעם במיוחד\' נוספה לפס ההזזה לבהירות"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"עכשיו אפשר להפוך את המסך למעומעם במיוחד באמצעות הפחתה נוספת של רמת הבהירות.\n\nהתכונה הזו היא עכשיו חלק מפס ההזזה לבהירות, לכן קיצורי הדרך לתכונה \'מעומעם במיוחד\' נמצאים בתהליך הסרה."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"הסרה של קיצורי הדרך לתכונה \'מעומעם במיוחד\'"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"קיצורי הדרך לתכונה \'מעומעם במיוחד\' הוסרו"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"קישוריות"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"נגישות"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"כלי תחזוקה"</string>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 56491fd..eda727f 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -1179,10 +1179,8 @@
<string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
<string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"スピーカーとディスプレイ"</string>
<string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"デバイスの候補"</string>
- <!-- no translation found for media_input_group_title (2057057473860783021) -->
- <skip />
- <!-- no translation found for media_output_group_title (6789001895863332576) -->
- <skip />
+ <string name="media_input_group_title" msgid="2057057473860783021">"入力"</string>
+ <string name="media_output_group_title" msgid="6789001895863332576">"出力"</string>
<string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"メディアを他のデバイスに移動する共有中のセッションを停止します。"</string>
<string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"停止"</string>
<string name="media_output_first_broadcast_title" msgid="6292237789860753022">"ブロードキャストの仕組み"</string>
@@ -1293,8 +1291,7 @@
<string name="add" msgid="81036585205287996">"追加"</string>
<string name="manage_users" msgid="1823875311934643849">"ユーザーの管理"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"この通知は、分割画面へのドラッグをサポートしていません"</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"位置情報がアクティブです"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi-Fi を利用できません"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"優先順位モード"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"アラームを設定しました"</string>
@@ -1351,8 +1348,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"ロック画面のカスタマイズ"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"ロック画面をカスタマイズするにはロックを解除してください"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi は利用できません"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"位置情報がアクティブです"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"カメラはブロックされています"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"カメラとマイクはブロックされています"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"マイクはブロックされています"</string>
@@ -1400,6 +1396,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1406,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"最近使ったアプリを表示する"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"完了"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"戻る"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"戻るには、3 本の指でタッチパッドを左右にスワイプします。\n\nキーボード ショートカットのアクション + ESC キーを使用して、この操作を行うこともできます。"</string>
@@ -1419,14 +1416,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"3 本の指で画面を下から上にスワイプすると、ホーム画面にいつでも移動できます。"</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"お疲れさまでした。"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"「ホームに移動」操作を学習しました。"</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"最近使ったアプリを表示する"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"タッチパッドを 3 本の指で上にスワイプして長押しします。"</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"よくできました"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"「最近使ったアプリを表示する」操作を学習しました。"</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"アクションキー"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"アプリにアクセスするには、キーボードのアクションキーを押します。"</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"お疲れさまでした。"</string>
@@ -1450,14 +1443,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"3 本の指で上にスワイプして長押しします。ジェスチャーの詳細を確認するにはタップしてください。"</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"キーボードを使用して、すべてのアプリを表示する"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"アクションキーを押せばいつでも機能します。ジェスチャーの詳細を確認するにはタップしてください。"</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"「さらに輝度を下げる」が明るさ調整スライダーに追加されました"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"明るさを大幅に低く設定することで、画面の輝度をさらに下げられるようになりました。\n\nこの機能が明るさ調整スライダーに追加されたため、「さらに輝度を下げる」のショートカットは削除されます。"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"「さらに輝度を下げる」のショートカットを削除"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"「さらに輝度を下げる」のショートカットを削除しました"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"接続"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"ユーザー補助"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"ユーティリティ"</string>
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index d3583fa..836bd44 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -1179,10 +1179,8 @@
<string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
<string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"დინამიკები და დისპლეები"</string>
<string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"შემოთავაზებული მოწყობილობები"</string>
- <!-- no translation found for media_input_group_title (2057057473860783021) -->
- <skip />
- <!-- no translation found for media_output_group_title (6789001895863332576) -->
- <skip />
+ <string name="media_input_group_title" msgid="2057057473860783021">"შემავალი"</string>
+ <string name="media_output_group_title" msgid="6789001895863332576">"გამომავალი"</string>
<string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"შეწყვიტეთ გაზიარებული სესია, რათა მულტიმედია სხვა მოწყობილობაზე გადაიტანოთ"</string>
<string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"შეწყვეტა"</string>
<string name="media_output_first_broadcast_title" msgid="6292237789860753022">"ტრანსლირების მუშაობის პრინციპი"</string>
@@ -1293,8 +1291,7 @@
<string name="add" msgid="81036585205287996">"დამატება"</string>
<string name="manage_users" msgid="1823875311934643849">"მართვა"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"ამ შეტყობინების გადათრევა გაყოფილ ეკრანებს შორის არ არის მხარდაჭერილი."</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"მდებარეობა აქტიურია"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi მიუწვდომელია"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"პრიორიტეტული რეჟიმი"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"მაღვიძარა დაყენებულია"</string>
@@ -1351,8 +1348,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"ჩაკეთილი ეკრანის მორგება"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"ჩაკეტილი ეკრანის მოსარგებად გაბლოკეთ"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi მიუწვდომელია"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"მდებარეობა აქტიურია"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"კამერა დაბლოკილია"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"კამერა და მიკროფონი დაბლოკილია"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"მიკროფონი დაბლოკილია"</string>
@@ -1400,6 +1396,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1406,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"ბოლო აპების ნახვა"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"მზადაა"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"უკან დაბრუნება"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"უკან დასაბრუნებლად სენსორულ პანელზე გადაფურცლეთ მარცხნივ ან მარჯვნივ სამი თითის გამოყენებით ნებისმიერ ადგილას.\n\nამისთვის თქვენ ასევე შეგიძლიათ გამოიყენოთ კლავიატურის მალსახმობის მოქმედება + ESC."</string>
@@ -1419,14 +1416,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"თქვენს მთავარ ეკრანზე ნებისმიერ დროს გადასასვლელად გადაფურცლეთ ეკრანის ქვემოდან ზემოთ სამი თითით."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"მშვენიერია!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"თქვენ შეასრულეთ მთავარ ეკრანზე დაბრუნების ჟესტი."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"ბოლო აპების ნახვა"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"თქვენს სენსორულ პანელზე სამი თითით გადაფურცლეთ ზემოთ და მოიცადეთ."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"შესანიშნავია!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"თქვენ დაასრულეთ ბოლო აპების ხედის ჟესტი."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"მოქმედების კლავიში"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"აპებზე წვდომისთვის დააჭირეთ მოქმედების კლავიშს თქვენს კლავიატურაზე."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"გილოცავთ!"</string>
@@ -1450,14 +1443,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"სამი თითით გადაფურცლეთ ზემოთ და მოიცადეთ. შეეხეთ მეტი ჟესტის შესასწავლად."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"ყველა აპის სანახავად გამოიყენეთ თქვენი კლავიატურა"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"ნებისმიერ დროს დააჭირეთ მოქმედების კლავიშს. შეეხეთ მეტი ჟესტის შესასწავლად."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"დამატებითი დაბინდვის ფუნქცია ახლა სიკაშკაშის სლაიდერზეა განთავსებული"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"ეკრანის დამატებითი დაბინდვა უკვე სიკაშკაშის დონის კიდევ უფრო შემცირების გზით შეგიძლიათ.\n\nვინაიდან ეს ფუნქცია უკვე სიკაშკაშის სლაიდერის ნაწილია, ამოშლილია დამატებითი დაბინდვის მალსახმობები."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"დამატებითი დაბინდვის მალსახმობების ამოშლა"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"დამატებითი დაბინდვის მალსახმობები ამოშლილია"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"კავშირი"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"მარტივი წვდომა"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"ხელსაწყოები"</string>
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index 3916063..dc2a618 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -1293,8 +1293,7 @@
<string name="add" msgid="81036585205287996">"Қосу"</string>
<string name="manage_users" msgid="1823875311934643849">"Параметрлер"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"Бұл хабарландыруды бөлінген экранға сүйреп апару мүмкін емес."</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"Локация қосулы"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi қолжетімсіз"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Басымдық режимі"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Оятқыш орнатылды"</string>
@@ -1351,8 +1350,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"Құлып экранын бейімдеу"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Құлып экранын бейімдеу үшін құлыпты ашыңыз"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi қолжетімсіз."</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Локация қосулы"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Камера блокталған."</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Камера мен микрофон блокталған."</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Микрофон блокталған."</string>
@@ -1400,6 +1398,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1408,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Соңғы қолданбаларды көру"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Дайын"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Артқа"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Артқа қайту үшін сенсорлық тақтаның кез келген жерін үш саусақпен солға не оңға сырғытыңыз.\n\nСондай-ақ Action + ESC перне тіркесімін пайдалануға болады."</string>
@@ -1419,14 +1418,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Негізгі экранға кез келген уақытта өту үшін экранның төменгі жағынан жоғары қарай үш саусағыңызбен сырғытыңыз."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Жақсы нәтиже!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Негізгі экранға қайту қимылын аяқтадыңыз."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Соңғы қолданбаларды көру"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Сенсорлық тақтада үш саусақпен жоғары сырғытып, басып тұрыңыз."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Жарайсыз!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Соңғы қолданбаларды көру қимылын орындадыңыз."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"Әрекет пернесі"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Қолданбаларыңызға кіру үшін пернетақтадағы әрекет пернесін басыңыз."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"Құттықтаймыз!"</string>
@@ -1450,14 +1445,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"Үш саусақпен жоғары сырғытып, басып тұрыңыз. Басқа қимылдарды үйрену үшін түртіңіз."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"Барлық қолданбаны көру үшін пернетақтаны қолданыңыз"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Әрекет пернесін кез келген уақытта баса аласыз. Басқа қимылдарды үйрену үшін түртіңіз."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Экранды қарайту функциясы енді жарықтық жүгірткісіне қосылды"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Экранның жарықтық деңгейін көбірек төмендету арқылы оны қарайта аласыз.\n\nБұл функция енді жарықтық жүгірткісіне қосылғандықтан, экранды қарайту жылдам пәрмендері өшіріліп жатыр."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Экранды қарайту жылдам пәрмендерін өшіру"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Экранды қарайту жылдам пәрмендері өшірілді."</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Қосылу мүмкіндігі"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Арнайы мүмкіндіктер"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Утилиталар"</string>
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index c72ee71..6c15c79 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -1179,10 +1179,8 @@
<string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
<string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"ឧបករណ៍បំពងសំឡេង និងផ្ទាំងអេក្រង់"</string>
<string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"ឧបករណ៍ដែលបានណែនាំ"</string>
- <!-- no translation found for media_input_group_title (2057057473860783021) -->
- <skip />
- <!-- no translation found for media_output_group_title (6789001895863332576) -->
- <skip />
+ <string name="media_input_group_title" msgid="2057057473860783021">"ឧបករណ៍បញ្ចូល"</string>
+ <string name="media_output_group_title" msgid="6789001895863332576">"ឧបករណ៍បញ្ចេញ"</string>
<string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"បញ្ឈប់វគ្គដែលអ្នកបានចែករំលែក ដើម្បីផ្លាស់ទីមេឌៀទៅឧបករណ៍ផ្សេងទៀត"</string>
<string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"បញ្ឈប់"</string>
<string name="media_output_first_broadcast_title" msgid="6292237789860753022">"របៀបដែលការផ្សាយដំណើរការ"</string>
@@ -1398,6 +1396,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index f1873c6..a16f110 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -1398,6 +1398,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index 3e851a1..622f0fb 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -1293,8 +1293,7 @@
<string name="add" msgid="81036585205287996">"추가"</string>
<string name="manage_users" msgid="1823875311934643849">"사용자 관리"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"드래그하여 화면을 분할하는 기능이 지원되지 않는 알림입니다."</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"활성 상태인 위치"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi를 이용할 수 없습니다."</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"우선순위 모드입니다."</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"알람이 설정되었습니다."</string>
@@ -1351,8 +1350,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"잠금 화면 맞춤 설정"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"잠금 화면 맞춤설정을 위해 잠금 해제"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi를 사용할 수 없음"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"활성 상태인 위치"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"카메라 차단됨"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"카메라 및 마이크 차단됨"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"마이크 차단됨"</string>
@@ -1400,6 +1398,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1408,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"최근 앱 보기"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"완료"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"뒤로"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"돌아가려면 세 손가락을 사용해 터치패드의 아무 곳이나 왼쪽 또는 오른쪽으로 스와이프합니다.\n\n키보드 단축키 Action + ESC를 사용할 수도 있습니다."</string>
@@ -1419,14 +1418,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"언제든지 홈 화면으로 이동하려면 세 손가락으로 화면 하단에서 위로 스와이프하세요."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"좋습니다"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"홈으로 이동 동작을 완료했습니다."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"최근 앱 보기"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"터치패드에서 세 손가락을 사용해 위로 스와이프한 후 잠시 기다리세요."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"아주 좋습니다"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"최근 앱 보기 동작을 완료했습니다."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"작업 키"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"앱에 액세스하려면 키보드의 작업 키를 누르세요."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"축하합니다"</string>
@@ -1450,14 +1445,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"세 손가락을 사용해 위로 스와이프한 다음 잠시 기다리세요. 더 많은 동작을 알아보려면 탭하세요."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"키보드를 사용하여 모든 앱 보기"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"언제든지 작업 키를 누릅니다. 더 많은 동작을 알아보려면 탭하세요."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"이제 \'더 어둡게\' 기능이 밝기 슬라이더에 추가되었습니다"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"이제 밝기 수준을 더 낮춰 화면을 더 어둡게 만들 수 있습니다.\n\n이 기능은 이제 밝기 슬라이더에 포함되므로 \'더 어둡게\' 단축키가 삭제됩니다."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"\'더 어둡게\' 단축키 삭제"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"\'더 어둡게\' 단축키가 삭제되었습니다."</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"연결"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"접근성"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"유틸리티"</string>
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index 7148a5b..0edb3f8 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -1293,8 +1293,7 @@
<string name="add" msgid="81036585205287996">"Кошуу"</string>
<string name="manage_users" msgid="1823875311934643849">"Колдонуучуларды башкаруу"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"Бул билдирмени бөлүнгөн экранда сүйрөөгө болбойт."</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"Жайгашкан жер активдүү"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi жеткиликсиз"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Маанилүү сүйлөшүүлөр режими"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Ойготкуч коюлду"</string>
@@ -1351,8 +1350,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"Кулпу экранын тууралоо"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Кулпуланган экранды тууралоо үчүн кулпусун ачыңыз"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi жеткиликтүү эмес"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Жайгашкан жер активдүү"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Камера бөгөттөлдү"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Камера менен микрофон бөгөттөлдү"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Микрофон бөгөттөлдү"</string>
@@ -1400,6 +1398,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1408,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Акыркы колдонмолорду көрүү"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Бүттү"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Артка кайтуу"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Кайтуу үчүн сенсордук тактанын каалаган жерин үч манжаңыз менен солго же оңго сүрүңүз.\n\nОшондой эле Action + ESC баскычтарынын айкалышын колдоно аласыз."</string>
@@ -1419,14 +1418,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Каалаган убакта башкы экранга өтүү үчүн экранды үч манжаңыз менен ылдыйдан жогору карай сүрүңүз."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Сонун!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"\"Башкы бетке өтүү\" жаңсоосун үйрөндүңүз."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Акыркы колдонмолорду көрүү"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Сенсордук тактаны үч манжаңыз менен өйдө сүрүп, кармап туруңуз."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Азаматсыз!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Акыркы колдонмолорду көрүү жаңсоосун аткардыңыз."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"Аракет баскычы"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Бардык колдонмолоруңузду көрүү үчүн баскычтобуңуздагы аракет баскычын басыңыз"</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"Куттуктайбыз!"</string>
@@ -1450,14 +1445,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"Үч манжаңыз менен өйдө сүрүп, кармап туруңуз. Башка жаңсоолорду үйрөнүү үчүн таптаңыз."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"Бардык колдонмолорду көрүү үчүн баскычтобуңузду колдонуңуз"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Каалаганда аракет баскычын басыңыз. Башка жаңсоолорду үйрөнүү үчүн таптаңыз."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Кошумча караңгылатуу эми жарыктык сыдырмасында жайгашкан"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Эми экрандын жарыктыктыгынын деңгээлин азайтып, экранды кошумча караңгылата аласыз.\n\nБул функция эми жарыктык сыдырмасынын бир бөлүгү болуп калгандыктан, кошумча караңгылатуунун ыкчам баскычтары өтүрүлөт."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Кошумча караңгылатуу ыкчам баскычтарын өчүрүү"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Кошумча караңгылатуу ыкчам баскычтары өчүрүлдү"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Байланыш"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Атайын мүмкүнчүлүктөр"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Утилиталар"</string>
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index a5b6218..242d766 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -1398,6 +1398,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index e210a99..fd62599 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -230,7 +230,7 @@
<string name="face_re_enroll_dialog_title" msgid="6392173708176069994">"Atrakinimo pagal veidą nustatymas"</string>
<string name="face_re_enroll_dialog_content" msgid="7353502359464038511">"Norint dar kartą nustatyti atrakinimą pagal veidą, dabartinis veido modelis bus ištrintas.\n\nTurite dar kartą nustatyti šią funkciją, kad galėtumėte atrakinti telefoną pagal veidą."</string>
<string name="face_reenroll_failure_dialog_content" msgid="7073947334397236935">"Nepavyko nustatyti atrakinimo pagal veidą. Eikite į skiltį „Nustatymai“ ir bandykite dar kartą."</string>
- <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Palieskite piršto antspaudo jutiklį"</string>
+ <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Palieskite piršto atspaudo jutiklį"</string>
<string name="fingerprint_dialog_authenticated_confirmation" msgid="1603899612957562862">"Tęskite paspaudę atrakinimo piktogramą"</string>
<string name="fingerprint_dialog_use_fingerprint_instead" msgid="5542430577183894219">"Veidas neatpažintas. Naudokite piršto antspaudą."</string>
<!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) -->
@@ -1240,7 +1240,7 @@
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Palieskite, kad sužinotumėte daugiau informacijos"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Nenustatyta signalų"</string>
<string name="accessibility_bouncer" msgid="5896923685673320070">"įvesti ekrano užraktą"</string>
- <string name="accessibility_side_fingerprint_indicator_label" msgid="1673807833352363712">"Palieskite piršto antspaudo jutiklį. Tai yra trumpesnis mygtukas telefono šone"</string>
+ <string name="accessibility_side_fingerprint_indicator_label" msgid="1673807833352363712">"Palieskite piršto atspaudo jutiklį. Tai yra trumpesnis mygtukas telefono šone"</string>
<string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Kontrolinio kodo jutiklis"</string>
<string name="accessibility_authenticate_hint" msgid="798914151813205721">"nustatytumėte tapatybę"</string>
<string name="accessibility_enter_hint" msgid="2617864063504824834">"pasiektumėte įrenginį"</string>
@@ -1293,8 +1293,7 @@
<string name="add" msgid="81036585205287996">"Pridėti"</string>
<string name="manage_users" msgid="1823875311934643849">"Tvarkyti naudotojus"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"Šio pranešimo vilkimas išskaidyto ekrano režimu nepalaikomas"</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"Vietovė aktyvi"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"„Wi‑Fi“ ryšys nepasiekiamas"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Prioriteto režimas"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Signalas nustatytas"</string>
@@ -1351,8 +1350,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"Užrakinimo ekrano tinkinimas"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Atrakinę tinkinkite užrakinimo ekraną"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"„Wi-Fi“ ryšys nepasiekiamas"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Vietovė aktyvi"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Fotoaparatas užblokuotas"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Fotoaparatas ir mikrofonas užblokuoti"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofonas užblokuotas"</string>
@@ -1400,6 +1398,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1408,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Peržiūrėti naujausias programas"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Atlikta"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Grįžti"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Jei norite grįžti, perbraukite kairėn arba dešinėn trimis pirštais bet kurioje jutiklinės dalies vietoje.\n\nTaip pat galite naudoti šį spartųjį klavišą: veiksmų klavišas + klavišas „Esc“."</string>
@@ -1419,14 +1418,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Jei norite bet kada pasiekti pagrindinį ekraną, perbraukite aukštyn trim pirštais iš ekrano apačios."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Šaunu!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Atlikote perėjimo į pagrindinį ekraną gestą."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Peržiūrėti naujausias programas"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Jutiklinėje dalyje perbraukite aukštyn trimis pirštais ir palaikykite."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Puiku!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Atlikote naujausių programų peržiūros gestą."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"Veiksmų klavišas"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Jei norite pasiekti programas, paspauskite klaviatūros veiksmų klavišą."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"Sveikiname!"</string>
@@ -1450,14 +1445,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"Perbraukite aukštyn trimis pirštais ir palaikykite. Palieskite, kad sužinotumėte daugiau gestų."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"Naudokite klaviatūrą, kad peržiūrėtumėte visas programas"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Bet kuriuo metu paspauskite veiksmų klavišą. Palieskite, kad sužinotumėte daugiau gestų."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Funkcija „Itin blanku“ dabar yra ryškumo šliaužiklio dalis"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Dabar galite padaryti ekraną itin blankų, dar labiau sumažindami ryškumo lygį.\n\nKadangi ši funkcija dabar yra ryškumo šliaužiklio dalis, funkcijos „Itin blanku“ spartieji klavišai bus pašalinti."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Pašalinti funkcijos „Itin blanku“ sparčiuosius klavišus"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Funkcijos „Itin blanku“ spartieji klavišai pašalinti"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Ryšiai"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Pritaikomumas"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Paslaugų programos"</string>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index 625da92..a6b7570 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -1293,8 +1293,7 @@
<string name="add" msgid="81036585205287996">"Pievienot"</string>
<string name="manage_users" msgid="1823875311934643849">"Pārvaldīt"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"Šis paziņojums neatbalsta vilkšanu uz sadalīto ekrānu."</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"Atrašanās vietas noteikšana ir aktīva"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi nav pieejams"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Prioritātes režīms"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Signāls ir iestatīts"</string>
@@ -1351,8 +1350,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"Pielāgot bloķēšanas ekrānu"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Bloķēšanas ekrāna pielāgošana pēc atbloķēšanas"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi nav pieejams"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Atrašanās vietas noteikšana ir aktīva"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera ir bloķēta"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kameras un mikrofona lietošana ir bloķēta"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofons ir bloķēts"</string>
@@ -1400,6 +1398,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1408,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Skatīt nesen izmantotās lietotnes"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Gatavs"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Atpakaļ"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Lai atgrieztos, ar trīs pirkstiem velciet pa kreisi vai pa labi jebkurā vietā uz skārienpaliktņa.\n\nVarat arī izmantot šim nolūkam īsinājumtaustiņus: darbību taustiņu + Esc."</string>
@@ -1419,14 +1418,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Lai jebkurā brīdī pārietu uz sākuma ekrānu, ar trim pirkstiem velciet augšup no ekrāna apakšdaļas."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Lieliski!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Jūs sekmīgi veicāt sākuma ekrāna atvēršanas žestu."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Nesen izmantoto lietotņu skatīšana"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Skārienpaliktnī ar trīs pirkstiem velciet augšup un turiet."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Lieliski!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Jūs sekmīgi veicāt nesen izmantoto lietotņu skatīšanas žestu."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"Darbību taustiņš"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Lai piekļūtu savām lietotnēm, tastatūrā nospiediet darbību taustiņu."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"Apsveicam!"</string>
@@ -1450,14 +1445,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"Ar trīs pirkstiem velciet augšup un turiet. Lai apgūtu citus žestus, pieskarieties šeit."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"Visu lietotņu skatīšana, izmantojot tastatūru"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Jebkurā laikā varat nospiest darbību taustiņu. Lai apgūtu citus žestus, pieskarieties šeit."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Papildu aptumšošana tagad ir iekļauta spilgtuma slīdnī"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Tagad varat veikt ekrāna papildu aptumšošanu, vēl vairāk samazinot spilgtuma līmeni.\n\nTā kā šī funkcija tagad ir iekļauta spilgtuma slīdnī, papildu aptumšošanas saīsnes tiek noņemtas."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Noņemt papildu aptumšošanas saīsnes"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Papildu aptumšošanas saīsnes ir noņemtas."</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Savienojamība"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Pieejamība"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Utilītprogrammas"</string>
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index f1aab84..1773e36 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -1179,10 +1179,8 @@
<string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
<string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Звучници и екрани"</string>
<string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Предложени уреди"</string>
- <!-- no translation found for media_input_group_title (2057057473860783021) -->
- <skip />
- <!-- no translation found for media_output_group_title (6789001895863332576) -->
- <skip />
+ <string name="media_input_group_title" msgid="2057057473860783021">"Влез"</string>
+ <string name="media_output_group_title" msgid="6789001895863332576">"Излез"</string>
<string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Сопрете ја споделената сесија за да ги преместите аудиовизуелните содржини на друг уред"</string>
<string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Сопри"</string>
<string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Како функционира емитувањето"</string>
@@ -1398,6 +1396,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index 42281ce..05b76d3 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -1179,10 +1179,8 @@
<string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
<string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"സ്പീക്കറുകളും ഡിസ്പ്ലേകളും"</string>
<string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"നിർദ്ദേശിച്ച ഉപകരണങ്ങൾ"</string>
- <!-- no translation found for media_input_group_title (2057057473860783021) -->
- <skip />
- <!-- no translation found for media_output_group_title (6789001895863332576) -->
- <skip />
+ <string name="media_input_group_title" msgid="2057057473860783021">"ഇൻപുട്ട്"</string>
+ <string name="media_output_group_title" msgid="6789001895863332576">"ഔട്ട്പുട്ട്"</string>
<string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"മീഡിയയെ മറ്റൊരു ഉപകരണത്തിലേക്ക് നീക്കുന്നതിന് നിങ്ങളുടെ പങ്കിട്ട സെഷൻ നിർത്തുക"</string>
<string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"നിർത്തുക"</string>
<string name="media_output_first_broadcast_title" msgid="6292237789860753022">"ബ്രോഡ്കാസ്റ്റ് എങ്ങനെയാണ് പ്രവർത്തിക്കുന്നത്"</string>
@@ -1398,6 +1396,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index b861020..7a9a38b 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -1398,6 +1398,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index eac5553..e4063f6 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -1179,10 +1179,8 @@
<string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
<string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"स्पीकर आणि डिस्प्ले"</string>
<string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"सुचवलेली डिव्हाइस"</string>
- <!-- no translation found for media_input_group_title (2057057473860783021) -->
- <skip />
- <!-- no translation found for media_output_group_title (6789001895863332576) -->
- <skip />
+ <string name="media_input_group_title" msgid="2057057473860783021">"इनपुट"</string>
+ <string name="media_output_group_title" msgid="6789001895863332576">"आउटपुट"</string>
<string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"मीडिया दुसऱ्या डिव्हाइसवर शेअर करण्यासाठी तुमचे शेअर केलेले सेशन थांबवा"</string>
<string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"थांबवा"</string>
<string name="media_output_first_broadcast_title" msgid="6292237789860753022">"ब्रॉडकास्टिंग कसे काम करते"</string>
@@ -1398,6 +1396,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index ab7ae77..710d342 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -1179,10 +1179,8 @@
<string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
<string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Pembesar Suara & Paparan"</string>
<string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Peranti yang Dicadangkan"</string>
- <!-- no translation found for media_input_group_title (2057057473860783021) -->
- <skip />
- <!-- no translation found for media_output_group_title (6789001895863332576) -->
- <skip />
+ <string name="media_input_group_title" msgid="2057057473860783021">"Input"</string>
+ <string name="media_output_group_title" msgid="6789001895863332576">"Output"</string>
<string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Hentikan sesi dikongsi anda untuk mengalihkan media kepada peranti yang lain"</string>
<string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Berhenti"</string>
<string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Cara siaran berfungsi"</string>
@@ -1398,6 +1396,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index 89449f8..0c9bbe6 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -1293,8 +1293,7 @@
<string name="add" msgid="81036585205287996">"ထည့်ရန်"</string>
<string name="manage_users" msgid="1823875311934643849">"အသုံးပြုသူများ စီမံရန်"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"ဤအကြောင်းကြားချက်သည် ‘မျက်နှာပြင် ခွဲ၍ပြသခြင်း’ သို့ ဖိဆွဲမှုကို မပံ့ပိုးပါ"</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"တည်နေရာ ဖွင့်ထားသည်"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi မရပါ"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"ဦးစားပေးမုဒ်"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"နိုးစက် သတ်မှတ်ထားသည်"</string>
@@ -1351,8 +1350,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"လော့ခ်မျက်နှာပြင်စိတ်ကြိုက်လုပ်ရန်"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"လော့ခ်မျက်နှာပြင် စိတ်ကြိုက်လုပ်ရန် ဖွင့်ပါ"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi မရနိုင်ပါ"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"တည်နေရာ ဖွင့်ထားသည်"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"ကင်မရာကို ပိတ်ထားသည်"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"ကင်မရာနှင့် မိုက်ခရိုဖုန်းကို ပိတ်ထားသည်"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"မိုက်ခရိုဖုန်းကို ပိတ်ထားသည်"</string>
@@ -1400,6 +1398,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1408,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"မကြာသေးမီကအက်ပ်များကို ကြည့်ရန်"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"ပြီးပြီ"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"ပြန်သွားရန်"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"နောက်ပြန်သွားရန် တာ့ချ်ပက်ပေါ်ရှိ မည်သည့်နေရာ၌မဆို လက်သုံးချောင်းဖြင့် ဘယ် (သို့) ညာသို့ ပွတ်ဆွဲပါ။\n\n၎င်းအတွက် လက်ကွက်ဖြတ်လမ်း Action + ESC ကိုလည်း သုံးနိုင်သည်။"</string>
@@ -1419,14 +1418,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"ပင်မစာမျက်နှာသို့ အချိန်မရွေးသွားရန် စခရင်အောက်ခြေမှ အပေါ်သို့ လက်သုံးချောင်းဖြင့် ပွတ်ဆွဲပါ။"</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"ကောင်းသည်။"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"ပင်မစာမျက်နှာသို့သွားသည့် လက်ဟန် အပြီးသတ်လိုက်ပါပြီ။"</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"မကြာသေးမီကအက်ပ်များကို ကြည့်ခြင်း"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"သင့်တာ့ချ်ပက်တွင် လက်သုံးချောင်းဖြင့် အပေါ်သို့ပွတ်ဆွဲပြီး ဖိထားပါ။"</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"တော်ပါပေသည်။"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"မကြာသေးမီကအက်ပ်များကို ကြည့်ခြင်းလက်ဟန် သင်ခန်းစာပြီးပါပြီ။"</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"လုပ်ဆောင်ချက်ကီး"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"သင့်အက်ပ်များသုံးရန် ကီးဘုတ်ပေါ်ရှိ လုပ်ဆောင်ချက်ကီးကို နှိပ်ပါ။"</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"ဂုဏ်ယူပါသည်။"</string>
@@ -1450,14 +1445,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"လက်သုံးချောင်းဖြင့် အပေါ်သို့ပွတ်ဆွဲပြီး ဖိထားပါ။ လက်ဟန်များ ပိုမိုလေ့လာရန် တို့ပါ။"</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"အက်ပ်အားလုံးကြည့်ရန် သင့်ကီးဘုတ်ကို သုံးပါ"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"လုပ်ဆောင်ချက်ကီးကို အချိန်မရွေးနှိပ်ပါ။ လက်ဟန်များ ပိုမိုလေ့လာရန် တို့ပါ။"</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"ပိုမှိန်ခြင်းသည် တောက်ပမှုရွှေ့တုံးတွင် ပါဝင်လာပြီ"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"တောက်ပမှုအဆင့် ထပ်မံလျှော့ချခြင်းဖြင့် စခရင်ကို ပိုမှိန်အောင် လုပ်နိုင်ပါပြီ။\n\nဤတူးလ်သည် တောက်ပမှုရွှေ့တုံးတွင် ပါဝင်လာသဖြင့် ပိုမှိန်ခြင်းဖြတ်လမ်းများကို ဖယ်ရှားထားသည်။"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"ပိုမှိန်ခြင်း ဖြတ်လမ်းများ ဖယ်ရှားရန်"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"ပိုမှိန်ခြင်း ဖြတ်လမ်းများကို ဖယ်ရှားထားသည်"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"ချိတ်ဆက်နိုင်မှု"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"အများသုံးနိုင်မှု"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"အထောက်အကူပြု ဆော့ဖ်ဝဲလ်များ"</string>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index c9656f2..a097505 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -1293,8 +1293,7 @@
<string name="add" msgid="81036585205287996">"Legg til"</string>
<string name="manage_users" msgid="1823875311934643849">"Brukervalg"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"Dette varselet støtter ikke at du drar det til en delt skjerm"</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"Posisjon er aktiv"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi er utilgjengelig"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Prioriteringsmodus"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarmen er stilt inn"</string>
@@ -1351,8 +1350,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"Tilpass låseskjermen"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Du må låse opp enheten for å tilpasse låseskjermen"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wifi er ikke tilgjengelig"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Posisjon er aktiv"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kameraet er blokkert"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kameraet og mikrofonen er blokkert"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofonen er blokkert"</string>
@@ -1400,6 +1398,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1408,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Se nylige apper"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Ferdig"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Gå tilbake"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"For å gå tilbake, sveip mot høyre eller venstre med tre fingre hvor som helst på styreflaten.\n\nDu kan også gjøre dette med hurtigtasten Action + Esc."</string>
@@ -1419,14 +1418,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"For å gå til startskjermen, sveip opp med tre fingre fra bunnen av skjermen når som helst."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Bra!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Du har fullført bevegelsen for å gå til startskjermen."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Se nylige apper"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Sveip opp og hold med tre fingre på styreflaten."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Bra jobbet!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Du har fullført bevegelsen for å se nylige apper."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"Handlingstast"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"For å åpne appene dine, trykk på handlingstasten på tastaturet."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"Gratulerer!"</string>
@@ -1450,14 +1445,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"Sveip opp og hold med tre fingre. Trykk for å lære flere bevegelser."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"Bruk tastaturet for å se alle apper"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Trykk på handlingstasten når som helst. Trykk for å lære flere bevegelser."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Nå er ekstra dimming en del av glidebryteren for lysstyrke"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Nå kan du gjøre skjermen ekstra dimmet ved å redusere lysstyrken enda mer.\n\nSiden denne funksjonen nå er en del av glidebryteren for lysstyrke, fjernes snarveiene for ekstra dimming."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Fjern snarveiene for ekstra dimming"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Snarveiene for ekstra dimming er fjernet"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Tilkobling"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Tilgjengelighet"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Systemverktøy"</string>
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index 16dd82f..e2ae7b9 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -1179,10 +1179,8 @@
<string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
<string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"स्पिकर तथा डिस्प्लेहरू"</string>
<string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"सिफारिस गरिएका डिभाइसहरू"</string>
- <!-- no translation found for media_input_group_title (2057057473860783021) -->
- <skip />
- <!-- no translation found for media_output_group_title (6789001895863332576) -->
- <skip />
+ <string name="media_input_group_title" msgid="2057057473860783021">"इन्पुट"</string>
+ <string name="media_output_group_title" msgid="6789001895863332576">"आउटपुट"</string>
<string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"मिडिया अर्को डिभाइसमा सार्नका लागि तपाईंले सेयर गरेको सत्र अन्त्य गर्नुहोस्"</string>
<string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"रोक्नुहोस्"</string>
<string name="media_output_first_broadcast_title" msgid="6292237789860753022">"प्रसारण गर्ने सुविधाले कसरी काम गर्छ"</string>
@@ -1398,6 +1396,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index b10c203..9681f1e 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -1179,10 +1179,8 @@
<string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
<string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Speakers en schermen"</string>
<string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Voorgestelde apparaten"</string>
- <!-- no translation found for media_input_group_title (2057057473860783021) -->
- <skip />
- <!-- no translation found for media_output_group_title (6789001895863332576) -->
- <skip />
+ <string name="media_input_group_title" msgid="2057057473860783021">"Invoer"</string>
+ <string name="media_output_group_title" msgid="6789001895863332576">"Uitvoer"</string>
<string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Stop je gedeelde sessie om media naar een ander apparaat te verplaatsen"</string>
<string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Stoppen"</string>
<string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Hoe uitzenden werkt"</string>
@@ -1293,8 +1291,7 @@
<string name="add" msgid="81036585205287996">"Toevoegen"</string>
<string name="manage_users" msgid="1823875311934643849">"Gebruikers beheren"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"Deze melding biedt geen ondersteuning voor slepen naar het gesplitste scherm"</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"Locatie actief"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wifi niet beschikbaar"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Prioriteitsmodus"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Wekker gezet"</string>
@@ -1351,8 +1348,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"Vergrendelscherm aanpassen"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Ontgrendelen om het vergrendelscherm aan te passen"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wifi niet beschikbaar"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Locatie actief"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Camera geblokkeerd"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Camera en microfoon geblokkeerd"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microfoon geblokkeerd"</string>
@@ -1400,6 +1396,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1406,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Recente apps bekijken"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Klaar"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Terug"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Als je wilt teruggaan, swipe je met 3 vingers naar links of rechts op de touchpad.\n\nJe kunt hiervoor ook de sneltoets Actie + ESC gebruiken."</string>
@@ -1419,14 +1416,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Swipe met 3 vingers omhoog vanaf de onderkant van het scherm om naar het startscherm te gaan."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Mooi zo!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Je weet nu hoe je het gebaar Naar startscherm maakt."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Recente apps bekijken"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Swipe met 3 vingers omhoog en houd vast op je touchpad."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Goed werk!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Je weet nu hoe je het gebaar Recente apps bekijken maakt."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"Actietoets"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Als je toegang tot je apps wilt krijgen, druk je op de actietoets op je toetsenbord."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"Gefeliciteerd!"</string>
@@ -1450,14 +1443,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"Swipe met 3 vingers omhoog en houd vast. Tik voor meer gebaren."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"Je toetsenbord gebruiken om alle apps te bekijken"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Druk op de actietoets wanneer je wilt. Tik voor meer gebaren."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Extra dimmen maakt nu deel uit van de schuifregelaar voor helderheid"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Je kunt het scherm nu extra dimmen door het helderheidsniveau nog verder te verlagen.\n\nOmdat deze functie nu deel uitmaakt van de schuifregelaar voor helderheid, worden snelkoppelingen voor extra dimmen verwijderd."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Snelkoppelingen voor extra dimmen verwijderen"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Snelkoppelingen voor extra dimmen verwijderd"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Connectiviteit"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Toegankelijkheid"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Hulpprogramma\'s"</string>
diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml
index 64b2b7c..14e8490 100644
--- a/packages/SystemUI/res/values-or/strings.xml
+++ b/packages/SystemUI/res/values-or/strings.xml
@@ -1398,6 +1398,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index dda36f7..8e7ed22e 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -1398,6 +1398,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index c1cdb58..287ecd3 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -1179,10 +1179,8 @@
<string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
<string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Głośniki i wyświetlacze"</string>
<string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Proponowane urządzenia"</string>
- <!-- no translation found for media_input_group_title (2057057473860783021) -->
- <skip />
- <!-- no translation found for media_output_group_title (6789001895863332576) -->
- <skip />
+ <string name="media_input_group_title" msgid="2057057473860783021">"Urządzenie wejściowe"</string>
+ <string name="media_output_group_title" msgid="6789001895863332576">"Urządzenie wyjściowe"</string>
<string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Zatrzymaj udostępnianie sesji, aby przenieść multimedia na inne urządzenie"</string>
<string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Zatrzymaj"</string>
<string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Jak działa transmitowanie"</string>
@@ -1293,8 +1291,7 @@
<string name="add" msgid="81036585205287996">"Dodaj"</string>
<string name="manage_users" msgid="1823875311934643849">"Zarządzaj użytkownikami"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"To powiadomienie nie obsługuje dzielenia ekranu przez przeciąganie."</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"Lokalizacja jest aktywna"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Sieć Wi‑Fi niedostępna"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Tryb priorytetowy"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarm ustawiony"</string>
@@ -1351,8 +1348,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"Dostosuj ekran blokady"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Odblokuj, aby dostosować ekran blokady"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Sieć Wi-Fi jest niedostępna"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Lokalizacja jest aktywna"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera jest zablokowana"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera i mikrofon są zablokowane"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon jest zablokowany"</string>
@@ -1400,6 +1396,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1406,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Wyświetlanie ostatnich aplikacji"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Gotowe"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Wróć"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Aby przejść wstecz, przesuń 3 palcami w lewo lub w prawo w dowolnym miejscu touchpada.\n\nMożesz też użyć do tego skrótu klawiszowego Action + ESC."</string>
@@ -1419,14 +1416,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Aby w dowolnym momencie wyświetlić ekran główny, przesuń od dołu ekranu w górę 3 palcami."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Super!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Gest przechodzenia na ekran główny został opanowany."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Wyświetlanie ostatnich aplikacji"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Przesuń w górę za pomocą 3 palców na touchpadzie i przytrzymaj."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Brawo!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Znasz już gest wyświetlania ostatnio używanych aplikacji."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"Klawisz działania"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Aby uzyskać dostęp do aplikacji, naciśnij klawisz działania na klawiaturze."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"Gratulacje!"</string>
@@ -1450,14 +1443,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"Przesuń w górę za pomocą 3 palców i przytrzymaj. Kliknij, aby poznać więcej gestów."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"Wyświetlanie wszystkich aplikacji za pomocą klawiatury"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Naciśnij klawisz działania w dowolnym momencie. Kliknij, aby poznać więcej gestów."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Dodatkowe przyciemnienie jest teraz częścią suwaka jasności"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Możesz teraz dodatkowo przyciemnić ekran, jeszcze bardziej zmniejszając poziom jasności.\n\nTa funkcja jest teraz częścią suwaka jasności, więc skróty do dodatkowego przyciemniania zostaną usunięte."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Usuń skróty do dodatkowego przyciemnienia"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Skróty do dodatkowego przyciemnienia zostały usunięte"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Łączność"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Ułatwienia dostępu"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Narzędzia"</string>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index fe90562..408ffcb 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -1179,10 +1179,8 @@
<string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
<string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Alto-falantes e telas"</string>
<string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Opções de dispositivos"</string>
- <!-- no translation found for media_input_group_title (2057057473860783021) -->
- <skip />
- <!-- no translation found for media_output_group_title (6789001895863332576) -->
- <skip />
+ <string name="media_input_group_title" msgid="2057057473860783021">"Entrada"</string>
+ <string name="media_output_group_title" msgid="6789001895863332576">"Saída"</string>
<string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Interrompa sua sessão compartilhada para transferir mídia a outro dispositivo"</string>
<string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Parar"</string>
<string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Como funciona a transmissão"</string>
@@ -1293,8 +1291,7 @@
<string name="add" msgid="81036585205287996">"Adicionar"</string>
<string name="manage_users" msgid="1823875311934643849">"Gerenciar usuários"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"Esta notificação não pode ser arrastada para a tela dividida"</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"Localização ativa"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi-Fi indisponível"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Modo de prioridade"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarme definido"</string>
@@ -1351,8 +1348,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"Personalizar a tela de bloqueio"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Desbloqueie para personalizar a tela de bloqueio"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi indisponível"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Localização ativa"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Câmara bloqueada"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Câmera e microfone bloqueados"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microfone bloqueado"</string>
@@ -1400,6 +1396,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1406,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Ver os apps recentes"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Concluído"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Voltar"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Para voltar, deslize para a esquerda ou direita usando 3 dedos em qualquer lugar do touchpad.\n\nVocê também pode usar o atalho de teclado Ação + ESC."</string>
@@ -1419,14 +1416,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Para acessar sua tela inicial a qualquer momento, deslize de baixo para cima na tela com três dedos."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Legal!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Você concluiu o gesto para acessar a tela inicial."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Ver os apps recentes"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Deslize para cima e pressione com 3 dedos no touchpad."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Muito bem!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Você concluiu o gesto para ver os apps recentes."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"Tecla de ação"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Para acessar os apps, pressione a tecla de ação no teclado."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"Parabéns!"</string>
@@ -1450,14 +1443,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"Deslize para cima e pressione com três dedos. Toque para aprender outros gestos."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"Use o teclado para ver todos os apps"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Pressione a tecla de ação a qualquer momento. Toque para aprender outros gestos."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"O recurso Escurecer a tela agora faz parte do controle deslizante de brilho"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Agora, é possível usar o recurso Escurecer a tela mostrado na parte de cima, que diminui ainda mais o nível de brilho.\n\nComo esse recurso agora faz parte do controle deslizante de brilho, os atalhos de Escurecer a tela estão sendo removidos."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Remover atalhos de Escurecer a tela"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Atalhos de Escurecer a tela removidos"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Conectividade"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Acessibilidade"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Utilitários"</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index 3e9d782..2e0bb56 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -1293,8 +1293,7 @@
<string name="add" msgid="81036585205287996">"Adicionar"</string>
<string name="manage_users" msgid="1823875311934643849">"Gerir utilizadores"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"Esta notificação não pode ser arrastada para o ecrã dividido"</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"Localização ativa"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi indisponível"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Modo Prioridade"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarme definido"</string>
@@ -1351,8 +1350,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"Personalizar ecrã de bloqueio"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Desbloqueie para personalizar o ecrã de bloqueio"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi indisponível"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Localização ativa"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Câmara bloqueada"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Câmara e microfone bloqueados"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microfone bloqueado"</string>
@@ -1400,6 +1398,7 @@
<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>
+ <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Indicador para arrastar"</string>
<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>
@@ -1408,8 +1407,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Ver apps recentes"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Concluir"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Voltar"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Para retroceder, deslize rapidamente para a esquerda ou direita com 3 dedos em qualquer parte do touchpad.\n\nPara o fazer, também pode usar o atalho de teclado Ação + ESC."</string>
@@ -1419,14 +1417,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Para aceder ao ecrã principal em qualquer altura, deslize rapidamente com 3 dedos de baixo para cima no ecrã."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Boa!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Concluiu o gesto para aceder ao ecrã principal."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Ver apps recentes"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Deslize rapidamente para cima e mantenha premido com 3 dedos no touchpad."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Muito bem!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Concluiu o gesto para ver as apps recentes."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"Tecla de ação"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Para aceder às suas apps, prima a tecla de ação no teclado."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"Parabéns!"</string>
@@ -1450,14 +1444,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"Deslize rapidamente para cima e mantenha premido com 3 dedos. Toque para aprender mais gestos."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"Use o teclado para ver todas as apps"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Prima a tecla de ação em qualquer altura. Toque para aprender mais gestos."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Agora, o escurecimento extra faz parte do controlo de deslize"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Agora, pode tornar o ecrã ainda mais escuro reduzindo ainda mais o nível de brilho.\n\nUma vez que esta funcionalidade faz agora parte do controlo de deslize do brilho, os atalhos de escurecimento extra vão ser removidos."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Remover atalhos de escurecimento extra"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Atalhos de escurecimento extra removidos"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Conetividade"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Acessibilidade"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Utilitários"</string>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index fe90562..408ffcb 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -1179,10 +1179,8 @@
<string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
<string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Alto-falantes e telas"</string>
<string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Opções de dispositivos"</string>
- <!-- no translation found for media_input_group_title (2057057473860783021) -->
- <skip />
- <!-- no translation found for media_output_group_title (6789001895863332576) -->
- <skip />
+ <string name="media_input_group_title" msgid="2057057473860783021">"Entrada"</string>
+ <string name="media_output_group_title" msgid="6789001895863332576">"Saída"</string>
<string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Interrompa sua sessão compartilhada para transferir mídia a outro dispositivo"</string>
<string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Parar"</string>
<string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Como funciona a transmissão"</string>
@@ -1293,8 +1291,7 @@
<string name="add" msgid="81036585205287996">"Adicionar"</string>
<string name="manage_users" msgid="1823875311934643849">"Gerenciar usuários"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"Esta notificação não pode ser arrastada para a tela dividida"</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"Localização ativa"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi-Fi indisponível"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Modo de prioridade"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarme definido"</string>
@@ -1351,8 +1348,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"Personalizar a tela de bloqueio"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Desbloqueie para personalizar a tela de bloqueio"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi indisponível"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Localização ativa"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Câmara bloqueada"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Câmera e microfone bloqueados"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microfone bloqueado"</string>
@@ -1400,6 +1396,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1406,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Ver os apps recentes"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Concluído"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Voltar"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Para voltar, deslize para a esquerda ou direita usando 3 dedos em qualquer lugar do touchpad.\n\nVocê também pode usar o atalho de teclado Ação + ESC."</string>
@@ -1419,14 +1416,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Para acessar sua tela inicial a qualquer momento, deslize de baixo para cima na tela com três dedos."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Legal!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Você concluiu o gesto para acessar a tela inicial."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Ver os apps recentes"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Deslize para cima e pressione com 3 dedos no touchpad."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Muito bem!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Você concluiu o gesto para ver os apps recentes."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"Tecla de ação"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Para acessar os apps, pressione a tecla de ação no teclado."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"Parabéns!"</string>
@@ -1450,14 +1443,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"Deslize para cima e pressione com três dedos. Toque para aprender outros gestos."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"Use o teclado para ver todos os apps"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Pressione a tecla de ação a qualquer momento. Toque para aprender outros gestos."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"O recurso Escurecer a tela agora faz parte do controle deslizante de brilho"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Agora, é possível usar o recurso Escurecer a tela mostrado na parte de cima, que diminui ainda mais o nível de brilho.\n\nComo esse recurso agora faz parte do controle deslizante de brilho, os atalhos de Escurecer a tela estão sendo removidos."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Remover atalhos de Escurecer a tela"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Atalhos de Escurecer a tela removidos"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Conectividade"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Acessibilidade"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Utilitários"</string>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index 1279ca2..443d28a 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -1293,8 +1293,7 @@
<string name="add" msgid="81036585205287996">"Adaugă"</string>
<string name="manage_users" msgid="1823875311934643849">"Gestionează"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"Notificarea nu acceptă tragerea pe ecranul împărțit"</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"Locație activă"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi indisponibil"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Modul Prioritate"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarmă setată"</string>
@@ -1351,8 +1350,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"Personalizează ecranul de blocare"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Deblochează pentru a personaliza ecranul de blocare"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Conexiune Wi-Fi indisponibilă"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Locație activă"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Camera foto a fost blocată"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Camera foto și microfonul sunt blocate"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microfonul a fost blocat"</string>
@@ -1400,6 +1398,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1408,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Vezi aplicațiile recente"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Gata"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Înapoi"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Pentru a reveni, glisează spre stânga sau spre dreapta cu trei degete oriunde pe touchpad.\n\nPoți folosi și comanda rapidă de la tastatură Action + ESC pentru aceasta."</string>
@@ -1419,14 +1418,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Pentru a accesa oricând ecranul de pornire, glisează în sus cu trei degete din partea de jos a ecranului"</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Bravo!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Ai finalizat gestul „accesează ecranul de pornire”."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Vezi aplicațiile recente"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Glisează în sus și ține apăsat cu trei degete pe touchpad."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Excelent!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Ai finalizat gestul pentru afișarea aplicațiilor recente."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"Tasta de acțiuni"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Pentru a accesa aplicațiile, apasă tasta de acțiuni de pe tastatură."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"Felicitări!"</string>
@@ -1450,14 +1445,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"Glisează în sus și ține apăsat cu trei degete. Atinge ca să înveți mai multe gesturi."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"Folosește-ți tastatura ca să vezi toate aplicațiile"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Apasă oricând tasta de acțiuni. Atinge ca să înveți mai multe gesturi."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Luminozitatea redusă suplimentar face acum parte din glisorul de luminozitate"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Poți reduce suplimentar luminozitatea ecranului dacă scazi nivelul de luminozitate.\n\nÎntrucât această funcție este acum disponibilă în glisorul de luminozitate, comenzile rapide de luminozitate redusă suplimentar sunt eliminate."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Elimină comenzile rapide de luminozitate redusă suplimentar"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"S-au eliminat comenzile rapide de luminozitate redusă suplimentar"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Conectivitate"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Accesibilitate"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Utilitare"</string>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index 5572658..66d7808 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -1179,10 +1179,8 @@
<string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
<string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Колонки и дисплеи"</string>
<string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Рекомендуемые устройства"</string>
- <!-- no translation found for media_input_group_title (2057057473860783021) -->
- <skip />
- <!-- no translation found for media_output_group_title (6789001895863332576) -->
- <skip />
+ <string name="media_input_group_title" msgid="2057057473860783021">"Устройства ввода"</string>
+ <string name="media_output_group_title" msgid="6789001895863332576">"Устройства вывода"</string>
<string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Чтобы перенести медиафайлы на другое устройство, закройте доступ."</string>
<string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Закрыть"</string>
<string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Как работают трансляции"</string>
@@ -1293,8 +1291,7 @@
<string name="add" msgid="81036585205287996">"Добавить"</string>
<string name="manage_users" msgid="1823875311934643849">"Управление пользователями"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"Это уведомление нельзя перетаскивать между частями разделенного экрана."</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"Используется геолокация"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Сеть Wi‑Fi недоступна"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Режим приоритета"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Будильник установлен"</string>
@@ -1351,8 +1348,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"Настройки заблок. экрана"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Разблокируйте устройство, чтобы настроить заблокированный экран"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Функция Wi-Fi недоступна"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Используется геолокация"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Камера заблокирована"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Камера и микрофон заблокированы"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Микрофон заблокирован"</string>
@@ -1400,6 +1396,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1406,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Жест \"Просмотр недавних приложений\""</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Готово"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Назад"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Чтобы вернуться назад, проведите по сенсорной панели тремя пальцами влево или вправо.\n\nВы также можете нажать клавишу действия + Esc."</string>
@@ -1419,14 +1416,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Чтобы перейти на главный экран, проведите снизу вверх тремя пальцами."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Неплохо!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Вы выполнили жест для перехода на главный экран."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Просмотр недавних приложений"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Проведите вверх по сенсорной панели тремя пальцами и удерживайте."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Отлично!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Вы выполнили жест для просмотра недавних приложений."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"Клавиша действия"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Чтобы перейти к приложениям, нажмите клавишу действия на клавиатуре."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"Готово!"</string>
@@ -1450,14 +1443,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"Для этого проведите тремя пальцами вверх и удерживайте. Нажмите, чтобы посмотреть другие жесты."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"Открывайте список всех приложений с помощью клавиатуры"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Для этого можно использовать клавишу действия. Нажмите, чтобы посмотреть другие жесты."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Дополнительно уменьшать яркость теперь можно через стандартный ползунок"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Вы можете дополнительно уменьшать яркость экрана, чтобы он был ещё темнее.\n\nТак как теперь это можно делать через стандартный ползунок, быстрые команды для дополнительного уменьшения яркости будут удалены."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Удалить быстрые команды для дополнительного уменьшения яркости"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Быстрые команды для дополнительного уменьшения яркости удалены."</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Подключение"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Специальные возможности"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Утилиты"</string>
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index b0e322e..7dd43a9 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -1179,10 +1179,8 @@
<string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
<string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"ස්පීකර් සහ සංදර්ශක"</string>
<string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"යෝජිත උපාංග"</string>
- <!-- no translation found for media_input_group_title (2057057473860783021) -->
- <skip />
- <!-- no translation found for media_output_group_title (6789001895863332576) -->
- <skip />
+ <string name="media_input_group_title" msgid="2057057473860783021">"ආදානය"</string>
+ <string name="media_output_group_title" msgid="6789001895863332576">"ප්රතිදානය"</string>
<string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"මාධ්ය වෙනත් උපාංගයකට ගෙන යාමට ඔබේ බෙදා ගත් සැසිය නවත්වන්න"</string>
<string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"නවත්වන්න"</string>
<string name="media_output_first_broadcast_title" msgid="6292237789860753022">"විකාශනය ක්රියා කරන ආකාරය"</string>
@@ -1398,6 +1396,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index 50d9828..a13a1b4 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -1293,8 +1293,7 @@
<string name="add" msgid="81036585205287996">"Pridať"</string>
<string name="manage_users" msgid="1823875311934643849">"Spravovať použ."</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"Toto upozornenie nepodporuje presun na rozdelenú obrazovku"</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"Aktívne miesto"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi nie je k dispozícii"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Režim priority"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Budík je nastavený"</string>
@@ -1351,8 +1350,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"Prispôsobiť uzamknutú obrazovku"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Uzamknutú obrazovku môžete prispôsobiť po odomknutí"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi‑Fi nie je k dispozícii"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Aktívne miesto"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera je blokovaná"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera a mikrofón sú blokované"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofón je blokovaný"</string>
@@ -1400,6 +1398,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1408,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Zobrazenie nedávnych aplikácií"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Hotovo"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Prejsť späť"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Ak chcete prejsť späť, potiahnite kdekoľvek na touchpade troma prstami doľava alebo doprava.\n\nMôžete použiť aj klávesovú skratku, teda akčný kláves + ESC."</string>
@@ -1419,14 +1418,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Na plochu môžete kedykoľvek prejsť potiahnutím troma prstami zdola obrazovky."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Výborne!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Dokončili ste gesto na prechod na plochu."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Zobrazenie nedávnych aplikácií"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Potiahnite troma prstami na touchpade nahor a pridržte ich."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Skvelé!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Dokončili ste gesto na zobrazenie nedávnych aplikácií."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"Akčný kláves"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Ak chcete získať prístup k aplikáciám, stlačte na klávesnici akčný kláves."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"Blahoželáme!"</string>
@@ -1450,14 +1445,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"Potiahnite troma prstami nahor a pridržte ich. Viac o gestách sa dozviete klepnutím."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"Zobrazte si všetky aplikácie pomocou klávesnice"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Akčný kláves môžete stlačiť kedykoľvek. Viac o gestách sa dozviete klepnutím."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Mimoriadne stmavenie je teraz súčasťou posúvača jasu"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Teraz môžete obrazovku mimoriadne stmaviť ešte ďalším znížením úrovne jasu.\n\nTáto funkcia je teraz súčasťou posúvača jasu, preto odstraňujeme skratky mimoriadneho stmavenia."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Odstrániť skratky mimoriadneho stmavenia"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Skratky mimoriadneho stmavenia boli odstránené"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Pripojenie"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Dostupnosť"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Utility"</string>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 6452a54..653bb58 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -1179,10 +1179,8 @@
<string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
<string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Zvočniki in zasloni"</string>
<string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Predlagane naprave"</string>
- <!-- no translation found for media_input_group_title (2057057473860783021) -->
- <skip />
- <!-- no translation found for media_output_group_title (6789001895863332576) -->
- <skip />
+ <string name="media_input_group_title" msgid="2057057473860783021">"Vhodno"</string>
+ <string name="media_output_group_title" msgid="6789001895863332576">"Izhodno"</string>
<string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Ustavi deljeno sejo za premik predstavnosti v drugo napravo."</string>
<string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Ustavi"</string>
<string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Kako deluje oddajanje"</string>
@@ -1398,6 +1396,7 @@
<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>
+ <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Ročica za vlečenje"</string>
<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>
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index 7ea8044..00484a7 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -1398,6 +1398,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 1930ead..3a940c1 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -1179,10 +1179,8 @@
<string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
<string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Звучници и екрани"</string>
<string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Предложени уређаји"</string>
- <!-- no translation found for media_input_group_title (2057057473860783021) -->
- <skip />
- <!-- no translation found for media_output_group_title (6789001895863332576) -->
- <skip />
+ <string name="media_input_group_title" msgid="2057057473860783021">"Улаз"</string>
+ <string name="media_output_group_title" msgid="6789001895863332576">"Излаз"</string>
<string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Зауставите дељену сесију да бисте преместили медијски садржај на други уређај"</string>
<string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Заустави"</string>
<string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Како функционише емитовање"</string>
@@ -1293,8 +1291,7 @@
<string name="add" msgid="81036585205287996">"Додај"</string>
<string name="manage_users" msgid="1823875311934643849">"Управљаj корисницима"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"Ово обавештење не подржава превлачење на подељени екран"</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"Локација је активна"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"WiFi није доступан"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Приоритетни режим"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Аларм је подешен"</string>
@@ -1351,8 +1348,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"Прилагоди закључани екран"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Откључајте да бисте прилагодили закључани екран"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"WiFi није доступан"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Локација је активна"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Камера је блокирана"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Камера и микрофон су блокирани"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Микрофон је блокиран"</string>
@@ -1400,6 +1396,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1406,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Прикажи недавно коришћене апликације"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Готово"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Назад"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Да бисте се вратили, превуците улево са три прста било где на тачпеду.\n\nМожете да користите и тастерску пречицу Alt + ESC за ово."</string>
@@ -1419,14 +1416,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Да бисте отишли на почетни екран у било ком тренутку, превуците нагоре од дна екрана помоћу три прста."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Свака част!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Довршили сте покрет за повратак на почетну страницу."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Прикажи недавно коришћене апликације"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Превуците нагоре и задржите помоћу три прста на тачпеду."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Одлично!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Довршили сте покрет за приказивање недавно коришћених апликација."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"Тастер радњи"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Да бисте приступили апликацијама, притисните тастер радњи на тастатури."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"Честитамо!"</string>
@@ -1450,14 +1443,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"Превуците нагоре и задржите са три прста. Додирните да бисте видели више покрета."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"Користите тастатуру да бисте прегледали све апликације"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Притисните тастер радњи у било ком тренутку. Додирните да бисте видели више покрета."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Додатно затамњивање је сада део клизача за осветљеност"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Сада можете додатно да затамните екран смањивањем нивоа осветљености. \n\nОва функција је сада део клизача за осветљеност, па се пречице за додатно затамњивање уклањају."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Уклони пречице за додатно затамњивање"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Уклоњене су пречице за додатно затамњивање"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Повезивање"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Приступачност"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Услужне апликације"</string>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index a4abb77..23f476d 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -1293,8 +1293,7 @@
<string name="add" msgid="81036585205287996">"Lägg till"</string>
<string name="manage_users" msgid="1823875311934643849">"Välj användare"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"Det går inte att dra den här aviseringen till delad skärm"</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"Aktiv plats"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wifi är inte tillgängligt"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Prioritetsläge"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarmet är aktiverat"</string>
@@ -1351,8 +1350,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"Anpassa låsskärmen"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Lås upp för att anpassa låsskärmen"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wifi är inte tillgängligt"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Aktiv plats"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kameran är blockerad"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kameran och mikrofonen är blockerade"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofonen är blockerad"</string>
@@ -1400,6 +1398,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1408,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Se de senaste apparna"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Klar"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Tillbaka"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Gå tillbaka genom att svepa åt vänster eller höger med tre fingrar var som helst på styrplattan.\n\nDu kan även använda kortkommandot Åtgärd + Esc."</string>
@@ -1419,14 +1418,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Öppna startskärmen när som helst genom att svepa uppåt med tre fingrar från skärmens nederkant."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Bra!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Du är klar med rörelsen för att öppna startskärmen."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Se de senaste apparna"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Svep uppåt med tre fingrar på styrplattan och håll kvar."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Bra jobbat!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Du är klar med rörelsen för att se de senaste apparna."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"Åtgärdstangent"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Tryck på åtgärdstangenten på tangentbordet för att komma åt dina appar."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"Grattis!"</string>
@@ -1450,14 +1445,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"Svep uppåt med tre fingrar och håll kvar. Tryck för att lära dig fler rörelser."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"Använd tangentbordet för att se alla appar"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Tryck på åtgärdstangenten när som helst. Tryck för att lära dig fler rörelser."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Extradimmat är nu en del av skjutreglaget för ljusstyrka"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Nu kan du göra skärmen extradimmad genom att sänka ljusstyrkan ännu mer.\n\nEftersom den här funktionen nu är en del av skjutreglaget för ljusstyrka tas kortkommandon för extradimmat bort."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Ta bort kortkommandon för extradimmat"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Kortkommandon för extradimmat har tagits bort"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Anslutning"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Tillgänglighet"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Verktyg"</string>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index 67ad0b5..dee6a5f 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -1293,8 +1293,7 @@
<string name="add" msgid="81036585205287996">"Weka"</string>
<string name="manage_users" msgid="1823875311934643849">"Dhibiti watumiaji"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"Arifa hii haitumii utaratibu wa kuburuta ili kugawa skrini"</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"Inatumia data ya mahali ulipo"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi-Fi haipatikani"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Hali ya kipaumbele"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Kengele imewekwa"</string>
@@ -1351,8 +1350,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"Wekea mapendeleo skrini iliyofungwa"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Fungua ili uweke mapendeleo ya skrini iliyofungwa"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi haipatikani"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Inatumia data ya mahali ulipo"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera imezuiwa"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera na maikrofoni zimezuiwa"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Maikrofoni imezuiwa"</string>
@@ -1400,6 +1398,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1408,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Angalia programu za hivi majuzi"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Nimemaliza"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Rudi nyuma"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Telezesha vidole vitatu kushoto au kulia mahali popote kwenye padi ya kugusa ili urudi nyuma.\n\nUnaweza pia kutumia mikato ya kibodi ya Kitendo pamoja na ESC kutekeleza kitendo hiki."</string>
@@ -1419,14 +1418,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Ili uende kwenye skrini ya kwanza wakati wowote, telezesha vidole vitatu juu kutoka sehemu ya chini ya skrini yako."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Safi!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Umeweka ishara ya kwenda kwenye skrini ya kwanza."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Angalia programu za hivi majuzi"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Telezesha vidole vitatu juu kisha ushikilie kwenye padi yako ya kugusa."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Kazi nzuri!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Umekamilisha mafunzo ya mguso wa kuangalia programu za hivi majuzi."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"Kitufe cha vitendo"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Bonyeza kitufe cha vitendo kwenye kibodi yako ili ufikie programu zako."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"Hongera!"</string>
@@ -1450,14 +1445,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"Telezesha vidole vitatu juu na ushikilie. Gusa ili upate maelezo kuhusu miguso zaidi."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"Kutumia kibodi yako kuangalia programu zote"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Bonyeza kitufe cha vitendo wakati wowote. Gusa ili upate maelezo kuhusu miguso zaidi."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Sasa kipunguza mwangaza zaidi ni sehemu ya kitelezi cha mwangaza"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Sasa unaweza kupunguza kiwango cha mwangaza wa skrini hata zaidi.\n\nKwa kuwa kipengele hiki sasa ni sehemu ya kitelezi cha mwangaza, njia za mkato za kipunguza mwangaza zaidi zinaondolewa."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Ondoa njia za mkato za kipunguza mwangaza zaidi"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Njia za mkato za kipunguza mwangaza zaidi zimeondolewa"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Muunganisho"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Ufikivu"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Vipengee"</string>
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index c574912..92da908 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -1293,8 +1293,7 @@
<string name="add" msgid="81036585205287996">"சேர்"</string>
<string name="manage_users" msgid="1823875311934643849">"பயனர்களை நிர்வகித்தல்"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"பிரிக்கப்பட்ட திரைக்குள் இந்த அறிவிப்பை இழுத்துவிட முடியாது"</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"இருப்பிடம் இயக்கத்திலுள்ளது"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"வைஃபை கிடைக்கவில்லை"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"முன்னுரிமைப் பயன்முறை"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"அலாரம் அமைக்கப்பட்டுள்ளது"</string>
@@ -1351,8 +1350,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"பூட்டுத் திரையை பிரத்தியேகமாக்கு"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"பூட்டுத் திரையைப் பிரத்தியேகப்படுத்த அன்லாக் செய்யுங்கள்"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"வைஃபை கிடைக்கவில்லை"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"இருப்பிடம் இயக்கத்திலுள்ளது"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"கேமரா தடுக்கப்பட்டுள்ளது"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"கேமராவும் மைக்ரோஃபோனும் தடுக்கப்பட்டுள்ளன"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"மைக்ரோஃபோன் தடுக்கப்பட்டுள்ளது"</string>
@@ -1400,6 +1398,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1408,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"சமீபத்திய ஆப்ஸைக் காட்டுதல்"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"முடிந்தது"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"பின்செல்"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"பின்செல்ல, உங்கள் டச்பேடில் எங்கு வேண்டுமானாலும் இடது அல்லது வலதுபுறமாக மூன்று விரல்களால் ஸ்வைப் செய்யவும்.\n\nஇதற்கு நீங்கள் கீபோர்டு ஷார்ட்கட் செயல்பாடுகள் + Esc பட்டனையும் பயன்படுத்தலாம்."</string>
@@ -1419,14 +1418,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"எப்போது வேண்டுமானாலும் உங்கள் முகப்புத் திரைக்குச் செல்ல, மூன்று விரல்களால் திரையின் கீழிருந்து மேல்நோக்கி ஸ்வைப் செய்யவும்."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"அற்புதம்!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"முகப்புக்குச் செல்வதற்கான சைகையை நிறைவுசெய்துவிட்டீர்கள்."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"சமீபத்திய ஆப்ஸைக் காட்டுதல்"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"உங்கள் டச்பேடில் மூன்று விரல்களால் மேல்நோக்கி ஸ்வைப் செய்து பிடிக்கவும்."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"அருமை!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"சமீபத்தில் பயன்படுத்திய ஆப்ஸுக்கான சைகை பயிற்சியை நிறைவுசெய்துவிட்டீர்கள்."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"ஆக்ஷன் பட்டன்"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"ஆப்ஸை அணுக உங்கள் கீபோர்டில் உள்ள ஆக்ஷன் பட்டனை அழுத்துங்கள்."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"வாழ்த்துகள்!"</string>
@@ -1450,14 +1445,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"மூன்று விரல்களால் மேல்நோக்கி ஸ்வைப் செய்து பிடிக்கவும். சைகைகள் குறித்து மேலும் அறிய தட்டவும்."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"அனைத்து ஆப்ஸையும் பார்க்க உங்கள் கீபோர்டைப் பயன்படுத்துங்கள்"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"எப்போது வேண்டுமானாலும் ஆக்ஷன் பட்டனை அழுத்தலாம். சைகைகள் குறித்து மேலும் அறிய தட்டவும்."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"மிகக் குறைவான வெளிச்சம் அம்சம் இப்போது ஒளிர்வு ஸ்லைடரின் ஒரு பகுதியாகும்"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"இப்போது ஒளிர்வு அளவைக் குறைப்பதன் மூலம் திரையை மிகக் குறைவான வெளிச்சத்தில் பயன்படுத்தலாம்.\n\nஇந்த அம்சம் ஒளிர்வு ஸ்லைடர் அம்சத்தின் ஒரு பகுதி என்பதால் மிகக் குறைவான வெளிச்சத்திற்கான ஷார்ட்கட்கள் அகற்றப்படுகின்றன."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"மிகக் குறைவான வெளிச்சத்திற்கான ஷார்ட்கட்களை அகற்றும்"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"மிகக் குறைவான வெளிச்சத்திற்கான ஷார்ட்கட்கள் அகற்றப்பட்டன"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"இணைப்புநிலை"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"மாற்றுத்திறன் வசதி"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"யூட்டிலிட்டி சேவைகள்"</string>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index f4bf055..16500ed 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -1179,10 +1179,8 @@
<string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
<string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"స్పీకర్లు & డిస్ప్లేలు"</string>
<string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"సూచించబడిన పరికరాలు"</string>
- <!-- no translation found for media_input_group_title (2057057473860783021) -->
- <skip />
- <!-- no translation found for media_output_group_title (6789001895863332576) -->
- <skip />
+ <string name="media_input_group_title" msgid="2057057473860783021">"ఇన్పుట్"</string>
+ <string name="media_output_group_title" msgid="6789001895863332576">"అవుట్పుట్"</string>
<string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"మీడియాను మరొక పరికరానికి తరలించడానికి మీ షేర్ చేసిన సెషన్ను ఆపండి"</string>
<string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"ఆపండి"</string>
<string name="media_output_first_broadcast_title" msgid="6292237789860753022">"ప్రసారం కావడం అనేది ఎలా పని చేస్తుంది"</string>
@@ -1398,6 +1396,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index 4224831..6bfc9f9 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -1179,10 +1179,8 @@
<string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
<string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"ลำโพงและจอแสดงผล"</string>
<string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"อุปกรณ์ที่แนะนำ"</string>
- <!-- no translation found for media_input_group_title (2057057473860783021) -->
- <skip />
- <!-- no translation found for media_output_group_title (6789001895863332576) -->
- <skip />
+ <string name="media_input_group_title" msgid="2057057473860783021">"อินพุต"</string>
+ <string name="media_output_group_title" msgid="6789001895863332576">"เอาต์พุต"</string>
<string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"หยุดเซสชันที่แชร์อยู่เพื่อย้ายสื่อไปยังอุปกรณ์อื่น"</string>
<string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"หยุด"</string>
<string name="media_output_first_broadcast_title" msgid="6292237789860753022">"วิธีการทำงานของการออกอากาศ"</string>
@@ -1293,8 +1291,7 @@
<string name="add" msgid="81036585205287996">"เพิ่ม"</string>
<string name="manage_users" msgid="1823875311934643849">"จัดการผู้ใช้"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"การแจ้งเตือนนี้ไม่รองรับการลากเพื่อแยกหน้าจอ"</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"ตำแหน่งที่ใช้งานอยู่"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"ใช้ Wi‑Fi ไม่ได้"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"โหมดลำดับความสำคัญ"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"ตั้งปลุกแล้ว"</string>
@@ -1351,8 +1348,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"ปรับแต่งหน้าจอล็อก"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"ปลดล็อกเพื่อปรับแต่งหน้าจอล็อก"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi ไม่พร้อมใช้งาน"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"ตำแหน่งที่ใช้งานอยู่"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"กล้องถูกบล็อกอยู่"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"กล้องและไมโครโฟนถูกบล็อกอยู่"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"ไมโครโฟนถูกบล็อกอยู่"</string>
@@ -1400,6 +1396,7 @@
<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>
+ <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"แฮนเดิลการลาก"</string>
<string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"ไปยังส่วนต่างๆ โดยใช้แป้นพิมพ์"</string>
<string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"ดูข้อมูลเกี่ยวกับแป้นพิมพ์ลัด"</string>
<string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"ไปยังส่วนต่างๆ โดยใช้ทัชแพด"</string>
@@ -1408,8 +1405,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"ดูแอปล่าสุด"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"เสร็จสิ้น"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"ย้อนกลับ"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"หากต้องการย้อนกลับ ให้ใช้ 3 นิ้วปัดไปทางซ้ายหรือขวาที่ใดก็ได้บนทัชแพด\n\nหรือใช้การดำเนินการแป้นพิมพ์ลัด + ESC ได้เช่นเดียวกัน"</string>
@@ -1419,14 +1415,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"ใช้ 3 นิ้วปัดขึ้นจากด้านล่างของหน้าจอเพื่อไปที่หน้าจอหลักได้ทุกเมื่อ"</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"ดีมาก"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"คุณทำท่าทางสัมผัสเพื่อไปที่หน้าแรกเสร็จแล้ว"</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"ดูแอปล่าสุด"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"ใช้ 3 นิ้วปัดขึ้นแล้วค้างไว้บนทัชแพด"</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"เยี่ยมมาก"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"คุณทำท่าทางสัมผัสเพื่อดูแอปล่าสุดสำเร็จแล้ว"</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"ปุ่มดำเนินการ"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"หากต้องการเข้าถึงแอป ให้กดปุ่มดำเนินการบนแป้นพิมพ์"</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"ยินดีด้วย"</string>
@@ -1450,14 +1442,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"ใช้ 3 นิ้วปัดขึ้นแล้วค้างไว้ แตะเพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับท่าทางสัมผัสต่างๆ"</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"ใช้แป้นพิมพ์เพื่อดูแอปทั้งหมด"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"กดปุ่มดำเนินการได้ทุกเมื่อ แตะเพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับท่าทางสัมผัสต่างๆ"</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"ตอนนี้การหรี่แสงเพิ่มเติมเป็นส่วนหนึ่งของแถบเลื่อนความสว่างแล้ว"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"ตอนนี้คุณสามารถหรี่แสงหน้าจอเพิ่มเติมได้โดยการลดระดับความสว่างลงไปอีก\n\nเนื่องจากฟีเจอร์นี้เป็นส่วนหนึ่งของแถบเลื่อนความสว่างแล้ว เราจึงนำทางลัดหรี่แสงเพิ่มเติมออก"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"นำทางลัดหรี่แสงเพิ่มเติมออก"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"นำทางลัดหรี่แสงเพิ่มเติมออกแล้ว"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"การเชื่อมต่อ"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"การช่วยเหลือพิเศษ"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"ยูทิลิตี"</string>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index 5145f26..4f3819b 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -1179,10 +1179,8 @@
<string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
<string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Mga Speaker at Display"</string>
<string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Mga Iminumungkahing Device"</string>
- <!-- no translation found for media_input_group_title (2057057473860783021) -->
- <skip />
- <!-- no translation found for media_output_group_title (6789001895863332576) -->
- <skip />
+ <string name="media_input_group_title" msgid="2057057473860783021">"Input"</string>
+ <string name="media_output_group_title" msgid="6789001895863332576">"Output"</string>
<string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Ihinto ang iyong nakabahaging session para maglipat ng media sa ibang device"</string>
<string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Ihinto"</string>
<string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Paano gumagana ang pag-broadcast"</string>
@@ -1293,8 +1291,7 @@
<string name="add" msgid="81036585205287996">"Magdagdag"</string>
<string name="manage_users" msgid="1823875311934643849">"Pamahalaan ang mga user"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"Hindi sinusuportahan ng notification na ito ang pag-drag sa split screen"</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"Aktibo ang lokasyon"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Hindi available ang Wi‑Fi"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Priority mode"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Nakatakda ang alarm"</string>
@@ -1351,8 +1348,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"I-customize ang lock screen"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"I-unlock para i-customize ang lock screen"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Hindi available ang Wi-Fi"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Aktibo ang lokasyon"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Naka-block ang camera"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Naka-block ang camera at mikropono"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Naka-block ang mikropono"</string>
@@ -1400,6 +1396,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1406,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Tingnan ang mga kamakailang app"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Tapos na"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Bumalik"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Para bumalik, mag-swipe pakaliwa o pakanan gamit ang tatlong daliri saanman sa touchpad.\n\nPuwede mo ring gamitin ang keyboard shortcut na Action + ESC para dito."</string>
@@ -1419,14 +1416,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Para pumunta sa iyong home screen anumang oras, mag-swipe pataas gamit ang tatlong daliri mula sa ibaba ng screen. mo."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Magaling!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Nakumpleto mo na ang galaw para pumunta sa home."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Tingnan ang mga kamakailang app"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Mag-swipe pataas at i-hold gamit ang tatlong daliri sa iyong touchpad."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Magaling!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Nakumpleto mo ang galaw sa pag-view ng mga kamakailang app."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"Action key"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Para ma-access ang iyong mga app, pindutin ang action key sa keyboard mo."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"Binabati kita!"</string>
@@ -1450,14 +1443,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"Mag-swipe pataas at i-hold gamit ang tatlong daliri. I-tap para matuto pa tungkol sa mga galaw."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"Gamitin ang iyong keyboard para tingnan ang lahat ng app"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Pindutin ang action key kahit kailan. I-tap para matuto pa tungkol sa mga galaw."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Bahagi na ng slider ng liwanag ang extra dim"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Puwede mo nang gawing extra dim ang screen sa pamamagitan ng pagbababa pa sa antas ng liwanag .\n\nDahil bahagi na ang feature na ito ng slider ng liwanag, aalisin na ang mga shortcut sa extra dim."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Alisin ang mga shortcut sa extra dim"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Inalis ang mga shortcut sa extra dim"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Pagkakonekta"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Accessibility"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Mga Utility"</string>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index 63c9a3c..19fad73 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -1293,8 +1293,7 @@
<string name="add" msgid="81036585205287996">"Ekle"</string>
<string name="manage_users" msgid="1823875311934643849">"Kullanıcıları yönet"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"Bu bildirim bölünmüş ekrana sürüklemeyi desteklemiyor"</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"Konum etkin"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Kablosuz kullanılamıyor"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Öncelik modu"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarm kuruldu"</string>
@@ -1351,8 +1350,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"Kilit ekranını özelleştir"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Kilit ekranını özelleştirmek için kilidi açın"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Kablosuz bağlantı kullanılamıyor"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Konum etkin"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera engellendi"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera ve mikrofon engellendi"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon engellendi"</string>
@@ -1400,6 +1398,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1408,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Son uygulamaları görüntüle"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Bitti"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Geri dön"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Geri dönmek için dokunmatik alanın herhangi bir yerinde üç parmağınızla sola veya sağa kaydırın.\n\nDilerseniz işlem düğmesi + Esc klavye kısayolunu kullanarak da geri dönebilirsiniz."</string>
@@ -1419,14 +1418,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"İstediğiniz zaman ana ekrana gitmek için üç parmağınızla ekranınızın altından yukarı doğru kaydırın."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Güzel!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Ana ekrana git hareketini tamamladınız."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Son uygulamaları görüntüle"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Dokunmatik alanda üç parmağınızla yukarı doğru kaydırıp basılı tutun."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Tebrikler!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Son uygulamaları görüntüleme hareketini tamamladınız."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"Eylem tuşu"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Uygulamalarınıza erişmek için klavyenizdeki eylem tuşuna basın."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"Tebrikler!"</string>
@@ -1450,14 +1445,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"Üç parmağınızla yukarı kaydırıp basılı tutun. Daha fazla hareket öğrenmek için dokunun."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"Tüm uygulamaları görüntülemek için klavyenizi kullanın"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"İstediğiniz zaman eylem tuşuna basın. Daha fazla hareket öğrenmek için dokunun."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Ekstra loş özelliği, parlaklık kaydırma çubuğuna eklendi"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Artık parlaklık seviyesini daha da düşürerek ekranı ekstra loş hale getirebilirsiniz.\n\nBu özellik artık parlaklık kaydırma çubuğuna eklendiği için ekstra loş kısayolları kaldırılıyor."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Ekstra loş kısayollarını kaldır"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Ekstra loş kısayolları kaldırıldı"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Bağlantı"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Erişilebilirlik"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Yardımcı programlar"</string>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index 98ed6c04..453ce4a 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -1293,8 +1293,7 @@
<string name="add" msgid="81036585205287996">"Додати"</string>
<string name="manage_users" msgid="1823875311934643849">"Керувати користувачами"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"Це сповіщення не підтримує режим розділеного екрана"</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"Геолокацію ввімкнено"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Мережа Wi-Fi недоступна"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Режим пріоритету"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Будильник установлено"</string>
@@ -1351,8 +1350,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"Налаштувати заблокований екран"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Розблокуйте, щоб налаштувати заблокований екран"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Мережа Wi-Fi недоступна"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Геолокацію ввімкнено"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Камеру заблоковано"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Камеру й мікрофон заблоковано"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Мікрофон заблоковано"</string>
@@ -1400,6 +1398,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1408,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Переглянути нещодавні додатки"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Готово"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Назад"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Щоб перейти назад, проведіть трьома пальцями вліво або вправо по сенсорній панелі.\n\nТакож можна скористатися комбінацією \"клавіша дії\" + ESC."</string>
@@ -1419,14 +1418,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Щоб будь-коли перейти на головний екран, проведіть трьома пальцями вгору від нижнього краю екрана."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Чудово!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Ви виконали жест переходу на головний екран."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Переглянути нещодавні додатки"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Проведіть трьома пальцями вгору й утримуйте їх на сенсорній панелі."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Чудово!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Ви виконали жест для перегляду нещодавно відкритих додатків."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"Клавіша дії"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Щоб переглянути додатки, натисніть клавішу дії на клавіатурі."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"Вітаємо!"</string>
@@ -1450,14 +1445,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"Проведіть трьома пальцями вгору й утримуйте їх на екрані. Натисніть, щоб дізнатися про інші жести."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"Щоб переглянути всі додатки, використовуйте клавіатуру"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Будь-коли натисніть клавішу дії. Натисніть, щоб дізнатися про інші жести."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Тепер функція додаткового зменшення яскравості активується за допомогою повзунка"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Тепер ви можете зробити екран ще темнішим, додатково зменшуючи рівень яскравості.\n\nОскільки тепер ця функція активується за допомогою повзунка яскравості, комбінації клавіш для додаткового зменшення яскравості буде вилучено."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Вилучити комбінації клавіш для додаткового зменшення яскравості"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Комбінації клавіш для додаткового зменшення яскравості вилучено"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Обмін даними"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Функції доступності"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Утиліти"</string>
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index cd57d52..9865c8d 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -1179,10 +1179,8 @@
<string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"%%<xliff:g id="PERCENTAGE">%1$d</xliff:g>"</string>
<string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"اسپیکرز اور ڈسپلیز"</string>
<string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"تجویز کردہ آلات"</string>
- <!-- no translation found for media_input_group_title (2057057473860783021) -->
- <skip />
- <!-- no translation found for media_output_group_title (6789001895863332576) -->
- <skip />
+ <string name="media_input_group_title" msgid="2057057473860783021">"ان پٹ"</string>
+ <string name="media_output_group_title" msgid="6789001895863332576">"آؤٹ پٹ"</string>
<string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"میڈیا کو دوسرے آلے پر منتقل کرنے کے لیے اپنا مشترکہ سیشن بند کریں"</string>
<string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"بند کریں"</string>
<string name="media_output_first_broadcast_title" msgid="6292237789860753022">"براڈکاسٹنگ کیسے کام کرتا ہے"</string>
@@ -1398,6 +1396,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index 07faf6a..cd4cc0d 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -1293,8 +1293,7 @@
<string name="add" msgid="81036585205287996">"Kiritish"</string>
<string name="manage_users" msgid="1823875311934643849">"Foyd-ni boshqarish"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"Bu bildirishnoma ikkiga ajratilgan ekranda ishlamaydi."</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"Joylashuv faol"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi ishlamayapti"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Imtiyozli rejim"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Signal oʻrnatildi"</string>
@@ -1351,8 +1350,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"Ekran qulfini moslash"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Ekran qulfini sozlash uchun qulfni oching"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi mavjud emas"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Joylashuv faol"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera bloklangan"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera va mikrofon bloklangan"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon bloklangan"</string>
@@ -1400,6 +1398,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1408,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Oxirgi ilovalarni koʻrish"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Tayyor"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Orqaga qaytish"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Ortga qaytish uchun sensorli panelda uchta barmoqni chapga yoki oʻngga suring.\n\nBuning uchun Action + ESC tezkor tugmalaridan ham foydalanishingiz mumkin."</string>
@@ -1419,14 +1418,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Istalgan vaqtda bosh ekranga oʻtish uchun ekranning pastidan uchta barmoq bilan tepaga suring."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Yaxshi!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Bosh ekranni ochish ishorasi darsini tamomladingiz."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Oxirgi ilovalarni koʻrish"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Sensorli panelda uchta barmoq bilan tepaga surib, bosib turing."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Barakalla!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Oxirgi ilovalarni koʻrish ishorasini tugalladingiz."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"Amal tugmasi"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Ilovalarga kirish uchun klaviaturadagi amal tugmasini bosing"</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"Tabriklaymiz!"</string>
@@ -1450,14 +1445,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"Uchta barmoq bilan tepaga surib, bosib turing. Boshqa ishoralar bilan tanishish uchun bosing."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"Klaviatura orqali barcha ilovalarni koʻrish"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Amal tugmasini istalganda bosing. Boshqa ishoralar bilan tanishish uchun bosing."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Juda xira endi yorqinlik slayderida joylashgan"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Endi yorqinlik darajasini yanada pasaytirish orqali ekranni yanada xiralashtirishingiz mumkin.\n\nBu funksiya yorqinlik slayderiga kiritilgani uchun \"juda xira\" buyruqlari olib tashlanmoqda."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Juda xira buyruqlarini olib tashlash"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Juda xira buyruqlari olib tashlandi"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Aloqa"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Qulayliklar"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Vositalar"</string>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index 279fe1e..28a6900 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -1293,8 +1293,7 @@
<string name="add" msgid="81036585205287996">"Thêm"</string>
<string name="manage_users" msgid="1823875311934643849">"Quản lý ng.dùng"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"Thông báo này không hỗ trợ thao tác kéo để chia đôi màn hình"</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"Vị trí đang hoạt động"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Không có Wi‑Fi"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Chế độ ưu tiên"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Đã đặt chuông báo"</string>
@@ -1351,8 +1350,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"Tuỳ chỉnh màn hình khoá"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Mở khoá để tuỳ chỉnh màn hình khoá"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Không có Wi-Fi"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Vị trí đang hoạt động"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Máy ảnh bị chặn"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Máy ảnh và micrô bị chặn"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Micrô bị chặn"</string>
@@ -1400,6 +1398,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1408,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Xem các ứng dụng gần đây"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Xong"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Quay lại"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Để quay lại, hãy dùng 3 ngón tay vuốt sang trái hoặc sang phải ở vị trí bất kỳ trên bàn di chuột.\n\nBạn cũng có thể dùng phím tắt Hành động + ESC cho thao tác này."</string>
@@ -1419,14 +1418,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Để chuyển đến màn hình chính bất cứ lúc nào, hãy dùng 3 ngón tay vuốt lên từ cuối màn hình lên."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Tốt lắm!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Bạn đã thực hiện xong cử chỉ chuyển đến màn hình chính."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Xem các ứng dụng gần đây"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Dùng 3 ngón tay vuốt lên và giữ trên bàn di chuột."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Tuyệt vời!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Bạn đã hoàn tất cử chỉ xem ứng dụng gần đây."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"Phím hành động"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Để truy cập vào các ứng dụng của bạn, hãy nhấn phím hành động trên bàn phím."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"Xin chúc mừng!"</string>
@@ -1450,14 +1445,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"Dùng 3 ngón tay vuốt lên và giữ. Hãy nhấn để tìm hiểu các cử chỉ khác."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"Sử dụng bàn phím để xem tất cả ứng dụng"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Nhấn phím hành động bất cứ lúc nào. Hãy nhấn để tìm hiểu các cử chỉ khác."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Tính năng siêu tối hiện đã có trên thanh trượt điều chỉnh độ sáng"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Giờ đây, bạn có thể giảm thêm độ sáng để làm màn hình trở nên siêu tối.\n\nVì tính năng này hiện đã có trên thanh trượt điều chỉnh độ sáng nên lối tắt đến tính năng siêu tối sẽ bị xoá."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Xoá lối tắt đến tính năng siêu tối"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Đã xoá lối tắt đến tính năng siêu tối"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Khả năng kết nối"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Hỗ trợ tiếp cận"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Phần mềm tiện ích"</string>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 6b1f0a7..267f392 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -667,7 +667,7 @@
<string name="volume_ringer_status_normal" msgid="1339039682222461143">"响铃"</string>
<string name="volume_ringer_status_vibrate" msgid="6970078708957857825">"振动"</string>
<string name="volume_ringer_status_silent" msgid="3691324657849880883">"静音"</string>
- <string name="media_device_cast" msgid="4786241789687569892">"投屏"</string>
+ <string name="media_device_cast" msgid="4786241789687569892">"投放"</string>
<string name="stream_notification_unavailable" msgid="4313854556205836435">"该功能无法使用,因为铃声被静音"</string>
<string name="stream_alarm_unavailable" msgid="4059817189292197839">"“勿扰”模式已开启,因此无法调整音量"</string>
<string name="stream_media_unavailable" msgid="6823020894438959853">"“勿扰”模式已开启,因此无法调整音量"</string>
@@ -1293,8 +1293,7 @@
<string name="add" msgid="81036585205287996">"添加"</string>
<string name="manage_users" msgid="1823875311934643849">"管理用户"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"此通知不支持拖动到分屏中"</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"正在使用位置信息"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"WLAN 已关闭"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"优先模式"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"闹钟已设置"</string>
@@ -1351,8 +1350,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"自定义锁屏"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"解锁以自定义锁定屏幕"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"没有 WLAN 连接"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"正在使用位置信息"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"已禁用摄像头"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"已禁用摄像头和麦克风"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"已禁用麦克风"</string>
@@ -1400,6 +1398,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1408,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"查看最近用过的应用"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"完成"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"返回"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"如要返回,请使用三根手指在触控板上的任意位置左滑或右滑。\n\n您也可以使用键盘快捷操作键 + ESC 键进行返回。"</string>
@@ -1419,14 +1418,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"若要随时进入主屏幕,请用三根手指从屏幕的底部向上滑动。"</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"很好!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"您完成了“前往主屏幕”手势教程。"</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"查看最近用过的应用"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"在触控板上用三根手指向上滑动并按住。"</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"太棒了!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"您已完成“查看最近用过的应用”的手势教程。"</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"快捷操作按键"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"如要访问您的应用,请按下键盘上的快捷操作按键。"</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"恭喜!"</string>
@@ -1450,14 +1445,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"用三根手指向上滑动并按住。点按即可了解更多手势。"</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"使用键盘查看所有应用"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"您可随时按下快捷操作按键。点按即可了解更多手势。"</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"“极暗”功能现已在亮度滑块中"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"现在,您可进一步调低亮度,将屏幕调成极暗。\n\n由于此功能现已在亮度滑块中,“极暗”快捷方式即将被移除。"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"移除“极暗”快捷方式"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"“极暗”快捷方式已移除"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"连接"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"无障碍功能"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"实用程序"</string>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index 13b1a0f..c08835a 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -1293,8 +1293,7 @@
<string name="add" msgid="81036585205287996">"新增"</string>
<string name="manage_users" msgid="1823875311934643849">"管理使用者"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"此通知無法拖曳到分割螢幕中。"</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"正在使用位置權限"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi 已關閉"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"優先模式"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"已設定鬧鐘"</string>
@@ -1351,8 +1350,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"自訂上鎖畫面"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"解鎖後即可自訂上鎖畫面"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"無法連線至 Wi-Fi"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"正在使用位置權限"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"已封鎖相機"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"已封鎖相機和麥克風"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"已封鎖麥克風"</string>
@@ -1400,6 +1398,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1408,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"查看最近使用的應用程式"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"完成"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"返回"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"用三隻手指在觸控板上任何一處向左或向右滑動即可返回。\n\n你也可使用鍵盤快速鍵 Action 鍵 + Esc 鍵執行此操作。"</string>
@@ -1419,14 +1418,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"只要用三隻手指從螢幕底部向上滑動,隨時可以返回主畫面。"</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"做得好!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"你已完成「返回主畫面」手勢的教學課程。"</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"查看最近使用的應用程式"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"用三隻手指在觸控板向上滑動並按住。"</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"做得好!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"你已完成「查看最近使用的應用程式」手勢的教學課程。"</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"快捷操作鍵"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"如要存取應用程式,請在鍵盤上按下快捷操作鍵。"</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"恭喜!"</string>
@@ -1450,14 +1445,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"用三隻手指向上滑動並按住。輕按即可瞭解更多手勢。"</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"使用鍵盤查看所有應用程式"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"隨時按下快捷操作鍵。輕按即可瞭解更多手勢。"</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"亮度滑桿現已加入超暗功能"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"而家只要將亮度校得越低,螢幕就會更加暗。\n\n由於亮度滑桿而家加入咗呢個功能,所以系統將會移除超暗功能捷徑。"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"移除超暗功能捷徑"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"超暗功能捷徑已移除"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"裝置連接"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"無障礙功能"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"實用程式"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index 0107819..787698c 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -1293,8 +1293,7 @@
<string name="add" msgid="81036585205287996">"新增"</string>
<string name="manage_users" msgid="1823875311934643849">"管理使用者"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"這項通知無法拖曳到分割畫面中。"</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"正在使用位置權限"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi 已關閉"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"優先模式"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"鬧鐘設定成功"</string>
@@ -1351,8 +1350,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"自訂螢幕鎖定畫面"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"解鎖後即可自訂螢幕鎖定畫面"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"無法連上 Wi-Fi"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"正在使用位置權限"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"已封鎖攝影機"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"已封鎖攝影機和麥克風"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"已封鎖麥克風"</string>
@@ -1400,6 +1398,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1408,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"查看最近使用的應用程式"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"完成"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"返回"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"如要返回,請在觸控板的任何位置上用三指向左或向右滑動。\n\n使用快捷操作鍵 + ESC 鍵 (鍵盤快速鍵) 也可以返回。"</string>
@@ -1419,14 +1418,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"用 3 指從螢幕底部向上滑動,就能隨時返回主畫面。"</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"太棒了!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"你已完成「返回主畫面」手勢的教學課程。"</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"查看最近使用的應用程式"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"在觸控板上用三指向上滑動並按住。"</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"太棒了!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"你已完成「查看最近使用的應用程式」手勢的教學課程。"</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"快捷操作鍵"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"如要存取應用程式,請按下鍵盤上的快捷操作鍵。"</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"恭喜!"</string>
@@ -1450,14 +1445,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"用三指向上滑動並按住。輕觸即可進一步瞭解手勢。"</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"使用鍵盤查看所有應用程式"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"你隨時可以按下快捷操作鍵。輕觸即可進一步瞭解手勢。"</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"「超暗」已併入亮度滑桿"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"現在只要將亮度調得更低,螢幕就會變得更暗。\n\n這項功能已併入亮度滑桿,因此系統將移除「超暗」捷徑。"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"移除「超暗」捷徑"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"「超暗」捷徑已移除"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"連線"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"無障礙"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"公用程式"</string>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index 8eddc80..3205b0e 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -1293,8 +1293,7 @@
<string name="add" msgid="81036585205287996">"Faka"</string>
<string name="manage_users" msgid="1823875311934643849">"Phatha abasebenzisi"</string>
<string name="drag_split_not_supported" msgid="7173481676120546121">"Lesi saziso asikusekeli ukuhudulela ekuhlukaniseni isikrini."</string>
- <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
- <skip />
+ <string name="dream_overlay_location_active" msgid="6484763493158166618">"Indawo iyasebenza"</string>
<string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"I-Wi-Fi ayitholakali"</string>
<string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Imodi ebalulekile"</string>
<string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"I-alamu isethiwe"</string>
@@ -1351,8 +1350,7 @@
<string name="lock_screen_settings" msgid="6152703934761402399">"Yenza ngokwezifiso ukukhiya isikrini"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Vula ukuze wenze ukuvala isikrini ngendlela oyifisayo"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"I-Wi-Fi ayitholakali"</string>
- <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
- <skip />
+ <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Indawo iyasebenza"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Ikhamera ivinjiwe"</string>
<string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Ikhamera nemakrofoni zivinjiwe"</string>
<string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Imakrofoni ivinjiwe"</string>
@@ -1400,6 +1398,8 @@
<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 shortcut_helper_content_description_drag_handle (5092426406009848110) -->
+ <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>
@@ -1408,8 +1408,7 @@
<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>
- <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
- <skip />
+ <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Buka ama-app akamuva"</string>
<string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Kwenziwe"</string>
<string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Buyela emuva"</string>
<string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Ukuze ubuyele emuva, swayiphela kwesokunxele noma kwesokudla usebenzisa iminwe emithathu noma yikuphi ephedini yokuthinta.\n\nUngasebenzisa nesinqamuleli sekhibhodi Isenzo + ESC kulokhu."</string>
@@ -1419,14 +1418,10 @@
<string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Ukuze uye esikrinini sakho sasekhaya nganoma isiphi isikhathi, swayipha uye phezulu ngeminwe emithathu usuka phansi esikrinini sakho."</string>
<string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Kuhle!"</string>
<string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Ukuqedile ukuthinta kokuya ekhaya."</string>
- <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
- <skip />
- <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
- <skip />
+ <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Buka ama-app akamuva"</string>
+ <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Swayiphela phezulu bese ubamba usebenzisa iminwe emithathu kuphedi yokuthinta."</string>
+ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Umsebenzi omuhle!"</string>
+ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Uqedele ukubuka ukuthinta kwama-app akamuva."</string>
<string name="tutorial_action_key_title" msgid="2659466586996495447">"Inkinobho yokufinyelela"</string>
<string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Ukuze ufinyelele ama-app wakho, cindezela inkinobho yokufinyelela kukhibhodi yakho."</string>
<string name="tutorial_action_key_success_title" msgid="466467860120112933">"Halala!"</string>
@@ -1450,14 +1445,10 @@
<string name="overview_edu_notification_content" msgid="3578204677648432500">"Swayiphela phezulu bese uyabamba usebenzisa iminwe emithathu. Thepha ukuze ufunde kabanzi ngokunyakazisa umzimba."</string>
<string name="all_apps_edu_notification_title" msgid="372262997265569063">"Sebenzisa ikhibhodi yakho ukubuka wonke ama-app"</string>
<string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Cindezela inkinobho yokufinyelela noma kunini. Thepha ukuze ufunde kabanzi ngokunyakazisa umzimba."</string>
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
- <skip />
- <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
- <skip />
+ <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Ukufiphala okwengeziwe manje sekuyingxenye yokukhanya kwesislayida"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Manje ungenza isikrini sifiphaze ngokwengeziwe ngokwehlisa izinga lokukhanya nakakhulu.\n\nNjengoba lesi sakhi manje sesiyingxenye yesilayida sokukhanya, izinqamuleli ezokufiphaza okwengeziwe ziyasuswa."</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Susa izinqamuleli zokufiphaza okwengeziwe"</string>
+ <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Izinqamuleli zokufiphaza okwengeziwe zisusiwe"</string>
<string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Ukuxhumana"</string>
<string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Ukufinyeleleka"</string>
<string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Okusetshenziswayo"</string>
diff --git a/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt b/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt
index c1eae2e..e5cf7cf 100644
--- a/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt
+++ b/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt
@@ -15,12 +15,15 @@
*/
package com.android.keyguard
+import android.app.NotificationManager.zenModeFromInterruptionFilter
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.content.res.Resources
import android.os.Trace
+import android.provider.Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS
+import android.provider.Settings.Global.ZEN_MODE_OFF
import android.text.format.DateFormat
import android.util.Log
import android.util.TypedValue
@@ -49,6 +52,7 @@
import com.android.systemui.keyguard.shared.model.TransitionState
import com.android.systemui.lifecycle.repeatWhenAttached
import com.android.systemui.log.core.Logger
+import com.android.systemui.modes.shared.ModesUi
import com.android.systemui.plugins.clocks.AlarmData
import com.android.systemui.plugins.clocks.ClockController
import com.android.systemui.plugins.clocks.ClockFaceController
@@ -63,6 +67,7 @@
import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.statusbar.policy.ZenModeController
+import com.android.systemui.statusbar.policy.domain.interactor.ZenModeInteractor
import com.android.systemui.util.concurrency.DelayableExecutor
import java.util.Locale
import java.util.TimeZone
@@ -97,12 +102,13 @@
private val clockBuffers: ClockMessageBuffers,
private val featureFlags: FeatureFlagsClassic,
private val zenModeController: ZenModeController,
+ private val zenModeInteractor: ZenModeInteractor,
) {
var loggers =
listOf(
clockBuffers.infraMessageBuffer,
clockBuffers.smallClockMessageBuffer,
- clockBuffers.largeClockMessageBuffer
+ clockBuffers.largeClockMessageBuffer,
)
.map { Logger(it, TAG) }
@@ -146,7 +152,7 @@
bgExecutor,
regionSamplingEnabled,
isLockscreen = true,
- ::updateColors
+ ::updateColors,
)
.apply { startRegionSampler() }
@@ -157,7 +163,7 @@
bgExecutor,
regionSamplingEnabled,
isLockscreen = true,
- ::updateColors
+ ::updateColors,
)
.apply { startRegionSampler() }
@@ -271,7 +277,7 @@
bgExecutor: Executor?,
regionSamplingEnabled: Boolean,
isLockscreen: Boolean,
- updateColors: () -> Unit
+ updateColors: () -> Unit,
): RegionSampler {
return RegionSampler(
sampledView,
@@ -384,24 +390,30 @@
}
}
+ @VisibleForTesting
+ internal fun listenForDnd(scope: CoroutineScope): Job {
+ ModesUi.assertInNewMode()
+ return scope.launch {
+ zenModeInteractor.dndMode.collect {
+ val zenMode =
+ if (it != null && it.isActive)
+ zenModeFromInterruptionFilter(
+ it.interruptionFilter,
+ ZEN_MODE_IMPORTANT_INTERRUPTIONS,
+ )
+ else ZEN_MODE_OFF
+
+ handleZenMode(zenMode)
+ }
+ }
+ }
+
private val zenModeCallback =
object : ZenModeController.Callback {
override fun onZenChanged(zen: Int) {
- var mode = ZenMode.fromInt(zen)
- if (mode == null) {
- Log.e(TAG, "Failed to get zen mode from int: $zen")
- return
+ if (!ModesUi.isEnabled) {
+ handleZenMode(zen)
}
-
- zenData =
- ZenData(
- mode,
- if (mode == ZenMode.OFF) SysuiR.string::dnd_is_off.name
- else SysuiR.string::dnd_is_on.name
- )
- .also { data ->
- mainExecutor.execute { clock?.run { events.onZenDataChanged(data) } }
- }
}
override fun onNextAlarmChanged() {
@@ -409,7 +421,7 @@
alarmData =
AlarmData(
if (nextAlarmMillis > 0) nextAlarmMillis else null,
- SysuiR.string::status_bar_alarm.name
+ SysuiR.string::status_bar_alarm.name,
)
.also { data ->
mainExecutor.execute { clock?.run { events.onAlarmDataChanged(data) } }
@@ -417,6 +429,24 @@
}
}
+ private fun handleZenMode(zen: Int) {
+ val mode = ZenMode.fromInt(zen)
+ if (mode == null) {
+ Log.e(TAG, "Failed to get zen mode from int: $zen")
+ return
+ }
+
+ zenData =
+ ZenData(
+ mode,
+ if (mode == ZenMode.OFF) SysuiR.string::dnd_is_off.name
+ else SysuiR.string::dnd_is_on.name,
+ )
+ .also { data ->
+ mainExecutor.execute { clock?.run { events.onZenDataChanged(data) } }
+ }
+ }
+
fun registerListeners(parent: View) {
if (isRegistered) {
return
@@ -424,7 +454,7 @@
isRegistered = true
broadcastDispatcher.registerReceiver(
localeBroadcastReceiver,
- IntentFilter(Intent.ACTION_LOCALE_CHANGED)
+ IntentFilter(Intent.ACTION_LOCALE_CHANGED),
)
configurationController.addCallback(configListener)
batteryController.addCallback(batteryCallback)
@@ -434,6 +464,9 @@
parent.repeatWhenAttached {
repeatOnLifecycle(Lifecycle.State.CREATED) {
listenForDozing(this)
+ if (ModesUi.isEnabled) {
+ listenForDnd(this)
+ }
if (MigrateClocksToBlueprint.isEnabled) {
listenForDozeAmountTransition(this)
listenForAnyStateToAodTransition(this)
@@ -449,7 +482,9 @@
bgExecutor.execute {
// Query ZenMode data
- zenModeCallback.onZenChanged(zenModeController.zen)
+ if (!ModesUi.isEnabled) {
+ zenModeCallback.onZenChanged(zenModeController.zen)
+ }
zenModeCallback.onNextAlarmChanged()
}
}
@@ -605,10 +640,9 @@
@VisibleForTesting
internal fun listenForDozing(scope: CoroutineScope): Job {
return scope.launch {
- combine(
- keyguardInteractor.dozeAmount,
- keyguardInteractor.isDozing,
- ) { localDozeAmount, localIsDozing ->
+ combine(keyguardInteractor.dozeAmount, keyguardInteractor.isDozing) {
+ localDozeAmount,
+ localIsDozing ->
localDozeAmount > dozeAmount || localIsDozing
}
.collect { localIsDozing -> isDozing = localIsDozing }
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
index ffbc85c..f05cbf4 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
@@ -109,6 +109,8 @@
import java.util.ArrayList;
import java.util.List;
+import java.util.concurrent.Executor;
+import java.util.function.Consumer;
/** Determines how the bouncer is displayed to the user. */
public class KeyguardSecurityContainer extends ConstraintLayout {
@@ -170,6 +172,7 @@
private ViewMode mViewMode = new DefaultViewMode();
private boolean mIsInteractable;
protected ViewMediatorCallback mViewMediatorCallback;
+ private Executor mBgExecutor;
/*
* Using MODE_UNINITIALIZED to mean the view mode is set to DefaultViewMode, but init() has not
* yet been called on it. This will happen when the ViewController is initialized.
@@ -352,6 +355,10 @@
updateBiometricRetry(securityMode, faceAuthEnabled);
}
+ void setBackgroundExecutor(Executor bgExecutor) {
+ mBgExecutor = bgExecutor;
+ }
+
void initMode(@Mode int mode, GlobalSettings globalSettings, FalsingManager falsingManager,
UserSwitcherController userSwitcherController,
UserSwitcherViewMode.UserSwitcherCallback userSwitcherCallback,
@@ -367,7 +374,7 @@
mViewMode = new OneHandedViewMode();
break;
case MODE_USER_SWITCHER:
- mViewMode = new UserSwitcherViewMode(userSwitcherCallback);
+ mViewMode = new UserSwitcherViewMode(userSwitcherCallback, mBgExecutor);
break;
default:
mViewMode = new DefaultViewMode();
@@ -991,6 +998,7 @@
private FalsingManager mFalsingManager;
private UserSwitcherController mUserSwitcherController;
private KeyguardUserSwitcherPopupMenu mPopup;
+ private Executor mBgExecutor;
private Resources mResources;
private UserSwitcherController.UserSwitchCallback mUserSwitchCallback =
this::setupUserSwitcher;
@@ -998,8 +1006,9 @@
private UserSwitcherCallback mUserSwitcherCallback;
private FalsingA11yDelegate mFalsingA11yDelegate;
- UserSwitcherViewMode(UserSwitcherCallback userSwitcherCallback) {
+ UserSwitcherViewMode(UserSwitcherCallback userSwitcherCallback, Executor bgExecutor) {
mUserSwitcherCallback = userSwitcherCallback;
+ mBgExecutor = bgExecutor;
}
@Override
@@ -1068,18 +1077,22 @@
mView.removeView(mUserSwitcher);
}
- private Drawable findLargeUserIcon(int userId) {
- Bitmap userIcon = UserManager.get(mView.getContext()).getUserIcon(userId);
- if (userIcon != null) {
- int iconSize =
- mResources.getDimensionPixelSize(R.dimen.bouncer_user_switcher_icon_size);
- return CircleFramedDrawable.getInstance(
- mView.getContext(),
- Icon.scaleDownIfNecessary(userIcon, iconSize, iconSize)
- );
- }
-
- return UserIcons.getDefaultUserIcon(mResources, userId, false);
+ private void findLargeUserIcon(int userId, Consumer<Drawable> consumer) {
+ mBgExecutor.execute(() -> {
+ Drawable icon;
+ Bitmap userIcon = UserManager.get(mView.getContext()).getUserIcon(userId);
+ if (userIcon != null) {
+ int iconSize = mResources.getDimensionPixelSize(
+ R.dimen.bouncer_user_switcher_icon_size);
+ icon = CircleFramedDrawable.getInstance(
+ mView.getContext(),
+ Icon.scaleDownIfNecessary(userIcon, iconSize, iconSize)
+ );
+ } else {
+ icon = UserIcons.getDefaultUserIcon(mResources, userId, false);
+ }
+ consumer.accept(icon);
+ });
}
@Override
@@ -1136,8 +1149,15 @@
return;
}
final String currentUserName = mUserSwitcherController.getCurrentUserName();
- Drawable userIcon = findLargeUserIcon(currentUser.info.id);
- ((ImageView) mView.findViewById(R.id.user_icon)).setImageDrawable(userIcon);
+ findLargeUserIcon(currentUser.info.id,
+ (Drawable userIcon) -> {
+ mView.post(() -> {
+ ImageView view = (ImageView) mView.findViewById(R.id.user_icon);
+ if (view != null) {
+ view.setImageDrawable(userIcon);
+ }
+ });
+ });
mUserSwitcher.setText(currentUserName);
KeyguardUserSwitcherAnchor anchor = mView.findViewById(R.id.user_switcher_anchor);
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java
index 2d28a18..a408211 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java
@@ -76,6 +76,7 @@
import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor;
import com.android.systemui.classifier.FalsingA11yDelegate;
import com.android.systemui.classifier.FalsingCollector;
+import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryFaceAuthInteractor;
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor;
import com.android.systemui.flags.FeatureFlags;
@@ -102,6 +103,7 @@
import java.io.File;
import java.util.Arrays;
+import java.util.concurrent.Executor;
import javax.inject.Inject;
import javax.inject.Provider;
@@ -426,6 +428,7 @@
private final Provider<JavaAdapter> mJavaAdapter;
private final DeviceProvisionedController mDeviceProvisionedController;
private final Lazy<PrimaryBouncerInteractor> mPrimaryBouncerInteractor;
+ private final Executor mBgExecutor;
@Nullable
private Job mSceneTransitionCollectionJob;
@@ -459,6 +462,7 @@
DevicePolicyManager devicePolicyManager,
KeyguardDismissTransitionInteractor keyguardDismissTransitionInteractor,
Lazy<PrimaryBouncerInteractor> primaryBouncerInteractor,
+ @Background Executor bgExecutor,
Provider<DeviceEntryInteractor> deviceEntryInteractor
) {
super(view);
@@ -493,11 +497,13 @@
mDeviceProvisionedController = deviceProvisionedController;
mPrimaryBouncerInteractor = primaryBouncerInteractor;
mDevicePolicyManager = devicePolicyManager;
+ mBgExecutor = bgExecutor;
}
@Override
public void onInit() {
mSecurityViewFlipperController.init();
+ mView.setBackgroundExecutor(mBgExecutor);
updateResources();
configureMode();
}
diff --git a/packages/SystemUI/src/com/android/systemui/back/domain/interactor/BackActionInteractor.kt b/packages/SystemUI/src/com/android/systemui/back/domain/interactor/BackActionInteractor.kt
index 5bd7e54..23045a3 100644
--- a/packages/SystemUI/src/com/android/systemui/back/domain/interactor/BackActionInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/back/domain/interactor/BackActionInteractor.kt
@@ -47,7 +47,9 @@
private val statusBarKeyguardViewManager: StatusBarKeyguardViewManager,
private val shadeController: ShadeController,
private val notificationShadeWindowController: NotificationShadeWindowController,
- private val windowRootViewVisibilityInteractor: WindowRootViewVisibilityInteractor
+ private val windowRootViewVisibilityInteractor: WindowRootViewVisibilityInteractor,
+ private val shadeBackActionInteractor: ShadeBackActionInteractor,
+ private val qsController: QuickSettingsController,
) : CoreStartable {
private var isCallbackRegistered = false
@@ -77,14 +79,6 @@
get() =
notificationShadeWindowController.windowRootView?.viewRootImpl?.onBackInvokedDispatcher
- private lateinit var shadeBackActionInteractor: ShadeBackActionInteractor
- private lateinit var qsController: QuickSettingsController
-
- fun setup(qsController: QuickSettingsController, svController: ShadeBackActionInteractor) {
- this.qsController = qsController
- this.shadeBackActionInteractor = svController
- }
-
override fun start() {
scope.launch {
windowRootViewVisibilityInteractor.isLockscreenOrShadeVisibleAndInteractive.collect {
diff --git a/packages/SystemUI/src/com/android/systemui/communal/util/WidgetViewFactory.kt b/packages/SystemUI/src/com/android/systemui/communal/util/WidgetViewFactory.kt
index ec03227..cafa74f 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/util/WidgetViewFactory.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/util/WidgetViewFactory.kt
@@ -26,6 +26,7 @@
import com.android.systemui.communal.widgets.CommunalAppWidgetHostView
import com.android.systemui.communal.widgets.WidgetInteractionHandler
import com.android.systemui.dagger.qualifiers.UiBackground
+import java.util.concurrent.Executor
import javax.inject.Inject
import kotlin.coroutines.CoroutineContext
@@ -34,6 +35,7 @@
@Inject
constructor(
@UiBackground private val uiBgContext: CoroutineContext,
+ @UiBackground private val uiBgExecutor: Executor,
private val appWidgetHost: CommunalAppWidgetHost,
private val interactionHandler: WidgetInteractionHandler,
private val listenerFactory: AppWidgetHostListenerDelegate.Factory,
@@ -44,8 +46,11 @@
size: SizeF,
): CommunalAppWidgetHostView =
withContext("$TAG#createWidget", uiBgContext) {
- val view = CommunalAppWidgetHostView(context, interactionHandler)
- view.setAppWidget(model.appWidgetId, model.providerInfo)
+ val view =
+ CommunalAppWidgetHostView(context, interactionHandler).apply {
+ setExecutor(uiBgExecutor)
+ setAppWidget(model.appWidgetId, model.providerInfo)
+ }
// Instead of setting the view as the listener directly, we wrap the view in a delegate
// which ensures the callbacks always get called on the main thread.
appWidgetHost.setListener(model.appWidgetId, listenerFactory.create(view))
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/ReferenceSystemUIModule.java b/packages/SystemUI/src/com/android/systemui/dagger/ReferenceSystemUIModule.java
index 79f4568..5c075c2 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/ReferenceSystemUIModule.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/ReferenceSystemUIModule.java
@@ -69,6 +69,7 @@
import com.android.systemui.statusbar.phone.DozeServiceHost;
import com.android.systemui.statusbar.phone.HeadsUpModule;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
+import com.android.systemui.statusbar.phone.dagger.StatusBarPhoneModule;
import com.android.systemui.statusbar.phone.fragment.CollapsedStatusBarFragmentStartableModule;
import com.android.systemui.statusbar.policy.AospPolicyModule;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
@@ -136,6 +137,7 @@
RotationLockModule.class,
RotationLockNewModule.class,
ScreenDecorationsModule.class,
+ StatusBarPhoneModule.class,
SystemActionsModule.class,
ShadeModule.class,
StartCentralSurfacesModule.class,
diff --git a/packages/SystemUI/src/com/android/systemui/display/data/repository/DisplayRepository.kt b/packages/SystemUI/src/com/android/systemui/display/data/repository/DisplayRepository.kt
index a327e4a..e68aba5 100644
--- a/packages/SystemUI/src/com/android/systemui/display/data/repository/DisplayRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/display/data/repository/DisplayRepository.kt
@@ -45,6 +45,7 @@
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.filterIsInstance
+import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onEach
@@ -73,6 +74,14 @@
/** Whether the default display is currently off. */
val defaultDisplayOff: Flow<Boolean>
+ /**
+ * Given a display ID int, return the corresponding Display object, or null if none exist.
+ *
+ * This method is guaranteed to not result in any binder call.
+ */
+ suspend fun getDisplay(displayId: Int): Display? =
+ displays.first().firstOrNull { it.displayId == displayId }
+
/** Represents a connected display that has not been enabled yet. */
interface PendingDisplay {
/** Id of the pending display. */
@@ -135,7 +144,9 @@
allDisplayEvents.filterIsInstance<DisplayEvent.Changed>().map { event -> event.displayId }
override val displayAdditionEvent: Flow<Display?> =
- allDisplayEvents.filterIsInstance<DisplayEvent.Added>().map { getDisplay(it.displayId) }
+ allDisplayEvents.filterIsInstance<DisplayEvent.Added>().map {
+ getDisplayFromDisplayManager(it.displayId)
+ }
// This is necessary because there might be multiple displays, and we could
// have missed events for those added before this process or flow started.
@@ -160,7 +171,8 @@
.debugLog("enabledDisplayIds")
private val defaultDisplay by lazy {
- getDisplay(Display.DEFAULT_DISPLAY) ?: error("Unable to get default display.")
+ getDisplayFromDisplayManager(Display.DEFAULT_DISPLAY)
+ ?: error("Unable to get default display.")
}
/**
@@ -170,7 +182,7 @@
*/
private val enabledDisplays: Flow<Set<Display>> =
enabledDisplayIds
- .mapElementsLazily { displayId -> getDisplay(displayId) }
+ .mapElementsLazily { displayId -> getDisplayFromDisplayManager(displayId) }
.onEach {
if (it.isEmpty()) Log.wtf(TAG, "No enabled displays. This should never happen.")
}
@@ -269,7 +281,7 @@
private fun getDisplayType(displayId: Int): Int? =
traceSection("$TAG#getDisplayType") { displayManager.getDisplay(displayId)?.type }
- private fun getDisplay(displayId: Int): Display? =
+ private fun getDisplayFromDisplayManager(displayId: Int): Display? =
traceSection("$TAG#getDisplay") { displayManager.getDisplay(displayId) }
/**
@@ -354,8 +366,8 @@
* Maps a set of T to a set of V, minimizing the number of `createValue` calls taking into
* account the diff between each root flow emission.
*
- * This is needed to minimize the number of [getDisplay] in this class. Note that if the
- * [createValue] returns a null element, it will not be added in the output set.
+ * This is needed to minimize the number of [getDisplayFromDisplayManager] in this class. Note
+ * that if the [createValue] returns a null element, it will not be added in the output set.
*/
private fun <T, V> Flow<Set<T>>.mapElementsLazily(createValue: (T) -> V?): Flow<Set<V>> {
data class State<T, V>(
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 93cd1cf4..5e05dab 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
@@ -403,7 +403,7 @@
SubCategoryTitle(subCategory.label)
subCategory.shortcuts.fastForEachIndexed { index, shortcut ->
if (index > 0) {
- HorizontalDivider()
+ HorizontalDivider(color = MaterialTheme.colorScheme.surfaceContainerHigh)
}
ShortcutView(Modifier.padding(vertical = 24.dp), searchQuery, shortcut)
}
@@ -482,7 +482,7 @@
Spacer(Modifier.height(8.dp))
subCategory.shortcuts.fastForEachIndexed { index, shortcut ->
if (index > 0) {
- HorizontalDivider()
+ HorizontalDivider(color = MaterialTheme.colorScheme.surfaceContainerHigh)
}
ShortcutView(Modifier.padding(vertical = 16.dp), searchQuery, shortcut)
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt
index 6569e4c..ee2ee52 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt
@@ -45,7 +45,6 @@
import com.android.keyguard.AuthInteractionProperties
import com.android.systemui.Flags
import com.android.systemui.Flags.msdlFeedback
-import com.android.systemui.Flags.newAodTransition
import com.android.systemui.common.shared.model.Icon
import com.android.systemui.common.shared.model.Text
import com.android.systemui.common.shared.model.TintedIcon
@@ -414,7 +413,10 @@
if (MigrateClocksToBlueprint.isEnabled) {
burnInParams.update { current ->
- current.copy(translationY = { childViews[burnInLayerId]?.translationY })
+ current.copy(
+ translationX = { childViews[burnInLayerId]?.translationX },
+ translationY = { childViews[burnInLayerId]?.translationY },
+ )
}
}
@@ -593,7 +595,7 @@
View.INVISIBLE
}
}
- newAodTransition() -> {
+ else -> {
animateInIconTranslation()
if (isVisible.value) {
CrossFadeHelper.fadeIn(this, animatorListener)
@@ -601,52 +603,6 @@
CrossFadeHelper.fadeOut(this, animatorListener)
}
}
- !isVisible.value -> {
- // Let's make sure the icon are translated to 0, since we cancelled it above
- animateInIconTranslation()
- CrossFadeHelper.fadeOut(this, animatorListener)
- }
- visibility != View.VISIBLE -> {
- // No fading here, let's just appear the icons instead!
- visibility = View.VISIBLE
- alpha = 1f
- appearIcons(
- animate = screenOffAnimationController.shouldAnimateAodIcons(),
- iconsAppearTranslationPx,
- animatorListener,
- )
- }
- else -> {
- // Let's make sure the icons are translated to 0, since we cancelled it above
- animateInIconTranslation()
- // We were fading out, let's fade in instead
- CrossFadeHelper.fadeIn(this, animatorListener)
- }
- }
- }
-
- private fun View.appearIcons(
- animate: Boolean,
- iconAppearTranslation: Int,
- animatorListener: Animator.AnimatorListener,
- ) {
- if (animate) {
- if (!MigrateClocksToBlueprint.isEnabled) {
- translationY = -iconAppearTranslation.toFloat()
- }
- alpha = 0f
- animate()
- .alpha(1f)
- .setInterpolator(Interpolators.LINEAR)
- .setDuration(AOD_ICONS_APPEAR_DURATION)
- .apply { if (MigrateClocksToBlueprint.isEnabled) animateInIconTranslation() }
- .setListener(animatorListener)
- .start()
- } else {
- alpha = 1.0f
- if (!MigrateClocksToBlueprint.isEnabled) {
- translationY = 0f
- }
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodBurnInViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodBurnInViewModel.kt
index 998c1c8..c78e0c9 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodBurnInViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodBurnInViewModel.kt
@@ -114,6 +114,9 @@
emit(0f)
},
aodToLockscreenTransitionViewModel
+ .translationX(params.translationX)
+ .onStart { emit(StateToValue()) },
+ aodToLockscreenTransitionViewModel
.translationY(params.translationY)
.onStart { emit(StateToValue()) },
) { flows ->
@@ -123,11 +126,12 @@
val goneToAodTranslationX = flows[3] as StateToValue
val lockscreenToAodTranslationX = flows[4] as StateToValue
val occludedToLockscreen = flows[5] as Float
- val aodToLockscreen = flows[6] as StateToValue
+ val aodToLockscreenTranslationX = flows[6] as StateToValue
+ val aodToLockscreenTranslationY = flows[7] as StateToValue
val translationY =
- if (aodToLockscreen.transitionState.isTransitioning()) {
- aodToLockscreen.value ?: 0f
+ if (aodToLockscreenTranslationY.transitionState.isTransitioning()) {
+ aodToLockscreenTranslationY.value ?: 0f
} else if (
goneToAodTranslationY.transitionState.isTransitioning()
) {
@@ -138,9 +142,13 @@
keyguardTranslationY
}
val translationX =
- burnInModel.translationX +
- (goneToAodTranslationX.value ?: 0f) +
- (lockscreenToAodTranslationX.value ?: 0f)
+ if (aodToLockscreenTranslationX.transitionState.isTransitioning()) {
+ aodToLockscreenTranslationX.value ?: 0f
+ } else {
+ burnInModel.translationX +
+ (goneToAodTranslationX.value ?: 0f) +
+ (lockscreenToAodTranslationX.value ?: 0f)
+ }
burnInModel.copy(
translationX = translationX.toInt(),
translationY = translationY.toInt(),
@@ -198,6 +206,8 @@
val minViewY: Int = Int.MAX_VALUE,
/** The current y translation of the view */
val translationY: () -> Float? = { null },
+ /** The current x translation of the view */
+ val translationX: () -> Float? = { null },
)
/**
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModel.kt
index 6b22c0f..6eeab8d 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModel.kt
@@ -39,10 +39,8 @@
@SysUISingleton
class AodToLockscreenTransitionViewModel
@Inject
-constructor(
- shadeInteractor: ShadeInteractor,
- animationFlow: KeyguardTransitionAnimationFlow,
-) : DeviceEntryIconTransition {
+constructor(shadeInteractor: ShadeInteractor, animationFlow: KeyguardTransitionAnimationFlow) :
+ DeviceEntryIconTransition {
private val transitionAnimation =
animationFlow.setup(
@@ -54,7 +52,7 @@
/**
* Begin the transition from wherever the y-translation value is currently. This helps ensure a
- * smooth transition if a transition in canceled.
+ * smooth transition if the prior transition was canceled.
*/
fun translationY(currentTranslationY: () -> Float?): Flow<StateToValue> {
var startValue = 0f
@@ -65,6 +63,19 @@
)
}
+ /**
+ * Begin the transition from wherever the x-translation value is currently. This helps ensure a
+ * smooth transition if the prior transition was canceled.
+ */
+ fun translationX(currentTranslationX: () -> Float?): Flow<StateToValue> {
+ var startValue = 0f
+ return transitionAnimation.sharedFlowWithState(
+ duration = 500.milliseconds,
+ onStart = { startValue = currentTranslationX() ?: 0f },
+ onStep = { MathUtils.lerp(startValue, 0f, FAST_OUT_SLOW_IN.getInterpolation(it)) },
+ )
+ }
+
/** Ensure alpha is set to be visible */
fun lockscreenAlpha(viewState: ViewStateAccessor): Flow<Float> {
var startAlpha = 1f
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModel.kt
index dc0ce34..10a2e5c 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModel.kt
@@ -20,7 +20,7 @@
import android.graphics.Point
import android.util.MathUtils
import android.view.View.VISIBLE
-import com.android.systemui.Flags.newAodTransition
+import com.android.app.tracing.coroutines.launch
import com.android.systemui.common.shared.model.NotificationContainerBounds
import com.android.systemui.communal.domain.interactor.CommunalInteractor
import com.android.systemui.dagger.SysUISingleton
@@ -386,10 +386,7 @@
!dozeParameters.alwaysOn -> false
// Don't animate when going to AOD if the display needs blanking.
dozeParameters.displayNeedsBlanking -> false
- // We only want the appear animations to happen when the notifications
- // get fully hidden, since otherwise the un-hide animation overlaps.
- newAodTransition() -> true
- else -> fullyHidden
+ else -> true
}
AnimatableEvent(fullyHidden, animate)
}
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 bb9517a..a0fb0bf2 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
@@ -110,6 +110,7 @@
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.flow.merge
import kotlinx.coroutines.flow.onStart
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.launch
@@ -174,19 +175,21 @@
* The desired location where we'll be at the end of the transformation. Usually this matches
* the end location, except when we're still waiting on a state update call.
*/
- @MediaLocation private var desiredLocation: Int = -1
+ @MediaLocation private var desiredLocation: Int = MediaHierarchyManager.LOCATION_UNKNOWN
/**
* The ending location of the view where it ends when all animations and transitions have
* finished
*/
- @MediaLocation @VisibleForTesting var currentEndLocation: Int = -1
+ @MediaLocation
+ @VisibleForTesting
+ var currentEndLocation: Int = MediaHierarchyManager.LOCATION_UNKNOWN
/**
* The ending location of the view where it ends when all animations and transitions have
* finished
*/
- @MediaLocation private var currentStartLocation: Int = -1
+ @MediaLocation private var currentStartLocation: Int = MediaHierarchyManager.LOCATION_UNKNOWN
/** The progress of the transition or 1.0 if there is no transition happening */
private var currentTransitionProgress: Float = 1.0f
@@ -726,6 +729,13 @@
)
DiffUtil.calculateDiff(diffUtilCallback).dispatchUpdatesTo(listUpdateCallback)
setNewViewModelsList(it)
+
+ // Update host visibility when media changes.
+ merge(
+ mediaCarouselViewModel.hasAnyMediaOrRecommendations,
+ mediaCarouselViewModel.hasActiveMediaOrRecommendations,
+ )
+ .collect { updateHostVisibility() }
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt
index 38cea5b..745ab12 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt
@@ -64,7 +64,6 @@
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.distinctUntilChanged
@@ -161,10 +160,10 @@
private var animationStartAlpha = 0.0f
/** The starting location of the cross fade if an animation is running right now. */
- @MediaLocation private var crossFadeAnimationStartLocation = -1
+ @MediaLocation private var crossFadeAnimationStartLocation = LOCATION_UNKNOWN
/** The end location of the cross fade if an animation is running right now. */
- @MediaLocation private var crossFadeAnimationEndLocation = -1
+ @MediaLocation private var crossFadeAnimationEndLocation = LOCATION_UNKNOWN
private var targetBounds: Rect = Rect()
private val mediaFrame
get() = mediaCarouselController.mediaFrame
@@ -191,7 +190,7 @@
animationStartBounds,
targetBounds,
boundsProgress,
- result = currentBounds
+ result = currentBounds,
)
resolveClipping(currentClipping)
applyState(currentBounds, currentAlpha, clipBounds = currentClipping)
@@ -233,16 +232,16 @@
* The last location where this view was at before going to the desired location. This is useful
* for guided transitions.
*/
- @MediaLocation private var previousLocation = -1
+ @MediaLocation private var previousLocation = LOCATION_UNKNOWN
/** The desired location where the view will be at the end of the transition. */
- @MediaLocation private var desiredLocation = -1
+ @MediaLocation private var desiredLocation = LOCATION_UNKNOWN
/**
* The current attachment location where the view is currently attached. Usually this matches
* the desired location except for animations whenever a view moves to the new desired location,
* during which it is in [IN_OVERLAY].
*/
- @MediaLocation private var currentAttachmentLocation = -1
+ @MediaLocation private var currentAttachmentLocation = LOCATION_UNKNOWN
private var inSplitShade = false
@@ -627,7 +626,7 @@
secureSettings.getBoolForUser(
Settings.Secure.MEDIA_CONTROLS_LOCK_SCREEN,
true,
- UserHandle.USER_CURRENT
+ UserHandle.USER_CURRENT,
)
}
}
@@ -635,7 +634,7 @@
secureSettings.registerContentObserverForUserSync(
Settings.Secure.MEDIA_CONTROLS_LOCK_SCREEN,
settingsObserver,
- UserHandle.USER_ALL
+ UserHandle.USER_ALL,
)
// Listen to the communal UI state. Make sure that communal UI is showing and hub itself is
@@ -651,7 +650,7 @@
shadeInteractor.shadeExpansion
.mapLatest { it < EXPANSION_THRESHOLD }
.distinctUntilChanged(),
- ::Triple
+ ::Triple,
)
.collectLatest { (communalShowing, isDreaming, isShadeExpanding) ->
isCommunalShowing = communalShowing
@@ -689,10 +688,10 @@
if (mediaObject.location == desiredLocation) {
// In case we are overriding a view that is already visible, make sure we attach it
// to this new host view in the below call
- desiredLocation = -1
+ desiredLocation = LOCATION_UNKNOWN
}
if (mediaObject.location == currentAttachmentLocation) {
- currentAttachmentLocation = -1
+ currentAttachmentLocation = LOCATION_UNKNOWN
}
updateDesiredLocation()
return viewHost
@@ -734,7 +733,7 @@
*/
private fun updateDesiredLocation(
forceNoAnimation: Boolean = false,
- forceStateUpdate: Boolean = false
+ forceStateUpdate: Boolean = false,
) =
traceSection("MediaHierarchyManager#updateDesiredLocation") {
val desiredLocation = calculateLocation()
@@ -758,7 +757,7 @@
previousLocation = LOCATION_QQS
}
}
- val isNewView = this.desiredLocation == -1
+ val isNewView = this.desiredLocation == LOCATION_UNKNOWN
this.desiredLocation = desiredLocation
// Let's perform a transition
val animate =
@@ -774,7 +773,7 @@
host,
animate,
animDuration,
- delay
+ delay,
)
}
performTransitionToNewLocation(isNewView, animate)
@@ -868,7 +867,7 @@
private fun shouldAnimateTransition(
@MediaLocation currentLocation: Int,
- @MediaLocation previousLocation: Int
+ @MediaLocation previousLocation: Int,
): Boolean {
if (isCurrentlyInGuidedTransformation()) {
return false
@@ -990,7 +989,7 @@
startBounds: Rect,
endBounds: Rect,
progress: Float,
- result: Rect? = null
+ result: Rect? = null,
): Rect {
val left =
MathUtils.lerp(startBounds.left.toFloat(), endBounds.left.toFloat(), progress).toInt()
@@ -1014,7 +1013,7 @@
}
private fun hasValidStartAndEndLocations(): Boolean {
- return previousLocation != -1 && desiredLocation != -1
+ return previousLocation != LOCATION_UNKNOWN && desiredLocation != LOCATION_UNKNOWN
}
/** Calculate the transformation type for the current animation */
@@ -1099,21 +1098,21 @@
bounds: Rect,
alpha: Float,
immediately: Boolean = false,
- clipBounds: Rect = EMPTY_RECT
+ clipBounds: Rect = EMPTY_RECT,
) =
traceSection("MediaHierarchyManager#applyState") {
currentBounds.set(bounds)
currentClipping = clipBounds
carouselAlpha = if (isCurrentlyFading()) alpha else 1.0f
val onlyUseEndState = !isCurrentlyInGuidedTransformation() || isCurrentlyFading()
- val startLocation = if (onlyUseEndState) -1 else previousLocation
+ val startLocation = if (onlyUseEndState) LOCATION_UNKNOWN else previousLocation
val progress = if (onlyUseEndState) 1.0f else getTransformationProgress()
val endLocation = resolveLocationForFading()
mediaCarouselController.setCurrentState(
startLocation,
endLocation,
progress,
- immediately
+ immediately,
)
updateHostAttachment()
if (currentAttachmentLocation == IN_OVERLAY) {
@@ -1125,7 +1124,7 @@
currentBounds.left,
currentBounds.top,
currentBounds.right,
- currentBounds.bottom
+ currentBounds.bottom,
)
}
}
@@ -1186,7 +1185,7 @@
mediaCarouselController.onDesiredLocationChanged(
newLocation,
getHost(newLocation),
- animate = false
+ animate = false,
)
}
}
@@ -1201,7 +1200,7 @@
if (isCrossFadeAnimatorRunning) {
// When animating between two hosts with a fade, let's keep ourselves in the old
// location for the first half, and then switch over to the end location
- if (animationCrossFadeProgress > 0.5 || previousLocation == -1) {
+ if (animationCrossFadeProgress > 0.5 || previousLocation == LOCATION_UNKNOWN) {
return crossFadeAnimationEndLocation
} else {
return crossFadeAnimationStartLocation
@@ -1364,6 +1363,9 @@
/** Attached at the root of the hierarchy in an overlay */
const val IN_OVERLAY = -1000
+ /** Not attached to any view */
+ const val LOCATION_UNKNOWN = -1
+
/**
* The default transformation type where the hosts transform into each other using a direct
* transition
@@ -1388,8 +1390,8 @@
value =
[
MediaHierarchyManager.TRANSFORMATION_TYPE_TRANSITION,
- MediaHierarchyManager.TRANSFORMATION_TYPE_FADE
- ]
+ MediaHierarchyManager.TRANSFORMATION_TYPE_FADE,
+ ],
)
@Retention(AnnotationRetention.SOURCE)
private annotation class TransformationType
@@ -1403,7 +1405,8 @@
MediaHierarchyManager.LOCATION_LOCKSCREEN,
MediaHierarchyManager.LOCATION_DREAM_OVERLAY,
MediaHierarchyManager.LOCATION_COMMUNAL_HUB,
- ]
+ MediaHierarchyManager.LOCATION_UNKNOWN,
+ ],
)
@Retention(AnnotationRetention.SOURCE)
annotation class MediaLocation
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaViewController.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaViewController.kt
index e57de09..3928a71 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaViewController.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaViewController.kt
@@ -91,7 +91,7 @@
*/
enum class TYPE {
PLAYER,
- RECOMMENDATION
+ RECOMMENDATION,
}
companion object {
@@ -120,7 +120,7 @@
* finished
*/
@MediaLocation
- var currentEndLocation: Int = -1
+ var currentEndLocation: Int = MediaHierarchyManager.LOCATION_UNKNOWN
set(value) {
if (field != value) {
field = value
@@ -130,7 +130,7 @@
}
/** The starting location of the view where it starts for all animations and transitions */
- @MediaLocation private var currentStartLocation: Int = -1
+ @MediaLocation private var currentStartLocation: Int = MediaHierarchyManager.LOCATION_UNKNOWN
/** The progress of the transition or 1.0 if there is no transition happening */
private var currentTransitionProgress: Float = 1.0f
@@ -294,14 +294,14 @@
object : MediaHostStatesManager.Callback {
override fun onHostStateChanged(
@MediaLocation location: Int,
- mediaHostState: MediaHostState
+ mediaHostState: MediaHostState,
) {
if (location == currentEndLocation || location == currentStartLocation) {
setCurrentState(
currentStartLocation,
currentEndLocation,
currentTransitionProgress,
- applyImmediately = false
+ applyImmediately = false,
)
}
}
@@ -442,7 +442,7 @@
/** Apply squishFraction to a copy of viewState such that the cached version is untouched. */
internal fun squishViewState(
viewState: TransitionViewState,
- squishFraction: Float
+ squishFraction: Float,
): TransitionViewState {
val squishedViewState = viewState.copy()
val squishedHeight = (squishedViewState.measureHeight * squishFraction).toInt()
@@ -458,13 +458,13 @@
MediaViewHolder.expandedBottomActionIds,
squishedViewState.measureHeight.toFloat(),
squishedViewState,
- squishFraction
+ squishFraction,
)
calculateWidgetGroupAlphaForSquishiness(
MediaViewHolder.detailIds,
squishedViewState.measureHeight.toFloat(),
squishedViewState,
- squishFraction
+ squishFraction,
)
// recommendation card
val titlesTop =
@@ -472,13 +472,13 @@
RecommendationViewHolder.mediaTitlesAndSubtitlesIds,
squishedViewState.measureHeight.toFloat(),
squishedViewState,
- squishFraction
+ squishFraction,
)
calculateWidgetGroupAlphaForSquishiness(
RecommendationViewHolder.mediaContainersIds,
titlesTop,
squishedViewState,
- squishFraction
+ squishFraction,
)
return squishedViewState
}
@@ -517,7 +517,7 @@
widgetGroupIds: Set<Int>,
groupEndPosition: Float,
squishedViewState: TransitionViewState,
- squishFraction: Float
+ squishFraction: Float,
): Float {
val nonsquishedHeight = squishedViewState.measureHeight
var groupTop = squishedViewState.measureHeight.toFloat()
@@ -547,7 +547,7 @@
calculateAlpha(
squishFraction,
startPosition / nonsquishedHeight,
- endPosition / nonsquishedHeight
+ endPosition / nonsquishedHeight,
)
}
}
@@ -562,10 +562,10 @@
@VisibleForTesting
fun obtainViewState(
state: MediaHostState?,
- isGutsAnimation: Boolean = false
+ isGutsAnimation: Boolean = false,
): TransitionViewState? {
if (SceneContainerFlag.isEnabled) {
- return obtainSceneContainerViewState()
+ return obtainSceneContainerViewState(state)
}
if (state == null || state.measurementInput == null) {
@@ -606,7 +606,7 @@
transitionLayout!!.calculateViewState(
state.measurementInput!!,
constraintSetForExpansion(state.expansion),
- TransitionViewState()
+ TransitionViewState(),
)
setGutsViewState(result)
@@ -653,7 +653,7 @@
logger.logMediaLocation("attach $type", currentStartLocation, currentEndLocation)
this.transitionLayout = transitionLayout
layoutController.attach(transitionLayout)
- if (currentEndLocation == -1) {
+ if (currentEndLocation == MediaHierarchyManager.LOCATION_UNKNOWN) {
return
}
// Set the previously set state immediately to the view, now that it's finally attached
@@ -661,7 +661,7 @@
startLocation = currentStartLocation,
endLocation = currentEndLocation,
transitionProgress = currentTransitionProgress,
- applyImmediately = true
+ applyImmediately = true,
)
}
@@ -695,7 +695,7 @@
Interpolators.EMPHASIZED_DECELERATE,
titleText,
artistText,
- explicitIndicator
+ explicitIndicator,
)
val exit =
loadAnimator(
@@ -704,7 +704,7 @@
Interpolators.EMPHASIZED_ACCELERATE,
titleText,
artistText,
- explicitIndicator
+ explicitIndicator,
)
metadataAnimationHandler = MetadataAnimationHandler(exit, enter)
@@ -713,7 +713,7 @@
mediaCard.context,
mediaViewHolder,
multiRippleController,
- turbulenceNoiseController
+ turbulenceNoiseController,
)
// For Turbulence noise.
@@ -728,7 +728,7 @@
object : LoadingEffect.AnimationStateChangedCallback {
override fun onStateChanged(
oldState: LoadingEffect.AnimationState,
- newState: LoadingEffect.AnimationState
+ newState: LoadingEffect.AnimationState,
) {
if (newState === LoadingEffect.AnimationState.NOT_PLAYING) {
loadingEffectView.visibility = View.INVISIBLE
@@ -755,12 +755,12 @@
MediaControlViewBinder.setVisibleAndAlpha(
expandedLayout,
it.scrubbingTotalTimeView.id,
- isTimeVisible
+ isTimeVisible,
)
MediaControlViewBinder.setVisibleAndAlpha(
expandedLayout,
it.scrubbingElapsedTimeView.id,
- isTimeVisible
+ isTimeVisible,
)
}
@@ -788,7 +788,7 @@
collapsedLayout,
isButtonVisible,
notVisibleValue,
- showInCollapsed = true
+ showInCollapsed = true,
)
}
}
@@ -822,7 +822,7 @@
createTurbulenceNoiseConfig(
it.loadingEffectView,
it.turbulenceNoiseView,
- colorSchemeTransition
+ colorSchemeTransition,
)
}
if (Flags.shaderlibLoadingEffectRefactor()) {
@@ -832,23 +832,23 @@
TurbulenceNoiseShader.Companion.Type.SIMPLEX_NOISE,
turbulenceNoiseAnimationConfig,
noiseDrawCallback,
- stateChangedCallback
+ stateChangedCallback,
)
}
colorSchemeTransition.loadingEffect = loadingEffect
loadingEffect.play()
mainExecutor.executeDelayed(
loadingEffect::finish,
- MediaControlViewModel.TURBULENCE_NOISE_PLAY_MS_DURATION
+ MediaControlViewModel.TURBULENCE_NOISE_PLAY_MS_DURATION,
)
} else {
turbulenceNoiseController.play(
TurbulenceNoiseShader.Companion.Type.SIMPLEX_NOISE,
- turbulenceNoiseAnimationConfig
+ turbulenceNoiseAnimationConfig,
)
mainExecutor.executeDelayed(
turbulenceNoiseController::finish,
- MediaControlViewModel.TURBULENCE_NOISE_PLAY_MS_DURATION
+ MediaControlViewModel.TURBULENCE_NOISE_PLAY_MS_DURATION,
)
}
}
@@ -920,7 +920,7 @@
startViewState,
startHostState.disappearParameters,
transitionProgress,
- tmpState
+ tmpState,
)
}
} else if (startHostState != null && !startHostState.visible) {
@@ -931,7 +931,7 @@
endViewState,
endHostState.disappearParameters,
1.0f - transitionProgress,
- tmpState
+ tmpState,
)
} else if (transitionProgress == 1.0f || startViewState == null) {
// We're at the end. Let's use that state
@@ -945,13 +945,13 @@
startViewState,
endViewState,
transitionProgress,
- tmpState
+ tmpState,
)
}
logger.logMediaSize(
"setCurrentState (progress $transitionProgress)",
result.width,
- result.height
+ result.height,
)
layoutController.setState(
result,
@@ -966,7 +966,7 @@
private fun updateViewStateSize(
viewState: TransitionViewState?,
location: Int,
- outState: TransitionViewState
+ outState: TransitionViewState,
): TransitionViewState? {
var result = viewState?.copy(outState) ?: return null
val state = mediaHostStatesManager.mediaHostStates[location]
@@ -1020,15 +1020,19 @@
}
/** Get a view state based on the width and height set by the scene */
- private fun obtainSceneContainerViewState(): TransitionViewState? {
+ private fun obtainSceneContainerViewState(state: MediaHostState?): TransitionViewState? {
logger.logMediaSize("scene container", widthInSceneContainerPx, heightInSceneContainerPx)
+ if (state?.measurementInput == null) {
+ return null
+ }
+
// Similar to obtainViewState: Let's create a new measurement
val result =
transitionLayout?.calculateViewState(
MeasurementInput(widthInSceneContainerPx, heightInSceneContainerPx),
- expandedLayout,
- TransitionViewState()
+ if (state.expansion > 0) expandedLayout else collapsedLayout,
+ TransitionViewState(),
)
result?.let {
// And then ensure the guts visibility is set correctly
@@ -1049,7 +1053,7 @@
private fun obtainViewStateForLocation(@MediaLocation location: Int): TransitionViewState? {
val mediaHostState = mediaHostStatesManager.mediaHostStates[location] ?: return null
if (SceneContainerFlag.isEnabled) {
- return obtainSceneContainerViewState()
+ return obtainSceneContainerViewState(mediaHostState)
}
val viewState = obtainViewState(mediaHostState)
@@ -1080,9 +1084,10 @@
fun refreshState() =
traceSection("MediaViewController#refreshState") {
if (SceneContainerFlag.isEnabled) {
+ val hostState = mediaHostStatesManager.mediaHostStates[currentEndLocation]
// We don't need to recreate measurements for scene container, since it's a known
// size. Just get the view state and update the layout controller
- obtainSceneContainerViewState()?.let {
+ obtainSceneContainerViewState(hostState)?.let {
// Get scene container state, then setCurrentState
layoutController.setState(
state = it,
@@ -1106,7 +1111,7 @@
currentStartLocation,
currentEndLocation,
currentTransitionProgress,
- applyImmediately = true
+ applyImmediately = true,
)
}
@@ -1115,7 +1120,7 @@
context: Context,
animId: Int,
motionInterpolator: Interpolator?,
- vararg targets: View?
+ vararg targets: View?,
): AnimatorSet {
val animators = ArrayList<Animator>()
for (target in targets) {
@@ -1132,7 +1137,7 @@
private fun createTurbulenceNoiseConfig(
loadingEffectView: LoadingEffectView,
turbulenceNoiseView: TurbulenceNoiseView,
- colorSchemeTransition: ColorSchemeTransition
+ colorSchemeTransition: ColorSchemeTransition,
): TurbulenceNoiseAnimationConfig {
val targetView: View =
if (Flags.shaderlibLoadingEffectRefactor()) {
@@ -1163,7 +1168,7 @@
targetView.context.resources.displayMetrics.density,
lumaMatteBlendFactor = 0.26f,
lumaMatteOverallBrightness = 0.09f,
- shouldInverseNoiseLuminosity = false
+ shouldInverseNoiseLuminosity = false,
)
}
@@ -1185,5 +1190,5 @@
var widthMeasureSpec: Int = -1,
var heightMeasureSpec: Int = -1,
var expansion: Float = 0.0f,
- var gutsVisible: Boolean = false
+ var gutsVisible: Boolean = false,
)
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/MediaCarouselViewModel.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/MediaCarouselViewModel.kt
index e7f7171..b2137af 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/MediaCarouselViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/MediaCarouselViewModel.kt
@@ -56,6 +56,9 @@
private val mediaLogger: MediaLogger,
) {
+ val hasAnyMediaOrRecommendations: StateFlow<Boolean> = interactor.hasAnyMediaOrRecommendation
+ val hasActiveMediaOrRecommendations: StateFlow<Boolean> =
+ interactor.hasActiveMediaOrRecommendation
val mediaItems: StateFlow<List<MediaCommonViewModel>> =
interactor.currentMedia
.map { sortedItems ->
@@ -114,7 +117,7 @@
qsExpanded: Boolean,
visibleIndex: Int,
location: Int,
- isUpdate: Boolean = false
+ isUpdate: Boolean = false,
) {
// Skip logging if on LS or QQS, and there is no active media card
if (!qsExpanded && !interactor.hasActiveMediaOrRecommendation()) return
@@ -127,7 +130,7 @@
val instanceId = commonModel.mediaLoadedModel.instanceId
return mediaControlByInstanceId[instanceId]?.copy(
immediatelyUpdateUi = commonModel.mediaLoadedModel.immediatelyUpdateUi,
- updateTime = commonModel.updateTime
+ updateTime = commonModel.updateTime,
)
?: MediaCommonViewModel.MediaControl(
instanceId = instanceId,
@@ -144,7 +147,7 @@
},
onUpdated = { onMediaControlAddedOrUpdated(it, commonModel) },
isMediaFromRec = commonModel.isMediaFromRec,
- updateTime = commonModel.updateTime
+ updateTime = commonModel.updateTime,
)
.also { mediaControlByInstanceId[instanceId] = it }
}
@@ -165,7 +168,7 @@
return mediaRecs?.copy(
key = commonModel.recsLoadingModel.key,
loadingEnabled =
- interactor.isRecommendationActive() || mediaFlags.isPersistentSsCardEnabled()
+ interactor.isRecommendationActive() || mediaFlags.isPersistentSsCardEnabled(),
)
?: MediaCommonViewModel.MediaRecommendations(
key = commonModel.recsLoadingModel.key,
@@ -195,7 +198,7 @@
private fun onMediaControlAddedOrUpdated(
commonViewModel: MediaCommonViewModel,
- commonModel: MediaCommonModel.MediaControl
+ commonModel: MediaCommonModel.MediaControl,
) {
if (commonModel.canBeRemoved && !Utils.useMediaResumption(applicationContext)) {
// This media control is due for removal as it is now paused + timed out, and resumption
@@ -222,7 +225,7 @@
private fun onMediaRecommendationRemoved(
commonModel: MediaCommonModel.MediaRecommendations,
- immediatelyRemove: Boolean
+ immediatelyRemove: Boolean,
) {
mediaLogger.logMediaRecommendationCardRemoved(commonModel.recsLoadingModel.key)
if (immediatelyRemove || isReorderingAllowed()) {
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/MediaControlViewModel.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/MediaControlViewModel.kt
index f07f2de..4173d2a 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/MediaControlViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/MediaControlViewModel.kt
@@ -33,6 +33,8 @@
import com.android.systemui.media.controls.shared.model.MediaAction
import com.android.systemui.media.controls.shared.model.MediaButton
import com.android.systemui.media.controls.shared.model.MediaControlModel
+import com.android.systemui.media.controls.ui.controller.MediaHierarchyManager
+import com.android.systemui.media.controls.ui.controller.MediaLocation
import com.android.systemui.media.controls.util.MediaSmartspaceLogger.Companion.SMARTSPACE_CARD_CLICK_EVENT
import com.android.systemui.media.controls.util.MediaSmartspaceLogger.Companion.SMARTSPACE_CARD_DISMISS_EVENT
import com.android.systemui.media.controls.util.MediaUiEventLogger
@@ -70,7 +72,7 @@
private var isPlaying = false
private var isAnyButtonClicked = false
- private var location = -1
+ @MediaLocation private var location = MediaHierarchyManager.LOCATION_UNKNOWN
private var playerViewModel: MediaPlayerViewModel? = null
fun isNewPlayer(viewModel: MediaPlayerViewModel): Boolean {
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/MediaRecommendationsViewModel.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/MediaRecommendationsViewModel.kt
index a7bce77..6bc6b10a 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/MediaRecommendationsViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/MediaRecommendationsViewModel.kt
@@ -31,6 +31,8 @@
import com.android.systemui.media.controls.shared.model.MediaRecModel
import com.android.systemui.media.controls.shared.model.MediaRecommendationsModel
import com.android.systemui.media.controls.shared.model.NUM_REQUIRED_RECOMMENDATIONS
+import com.android.systemui.media.controls.ui.controller.MediaHierarchyManager
+import com.android.systemui.media.controls.ui.controller.MediaLocation
import com.android.systemui.media.controls.ui.controller.MediaViewController.Companion.GUTS_ANIMATION_DURATION
import com.android.systemui.media.controls.util.MediaDataUtils
import com.android.systemui.media.controls.util.MediaSmartspaceLogger.Companion.SMARTSPACE_CARD_CLICK_EVENT
@@ -66,7 +68,7 @@
.distinctUntilChanged()
.flowOn(backgroundDispatcher)
- private var location = -1
+ @MediaLocation private var location = MediaHierarchyManager.LOCATION_UNKNOWN
/**
* Called whenever the recommendation has been expired or removed by the user. This method
diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaSwitchingController.java b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaSwitchingController.java
index f7b7353..b69b25d 100644
--- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaSwitchingController.java
+++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaSwitchingController.java
@@ -77,6 +77,7 @@
import com.android.settingslib.bluetooth.LocalBluetoothLeBroadcastMetadata;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.media.InfoMediaManager;
+import com.android.settingslib.media.InputMediaDevice;
import com.android.settingslib.media.InputRouteManager;
import com.android.settingslib.media.LocalMediaManager;
import com.android.settingslib.media.MediaDevice;
@@ -875,6 +876,17 @@
}
protected void connectDevice(MediaDevice device) {
+ // If input routing is supported and the device is an input device, call mInputRouteManager
+ // to handle routing.
+ if (enableInputRouting() && device instanceof InputMediaDevice) {
+ var unused =
+ ThreadUtils.postOnBackgroundThread(
+ () -> {
+ mInputRouteManager.selectDevice(device);
+ });
+ return;
+ }
+
mMetricLogger.updateOutputEndPoints(getCurrentConnectedMediaDevice(), device);
ThreadUtils.postOnBackgroundThread(() -> {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java
index 13cedc2..6cf5b32 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java
@@ -107,6 +107,8 @@
setLayoutForMediaInScene();
};
+ private boolean mLastListening;
+
@VisibleForTesting
protected final QSPanel.OnConfigurationChangedListener mOnConfigurationChangedListener =
new QSPanel.OnConfigurationChangedListener() {
@@ -242,6 +244,8 @@
switchTileLayout(true);
mDumpManager.registerDumpable(mView.getDumpableTag(), this);
+
+ setListening(mLastListening);
}
private void registerForMediaInteractorChanges() {
@@ -259,7 +263,10 @@
mQSLogger.logOnViewDetached(mLastOrientation, mView.getDumpableTag());
mView.removeOnConfigurationChangedListener(mOnConfigurationChangedListener);
+ // Call directly so mLastListening is not modified. We want that to have the last actual
+ // value.
mView.getTileLayout().setListening(false, mUiEventLogger);
+ mView.setListening(false);
mMediaHost.removeVisibilityChangeListener(mMediaHostVisibilityListener);
@@ -436,6 +443,7 @@
}
void setListening(boolean listening) {
+ mLastListening = listening;
if (mView.isListening() == listening) return;
mView.setListening(listening);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt b/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt
index c174038..ba0d938 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt
@@ -17,16 +17,24 @@
package com.android.systemui.qs.composefragment
import android.annotation.SuppressLint
+import android.content.Context
+import android.graphics.PointF
import android.graphics.Rect
import android.os.Bundle
import android.util.IndentingPrintWriter
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
+import android.widget.FrameLayout
import androidx.activity.OnBackPressedDispatcher
import androidx.activity.OnBackPressedDispatcherOwner
import androidx.activity.setViewTreeOnBackPressedDispatcherOwner
+import androidx.compose.animation.AnimatedContent
import androidx.compose.animation.AnimatedVisibility
+import androidx.compose.animation.core.tween
+import androidx.compose.animation.fadeIn
+import androidx.compose.animation.fadeOut
+import androidx.compose.animation.togetherWith
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
@@ -88,11 +96,12 @@
import com.android.systemui.qs.composefragment.viewmodel.QSFragmentComposeViewModel
import com.android.systemui.qs.flags.QSComposeFragment
import com.android.systemui.qs.footer.ui.compose.FooterActions
+import com.android.systemui.qs.panels.ui.compose.EditMode
import com.android.systemui.qs.panels.ui.compose.QuickQuickSettings
import com.android.systemui.qs.shared.ui.ElementKeys
+import com.android.systemui.qs.ui.composable.QuickSettingsLayout
import com.android.systemui.qs.ui.composable.QuickSettingsShade
import com.android.systemui.qs.ui.composable.QuickSettingsTheme
-import com.android.systemui.qs.ui.composable.ShadeBody
import com.android.systemui.res.R
import com.android.systemui.util.LifecycleFragment
import com.android.systemui.util.asIndenting
@@ -179,57 +188,105 @@
savedInstanceState: Bundle?,
): View {
val context = inflater.context
- return ComposeView(context).apply {
- setBackPressedDispatcher()
- setContent {
- PlatformTheme {
- val visible by viewModel.qsVisible.collectAsStateWithLifecycle()
+ val composeView =
+ ComposeView(context).apply {
+ setBackPressedDispatcher()
+ setContent {
+ PlatformTheme {
+ val visible by viewModel.qsVisible.collectAsStateWithLifecycle()
- AnimatedVisibility(
- visible = visible,
- modifier =
- Modifier.windowInsetsPadding(WindowInsets.navigationBars)
- .thenIf(notificationScrimClippingParams.isEnabled) {
- Modifier.notificationScrimClip(
- notificationScrimClippingParams.leftInset,
- notificationScrimClippingParams.top,
- notificationScrimClippingParams.rightInset,
- notificationScrimClippingParams.bottom,
- notificationScrimClippingParams.radius,
- )
- }
- .graphicsLayer { elevation = 4.dp.toPx() },
- ) {
- val sceneState = remember {
- MutableSceneTransitionLayoutState(
- viewModel.expansionState.value.toIdleSceneKey(),
- transitions =
- transitions {
- from(QuickQuickSettings, QuickSettings) {
- quickQuickSettingsToQuickSettings()
- }
- },
- )
- }
-
- LaunchedEffect(Unit) {
- synchronizeQsState(
- sceneState,
- viewModel.expansionState.map { it.progress },
- )
- }
-
- SceneTransitionLayout(
- state = sceneState,
- modifier = Modifier.fillMaxSize(),
+ AnimatedVisibility(
+ visible = visible,
+ modifier =
+ Modifier.windowInsetsPadding(WindowInsets.navigationBars)
+ .thenIf(notificationScrimClippingParams.isEnabled) {
+ Modifier.notificationScrimClip(
+ notificationScrimClippingParams.leftInset,
+ notificationScrimClippingParams.top,
+ notificationScrimClippingParams.rightInset,
+ notificationScrimClippingParams.bottom,
+ notificationScrimClippingParams.radius,
+ )
+ }
+ .graphicsLayer { elevation = 4.dp.toPx() },
) {
- scene(QuickSettings) { QuickSettingsElement() }
-
- scene(QuickQuickSettings) { QuickQuickSettingsElement() }
+ val isEditing by
+ viewModel.containerViewModel.editModeViewModel.isEditing
+ .collectAsStateWithLifecycle()
+ val animationSpecEditMode = tween<Float>(EDIT_MODE_TIME_MILLIS)
+ AnimatedContent(
+ targetState = isEditing,
+ transitionSpec = {
+ fadeIn(animationSpecEditMode) togetherWith
+ fadeOut(animationSpecEditMode)
+ },
+ label = "EditModeAnimatedContent",
+ ) { editing ->
+ if (editing) {
+ val qqsPadding by
+ viewModel.qqsHeaderHeight.collectAsStateWithLifecycle()
+ EditMode(
+ viewModel = viewModel.containerViewModel.editModeViewModel,
+ modifier =
+ Modifier.fillMaxWidth()
+ .padding(top = { qqsPadding })
+ .padding(
+ horizontal = {
+ QuickSettingsShade.Dimensions.Padding
+ .roundToPx()
+ }
+ ),
+ )
+ } else {
+ CollapsableQuickSettingsSTL()
+ }
+ }
}
}
}
}
+
+ val frame =
+ FrameLayoutTouchPassthrough(
+ context,
+ { notificationScrimClippingParams.isEnabled },
+ { notificationScrimClippingParams.top },
+ )
+ frame.addView(
+ composeView,
+ FrameLayout.LayoutParams.MATCH_PARENT,
+ FrameLayout.LayoutParams.MATCH_PARENT,
+ )
+ return frame
+ }
+
+ /**
+ * STL that contains both QQS (tiles) and QS (brightness, tiles, footer actions), but no Edit
+ * mode. It tracks [QSFragmentComposeViewModel.expansionState] to drive the transition between
+ * [SceneKeys.QuickQuickSettings] and [SceneKeys.QuickSettings].
+ */
+ @Composable
+ private fun CollapsableQuickSettingsSTL() {
+ val sceneState = remember {
+ MutableSceneTransitionLayoutState(
+ viewModel.expansionState.value.toIdleSceneKey(),
+ transitions =
+ transitions {
+ from(QuickQuickSettings, QuickSettings) {
+ quickQuickSettingsToQuickSettings()
+ }
+ },
+ )
+ }
+
+ LaunchedEffect(Unit) {
+ synchronizeQsState(sceneState, viewModel.expansionState.map { it.progress })
+ }
+
+ SceneTransitionLayout(state = sceneState, modifier = Modifier.fillMaxSize()) {
+ scene(QuickSettings) { QuickSettingsElement() }
+
+ scene(QuickQuickSettings) { QuickQuickSettingsElement() }
}
}
@@ -445,7 +502,7 @@
qsContainerController,
viewModel.containerViewModel.editModeViewModel.isEditing,
) {
- setCustomizerShowing(it)
+ setCustomizerShowing(it, EDIT_MODE_TIME_MILLIS.toLong())
}
}
}
@@ -519,7 +576,10 @@
Spacer(
modifier = Modifier.height { qqsPadding + qsExtraPadding.roundToPx() }
)
- ShadeBody(viewModel = viewModel.containerViewModel)
+ QuickSettingsLayout(
+ viewModel = viewModel.containerViewModel,
+ modifier = Modifier.sysuiResTag("quick_settings_panel"),
+ )
}
}
QuickSettingsTheme {
@@ -717,3 +777,28 @@
finishCompletable.complete(Unit)
}
}
+
+private const val EDIT_MODE_TIME_MILLIS = 500
+
+/**
+ * Ignore touches below the value returned by [clippingTopProvider], when clipping is enabled, as
+ * per [clippingEnabledProvider].
+ */
+private class FrameLayoutTouchPassthrough(
+ context: Context,
+ private val clippingEnabledProvider: () -> Boolean,
+ private val clippingTopProvider: () -> Int,
+) : FrameLayout(context) {
+ override fun isTransformedTouchPointInView(
+ x: Float,
+ y: Float,
+ child: View?,
+ outLocalPoint: PointF?,
+ ): Boolean {
+ return if (clippingEnabledProvider() && y + translationY > clippingTopProvider()) {
+ false
+ } else {
+ super.isTransformedTouchPointInView(x, y, child, outLocalPoint)
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/PagerDots.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/PagerDots.kt
index 7de22161..331aabb 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/PagerDots.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/PagerDots.kt
@@ -31,9 +31,11 @@
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.CornerRadius
+import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.geometry.Size
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.drawscope.DrawScope
+import androidx.compose.ui.graphics.drawscope.scale
import androidx.compose.ui.semantics.pageLeft
import androidx.compose.ui.semantics.pageRight
import androidx.compose.ui.semantics.semantics
@@ -60,68 +62,64 @@
val inPageTransition by
remember(pagerState) {
derivedStateOf {
- pagerState.currentPageOffsetFraction.absoluteValue > 0.01 &&
+ pagerState.currentPageOffsetFraction.absoluteValue > 0.05 &&
!pagerState.isOverscrolling()
}
}
val coroutineScope = rememberCoroutineScope()
- Row(
- modifier =
- modifier
- .wrapContentWidth()
- .pagerDotsSemantics(
- pagerState,
- coroutineScope,
+ val doubleDotWidth = dotSize * 2 + spaceSize
+ val activeMarkerWidth by
+ animateDpAsState(
+ targetValue = if (inPageTransition) doubleDotWidth else dotSize,
+ label = "PagerDotsTransitionAnimation",
+ )
+ val cornerRadius = dotSize / 2
+
+ fun DrawScope.drawDoubleRect(withPrevious: Boolean, width: Dp) {
+ drawRoundRect(
+ topLeft =
+ Offset(
+ if (withPrevious) {
+ dotSize.toPx() - width.toPx()
+ } else {
+ -(dotSize.toPx() + spaceSize.toPx())
+ },
+ 0f,
),
+ color = activeColor,
+ size = Size(width.toPx(), dotSize.toPx()),
+ cornerRadius = CornerRadius(cornerRadius.toPx()),
+ )
+ }
+
+ Row(
+ modifier = modifier.wrapContentWidth().pagerDotsSemantics(pagerState, coroutineScope),
horizontalArrangement = spacedBy(spaceSize),
- verticalAlignment = Alignment.CenterVertically
+ verticalAlignment = Alignment.CenterVertically,
) {
- if (!inPageTransition) {
- repeat(pagerState.pageCount) { i ->
- // We use canvas directly to only invalidate the draw phase when the page is
- // changing.
- Canvas(Modifier.size(dotSize)) {
- if (pagerState.currentPage == i) {
- drawCircle(activeColor)
- } else {
- drawCircle(nonActiveColor)
- }
- }
- }
- } else {
- val doubleDotWidth = dotSize * 2 + spaceSize
- val cornerRadius = dotSize / 2
- val width by
- animateDpAsState(targetValue = if (inPageTransition) doubleDotWidth else dotSize)
-
- fun DrawScope.drawDoubleRect() {
- drawRoundRect(
- color = activeColor,
- size = Size(width.toPx(), dotSize.toPx()),
- cornerRadius = CornerRadius(cornerRadius.toPx(), cornerRadius.toPx())
- )
- }
-
- repeat(pagerState.pageCount) { page ->
- Canvas(Modifier.size(dotSize)) {
- val withPrevious = pagerState.currentPageOffsetFraction < 0
- val ltr = layoutDirection == LayoutDirection.Ltr
+ // This means that the active rounded rect has to be drawn between the current page
+ // and the previous one (as we are animating back), or the current one if not transitioning
+ val withPrevious = pagerState.currentPageOffsetFraction <= 0 || pagerState.isOverscrolling()
+ repeat(pagerState.pageCount) { page ->
+ Canvas(Modifier.size(dotSize)) {
+ val rtl = layoutDirection == LayoutDirection.Rtl
+ scale(if (rtl) -1f else 1f, 1f, Offset(0f, center.y)) {
+ drawCircle(nonActiveColor)
+ // We always want to draw the rounded rect on the rightmost dot iteration, so
+ // the inactive dot is always drawn behind.
+ // This means that:
+ // * if we are scrolling back, we draw it when we are in the current page (so it
+ // extends between this page and the previous one).
+ // * if we are scrolling forward, we draw it when we are in the next page (so it
+ // extends between the next page and the current one).
+ // * if we are not scrolling, withPrevious is true (pageOffset 0) and we
+ // draw in the current page.
+ // drawDoubleRect calculates the offset based on the above.
if (
- withPrevious && page == (pagerState.currentPage - 1) ||
- !withPrevious && page == pagerState.currentPage
- ) {
- if (ltr) {
- drawDoubleRect()
- }
- } else if (
withPrevious && page == pagerState.currentPage ||
- !withPrevious && page == (pagerState.currentPage + 1)
+ (!withPrevious && page == pagerState.currentPage + 1)
) {
- if (!ltr) {
- drawDoubleRect()
- }
- } else {
- drawCircle(nonActiveColor)
+ drawDoubleRect(withPrevious, activeMarkerWidth)
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/selection/Selection.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/selection/Selection.kt
index 7c62e59..e0f0b6a 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/selection/Selection.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/selection/Selection.kt
@@ -20,14 +20,18 @@
import androidx.compose.foundation.gestures.detectHorizontalDragGestures
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.systemGestureExclusion
import androidx.compose.material3.LocalMinimumInteractiveComponentSize
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.geometry.Rect
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.toSize
import com.android.systemui.qs.panels.ui.compose.selection.SelectionDefaults.ResizingDotSize
/**
@@ -52,14 +56,18 @@
// not receive the touch input accidentally.
val minTouchTargetSize = LocalMinimumInteractiveComponentSize.current
Box(
- Modifier.size(minTouchTargetSize).pointerInput(Unit) {
- detectHorizontalDragGestures(
- onHorizontalDrag = { _, offset -> selectionState.onResizingDrag(offset) },
- onDragStart = { tileWidths()?.let { selectionState.onResizingDragStart(it) } },
- onDragEnd = selectionState::onResizingDragEnd,
- onDragCancel = selectionState::onResizingDragEnd,
- )
- }
+ Modifier.size(minTouchTargetSize)
+ .systemGestureExclusion { Rect(Offset.Zero, it.size.toSize()) }
+ .pointerInput(Unit) {
+ detectHorizontalDragGestures(
+ onHorizontalDrag = { _, offset -> selectionState.onResizingDrag(offset) },
+ onDragStart = {
+ tileWidths()?.let { selectionState.onResizingDragStart(it) }
+ },
+ onDragEnd = selectionState::onResizingDragEnd,
+ onDragCancel = selectionState::onResizingDragEnd,
+ )
+ }
) {
ResizingDot(transition = transition, modifier = Modifier.align(Alignment.Center))
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt
index 6a8cc17..4f3ea83 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt
@@ -126,12 +126,12 @@
private val overlayColorActive =
Utils.applyAlpha(
/* alpha= */ 0.11f,
- Utils.getColorAttrDefaultColor(context, R.attr.onShadeActive)
+ Utils.getColorAttrDefaultColor(context, R.attr.onShadeActive),
)
private val overlayColorInactive =
Utils.applyAlpha(
/* alpha= */ 0.08f,
- Utils.getColorAttrDefaultColor(context, R.attr.onShadeInactive)
+ Utils.getColorAttrDefaultColor(context, R.attr.onShadeInactive),
)
private val colorLabelActive = Utils.getColorAttrDefaultColor(context, R.attr.onShadeActive)
@@ -188,10 +188,7 @@
private var lastState = INVALID
private var lastIconTint = 0
private val launchableViewDelegate =
- LaunchableViewDelegate(
- this,
- superSetVisibility = { super.setVisibility(it) },
- )
+ LaunchableViewDelegate(this, superSetVisibility = { super.setVisibility(it) })
private var lastDisabledByPolicy = false
private val locInScreen = IntArray(2)
@@ -418,7 +415,7 @@
initLongPressEffectCallback()
init(
{ _: View -> longPressEffect.onTileClick() },
- null, // Haptics and long-clicks will be handled by the [QSLongPressEffect]
+ { _: View -> true }, // Haptics and long-clicks are handled by [QSLongPressEffect]
)
} else {
val expandable = Expandable.fromView(this)
@@ -583,7 +580,7 @@
AccessibilityNodeInfo.AccessibilityAction.ACTION_CLICK.id,
resources.getString(
R.string.accessibility_tile_disabled_by_policy_action_description
- )
+ ),
)
)
} else {
@@ -591,7 +588,7 @@
info.addAction(
AccessibilityNodeInfo.AccessibilityAction(
AccessibilityNodeInfo.AccessibilityAction.ACTION_LONG_CLICK.id,
- resources.getString(R.string.accessibility_long_click_tile)
+ resources.getString(R.string.accessibility_long_click_tile),
)
)
}
@@ -716,35 +713,35 @@
state.spec,
state.state,
state.disabledByPolicy,
- getBackgroundColorForState(state.state, state.disabledByPolicy)
+ getBackgroundColorForState(state.state, state.disabledByPolicy),
)
if (allowAnimations) {
singleAnimator.setValues(
colorValuesHolder(
BACKGROUND_NAME,
backgroundColor,
- getBackgroundColorForState(state.state, state.disabledByPolicy)
+ getBackgroundColorForState(state.state, state.disabledByPolicy),
),
colorValuesHolder(
LABEL_NAME,
label.currentTextColor,
- getLabelColorForState(state.state, state.disabledByPolicy)
+ getLabelColorForState(state.state, state.disabledByPolicy),
),
colorValuesHolder(
SECONDARY_LABEL_NAME,
secondaryLabel.currentTextColor,
- getSecondaryLabelColorForState(state.state, state.disabledByPolicy)
+ getSecondaryLabelColorForState(state.state, state.disabledByPolicy),
),
colorValuesHolder(
CHEVRON_NAME,
chevronView.imageTintList?.defaultColor ?: 0,
- getChevronColorForState(state.state, state.disabledByPolicy)
+ getChevronColorForState(state.state, state.disabledByPolicy),
),
colorValuesHolder(
OVERLAY_NAME,
backgroundOverlayColor,
- getOverlayColorForState(state.state)
- )
+ getOverlayColorForState(state.state),
+ ),
)
singleAnimator.start()
} else {
@@ -753,7 +750,7 @@
getLabelColorForState(state.state, state.disabledByPolicy),
getSecondaryLabelColorForState(state.state, state.disabledByPolicy),
getChevronColorForState(state.state, state.disabledByPolicy),
- getOverlayColorForState(state.state)
+ getOverlayColorForState(state.state),
)
}
}
@@ -1077,7 +1074,7 @@
backgroundColor,
label.currentTextColor,
secondaryLabel.currentTextColor,
- chevronView.imageTintList?.defaultColor ?: 0
+ chevronView.imageTintList?.defaultColor ?: 0,
)
inner class StateChangeRunnable(private val state: QSTile.State) : Runnable {
diff --git a/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsControllerImpl.java b/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsControllerImpl.java
index 4ed4af6..830649b 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsControllerImpl.java
@@ -42,7 +42,6 @@
import android.util.MathUtils;
import android.view.MotionEvent;
import android.view.VelocityTracker;
-import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.view.WindowInsets;
@@ -464,9 +463,6 @@
mJavaAdapter.alwaysCollectFlow(
mCommunalTransitionViewModelLazy.get().isUmoOnCommunal(),
this::setShouldUpdateSquishinessOnMedia);
- mJavaAdapter.alwaysCollectFlow(
- mShadeInteractor.isAnyExpanded(),
- this::onAnyExpandedChanged);
}
private void initNotificationStackScrollLayoutController() {
@@ -486,10 +482,6 @@
}
}
- private void onAnyExpandedChanged(boolean isAnyExpanded) {
- mQsFrame.setVisibility(isAnyExpanded ? View.VISIBLE : View.INVISIBLE);
- }
-
private void onNotificationScrolled(int newScrollPosition) {
updateExpansionEnabledAmbient();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/core/StatusBarInitializer.kt b/packages/SystemUI/src/com/android/systemui/statusbar/core/StatusBarInitializer.kt
index 975b92e..3ad76b7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/core/StatusBarInitializer.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/core/StatusBarInitializer.kt
@@ -16,6 +16,8 @@
package com.android.systemui.statusbar.core
import android.app.Fragment
+import androidx.annotation.VisibleForTesting
+import com.android.systemui.CoreStartable
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.fragments.FragmentHostManager
import com.android.systemui.res.R
@@ -72,11 +74,38 @@
private val windowController: StatusBarWindowController,
private val collapsedStatusBarFragmentProvider: Provider<CollapsedStatusBarFragment>,
private val creationListeners: Set<@JvmSuppressWildcards OnStatusBarViewInitializedListener>,
-) : StatusBarInitializer {
+) : CoreStartable, StatusBarInitializer {
+ private var component: StatusBarFragmentComponent? = null
+
+ @get:VisibleForTesting
+ var initialized = false
+ private set
override var statusBarViewUpdatedListener: OnStatusBarViewUpdatedListener? = null
+ set(value) {
+ field = value
+ // If a listener is added after initialization, immediately call the callback
+ component?.let { component ->
+ field?.onStatusBarViewUpdated(
+ component.phoneStatusBarViewController,
+ component.phoneStatusBarTransitions,
+ )
+ }
+ }
+
+ override fun start() {
+ if (StatusBarSimpleFragment.isEnabled) {
+ doStart()
+ }
+ }
override fun initializeStatusBar() {
+ StatusBarSimpleFragment.assertInLegacyMode()
+ doStart()
+ }
+
+ private fun doStart() {
+ initialized = true
windowController.fragmentHostManager
.addTagListener(
CollapsedStatusBarFragment.TAG,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesModule.java
index c8f0b52..525f3de 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesModule.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesModule.java
@@ -16,17 +16,28 @@
package com.android.systemui.statusbar.dagger;
+import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.emergency.EmergencyGestureModule;
import com.android.systemui.statusbar.notification.dagger.NotificationsModule;
import com.android.systemui.statusbar.notification.row.NotificationRowModule;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
+import com.android.systemui.statusbar.phone.CentralSurfacesImpl;
import com.android.systemui.statusbar.phone.StatusBarNotificationPresenterModule;
-import com.android.systemui.statusbar.phone.dagger.StatusBarPhoneModule;
+import dagger.Binds;
import dagger.Module;
-/** */
+/**
+ * Dagger Module providing {@link CentralSurfacesImpl}.
+ */
@Module(includes = {CentralSurfacesDependenciesModule.class,
- StatusBarNotificationPresenterModule.class, StatusBarPhoneModule.class,
+ StatusBarNotificationPresenterModule.class,
NotificationsModule.class, NotificationRowModule.class, EmergencyGestureModule.class})
public interface CentralSurfacesModule {
+ /**
+ * Provides our instance of CentralSurfaces which is considered optional.
+ */
+ @Binds
+ @SysUISingleton
+ CentralSurfaces bindsCentralSurfaces(CentralSurfacesImpl impl);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarModule.kt b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarModule.kt
index 55943a5..3903ff3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarModule.kt
@@ -22,8 +22,6 @@
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.log.LogBuffer
import com.android.systemui.log.LogBufferFactory
-import com.android.systemui.statusbar.core.StatusBarInitializer
-import com.android.systemui.statusbar.core.StatusBarInitializerImpl
import com.android.systemui.statusbar.data.StatusBarDataLayerModule
import com.android.systemui.statusbar.phone.LightBarController
import com.android.systemui.statusbar.phone.StatusBarSignalPolicy
@@ -63,8 +61,6 @@
@ClassKey(StatusBarSignalPolicy::class)
abstract fun bindStatusBarSignalPolicy(impl: StatusBarSignalPolicy): CoreStartable
- @Binds abstract fun statusBarInitializer(impl: StatusBarInitializerImpl): StatusBarInitializer
-
companion object {
@Provides
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/EmptyShadeView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/emptyshade/ui/view/EmptyShadeView.java
similarity index 96%
rename from packages/SystemUI/src/com/android/systemui/statusbar/EmptyShadeView.java
rename to packages/SystemUI/src/com/android/systemui/statusbar/notification/emptyshade/ui/view/EmptyShadeView.java
index 2338be2..850e944 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/EmptyShadeView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/emptyshade/ui/view/EmptyShadeView.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2014 The Android Open Source Project
+ * Copyright (C) 2024 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -11,10 +11,10 @@
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
- * limitations under the License
+ * limitations under the License.
*/
-package com.android.systemui.statusbar;
+package com.android.systemui.statusbar.notification.emptyshade.ui.view;
import android.annotation.ColorInt;
import android.annotation.DrawableRes;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
index 3c6962a..cd3516d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
@@ -22,7 +22,6 @@
import static com.android.internal.jank.InteractionJankMonitor.CUJ_NOTIFICATION_SHADE_SCROLL_FLING;
import static com.android.internal.jank.InteractionJankMonitor.CUJ_SHADE_CLEAR_ALL;
-import static com.android.systemui.Flags.newAodTransition;
import static com.android.systemui.Flags.notificationOverExpansionClippingFix;
import static com.android.systemui.statusbar.notification.stack.NotificationPriorityBucketKt.BUCKET_SILENT;
import static com.android.systemui.statusbar.notification.stack.StackStateAnimator.ANIMATION_DURATION_SWIPE;
@@ -94,7 +93,6 @@
import com.android.systemui.scene.shared.flag.SceneContainerFlag;
import com.android.systemui.shade.QSHeaderBoundsProvider;
import com.android.systemui.shade.TouchLogger;
-import com.android.systemui.statusbar.EmptyShadeView;
import com.android.systemui.statusbar.NotificationShelf;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.notification.ColorUpdateLogger;
@@ -106,6 +104,7 @@
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.render.GroupExpansionManager;
import com.android.systemui.statusbar.notification.collection.render.GroupMembershipManager;
+import com.android.systemui.statusbar.notification.emptyshade.ui.view.EmptyShadeView;
import com.android.systemui.statusbar.notification.footer.shared.FooterViewRefactor;
import com.android.systemui.statusbar.notification.footer.ui.view.FooterView;
import com.android.systemui.statusbar.notification.logging.NotificationLogger;
@@ -1549,15 +1548,6 @@
@VisibleForTesting
public void updateInterpolatedStackHeight(float endHeight, float fraction) {
- if (!newAodTransition()) {
- // During the (AOD<=>LS) transition where dozeAmount is changing,
- // apply dozeAmount to stack height instead of expansionFraction
- // to unfurl notifications on AOD=>LS wakeup (and furl up on LS=>AOD sleep)
- final float dozeAmount = mAmbientState.getDozeAmount();
- if (0f < dozeAmount && dozeAmount < 1f) {
- fraction = 1f - dozeAmount;
- }
- }
mAmbientState.setInterpolatedStackHeight(
MathUtils.lerp(endHeight * StackScrollAlgorithm.START_FRACTION,
endHeight, fraction));
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java
index cccac4b..9c0fd0e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java
@@ -31,9 +31,9 @@
import com.android.systemui.res.R;
import com.android.systemui.scene.shared.flag.SceneContainerFlag;
import com.android.systemui.shade.transition.LargeScreenShadeInterpolator;
-import com.android.systemui.statusbar.EmptyShadeView;
import com.android.systemui.statusbar.NotificationShelf;
import com.android.systemui.statusbar.notification.SourceType;
+import com.android.systemui.statusbar.notification.emptyshade.ui.view.EmptyShadeView;
import com.android.systemui.statusbar.notification.footer.shared.FooterViewRefactor;
import com.android.systemui.statusbar.notification.footer.ui.view.FooterView;
import com.android.systemui.statusbar.notification.row.ActivatableNotificationView;
@@ -677,22 +677,30 @@
);
if (view instanceof FooterView) {
if (FooterViewRefactor.isEnabled()) {
- // TODO(b/333445519): shouldBeHidden should reflect whether the shade is closed
- // already, so we shouldn't need to use ambientState here. However, currently it
- // doesn't get updated quickly enough and can cause the footer to flash when
- // closing the shade. As such, we temporarily also check the ambientState directly.
- if (((FooterView) view).shouldBeHidden() || !ambientState.isShadeExpanded()) {
- // Note: This is no longer necessary in flexiglass.
- if (!SceneContainerFlag.isEnabled()) {
- viewState.hidden = true;
- }
- } else {
- final float footerEnd = algorithmState.mCurrentExpandedYPosition
- + view.getIntrinsicHeight();
- final boolean noSpaceForFooter = footerEnd > ambientState.getStackEndHeight();
+ if (SceneContainerFlag.isEnabled()) {
+ final float footerEnd =
+ stackTop + viewState.getYTranslation() + view.getIntrinsicHeight();
+ final boolean noSpaceForFooter = footerEnd > ambientState.getStackCutoff();
((FooterView.FooterViewState) viewState).hideContent =
noSpaceForFooter || (ambientState.isClearAllInProgress()
&& !hasNonClearableNotifs(algorithmState));
+ } else {
+ // TODO(b/333445519): shouldBeHidden should reflect whether the shade is closed
+ // already, so we shouldn't need to use ambientState here. However,
+ // currently it doesn't get updated quickly enough and can cause the footer to
+ // flash when closing the shade. As such, we temporarily also check the
+ // ambientState directly.
+ if (((FooterView) view).shouldBeHidden() || !ambientState.isShadeExpanded()) {
+ viewState.hidden = true;
+ } else {
+ final float footerEnd = algorithmState.mCurrentExpandedYPosition
+ + view.getIntrinsicHeight();
+ final boolean noSpaceForFooter =
+ footerEnd > ambientState.getStackEndHeight();
+ ((FooterView.FooterViewState) viewState).hideContent =
+ noSpaceForFooter || (ambientState.isClearAllInProgress()
+ && !hasNonClearableNotifs(algorithmState));
+ }
}
} else {
final boolean shadeClosed = !ambientState.isShadeExpanded();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java
index 59533b3..1d3f0e1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java
@@ -29,7 +29,6 @@
import static com.android.systemui.Dependency.TIME_TICK_HANDLER_NAME;
import static com.android.systemui.Flags.keyboardShortcutHelperRewrite;
import static com.android.systemui.Flags.lightRevealMigration;
-import static com.android.systemui.Flags.newAodTransition;
import static com.android.systemui.Flags.relockWithPowerButtonImmediately;
import static com.android.systemui.Flags.statusBarSignalPolicyRefactor;
import static com.android.systemui.charging.WirelessChargingAnimation.UNKNOWN_BATTERY_LEVEL;
@@ -206,6 +205,7 @@
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.SysuiStatusBarStateController;
import com.android.systemui.statusbar.core.StatusBarInitializer;
+import com.android.systemui.statusbar.core.StatusBarSimpleFragment;
import com.android.systemui.statusbar.data.model.StatusBarMode;
import com.android.systemui.statusbar.data.repository.StatusBarModeRepositoryStore;
import com.android.systemui.statusbar.notification.NotificationActivityStarter;
@@ -1204,7 +1204,10 @@
setBouncerShowingForStatusBarComponents(mBouncerShowing);
checkBarModes();
});
- mStatusBarInitializer.initializeStatusBar();
+ // When the flag is on, we register the fragment as a core startable and this is not needed
+ if (!StatusBarSimpleFragment.isEnabled()) {
+ mStatusBarInitializer.initializeStatusBar();
+ }
mStatusBarTouchableRegionManager.setup(getNotificationShadeWindowView());
@@ -1509,7 +1512,6 @@
mNotificationShadeWindowController.fetchWindowRootView();
getNotificationShadeWindowViewController().setupExpandedStatusBar();
getNotificationShadeWindowViewController().setupCommunalHubLayout();
- mBackActionInteractor.setup(mQsController, mShadeSurface);
}
protected NotificationShadeWindowViewController getNotificationShadeWindowViewController() {
@@ -2547,7 +2549,7 @@
mNotificationShadeWindowController.batchApplyWindowLayoutParams(()-> {
mDeviceInteractive = true;
- boolean isFlaggedOff = newAodTransition() && MigrateClocksToBlueprint.isEnabled();
+ boolean isFlaggedOff = MigrateClocksToBlueprint.isEnabled();
if (!isFlaggedOff && shouldAnimateDozeWakeup()) {
// If this is false, the power button must be physically pressed in order to
// trigger fingerprint authentication.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java
deleted file mode 100644
index 942d186..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * 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.
- */
-
-package com.android.systemui.statusbar.phone.dagger;
-
-import com.android.systemui.dagger.SysUISingleton;
-import com.android.systemui.statusbar.phone.CentralSurfaces;
-import com.android.systemui.statusbar.phone.CentralSurfacesImpl;
-
-import dagger.Binds;
-import dagger.Module;
-
-/**
- * Dagger Module providing {@link CentralSurfacesImpl}.
- */
-@Module
-public interface StatusBarPhoneModule {
- /**
- * Provides our instance of CentralSurfaces which is considered optional.
- */
- @Binds
- @SysUISingleton
- CentralSurfaces bindsCentralSurfaces(CentralSurfacesImpl impl);
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.kt
new file mode 100644
index 0000000..13b651e8
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.kt
@@ -0,0 +1,37 @@
+/*
+ * 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.
+ */
+package com.android.systemui.statusbar.phone.dagger
+
+import com.android.systemui.CoreStartable
+import com.android.systemui.statusbar.core.StatusBarInitializer
+import com.android.systemui.statusbar.core.StatusBarInitializerImpl
+import dagger.Binds
+import dagger.Module
+import dagger.multibindings.ClassKey
+import dagger.multibindings.IntoMap
+
+/** Similar in purpose to [StatusBarModule], but scoped only to phones */
+@Module
+interface StatusBarPhoneModule {
+
+ /** Binds {@link StatusBarInitializer} as a {@link CoreStartable}. */
+ @Binds
+ @IntoMap
+ @ClassKey(StatusBarInitializerImpl::class)
+ fun bindStatusBarInitializer(impl: StatusBarInitializerImpl): CoreStartable
+
+ @Binds fun statusBarInitializer(impl: StatusBarInitializerImpl): StatusBarInitializer
+}
diff --git a/packages/SystemUI/src/com/android/systemui/user/data/repository/UserRepository.kt b/packages/SystemUI/src/com/android/systemui/user/data/repository/UserRepository.kt
index a817b31..7bf9efa 100644
--- a/packages/SystemUI/src/com/android/systemui/user/data/repository/UserRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/user/data/repository/UserRepository.kt
@@ -195,7 +195,7 @@
val callback =
object : UserTracker.Callback {
- override fun onUserChanging(newUser: Int, userContext: Context) {
+ override fun onBeforeUserSwitching(newUser: Int) {
send(SelectionStatus.SELECTION_IN_PROGRESS)
}
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/ClockEventControllerTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/ClockEventControllerTest.kt
index a94ef36..c7b707d 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/ClockEventControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/keyguard/ClockEventControllerTest.kt
@@ -17,11 +17,16 @@
import android.content.BroadcastReceiver
import android.platform.test.annotations.DisableFlags
+import android.platform.test.annotations.EnableFlags
+import android.provider.Settings
import android.view.View
import android.view.ViewTreeObserver
import android.widget.FrameLayout
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
+import com.android.settingslib.notification.modes.TestModeBuilder.MANUAL_DND_ACTIVE
+import com.android.settingslib.notification.modes.TestModeBuilder.MANUAL_DND_INACTIVE
+import com.android.systemui.Flags as AConfigFlags
import com.android.systemui.SysuiTestCase
import com.android.systemui.broadcast.BroadcastDispatcher
import com.android.systemui.flags.Flags
@@ -36,6 +41,7 @@
import com.android.systemui.keyguard.shared.model.KeyguardState.OCCLUDED
import com.android.systemui.keyguard.shared.model.TransitionState
import com.android.systemui.keyguard.shared.model.TransitionStep
+import com.android.systemui.kosmos.testScope
import com.android.systemui.log.core.LogLevel
import com.android.systemui.log.core.LogcatOnlyMessageBuffer
import com.android.systemui.plugins.clocks.ClockAnimations
@@ -46,9 +52,15 @@
import com.android.systemui.plugins.clocks.ClockFaceEvents
import com.android.systemui.plugins.clocks.ClockMessageBuffers
import com.android.systemui.plugins.clocks.ClockTickRate
+import com.android.systemui.plugins.clocks.ZenData
+import com.android.systemui.plugins.clocks.ZenData.ZenMode
+import com.android.systemui.res.R
import com.android.systemui.statusbar.policy.BatteryController
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.statusbar.policy.ZenModeController
+import com.android.systemui.statusbar.policy.data.repository.fakeZenModeRepository
+import com.android.systemui.statusbar.policy.domain.interactor.zenModeInteractor
+import com.android.systemui.testKosmos
import com.android.systemui.util.concurrency.DelayableExecutor
import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.argumentCaptor
@@ -57,9 +69,12 @@
import com.android.systemui.util.mockito.mock
import java.util.TimeZone
import java.util.concurrent.Executor
+import java.util.concurrent.TimeUnit
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.runBlocking
+import kotlinx.coroutines.test.runCurrent
+import kotlinx.coroutines.test.runTest
import kotlinx.coroutines.yield
import org.junit.Assert.assertEquals
import org.junit.Before
@@ -73,15 +88,26 @@
import org.mockito.Mockito.never
import org.mockito.Mockito.times
import org.mockito.Mockito.verify
-import org.mockito.junit.MockitoJUnit
-import com.android.systemui.Flags as AConfigFlags
import org.mockito.Mockito.`when` as whenever
+import org.mockito.junit.MockitoJUnit
@RunWith(AndroidJUnit4::class)
@SmallTest
+@OptIn(kotlinx.coroutines.ExperimentalCoroutinesApi::class)
class ClockEventControllerTest : SysuiTestCase() {
+ private val kosmos = testKosmos()
+ private val zenModeRepository = kosmos.fakeZenModeRepository
+ private val testScope = kosmos.testScope
+
@JvmField @Rule val mockito = MockitoJUnit.rule()
+
+ private val mainExecutor = ImmediateExecutor()
+ private lateinit var repository: FakeKeyguardRepository
+ private val messageBuffer = LogcatOnlyMessageBuffer(LogLevel.DEBUG)
+ private val clockBuffers = ClockMessageBuffers(messageBuffer, messageBuffer, messageBuffer)
+ private lateinit var underTest: ClockEventController
+
@Mock private lateinit var broadcastDispatcher: BroadcastDispatcher
@Mock private lateinit var batteryController: BatteryController
@Mock private lateinit var keyguardUpdateMonitor: KeyguardUpdateMonitor
@@ -89,7 +115,6 @@
@Mock private lateinit var animations: ClockAnimations
@Mock private lateinit var events: ClockEvents
@Mock private lateinit var clock: ClockController
- @Mock private lateinit var mainExecutor: DelayableExecutor
@Mock private lateinit var bgExecutor: Executor
@Mock private lateinit var smallClockController: ClockFaceController
@Mock private lateinit var smallClockView: View
@@ -102,12 +127,10 @@
@Mock private lateinit var smallClockEvents: ClockFaceEvents
@Mock private lateinit var largeClockEvents: ClockFaceEvents
@Mock private lateinit var parentView: View
- private lateinit var repository: FakeKeyguardRepository
@Mock private lateinit var keyguardTransitionInteractor: KeyguardTransitionInteractor
- private val messageBuffer = LogcatOnlyMessageBuffer(LogLevel.DEBUG)
- private val clockBuffers = ClockMessageBuffers(messageBuffer, messageBuffer, messageBuffer)
- private lateinit var underTest: ClockEventController
+
@Mock private lateinit var zenModeController: ZenModeController
+ private var zenModeControllerCallback: ZenModeController.Callback? = null
@Before
fun setUp() {
@@ -129,12 +152,11 @@
whenever(largeClockController.config)
.thenReturn(ClockFaceConfig(tickRate = ClockTickRate.PER_MINUTE))
+ zenModeRepository.addMode(MANUAL_DND_INACTIVE)
+
repository = FakeKeyguardRepository()
- val withDeps =
- KeyguardInteractorFactory.create(
- repository = repository,
- )
+ val withDeps = KeyguardInteractorFactory.create(repository = repository)
withDeps.featureFlags.apply { set(Flags.REGION_SAMPLING, false) }
underTest =
@@ -151,7 +173,8 @@
bgExecutor,
clockBuffers,
withDeps.featureFlags,
- zenModeController
+ zenModeController,
+ kosmos.zenModeInteractor,
)
underTest.clock = clock
@@ -161,6 +184,10 @@
repository.setIsDozing(true)
repository.setDozeAmount(1f)
}
+
+ val zenCallbackCaptor = argumentCaptor<ZenModeController.Callback>()
+ verify(zenModeController).addCallback(zenCallbackCaptor.capture())
+ zenModeControllerCallback = zenCallbackCaptor.value
}
@Test
@@ -349,17 +376,12 @@
fun listenForTransitionToAodFromGone_updatesClockDozeAmountToOne() =
runBlocking(IMMEDIATE) {
val transitionStep = MutableStateFlow(TransitionStep())
- whenever(keyguardTransitionInteractor
- .transition(Edge.create(to = AOD)))
+ whenever(keyguardTransitionInteractor.transition(Edge.create(to = AOD)))
.thenReturn(transitionStep)
val job = underTest.listenForAnyStateToAodTransition(this)
transitionStep.value =
- TransitionStep(
- from = GONE,
- to = AOD,
- transitionState = TransitionState.STARTED,
- )
+ TransitionStep(from = GONE, to = AOD, transitionState = TransitionState.STARTED)
yield()
verify(animations, times(2)).doze(1f)
@@ -371,8 +393,7 @@
fun listenForTransitionToLSFromOccluded_updatesClockDozeAmountToZero() =
runBlocking(IMMEDIATE) {
val transitionStep = MutableStateFlow(TransitionStep())
- whenever(keyguardTransitionInteractor
- .transition(Edge.create(to = LOCKSCREEN)))
+ whenever(keyguardTransitionInteractor.transition(Edge.create(to = LOCKSCREEN)))
.thenReturn(transitionStep)
val job = underTest.listenForAnyStateToLockscreenTransition(this)
@@ -393,8 +414,7 @@
fun listenForTransitionToAodFromLockscreen_neverUpdatesClockDozeAmount() =
runBlocking(IMMEDIATE) {
val transitionStep = MutableStateFlow(TransitionStep())
- whenever(keyguardTransitionInteractor
- .transition(Edge.create(to = AOD)))
+ whenever(keyguardTransitionInteractor.transition(Edge.create(to = AOD)))
.thenReturn(transitionStep)
val job = underTest.listenForAnyStateToAodTransition(this)
@@ -415,8 +435,7 @@
fun listenForAnyStateToLockscreenTransition_neverUpdatesClockDozeAmount() =
runBlocking(IMMEDIATE) {
val transitionStep = MutableStateFlow(TransitionStep())
- whenever(keyguardTransitionInteractor
- .transition(Edge.create(to = LOCKSCREEN)))
+ whenever(keyguardTransitionInteractor.transition(Edge.create(to = LOCKSCREEN)))
.thenReturn(transitionStep)
val job = underTest.listenForAnyStateToLockscreenTransition(this)
@@ -437,8 +456,7 @@
fun listenForAnyStateToDozingTransition_UpdatesClockDozeAmountToOne() =
runBlocking(IMMEDIATE) {
val transitionStep = MutableStateFlow(TransitionStep())
- whenever(keyguardTransitionInteractor
- .transition(Edge.create(to = DOZING)))
+ whenever(keyguardTransitionInteractor.transition(Edge.create(to = DOZING)))
.thenReturn(transitionStep)
val job = underTest.listenForAnyStateToDozingTransition(this)
@@ -498,7 +516,57 @@
verify(smallClockFrame.viewTreeObserver).removeOnGlobalLayoutListener(any())
}
+ @Test
+ @EnableFlags(android.app.Flags.FLAG_MODES_UI)
+ fun listenForDnd_onDndChange_updatesClockZenMode() =
+ testScope.runTest {
+ underTest.listenForDnd(testScope.backgroundScope)
+
+ zenModeRepository.replaceMode(MANUAL_DND_INACTIVE.id, MANUAL_DND_ACTIVE)
+ runCurrent()
+
+ verify(events)
+ .onZenDataChanged(
+ eq(ZenData(ZenMode.IMPORTANT_INTERRUPTIONS, R.string::dnd_is_on.name))
+ )
+
+ zenModeRepository.replaceMode(MANUAL_DND_ACTIVE.id, MANUAL_DND_INACTIVE)
+ runCurrent()
+
+ verify(events).onZenDataChanged(eq(ZenData(ZenMode.OFF, R.string::dnd_is_off.name)))
+ }
+
+ @Test
+ @DisableFlags(android.app.Flags.FLAG_MODES_UI)
+ fun zenModeControllerCallback_onDndChange_updatesClockZenMode() =
+ runBlocking(IMMEDIATE) {
+ zenModeControllerCallback!!.onZenChanged(
+ Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS
+ )
+
+ verify(events)
+ .onZenDataChanged(
+ eq(ZenData(ZenMode.IMPORTANT_INTERRUPTIONS, R.string::dnd_is_on.name))
+ )
+
+ zenModeControllerCallback!!.onZenChanged(Settings.Global.ZEN_MODE_OFF)
+
+ verify(events).onZenDataChanged(eq(ZenData(ZenMode.OFF, R.string::dnd_is_off.name)))
+ }
+
companion object {
private val IMMEDIATE = Dispatchers.Main.immediate
}
}
+
+private class ImmediateExecutor : DelayableExecutor {
+ override fun execute(runnable: Runnable) {
+ runnable.run()
+ }
+
+ override fun executeDelayed(runnable: Runnable, delay: Long, unit: TimeUnit) =
+ runnable.apply { run() }
+
+ override fun executeAtTime(runnable: Runnable, uptimeMillis: Long, unit: TimeUnit) =
+ runnable.apply { run() }
+}
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.kt
index e444db4..5fe5cb3 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.kt
@@ -76,6 +76,7 @@
import com.android.systemui.statusbar.policy.UserSwitcherController
import com.android.systemui.testKosmos
import com.android.systemui.user.domain.interactor.SelectedUserInteractor
+import com.android.systemui.util.concurrency.FakeExecutor
import com.android.systemui.util.kotlin.JavaAdapter
import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.argThat
@@ -84,6 +85,7 @@
import com.android.systemui.util.mockito.mock
import com.android.systemui.util.mockito.whenever
import com.android.systemui.util.settings.GlobalSettings
+import com.android.systemui.util.time.FakeSystemClock
import com.google.common.truth.Truth
import junit.framework.Assert
import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -172,6 +174,7 @@
@Mock private lateinit var primaryBouncerInteractor: PrimaryBouncerInteractor
private lateinit var sceneTransitionStateFlow: MutableStateFlow<ObservableTransitionState>
private lateinit var fakeSceneDataSource: FakeSceneDataSource
+ private val executor = FakeExecutor(FakeSystemClock())
private lateinit var underTest: KeyguardSecurityContainerController
@@ -210,13 +213,9 @@
featureFlags = FakeFeatureFlags()
featureFlags.set(Flags.LOCKSCREEN_ENABLE_LANDSCAPE, false)
- mSetFlagsRule.enableFlags(
- AConfigFlags.FLAG_REVAMPED_BOUNCER_MESSAGES,
- )
+ mSetFlagsRule.enableFlags(AConfigFlags.FLAG_REVAMPED_BOUNCER_MESSAGES)
if (!SceneContainerFlag.isEnabled) {
- mSetFlagsRule.disableFlags(
- AConfigFlags.FLAG_KEYGUARD_WM_STATE_REFACTOR,
- )
+ mSetFlagsRule.disableFlags(AConfigFlags.FLAG_KEYGUARD_WM_STATE_REFACTOR)
}
keyguardPasswordViewController =
@@ -239,7 +238,7 @@
mSelectedUserInteractor,
keyguardKeyboardInteractor,
null,
- mUserActivityNotifier
+ mUserActivityNotifier,
)
kosmos = testKosmos()
@@ -283,6 +282,7 @@
devicePolicyManager,
kosmos.keyguardDismissTransitionInteractor,
{ primaryBouncerInteractor },
+ executor,
) {
deviceEntryInteractor
}
@@ -298,7 +298,7 @@
eq(falsingManager),
eq(userSwitcherController),
any(),
- eq(falsingA11yDelegate)
+ eq(falsingA11yDelegate),
)
}
@@ -334,7 +334,7 @@
eq(falsingManager),
eq(userSwitcherController),
any(),
- eq(falsingA11yDelegate)
+ eq(falsingA11yDelegate),
)
// Update rotation. Should trigger update
@@ -347,7 +347,7 @@
eq(falsingManager),
eq(userSwitcherController),
any(),
- eq(falsingA11yDelegate)
+ eq(falsingA11yDelegate),
)
}
@@ -359,7 +359,7 @@
MotionEvent.ACTION_DOWN,
/* x= */ 0f,
/* y= */ 0f,
- /* metaState= */ 0
+ /* metaState= */ 0,
)
)
}
@@ -386,7 +386,7 @@
eq(falsingManager),
eq(userSwitcherController),
any(),
- eq(falsingA11yDelegate)
+ eq(falsingA11yDelegate),
)
}
@@ -401,7 +401,7 @@
eq(falsingManager),
eq(userSwitcherController),
any(),
- eq(falsingA11yDelegate)
+ eq(falsingA11yDelegate),
)
}
@@ -416,7 +416,7 @@
eq(falsingManager),
eq(userSwitcherController),
any(),
- eq(falsingA11yDelegate)
+ eq(falsingA11yDelegate),
)
}
@@ -431,7 +431,7 @@
eq(falsingManager),
eq(userSwitcherController),
any(),
- eq(falsingA11yDelegate)
+ eq(falsingA11yDelegate),
)
}
@@ -446,7 +446,7 @@
eq(falsingManager),
eq(userSwitcherController),
any(),
- eq(falsingA11yDelegate)
+ eq(falsingA11yDelegate),
)
}
@@ -462,7 +462,7 @@
.showMessage(
/* message= */ context.getString(R.string.keyguard_unlock_to_continue),
/* colorState= */ null,
- /* animated= */ true
+ /* animated= */ true,
)
}
@@ -496,7 +496,7 @@
/* authenticated= */ true,
TARGET_USER_ID,
/* bypassSecondaryLockScreen= */ true,
- SecurityMode.SimPin
+ SecurityMode.SimPin,
)
// THEN the next security method of None will dismiss keyguard.
@@ -514,7 +514,7 @@
/* authenticated= */ true,
TARGET_USER_ID,
/* bypassSecondaryLockScreen= */ true,
- SecurityMode.SimPin
+ SecurityMode.SimPin,
)
// THEN no action has happened, which will not dismiss the security screens
@@ -539,7 +539,7 @@
/* authenticated= */ true,
TARGET_USER_ID,
/* bypassSecondaryLockScreen= */ true,
- SecurityMode.SimPin
+ SecurityMode.SimPin,
)
// THEN the next security method of None will dismiss keyguard.
@@ -564,7 +564,7 @@
/* authenticated= */ true,
TARGET_USER_ID,
/* bypassSecondaryLockScreen= */ true,
- SecurityMode.SimPin
+ SecurityMode.SimPin,
)
// THEN the next security method of None will dismiss keyguard.
@@ -589,7 +589,7 @@
/* authenticated= */ true,
TARGET_USER_ID,
/* bypassSecondaryLockScreen= */ true,
- SecurityMode.SimPin
+ SecurityMode.SimPin,
)
// THEN we will not show the password screen.
@@ -615,7 +615,7 @@
/* authenticated= */ true,
TARGET_USER_ID,
/* bypassSecondaryLockScreen= */ true,
- SecurityMode.SimPin
+ SecurityMode.SimPin,
)
// THEN we will not show the password screen.
@@ -717,7 +717,7 @@
// Now simulate a config change
testableResources.addOverride(
R.integer.keyguard_host_view_gravity,
- Gravity.CENTER_HORIZONTAL or Gravity.BOTTOM
+ Gravity.CENTER_HORIZONTAL or Gravity.BOTTOM,
)
underTest.updateResources()
verify(view).layoutParams = any()
@@ -728,7 +728,7 @@
testableResources.addOverride(R.integer.keyguard_host_view_gravity, Gravity.CENTER)
testableResources.addOverride(
R.integer.keyguard_host_view_one_handed_gravity,
- Gravity.CENTER_HORIZONTAL or Gravity.BOTTOM
+ Gravity.CENTER_HORIZONTAL or Gravity.BOTTOM,
)
// Start disabled.
@@ -948,7 +948,7 @@
/* expiringUserId = */ mainUserId,
/* mainUserId = */ mainUserId,
/* remainingBeforeWipe = */ 1,
- /* failedAttempts = */ 1
+ /* failedAttempts = */ 1,
)
verify(view)
@@ -965,14 +965,14 @@
/* expiringUserId = */ secondaryUserId,
/* mainUserId = */ mainUserId,
/* remainingBeforeWipe = */ 1,
- /* failedAttempts = */ 1
+ /* failedAttempts = */ 1,
)
verify(view)
.showAlmostAtWipeDialog(
any(),
any(),
- eq(KeyguardSecurityContainer.USER_TYPE_SECONDARY_USER)
+ eq(KeyguardSecurityContainer.USER_TYPE_SECONDARY_USER),
)
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/OWNERS b/packages/SystemUI/tests/src/com/android/systemui/biometrics/OWNERS
index 5420c37..58ae2b2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/OWNERS
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/OWNERS
@@ -3,3 +3,4 @@
# Bug component: 879035
include /services/core/java/com/android/server/biometrics/OWNERS
beverlyt@google.com
+include /packages/SystemUI/TEST_OWNERS
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/composable/BouncerPredictiveBackTest.kt b/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/composable/BouncerPredictiveBackTest.kt
index 22946c8..71afa62 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/composable/BouncerPredictiveBackTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/composable/BouncerPredictiveBackTest.kt
@@ -72,6 +72,7 @@
import com.android.systemui.scene.ui.viewmodel.splitEdgeDetector
import com.android.systemui.shade.domain.interactor.shadeInteractor
import com.android.systemui.testKosmos
+import kotlin.time.Duration.Companion.seconds
import kotlinx.coroutines.awaitCancellation
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
@@ -115,11 +116,7 @@
private val Kosmos.sceneKeys by Fixture { listOf(Scenes.Lockscreen, Scenes.Bouncer) }
private val Kosmos.initialSceneKey by Fixture { Scenes.Bouncer }
private val Kosmos.sceneContainerConfig by Fixture {
- val navigationDistances =
- mapOf(
- Scenes.Lockscreen to 1,
- Scenes.Bouncer to 0,
- )
+ val navigationDistances = mapOf(Scenes.Lockscreen to 1, Scenes.Bouncer to 0)
SceneContainerConfig(sceneKeys, initialSceneKey, emptyList(), navigationDistances)
}
@@ -160,7 +157,7 @@
BouncerScene(
bouncerSceneActionsViewModelFactory,
bouncerSceneContentViewModelFactory,
- bouncerDialogFactory
+ bouncerDialogFactory,
)
@Before
@@ -175,7 +172,7 @@
@Test
fun bouncerPredictiveBackMotion() =
- motionTestRule.runTest {
+ motionTestRule.runTest(timeout = 30.seconds) {
val motion =
recordMotion(
content = { play ->
@@ -189,11 +186,11 @@
sceneByKey =
mapOf(
Scenes.Lockscreen to FakeLockscreen(),
- Scenes.Bouncer to bouncerScene
+ Scenes.Bouncer to bouncerScene,
),
initialSceneKey = Scenes.Bouncer,
overlayByKey = emptyMap(),
- dataSourceDelegator = kosmos.sceneDataSourceDelegator
+ dataSourceDelegator = kosmos.sceneDataSourceDelegator,
)
}
},
@@ -215,14 +212,14 @@
feature(
isElement(Bouncer.Elements.Content),
positionInRoot,
- "content_offset"
+ "content_offset",
)
feature(
isElement(Bouncer.Elements.Background),
elementAlpha,
- "background_alpha"
+ "background_alpha",
)
- }
+ },
)
assertThat(motion).timeSeriesMatchesGolden()
@@ -240,7 +237,7 @@
}
backProgress.animateTo(
targetValue = 1f,
- animationSpec = tween(durationMillis = 500)
+ animationSpec = tween(durationMillis = 500),
) {
androidComposeTestRule.runOnUiThread {
dispatcher.dispatchOnBackProgressed(
@@ -309,10 +306,10 @@
is JSONObject ->
Offset(
pivot.getDouble("x").toFloat(),
- pivot.getDouble("y").toFloat()
+ pivot.getDouble("y").toFloat(),
)
else -> throw UnknownTypeException()
- }
+ },
)
}
else -> throw UnknownTypeException()
@@ -337,12 +334,12 @@
put("x", it.pivot.x)
put("y", it.pivot.y)
}
- }
+ },
)
}
}
}
- }
+ },
)
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/display/data/repository/DisplayRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/display/data/repository/DisplayRepositoryTest.kt
index 633efd8..6c6de61 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/display/data/repository/DisplayRepositoryTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/display/data/repository/DisplayRepositoryTest.kt
@@ -483,6 +483,16 @@
assertThat(values.toIdSets()).containsExactly(setOf(0))
}
+ @Test
+ fun displayIdToId() =
+ testScope.runTest {
+ setDisplays(0, 1)
+
+ assertThat(displayRepository.getDisplay(0)?.displayId).isEqualTo(0)
+ assertThat(displayRepository.getDisplay(1)?.displayId).isEqualTo(1)
+ assertThat(displayRepository.getDisplay(2)).isNull()
+ }
+
private fun Iterable<Display>.ids(): List<Int> = map { it.displayId }
private fun Iterable<Set<Display>>.toIdSets(): List<Set<Int>> = map { it.ids().toSet() }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayServiceTest.kt b/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayServiceTest.kt
similarity index 95%
rename from packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayServiceTest.kt
rename to packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayServiceTest.kt
index 7dd7174..a3314e8 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayServiceTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayServiceTest.kt
@@ -185,7 +185,7 @@
dreamsComplicationComponent,
dreamOverlayComponent,
complicationComponent,
- ambientTouchComponent
+ ambientTouchComponent,
)
}
@@ -194,7 +194,7 @@
dreamsComplicationComponent,
dreamOverlayComponent,
complicationComponent,
- ambientTouchComponent
+ ambientTouchComponent,
)
}
}
@@ -204,7 +204,7 @@
com.android.systemui.dreams.complication.dagger.ComplicationComponent.Factory,
dreamOverlayComponentFactory: DreamOverlayComponent.Factory,
complicationComponentFactory: ComplicationComponent.Factory,
- ambientTouchComponentFactory: AmbientTouchComponent.Factory
+ ambientTouchComponentFactory: AmbientTouchComponent.Factory,
): EnvironmentComponents {
val dreamOverlayComponent = mock<DreamOverlayComponent>()
whenever(dreamOverlayComponent.getDreamOverlayContainerViewController())
@@ -241,7 +241,7 @@
dreamComplicationComponent,
dreamOverlayComponent,
complicationComponent,
- ambientTouchComponent
+ ambientTouchComponent,
)
}
@@ -259,7 +259,7 @@
mDreamComplicationComponentFactory,
mDreamOverlayComponentFactory,
mComplicationComponentFactory,
- mAmbientTouchComponentFactory
+ mAmbientTouchComponentFactory,
)
whenever(mDreamOverlayContainerViewController.containerView)
@@ -271,7 +271,7 @@
ViewCaptureAwareWindowManager(
mWindowManager,
mLazyViewCapture,
- isViewCaptureEnabled = false
+ isViewCaptureEnabled = false,
)
mService =
DreamOverlayService(
@@ -295,7 +295,7 @@
mDreamOverlayCallbackController,
kosmos.keyguardInteractor,
gestureInteractor,
- WINDOW_NAME
+ WINDOW_NAME,
)
}
@@ -323,7 +323,7 @@
mDreamOverlayCallback,
DREAM_COMPONENT,
false /*isPreview*/,
- false /*shouldShowComplication*/
+ false, /*shouldShowComplication*/
)
mMainExecutor.runAllReady()
verify(mUiEventLogger).log(DreamOverlayService.DreamOverlayEvent.DREAM_OVERLAY_ENTER_START)
@@ -341,7 +341,7 @@
mDreamOverlayCallback,
DREAM_COMPONENT,
false /*isPreview*/,
- false /*shouldShowComplication*/
+ false, /*shouldShowComplication*/
)
mMainExecutor.runAllReady()
verify(mWindowManager).addView(any(), any())
@@ -361,7 +361,7 @@
mDreamOverlayCallback,
DREAM_COMPONENT,
false /*isPreview*/,
- false /*shouldShowComplication*/
+ false, /*shouldShowComplication*/
)
mMainExecutor.runAllReady()
verify(mWindowManager).addView(any(), any())
@@ -384,7 +384,7 @@
mDreamOverlayCallback,
DREAM_COMPONENT,
false /*isPreview*/,
- false /*shouldShowComplication*/
+ false, /*shouldShowComplication*/
)
mMainExecutor.runAllReady()
verify(mDreamOverlayContainerViewController).init()
@@ -403,7 +403,7 @@
mDreamOverlayCallback,
DREAM_COMPONENT,
false /*isPreview*/,
- false /*shouldShowComplication*/
+ false, /*shouldShowComplication*/
)
mMainExecutor.runAllReady()
verify(mDreamOverlayContainerViewParent).removeView(mDreamOverlayContainerView)
@@ -419,7 +419,7 @@
mDreamOverlayCallback,
DREAM_COMPONENT,
false /*isPreview*/,
- true /*shouldShowComplication*/
+ true, /*shouldShowComplication*/
)
mMainExecutor.runAllReady()
assertThat(mService.shouldShowComplications()).isTrue()
@@ -435,7 +435,7 @@
mDreamOverlayCallback,
DREAM_COMPONENT,
false /*isPreview*/,
- true /*shouldShowComplication*/
+ true, /*shouldShowComplication*/
)
mMainExecutor.runAllReady()
@@ -448,7 +448,7 @@
mDreamOverlayCallback,
DREAM_COMPONENT,
false /*isPreview*/,
- true /*shouldShowComplication*/
+ true, /*shouldShowComplication*/
)
mMainExecutor.runAllReady()
@@ -476,7 +476,7 @@
mDreamOverlayCallback,
LOW_LIGHT_COMPONENT.flattenToString(),
false /*isPreview*/,
- false /*shouldShowComplication*/
+ false, /*shouldShowComplication*/
)
mMainExecutor.runAllReady()
assertThat(mService.dreamComponent).isEqualTo(LOW_LIGHT_COMPONENT)
@@ -493,7 +493,7 @@
mDreamOverlayCallback,
HOME_CONTROL_PANEL_DREAM_COMPONENT.flattenToString(),
false /*isPreview*/,
- false /*shouldShowComplication*/
+ false, /*shouldShowComplication*/
)
mMainExecutor.runAllReady()
assertThat(mService.dreamComponent).isEqualTo(HOME_CONTROL_PANEL_DREAM_COMPONENT)
@@ -510,7 +510,7 @@
mDreamOverlayCallback,
LOW_LIGHT_COMPONENT.flattenToString(),
false /*isPreview*/,
- false /*shouldShowComplication*/
+ false, /*shouldShowComplication*/
)
mMainExecutor.runAllReady()
@@ -545,7 +545,7 @@
mDreamOverlayCallback,
DREAM_COMPONENT,
false /*isPreview*/,
- false /*shouldShowComplication*/
+ false, /*shouldShowComplication*/
)
// Immediately end the dream.
client.endDream()
@@ -577,7 +577,7 @@
mDreamOverlayCallback,
DREAM_COMPONENT,
false /*isPreview*/,
- false /*shouldShowComplication*/
+ false, /*shouldShowComplication*/
)
mMainExecutor.runAllReady()
@@ -597,7 +597,7 @@
mDreamOverlayCallback,
LOW_LIGHT_COMPONENT.flattenToString(),
false /*isPreview*/,
- false /*shouldShowComplication*/
+ false, /*shouldShowComplication*/
)
mMainExecutor.runAllReady()
@@ -649,7 +649,7 @@
mDreamOverlayCallback,
DREAM_COMPONENT,
false /*isPreview*/,
- false /*shouldShowComplication*/
+ false, /*shouldShowComplication*/
)
mMainExecutor.runAllReady()
verify(mWindowManager, Mockito.never()).addView(any(), any())
@@ -673,7 +673,7 @@
mDreamOverlayCallback,
DREAM_COMPONENT,
false /*isPreview*/,
- false /*shouldShowComplication*/
+ false, /*shouldShowComplication*/
)
mMainExecutor.runAllReady()
@@ -694,7 +694,7 @@
mDreamOverlayCallback,
DREAM_COMPONENT,
false /*isPreview*/,
- true /*shouldShowComplication*/
+ true, /*shouldShowComplication*/
)
mMainExecutor.runAllReady()
@@ -724,7 +724,7 @@
mDreamOverlayCallback,
DREAM_COMPONENT,
false /*isPreview*/,
- true /*shouldShowComplication*/
+ true, /*shouldShowComplication*/
)
mMainExecutor.runAllReady()
mService.onWakeUp()
@@ -748,7 +748,7 @@
mDreamOverlayCallback,
DREAM_COMPONENT,
false /*isPreview*/,
- false /*shouldShowComplication*/
+ false, /*shouldShowComplication*/
)
mMainExecutor.runAllReady()
val paramsCaptor = ArgumentCaptor.forClass(WindowManager.LayoutParams::class.java)
@@ -774,7 +774,7 @@
mDreamOverlayCallback,
DREAM_COMPONENT,
false /*isPreview*/,
- false /*shouldShowComplication*/
+ false, /*shouldShowComplication*/
)
mMainExecutor.runAllReady()
@@ -800,7 +800,7 @@
mDreamOverlayCallback,
DREAM_COMPONENT,
false /*isPreview*/,
- false /*shouldShowComplication*/
+ false, /*shouldShowComplication*/
)
// Set communal available, verify that overlay callback is informed.
kosmos.setCommunalAvailable(true)
@@ -829,7 +829,7 @@
mDreamOverlayCallback,
DREAM_COMPONENT,
false /*isPreview*/,
- true /*shouldShowComplication*/
+ true, /*shouldShowComplication*/
)
mMainExecutor.runAllReady()
@@ -850,7 +850,7 @@
mDreamOverlayCallback,
DREAM_COMPONENT,
false /*isPreview*/,
- true /*shouldShowComplication*/
+ true, /*shouldShowComplication*/
)
mMainExecutor.runAllReady()
@@ -870,7 +870,7 @@
mDreamOverlayCallback,
DREAM_COMPONENT,
false /*isPreview*/,
- true /*shouldShowComplication*/
+ true, /*shouldShowComplication*/
)
mMainExecutor.runAllReady()
@@ -894,14 +894,14 @@
mDreamOverlayCallback,
DREAM_COMPONENT,
false /*isPreview*/,
- false /*shouldShowComplication*/
+ false, /*shouldShowComplication*/
)
mMainExecutor.runAllReady()
assertThat(lifecycleRegistry.mLifecycles)
.containsExactly(
Lifecycle.State.CREATED,
Lifecycle.State.STARTED,
- Lifecycle.State.RESUMED
+ Lifecycle.State.RESUMED,
)
}
@@ -925,7 +925,7 @@
mDreamOverlayCallback,
DREAM_COMPONENT,
false /*isPreview*/,
- false /*shouldShowComplication*/
+ false, /*shouldShowComplication*/
)
testScope.runCurrent()
mMainExecutor.runAllReady()
@@ -942,7 +942,7 @@
mDreamOverlayCallback,
DREAM_COMPONENT,
false /*isPreview*/,
- false /*shouldShowComplication*/
+ false, /*shouldShowComplication*/
)
mMainExecutor.runAllReady()
mService.onDestroy()
@@ -952,7 +952,7 @@
Lifecycle.State.CREATED,
Lifecycle.State.STARTED,
Lifecycle.State.RESUMED,
- Lifecycle.State.DESTROYED
+ Lifecycle.State.DESTROYED,
)
}
@@ -966,7 +966,7 @@
mDreamOverlayCallback,
DREAM_COMPONENT,
false /*isPreview*/,
- false /*shouldShowComplication*/
+ false, /*shouldShowComplication*/
)
mMainExecutor.runAllReady()
assertThat(lifecycleRegistry.currentState).isEqualTo(Lifecycle.State.RESUMED)
@@ -998,7 +998,7 @@
mDreamOverlayCallback,
DREAM_COMPONENT,
false /*isPreview*/,
- false /*shouldShowComplication*/
+ false, /*shouldShowComplication*/
)
mMainExecutor.runAllReady()
assertThat(lifecycleRegistry.currentState).isEqualTo(Lifecycle.State.RESUMED)
@@ -1030,7 +1030,7 @@
mDreamOverlayCallback,
DREAM_COMPONENT,
false /*isPreview*/,
- false /*shouldShowComplication*/
+ false, /*shouldShowComplication*/
)
mMainExecutor.runAllReady()
assertThat(lifecycleRegistry.currentState).isEqualTo(Lifecycle.State.RESUMED)
@@ -1066,7 +1066,7 @@
mDreamOverlayCallback,
DREAM_COMPONENT,
false /*isPreview*/,
- false /*shouldShowComplication*/
+ false, /*shouldShowComplication*/
)
mMainExecutor.runAllReady()
assertThat(lifecycleRegistry.currentState).isEqualTo(Lifecycle.State.RESUMED)
@@ -1101,7 +1101,7 @@
mDreamOverlayCallback,
DREAM_COMPONENT,
false /*isPreview*/,
- false /*shouldShowComplication*/
+ false, /*shouldShowComplication*/
)
mMainExecutor.runAllReady()
@@ -1130,7 +1130,7 @@
mDreamOverlayCallback,
DREAM_COMPONENT,
true /*isPreview*/,
- false /*shouldShowComplication*/
+ false, /*shouldShowComplication*/
)
mMainExecutor.runAllReady()
@@ -1148,7 +1148,7 @@
mDreamOverlayCallback,
DREAM_COMPONENT,
false /*isPreview*/,
- false /*shouldShowComplication*/
+ false, /*shouldShowComplication*/
)
mMainExecutor.runAllReady()
@@ -1181,7 +1181,7 @@
mDreamOverlayCallback,
DREAM_COMPONENT,
false /*isPreview*/,
- false /*shouldShowComplication*/
+ false, /*shouldShowComplication*/
)
mMainExecutor.runAllReady()
@@ -1214,7 +1214,7 @@
mDreamComplicationComponentFactory,
mDreamOverlayComponentFactory,
mComplicationComponentFactory,
- mAmbientTouchComponentFactory
+ mAmbientTouchComponentFactory,
)
mService.onEndDream()
@@ -1223,7 +1223,7 @@
mDreamComplicationComponentFactory,
mDreamOverlayComponentFactory,
mComplicationComponentFactory,
- mAmbientTouchComponentFactory
+ mAmbientTouchComponentFactory,
)
client.startDream(
@@ -1231,7 +1231,7 @@
mDreamOverlayCallback,
DREAM_COMPONENT,
false /*isPreview*/,
- false /*shouldShowComplication*/
+ false, /*shouldShowComplication*/
)
mMainExecutor.runAllReady()
environmentComponents.verifyNoMoreInteractions()
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadStatsInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadStatsInteractorTest.kt
similarity index 100%
rename from packages/SystemUI/multivalentTests/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadStatsInteractorTest.kt
rename to packages/SystemUI/tests/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadStatsInteractorTest.kt
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/lifecycle/HydratorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/lifecycle/HydratorTest.kt
similarity index 95%
rename from packages/SystemUI/multivalentTests/src/com/android/systemui/lifecycle/HydratorTest.kt
rename to packages/SystemUI/tests/src/com/android/systemui/lifecycle/HydratorTest.kt
index ec6045c..b0e93fb 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/lifecycle/HydratorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/lifecycle/HydratorTest.kt
@@ -59,11 +59,11 @@
Column {
Text(
"upstreamStateFlow=${viewModel.stateBackedByStateFlow}",
- Modifier.testTag("upstreamStateFlow")
+ Modifier.testTag("upstreamStateFlow"),
)
Text(
"upstreamFlow=${viewModel.stateBackedByFlow}",
- Modifier.testTag("upstreamFlow")
+ Modifier.testTag("upstreamFlow"),
)
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaSwitchingControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaSwitchingControllerTest.java
index 53f0800..c4f5d62 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaSwitchingControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaSwitchingControllerTest.java
@@ -76,6 +76,7 @@
import com.android.settingslib.media.InputRouteManager;
import com.android.settingslib.media.LocalMediaManager;
import com.android.settingslib.media.MediaDevice;
+import com.android.settingslib.utils.ThreadUtils;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.SysuiTestCaseExtKt;
import com.android.systemui.animation.ActivityTransitionAnimator;
@@ -103,6 +104,8 @@
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
@SmallTest
@RunWith(AndroidJUnit4.class)
@@ -120,6 +123,8 @@
private static final int MAX_VOLUME = 1;
private static final int CURRENT_VOLUME = 0;
private static final boolean VOLUME_FIXED_TRUE = true;
+ private static final int LATCH_COUNT_DOWN_TIME_IN_SECOND = 5;
+ private static final int LATCH_TIME_OUT_TIME_IN_SECOND = 10;
@Mock
private DialogTransitionAnimator mDialogTransitionAnimator;
@@ -1339,4 +1344,39 @@
assertThat(selectedMediaDevices)
.containsExactly(selectedOutputMediaDevice, selectedInputMediaDevice);
}
+
+ @EnableFlags(Flags.FLAG_ENABLE_AUDIO_INPUT_DEVICE_ROUTING_AND_VOLUME_CONTROL)
+ @Test
+ public void selectInputDevice() throws InterruptedException {
+ final MediaDevice inputMediaDevice =
+ InputMediaDevice.create(
+ mContext,
+ TEST_DEVICE_1_ID,
+ AudioDeviceInfo.TYPE_BUILTIN_MIC,
+ MAX_VOLUME,
+ CURRENT_VOLUME,
+ VOLUME_FIXED_TRUE);
+ mMediaSwitchingController.connectDevice(inputMediaDevice);
+
+ CountDownLatch latch = new CountDownLatch(LATCH_COUNT_DOWN_TIME_IN_SECOND);
+ var unused = ThreadUtils.postOnBackgroundThread(latch::countDown);
+ latch.await(LATCH_TIME_OUT_TIME_IN_SECOND, TimeUnit.SECONDS);
+
+ verify(mInputRouteManager, atLeastOnce()).selectDevice(inputMediaDevice);
+ verify(mLocalMediaManager, never()).connectDevice(inputMediaDevice);
+ }
+
+ @EnableFlags(Flags.FLAG_ENABLE_AUDIO_INPUT_DEVICE_ROUTING_AND_VOLUME_CONTROL)
+ @Test
+ public void selectOutputDevice() throws InterruptedException {
+ final MediaDevice outputMediaDevice = mock(MediaDevice.class);
+ mMediaSwitchingController.connectDevice(outputMediaDevice);
+
+ CountDownLatch latch = new CountDownLatch(LATCH_COUNT_DOWN_TIME_IN_SECOND);
+ var unused = ThreadUtils.postOnBackgroundThread(latch::countDown);
+ latch.await(LATCH_TIME_OUT_TIME_IN_SECOND, TimeUnit.SECONDS);
+
+ verify(mInputRouteManager, never()).selectDevice(outputMediaDevice);
+ verify(mLocalMediaManager, atLeastOnce()).connectDevice(outputMediaDevice);
+ }
}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsUserActionsViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsUserActionsViewModelTest.kt
similarity index 100%
rename from packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsUserActionsViewModelTest.kt
rename to packages/SystemUI/tests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsUserActionsViewModelTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/OWNERS b/packages/SystemUI/tests/src/com/android/systemui/statusbar/OWNERS
index 1c52b8d..48a20dd 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/OWNERS
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/OWNERS
@@ -1,3 +1,4 @@
set noparent
include /packages/SystemUI/src/com/android/systemui/statusbar/OWNERS
+include /packages/SystemUI/TEST_OWNERS
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/core/StatusBarInitializerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/core/StatusBarInitializerTest.kt
new file mode 100644
index 0000000..9142972
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/core/StatusBarInitializerTest.kt
@@ -0,0 +1,92 @@
+/*
+ * 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.core
+
+import android.app.FragmentManager
+import android.app.FragmentTransaction
+import android.platform.test.annotations.DisableFlags
+import android.platform.test.annotations.EnableFlags
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.Flags
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.fragments.FragmentHostManager
+import com.android.systemui.statusbar.phone.fragment.CollapsedStatusBarFragment
+import com.android.systemui.statusbar.window.StatusBarWindowController
+import com.google.common.truth.Truth.assertThat
+import kotlin.test.Test
+import org.junit.Assert.assertThrows
+import org.junit.Before
+import org.junit.runner.RunWith
+import org.mockito.Mockito.mock
+import org.mockito.kotlin.any
+import org.mockito.kotlin.whenever
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class StatusBarInitializerTest : SysuiTestCase() {
+ val windowController = mock(StatusBarWindowController::class.java)
+
+ @Before
+ fun setup() {
+ // TODO(b/364360986) this will go away once the fragment is deprecated. Hence, there is no
+ // need right now for moving this to kosmos
+ val transaction = mock(FragmentTransaction::class.java)
+ val fragmentManager = mock(FragmentManager::class.java)
+ val fragmentHostManager = mock(FragmentHostManager::class.java)
+ whenever(fragmentHostManager.addTagListener(any(), any())).thenReturn(fragmentHostManager)
+ whenever(fragmentHostManager.fragmentManager).thenReturn(fragmentManager)
+ whenever(fragmentManager.beginTransaction()).thenReturn(transaction)
+ whenever(transaction.replace(any(), any(), any())).thenReturn(transaction)
+
+ whenever(windowController.fragmentHostManager).thenReturn(fragmentHostManager)
+ }
+
+ val underTest =
+ StatusBarInitializerImpl(
+ windowController,
+ { mock(CollapsedStatusBarFragment::class.java) },
+ setOf(),
+ )
+
+ @Test
+ @EnableFlags(Flags.FLAG_STATUS_BAR_SIMPLE_FRAGMENT)
+ fun simpleFragment_startsFromCoreStartable() {
+ underTest.start()
+ assertThat(underTest.initialized).isTrue()
+ }
+
+ @Test
+ @EnableFlags(Flags.FLAG_STATUS_BAR_SIMPLE_FRAGMENT)
+ fun simpleFragment_throwsIfInitializeIsCalled() {
+ assertThrows(IllegalStateException::class.java) { underTest.initializeStatusBar() }
+ }
+
+ @Test
+ @DisableFlags(Flags.FLAG_STATUS_BAR_SIMPLE_FRAGMENT)
+ fun flagOff_doesNotInitializeViaCoreStartable() {
+ underTest.start()
+ assertThat(underTest.initialized).isFalse()
+ }
+
+ @Test
+ @DisableFlags(Flags.FLAG_STATUS_BAR_SIMPLE_FRAGMENT)
+ fun flagOff_doesNotThrowIfInitializeIsCalled() {
+ underTest.initializeStatusBar()
+ assertThat(underTest.initialized).isTrue()
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/OWNERS b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/OWNERS
index 7f5384d..1da7007 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/OWNERS
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/OWNERS
@@ -1,3 +1,4 @@
set noparent
-include /packages/SystemUI/src/com/android/systemui/statusbar/notification/OWNERS
\ No newline at end of file
+include /packages/SystemUI/src/com/android/systemui/statusbar/notification/OWNERS
+include /packages/SystemUI/TEST_OWNERS
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/domain/interactor/HeadsUpNotificationInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/domain/interactor/HeadsUpNotificationInteractorTest.kt
similarity index 100%
rename from packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/domain/interactor/HeadsUpNotificationInteractorTest.kt
rename to packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/domain/interactor/HeadsUpNotificationInteractorTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerAlwaysOnDisplayViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerAlwaysOnDisplayViewModelTest.kt
index 1f4e80e..740abf3 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerAlwaysOnDisplayViewModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerAlwaysOnDisplayViewModelTest.kt
@@ -21,7 +21,6 @@
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.Flags.FLAG_KEYGUARD_WM_STATE_REFACTOR
-import com.android.systemui.Flags.FLAG_NEW_AOD_TRANSITION
import com.android.systemui.SysuiTestCase
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.flags.Flags
@@ -85,7 +84,6 @@
lastWakeReason = WakeSleepReason.OTHER,
lastSleepReason = WakeSleepReason.OTHER,
)
- mSetFlagsRule.enableFlags(FLAG_NEW_AOD_TRANSITION)
}
@Test
@@ -97,14 +95,10 @@
lastSleepReason = WakeSleepReason.OTHER,
)
keyguardTransitionRepository.sendTransitionStep(
- TransitionStep(
- transitionState = TransitionState.STARTED,
- )
+ TransitionStep(transitionState = TransitionState.STARTED)
)
keyguardRepository.setDozeTransitionModel(
- DozeTransitionModel(
- to = DozeStateModel.DOZE_AOD,
- )
+ DozeTransitionModel(to = DozeStateModel.DOZE_AOD)
)
val animationsEnabled by collectLastValue(underTest.areContainerChangesAnimated)
runCurrent()
@@ -120,14 +114,10 @@
lastSleepReason = WakeSleepReason.OTHER,
)
keyguardTransitionRepository.sendTransitionStep(
- TransitionStep(
- transitionState = TransitionState.STARTED,
- )
+ TransitionStep(transitionState = TransitionState.STARTED)
)
keyguardRepository.setDozeTransitionModel(
- DozeTransitionModel(
- to = DozeStateModel.DOZE_PULSING,
- )
+ DozeTransitionModel(to = DozeStateModel.DOZE_PULSING)
)
val animationsEnabled by collectLastValue(underTest.areContainerChangesAnimated)
runCurrent()
@@ -186,9 +176,7 @@
lastSleepReason = WakeSleepReason.OTHER,
)
keyguardTransitionRepository.sendTransitionStep(
- TransitionStep(
- transitionState = TransitionState.STARTED,
- )
+ TransitionStep(transitionState = TransitionState.STARTED)
)
val animationsEnabled by collectLastValue(underTest.areContainerChangesAnimated)
runCurrent()
@@ -200,9 +188,7 @@
fun animationsEnabled_isTrue_whenKeyguardIsShowing() =
testScope.runTest {
keyguardTransitionRepository.sendTransitionStep(
- TransitionStep(
- transitionState = TransitionState.STARTED,
- )
+ TransitionStep(transitionState = TransitionState.STARTED)
)
val animationsEnabled by collectLastValue(underTest.areContainerChangesAnimated)
runCurrent()
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java
index a06f4d2..bb9f12b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java
@@ -19,7 +19,6 @@
import static android.view.View.GONE;
import static android.view.WindowInsets.Type.ime;
-import static com.android.systemui.Flags.FLAG_NEW_AOD_TRANSITION;
import static com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout.ROWS_ALL;
import static com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout.ROWS_GENTLE;
import static com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout.RUBBER_BAND_FACTOR_NORMAL;
@@ -83,13 +82,13 @@
import com.android.systemui.shade.QSHeaderBoundsProvider;
import com.android.systemui.shade.ShadeController;
import com.android.systemui.shade.transition.LargeScreenShadeInterpolator;
-import com.android.systemui.statusbar.EmptyShadeView;
import com.android.systemui.statusbar.NotificationShelf;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.SysuiStatusBarStateController;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.render.GroupExpansionManager;
import com.android.systemui.statusbar.notification.collection.render.GroupMembershipManager;
+import com.android.systemui.statusbar.notification.emptyshade.ui.view.EmptyShadeView;
import com.android.systemui.statusbar.notification.footer.shared.FooterViewRefactor;
import com.android.systemui.statusbar.notification.footer.ui.view.FooterView;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
@@ -174,12 +173,6 @@
mFeatureFlags.set(Flags.NSSL_DEBUG_REMOVE_ANIMATION, false);
mFeatureFlags.set(Flags.LOCKSCREEN_ENABLE_LANDSCAPE, false);
- // Register the feature flags we use
- // TODO: Ideally we wouldn't need to set these unless a test actually reads them,
- // and then we would test both configurations, but currently they are all read
- // in the constructor.
- mSetFlagsRule.enableFlags(FLAG_NEW_AOD_TRANSITION);
-
// Inject dependencies before initializing the layout
mDependency.injectTestDependency(FeatureFlags.class, mFeatureFlags);
mDependency.injectTestDependency(SysuiStatusBarStateController.class, mBarState);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithmTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithmTest.kt
index 3e8bf47..1ef4007 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithmTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithmTest.kt
@@ -18,11 +18,11 @@
import com.android.systemui.flags.FeatureFlagsClassic
import com.android.systemui.res.R
import com.android.systemui.shade.transition.LargeScreenShadeInterpolator
-import com.android.systemui.statusbar.EmptyShadeView
import com.android.systemui.statusbar.NotificationShelf
import com.android.systemui.statusbar.StatusBarState
import com.android.systemui.statusbar.notification.RoundableState
import com.android.systemui.statusbar.notification.collection.NotificationEntry
+import com.android.systemui.statusbar.notification.emptyshade.ui.view.EmptyShadeView
import com.android.systemui.statusbar.notification.footer.ui.view.FooterView
import com.android.systemui.statusbar.notification.footer.ui.view.FooterView.FooterViewState
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow
@@ -79,7 +79,7 @@
/* bypassController */ { false },
mStatusBarKeyguardViewManager,
largeScreenShadeInterpolator,
- avalancheController
+ avalancheController,
)
private val testableResources = mContext.getOrCreateTestableResources()
@@ -240,7 +240,7 @@
headsUpTop = headsUpTop,
stackTop = stackTop,
collapsedHeight = collapsedHeight,
- intrinsicHeight = intrinsicHeight
+ intrinsicHeight = intrinsicHeight,
)
// When
@@ -269,7 +269,7 @@
headsUpTop = headsUpTop,
stackTop = stackTop,
collapsedHeight = collapsedHeight,
- intrinsicHeight = intrinsicHeight
+ intrinsicHeight = intrinsicHeight,
)
// When
@@ -548,7 +548,7 @@
whenever(mStatusBarKeyguardViewManager.isPrimaryBouncerInTransit).thenReturn(false)
resetViewStates_expansionChanging_notificationAlphaUpdated(
expansionFraction = 0.25f,
- expectedAlpha = 0.0f
+ expectedAlpha = 0.0f,
)
}
@@ -558,7 +558,7 @@
whenever(mStatusBarKeyguardViewManager.isPrimaryBouncerInTransit).thenReturn(true)
resetViewStates_expansionChanging_notificationAlphaUpdated(
expansionFraction = 0.85f,
- expectedAlpha = 0.0f
+ expectedAlpha = 0.0f,
)
}
@@ -568,7 +568,7 @@
whenever(mStatusBarKeyguardViewManager.isPrimaryBouncerInTransit).thenReturn(false)
resetViewStates_expansionChanging_notificationAlphaUpdated(
expansionFraction = 0.6f,
- expectedAlpha = getContentAlpha(0.6f)
+ expectedAlpha = getContentAlpha(0.6f),
)
}
@@ -785,7 +785,7 @@
val gap =
stackScrollAlgorithm.getGapForLocation(
/* fractionToShade= */ 0f,
- /* onKeyguard= */ true
+ /* onKeyguard= */ true,
)
assertThat(gap).isEqualTo(smallGap)
}
@@ -795,7 +795,7 @@
val gap =
stackScrollAlgorithm.getGapForLocation(
/* fractionToShade= */ 0.5f,
- /* onKeyguard= */ true
+ /* onKeyguard= */ true,
)
assertThat(gap).isEqualTo(smallGap * 0.5f + bigGap * 0.5f)
}
@@ -805,7 +805,7 @@
val gap =
stackScrollAlgorithm.getGapForLocation(
/* fractionToShade= */ 0f,
- /* onKeyguard= */ false
+ /* onKeyguard= */ false,
)
assertThat(gap).isEqualTo(bigGap)
}
@@ -869,7 +869,7 @@
/* mustStayOnScreen= */ true,
/* isViewEndVisible= */ true,
/* viewEnd= */ 0f,
- /* maxHunY= */ 10f
+ /* maxHunY= */ 10f,
)
assertTrue(expandableViewState.headsUpIsVisible)
@@ -886,7 +886,7 @@
/* mustStayOnScreen= */ true,
/* isViewEndVisible= */ true,
/* viewEnd= */ 10f,
- /* maxHunY= */ 0f
+ /* maxHunY= */ 0f,
)
assertFalse(expandableViewState.headsUpIsVisible)
@@ -903,7 +903,7 @@
/* mustStayOnScreen= */ true,
/* isViewEndVisible= */ true,
/* viewEnd= */ 10f,
- /* maxHunY= */ 1f
+ /* maxHunY= */ 1f,
)
assertTrue(expandableViewState.headsUpIsVisible)
@@ -920,7 +920,7 @@
/* mustStayOnScreen= */ false,
/* isViewEndVisible= */ true,
/* viewEnd= */ 10f,
- /* maxHunY= */ 1f
+ /* maxHunY= */ 1f,
)
assertTrue(expandableViewState.headsUpIsVisible)
@@ -937,7 +937,7 @@
/* mustStayOnScreen= */ true,
/* isViewEndVisible= */ false,
/* viewEnd= */ 10f,
- /* maxHunY= */ 1f
+ /* maxHunY= */ 1f,
)
assertTrue(expandableViewState.headsUpIsVisible)
@@ -951,7 +951,7 @@
stackScrollAlgorithm.clampHunToTop(
/* headsUpTop= */ 10f,
/* collapsedHeight= */ 1f,
- expandableViewState
+ expandableViewState,
)
// qqs (10 + 0) < viewY (50)
@@ -966,7 +966,7 @@
stackScrollAlgorithm.clampHunToTop(
/* headsUpTop= */ 10f,
/* collapsedHeight= */ 1f,
- expandableViewState
+ expandableViewState,
)
// qqs (10 + 0) > viewY (-10)
@@ -982,7 +982,7 @@
stackScrollAlgorithm.clampHunToTop(
/* headsUpTop= */ 10f,
/* collapsedHeight= */ 10f,
- expandableViewState
+ expandableViewState,
)
// newTranslation = max(10, -100) = 10
@@ -1000,7 +1000,7 @@
stackScrollAlgorithm.clampHunToTop(
/* headsUpTop= */ 10f,
/* collapsedHeight= */ 10f,
- expandableViewState
+ expandableViewState,
)
// newTranslation = max(10, 5) = 10
@@ -1016,7 +1016,7 @@
/* hostViewHeight= */ 100f,
/* stackY= */ 110f,
/* viewMaxHeight= */ 20f,
- /* originalCornerRoundness= */ 0f
+ /* originalCornerRoundness= */ 0f,
)
assertEquals(1f, currentRoundness)
}
@@ -1028,7 +1028,7 @@
/* hostViewHeight= */ 100f,
/* stackY= */ 90f,
/* viewMaxHeight= */ 20f,
- /* originalCornerRoundness= */ 0f
+ /* originalCornerRoundness= */ 0f,
)
assertEquals(0.5f, currentRoundness)
}
@@ -1040,7 +1040,7 @@
/* hostViewHeight= */ 100f,
/* stackY= */ 0f,
/* viewMaxHeight= */ 20f,
- /* originalCornerRoundness= */ 0f
+ /* originalCornerRoundness= */ 0f,
)
assertEquals(0f, currentRoundness)
}
@@ -1052,7 +1052,7 @@
/* hostViewHeight= */ 100f,
/* stackY= */ 0f,
/* viewMaxHeight= */ 20f,
- /* originalCornerRoundness= */ 1f
+ /* originalCornerRoundness= */ 1f,
)
assertEquals(1f, currentRoundness)
}
@@ -1076,7 +1076,7 @@
/* childrenOnTop= */ 0.0f,
/* StackScrollAlgorithmState= */ algorithmState,
/* ambientState= */ ambientState,
- /* shouldElevateHun= */ true
+ /* shouldElevateHun= */ true,
)
// Then: full shadow would be applied
@@ -1104,7 +1104,7 @@
/* childrenOnTop= */ 0.0f,
/* StackScrollAlgorithmState= */ algorithmState,
/* ambientState= */ ambientState,
- /* shouldElevateHun= */ true
+ /* shouldElevateHun= */ true,
)
// Then: HUN should have shadow, but not as full size
@@ -1137,7 +1137,7 @@
/* childrenOnTop= */ 0.0f,
/* StackScrollAlgorithmState= */ algorithmState,
/* ambientState= */ ambientState,
- /* shouldElevateHun= */ true
+ /* shouldElevateHun= */ true,
)
// Then: HUN should not have shadow
@@ -1166,7 +1166,7 @@
/* childrenOnTop= */ 0.0f,
/* StackScrollAlgorithmState= */ algorithmState,
/* ambientState= */ ambientState,
- /* shouldElevateHun= */ true
+ /* shouldElevateHun= */ true,
)
// Then: HUN should have full shadow
@@ -1196,7 +1196,7 @@
/* childrenOnTop= */ 0.0f,
/* StackScrollAlgorithmState= */ algorithmState,
/* ambientState= */ ambientState,
- /* shouldElevateHun= */ true
+ /* shouldElevateHun= */ true,
)
// Then: HUN should have shadow, but not as full size
@@ -1274,14 +1274,14 @@
setExpansionFractionWithoutShelfDuringAodToLockScreen(
ambientState,
algorithmState,
- fraction = 0.5f
+ fraction = 0.5f,
)
stackScrollAlgorithm.resetViewStates(ambientState, 0)
// Then: pulsingNotificationView should show at full height
assertEquals(
stackScrollAlgorithm.getMaxAllowedChildHeight(pulsingNotificationView),
- pulsingNotificationView.viewState.height
+ pulsingNotificationView.viewState.height,
)
// After: reset dozeAmount and expansionFraction
@@ -1289,7 +1289,7 @@
setExpansionFractionWithoutShelfDuringAodToLockScreen(
ambientState,
algorithmState,
- fraction = 1f
+ fraction = 1f,
)
}
@@ -1302,7 +1302,7 @@
/* headsUpIsVisible= */ false,
/* showingPulsing= */ false,
/* isOnKeyguard=*/ false,
- /*headsUpOnKeyguard=*/ false
+ /*headsUpOnKeyguard=*/ false,
)
)
.isFalse()
@@ -1316,7 +1316,7 @@
/* headsUpIsVisible= */ true,
/* showingPulsing= */ false,
/* isOnKeyguard=*/ false,
- /*headsUpOnKeyguard=*/ false
+ /*headsUpOnKeyguard=*/ false,
)
)
.isFalse()
@@ -1330,7 +1330,7 @@
/* headsUpIsVisible= */ false,
/* showingPulsing= */ true,
/* isOnKeyguard=*/ false,
- /* headsUpOnKeyguard= */ false
+ /* headsUpOnKeyguard= */ false,
)
)
.isFalse()
@@ -1344,7 +1344,7 @@
/* headsUpIsVisible= */ false,
/* showingPulsing= */ false,
/* isOnKeyguard=*/ true,
- /* headsUpOnKeyguard= */ false
+ /* headsUpOnKeyguard= */ false,
)
)
.isFalse()
@@ -1358,7 +1358,7 @@
/* headsUpIsVisible= */ false,
/* showingPulsing= */ false,
/* isOnKeyguard=*/ false,
- /* headsUpOnKeyguard= */ false
+ /* headsUpOnKeyguard= */ false,
)
)
.isTrue()
@@ -1372,7 +1372,7 @@
/* headsUpIsVisible= */ false,
/* showingPulsing= */ false,
/* isOnKeyguard=*/ true,
- /* headsUpOnKeyguard= */ true
+ /* headsUpOnKeyguard= */ true,
)
)
.isTrue()
@@ -1408,7 +1408,7 @@
private fun createHunViewMock(
isShadeOpen: Boolean,
fullyVisible: Boolean,
- headerVisibleAmount: Float
+ headerVisibleAmount: Float,
) =
mock<ExpandableNotificationRow>().apply {
val childViewStateMock = createHunChildViewState(isShadeOpen, fullyVisible)
@@ -1440,7 +1440,7 @@
private fun setExpansionFractionWithoutShelfDuringAodToLockScreen(
ambientState: AmbientState,
algorithmState: StackScrollAlgorithm.StackScrollAlgorithmState,
- fraction: Float
+ fraction: Float,
) {
// showingShelf: false
algorithmState.firstViewInShelf = null
@@ -1476,7 +1476,7 @@
private fun resetViewStates_hunsOverlapping_bottomHunClipped(
topHun: ExpandableNotificationRow,
- bottomHun: ExpandableNotificationRow
+ bottomHun: ExpandableNotificationRow,
) {
val topHunHeight =
mContext.resources.getDimensionPixelSize(R.dimen.notification_content_min_height)
@@ -1524,7 +1524,7 @@
headsUpBottom: Float = headsUpTop + intrinsicHeight, // assume all the space available
stackTop: Float,
stackCutoff: Float = 2000f,
- fullStackHeight: Float = 3000f
+ fullStackHeight: Float = 3000f,
) {
ambientState.headsUpTop = headsUpTop
ambientState.headsUpBottom = headsUpBottom
diff --git a/packages/SystemUI/tests/src/com/android/systemui/user/data/repository/UserRepositoryImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/user/data/repository/UserRepositoryImplTest.kt
index c235954..1af0f79 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/user/data/repository/UserRepositoryImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/user/data/repository/UserRepositoryImplTest.kt
@@ -248,10 +248,17 @@
setUpUsers(count = 2, selectedIndex = 1)
+ // WHEN the user switch is starting
+ tracker.onBeforeUserSwitching(userId = 1)
+
+ // THEN the selection status is IN_PROGRESS
+ assertThat(selectedUser!!.selectionStatus)
+ .isEqualTo(SelectionStatus.SELECTION_IN_PROGRESS)
+
// WHEN the user is changing
tracker.onUserChanging(userId = 1)
- // THEN the selection status is IN_PROGRESS
+ // THEN the selection status is still IN_PROGRESS
assertThat(selectedUser!!.selectionStatus)
.isEqualTo(SelectionStatus.SELECTION_IN_PROGRESS)
@@ -266,6 +273,7 @@
setUpUsers(count = 2, selectedIndex = 0)
+ tracker.onBeforeUserSwitching(userId = 0)
tracker.onUserChanging(userId = 0)
assertThat(selectedUser!!.selectionStatus)
.isEqualTo(SelectionStatus.SELECTION_IN_PROGRESS)
diff --git a/ravenwood/Android.bp b/ravenwood/Android.bp
index 10e4f38..6b1197a 100644
--- a/ravenwood/Android.bp
+++ b/ravenwood/Android.bp
@@ -267,25 +267,39 @@
visibility: ["//frameworks/base"],
}
-cc_library_shared {
- name: "libravenwood_runtime",
- host_supported: true,
-
+cc_defaults {
+ name: "ravenwood_jni_defaults",
cflags: [
"-Wall",
"-Werror",
"-Wno-unused-parameter",
"-Wthread-safety",
],
-
- srcs: [
- "runtime-jni/*.cpp",
+ static_libs: [
+ "libnativehelper_jvm",
],
+ shared_libs: [
+ "liblog",
+ ],
+}
+// We need this as a separate library because we need to overload the
+// sysprop symbols before libbase is loaded into the process
+cc_library_host_shared {
+ name: "libravenwood_sysprop",
+ defaults: ["ravenwood_jni_defaults"],
+ srcs: ["runtime-jni/ravenwood_sysprop.cpp"],
+}
+
+cc_library_host_shared {
+ name: "libravenwood_runtime",
+ defaults: ["ravenwood_jni_defaults"],
+ srcs: [
+ "runtime-jni/ravenwood_runtime.cpp",
+ "runtime-jni/ravenwood_os_constants.cpp",
+ ],
shared_libs: [
"libbase",
- "liblog",
- "libnativehelper",
"libutils",
"libcutils",
],
@@ -377,8 +391,10 @@
"z00-all-updatable-modules-system-stubs",
],
jni_libs: [
- "libandroid_runtime",
+ // Libraries has to be loaded in the following order
+ "libravenwood_sysprop",
"libravenwood_runtime",
+ "libandroid_runtime",
],
}
diff --git a/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodNativeLoader.java b/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodNativeLoader.java
index e548611..d29b93c 100644
--- a/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodNativeLoader.java
+++ b/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodNativeLoader.java
@@ -43,6 +43,7 @@
android.util.Log.class,
android.os.Parcel.class,
android.os.Binder.class,
+ android.os.SystemProperties.class,
android.content.res.ApkAssets.class,
android.content.res.AssetManager.class,
android.content.res.StringBlock.class,
diff --git a/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodRuntimeEnvironmentController.java b/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodRuntimeEnvironmentController.java
index 90bb93d..6e73b2c 100644
--- a/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodRuntimeEnvironmentController.java
+++ b/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodRuntimeEnvironmentController.java
@@ -31,6 +31,7 @@
import android.os.HandlerThread;
import android.os.Looper;
import android.os.ServiceManager;
+import android.os.SystemProperties;
import android.system.ErrnoException;
import android.system.Os;
import android.util.Log;
@@ -38,6 +39,7 @@
import androidx.test.platform.app.InstrumentationRegistry;
import com.android.internal.os.RuntimeInit;
+import com.android.ravenwood.RavenwoodRuntimeNative;
import com.android.ravenwood.common.RavenwoodCommonUtils;
import com.android.ravenwood.common.RavenwoodRuntimeException;
import com.android.ravenwood.common.SneakyThrow;
@@ -68,6 +70,8 @@
}
private static final String MAIN_THREAD_NAME = "RavenwoodMain";
+ private static final String RAVENWOOD_NATIVE_SYSPROP_NAME = "ravenwood_sysprop";
+ private static final String RAVENWOOD_NATIVE_RUNTIME_NAME = "ravenwood_runtime";
/**
* When enabled, attempt to dump all thread stacks just before we hit the
@@ -118,6 +122,7 @@
}
private static RavenwoodConfig sConfig;
+ private static RavenwoodSystemProperties sProps;
private static boolean sInitialized = false;
/**
@@ -132,6 +137,14 @@
// We haven't initialized liblog yet, so directly write to System.out here.
RavenwoodCommonUtils.log(TAG, "globalInit()");
+ // Load libravenwood_sysprop first
+ var libProp = RavenwoodCommonUtils.getJniLibraryPath(RAVENWOOD_NATIVE_SYSPROP_NAME);
+ System.load(libProp);
+ RavenwoodRuntimeNative.reloadNativeLibrary(libProp);
+
+ // Make sure libravenwood_runtime is loaded.
+ System.load(RavenwoodCommonUtils.getJniLibraryPath(RAVENWOOD_NATIVE_RUNTIME_NAME));
+
// Do the basic set up for the android sysprops.
setSystemProperties(RavenwoodSystemProperties.DEFAULT_VALUES);
@@ -355,12 +368,21 @@
/**
* Set the current configuration to the actual SystemProperties.
*/
- public static void setSystemProperties(RavenwoodSystemProperties ravenwoodSystemProperties) {
- var clone = new RavenwoodSystemProperties(ravenwoodSystemProperties, true);
+ private static void setSystemProperties(RavenwoodSystemProperties systemProperties) {
+ SystemProperties.clearChangeCallbacksForTest();
+ RavenwoodRuntimeNative.clearSystemProperties();
+ sProps = new RavenwoodSystemProperties(systemProperties, true);
+ for (var entry : systemProperties.getValues().entrySet()) {
+ RavenwoodRuntimeNative.setSystemProperty(entry.getKey(), entry.getValue());
+ }
+ }
- android.os.SystemProperties.init$ravenwood(
- clone.getValues(),
- clone.getKeyReadablePredicate(),
- clone.getKeyWritablePredicate());
+ @SuppressWarnings("unused") // Called from native code (ravenwood_sysprop.cpp)
+ private static void checkSystemPropertyAccess(String key, boolean write) {
+ boolean result = write ? sProps.isKeyWritable(key) : sProps.isKeyReadable(key);
+ if (!result) {
+ throw new IllegalArgumentException((write ? "Write" : "Read")
+ + " access to system property '" + key + "' denied via RavenwoodConfig");
+ }
}
}
diff --git a/ravenwood/junit-src/android/platform/test/ravenwood/RavenwoodSystemProperties.java b/ravenwood/junit-src/android/platform/test/ravenwood/RavenwoodSystemProperties.java
index ef8f584..f1e1ef6 100644
--- a/ravenwood/junit-src/android/platform/test/ravenwood/RavenwoodSystemProperties.java
+++ b/ravenwood/junit-src/android/platform/test/ravenwood/RavenwoodSystemProperties.java
@@ -22,7 +22,6 @@
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
-import java.util.function.Predicate;
public class RavenwoodSystemProperties {
private volatile boolean mIsImmutable;
@@ -31,47 +30,9 @@
/** Set of additional keys that should be considered readable */
private final Set<String> mKeyReadable = new HashSet<>();
- private final Predicate<String> mKeyReadablePredicate = (key) -> {
- final String root = getKeyRoot(key);
-
- if (root.startsWith("debug.")) return true;
-
- // This set is carefully curated to help identify situations where a test may
- // accidentally depend on a default value of an obscure property whose owner hasn't
- // decided how Ravenwood should behave.
- if (root.startsWith("boot.")) return true;
- if (root.startsWith("build.")) return true;
- if (root.startsWith("product.")) return true;
- if (root.startsWith("soc.")) return true;
- if (root.startsWith("system.")) return true;
-
- switch (key) {
- case "gsm.version.baseband":
- case "no.such.thing":
- case "qemu.sf.lcd_density":
- case "ro.bootloader":
- case "ro.debuggable":
- case "ro.hardware":
- case "ro.hw_timeout_multiplier":
- case "ro.odm.build.media_performance_class":
- case "ro.sf.lcd_density":
- case "ro.treble.enabled":
- case "ro.vndk.version":
- return true;
- }
-
- return mKeyReadable.contains(key);
- };
/** Set of additional keys that should be considered writable */
private final Set<String> mKeyWritable = new HashSet<>();
- private final Predicate<String> mKeyWritablePredicate = (key) -> {
- final String root = getKeyRoot(key);
-
- if (root.startsWith("debug.")) return true;
-
- return mKeyWritable.contains(key);
- };
public RavenwoodSystemProperties() {
// TODO: load these values from build.prop generated files
@@ -121,12 +82,45 @@
return new HashMap<>(mValues);
}
- public Predicate<String> getKeyReadablePredicate() {
- return mKeyReadablePredicate;
+ public boolean isKeyReadable(String key) {
+ final String root = getKeyRoot(key);
+
+ if (root.startsWith("debug.")) return true;
+
+ // This set is carefully curated to help identify situations where a test may
+ // accidentally depend on a default value of an obscure property whose owner hasn't
+ // decided how Ravenwood should behave.
+ if (root.startsWith("boot.")) return true;
+ if (root.startsWith("build.")) return true;
+ if (root.startsWith("product.")) return true;
+ if (root.startsWith("soc.")) return true;
+ if (root.startsWith("system.")) return true;
+
+ switch (key) {
+ case "gsm.version.baseband":
+ case "no.such.thing":
+ case "qemu.sf.lcd_density":
+ case "ro.bootloader":
+ case "ro.debuggable":
+ case "ro.hardware":
+ case "ro.hw_timeout_multiplier":
+ case "ro.odm.build.media_performance_class":
+ case "ro.sf.lcd_density":
+ case "ro.treble.enabled":
+ case "ro.vndk.version":
+ case "ro.icu.data.path":
+ return true;
+ }
+
+ return mKeyReadable.contains(key);
}
- public Predicate<String> getKeyWritablePredicate() {
- return mKeyWritablePredicate;
+ public boolean isKeyWritable(String key) {
+ final String root = getKeyRoot(key);
+
+ if (root.startsWith("debug.")) return true;
+
+ return mKeyWritable.contains(key);
}
private static final String[] PARTITIONS = {
@@ -208,4 +202,4 @@
// Create a default instance, and make an immutable copy of it.
public static final RavenwoodSystemProperties DEFAULT_VALUES =
new RavenwoodSystemProperties(new RavenwoodSystemProperties(), true);
-}
\ No newline at end of file
+}
diff --git a/ravenwood/runtime-common-src/com/android/ravenwood/common/RavenwoodCommonUtils.java b/ravenwood/runtime-common-src/com/android/ravenwood/common/RavenwoodCommonUtils.java
index 989bb6b..ef795c6 100644
--- a/ravenwood/runtime-common-src/com/android/ravenwood/common/RavenwoodCommonUtils.java
+++ b/ravenwood/runtime-common-src/com/android/ravenwood/common/RavenwoodCommonUtils.java
@@ -47,9 +47,6 @@
public static final boolean RAVENWOOD_VERBOSE_LOGGING = "1".equals(System.getenv(
"RAVENWOOD_VERBOSE"));
- /** Name of `libravenwood_runtime` */
- private static final String RAVENWOOD_NATIVE_RUNTIME_NAME = "ravenwood_runtime";
-
/** Directory name of `out/host/linux-x86/testcases/ravenwood-runtime` */
private static final String RAVENWOOD_RUNTIME_DIR_NAME = "ravenwood-runtime";
@@ -110,29 +107,21 @@
}
/**
- * Load the main runtime JNI library.
- */
- public static void loadRavenwoodNativeRuntime() {
- ensureOnRavenwood();
- loadJniLibrary(RAVENWOOD_NATIVE_RUNTIME_NAME);
- }
-
- /**
* Internal implementation of
* {@link android.platform.test.ravenwood.RavenwoodUtils#loadJniLibrary(String)}
*/
public static void loadJniLibrary(String libname) {
if (RavenwoodCommonUtils.isOnRavenwood()) {
- loadJniLibraryInternal(libname);
+ System.load(getJniLibraryPath(libname));
} else {
System.loadLibrary(libname);
}
}
/**
- * Function equivalent to ART's System.loadLibrary. See RavenwoodUtils for why we need it.
+ * Find the shared library path from java.library.path.
*/
- private static void loadJniLibraryInternal(String libname) {
+ public static String getJniLibraryPath(String libname) {
var path = System.getProperty("java.library.path");
var filename = "lib" + libname + ".so";
@@ -140,22 +129,21 @@
try {
if (path == null) {
- throw new UnsatisfiedLinkError("Cannot load library " + libname + "."
+ throw new UnsatisfiedLinkError("Cannot find library " + libname + "."
+ " Property java.library.path not set!");
}
for (var dir : path.split(":")) {
var file = new File(dir + "/" + filename);
if (file.exists()) {
- System.load(file.getAbsolutePath());
- return;
+ return file.getAbsolutePath();
}
}
- throw new UnsatisfiedLinkError("Library " + libname + " not found in "
- + "java.library.path: " + path);
} catch (Throwable e) {
dumpFiles(System.out);
throw e;
}
+ throw new UnsatisfiedLinkError("Library " + libname + " not found in "
+ + "java.library.path: " + path);
}
private static void dumpFiles(PrintStream out) {
diff --git a/ravenwood/runtime-helper-src/framework/android/os/SystemProperties_host.java b/ravenwood/runtime-helper-src/framework/android/os/SystemProperties_host.java
deleted file mode 100644
index b09bf31..0000000
--- a/ravenwood/runtime-helper-src/framework/android/os/SystemProperties_host.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.os;
-
-import android.util.SparseArray;
-
-import com.android.internal.annotations.GuardedBy;
-import com.android.internal.util.Preconditions;
-
-import java.util.Map;
-import java.util.Objects;
-import java.util.function.Predicate;
-
-public class SystemProperties_host {
- private static final Object sLock = new Object();
-
- /** Active system property values */
- @GuardedBy("sLock")
- private static Map<String, String> sValues;
- /** Predicate tested to determine if a given key can be read. */
- @GuardedBy("sLock")
- private static Predicate<String> sKeyReadablePredicate;
- /** Predicate tested to determine if a given key can be written. */
- @GuardedBy("sLock")
- private static Predicate<String> sKeyWritablePredicate;
-
- /**
- * Reverse mapping that provides a way back to an original key from the
- * {@link System#identityHashCode(Object)} of {@link String#intern}.
- */
- @GuardedBy("sLock")
- private static SparseArray<String> sKeyHandles = new SparseArray<>();
-
- /**
- * Basically the same as {@link #init$ravenwood}, but it'll only run if no values are
- * set yet.
- */
- public static void initializeIfNeeded(Map<String, String> values,
- Predicate<String> keyReadablePredicate, Predicate<String> keyWritablePredicate) {
- synchronized (sLock) {
- if (sValues != null) {
- return; // Already initialized.
- }
- init$ravenwood(values, keyReadablePredicate, keyWritablePredicate);
- }
- }
-
- public static void init$ravenwood(Map<String, String> values,
- Predicate<String> keyReadablePredicate, Predicate<String> keyWritablePredicate) {
- synchronized (sLock) {
- sValues = Objects.requireNonNull(values);
- sKeyReadablePredicate = Objects.requireNonNull(keyReadablePredicate);
- sKeyWritablePredicate = Objects.requireNonNull(keyWritablePredicate);
- sKeyHandles.clear();
- synchronized (SystemProperties.sChangeCallbacks) {
- SystemProperties.sChangeCallbacks.clear();
- }
- }
- }
-
- public static void reset$ravenwood() {
- synchronized (sLock) {
- sValues = null;
- sKeyReadablePredicate = null;
- sKeyWritablePredicate = null;
- sKeyHandles.clear();
- synchronized (SystemProperties.sChangeCallbacks) {
- SystemProperties.sChangeCallbacks.clear();
- }
- }
- }
-
- public static void native_set(String key, String val) {
- synchronized (sLock) {
- Objects.requireNonNull(key);
- Preconditions.requireNonNullViaRavenwoodRule(sValues);
- if (!sKeyWritablePredicate.test(key)) {
- throw new IllegalArgumentException(
- "Write access to system property '" + key + "' denied via RavenwoodRule");
- }
- if (key.startsWith("ro.") && sValues.containsKey(key)) {
- throw new IllegalArgumentException(
- "System property '" + key + "' already defined once; cannot redefine");
- }
- if ((val == null) || val.isEmpty()) {
- sValues.remove(key);
- } else {
- sValues.put(key, val);
- }
- SystemProperties.callChangeCallbacks();
- }
- }
-
- public static String native_get(String key, String def) {
- synchronized (sLock) {
- Objects.requireNonNull(key);
- Preconditions.requireNonNullViaRavenwoodRule(sValues);
- if (!sKeyReadablePredicate.test(key)) {
- throw new IllegalArgumentException(
- "Read access to system property '" + key + "' denied via RavenwoodRule");
- }
- return sValues.getOrDefault(key, def);
- }
- }
-
- public static int native_get_int(String key, int def) {
- try {
- return Integer.parseInt(native_get(key, ""));
- } catch (NumberFormatException ignored) {
- return def;
- }
- }
-
- public static long native_get_long(String key, long def) {
- try {
- return Long.parseLong(native_get(key, ""));
- } catch (NumberFormatException ignored) {
- return def;
- }
- }
-
- public static boolean native_get_boolean(String key, boolean def) {
- return parseBoolean(native_get(key, ""), def);
- }
-
- public static long native_find(String name) {
- synchronized (sLock) {
- Preconditions.requireNonNullViaRavenwoodRule(sValues);
- if (sValues.containsKey(name)) {
- name = name.intern();
- final int handle = System.identityHashCode(name);
- sKeyHandles.put(handle, name);
- return handle;
- } else {
- return 0;
- }
- }
- }
-
- public static String native_get(long handle) {
- synchronized (sLock) {
- return native_get(sKeyHandles.get((int) handle), "");
- }
- }
-
- public static int native_get_int(long handle, int def) {
- synchronized (sLock) {
- return native_get_int(sKeyHandles.get((int) handle), def);
- }
- }
-
- public static long native_get_long(long handle, long def) {
- synchronized (sLock) {
- return native_get_long(sKeyHandles.get((int) handle), def);
- }
- }
-
- public static boolean native_get_boolean(long handle, boolean def) {
- synchronized (sLock) {
- return native_get_boolean(sKeyHandles.get((int) handle), def);
- }
- }
-
- public static void native_add_change_callback() {
- // Ignored; callback always registered via init above
- }
-
- public static void native_report_sysprop_change() {
- // Report through callback always registered via init above
- synchronized (sLock) {
- Preconditions.requireNonNullViaRavenwoodRule(sValues);
- SystemProperties.callChangeCallbacks();
- }
- }
-
- private static boolean parseBoolean(String val, boolean def) {
- // Matches system/libbase/include/android-base/parsebool.h
- if (val == null) return def;
- switch (val) {
- case "1":
- case "on":
- case "true":
- case "y":
- case "yes":
- return true;
- case "0":
- case "false":
- case "n":
- case "no":
- case "off":
- return false;
- default:
- return def;
- }
- }
-}
diff --git a/ravenwood/runtime-helper-src/libcore-fake/android/system/OsConstants.java b/ravenwood/runtime-helper-src/libcore-fake/android/system/OsConstants.java
index c56ec8a..3fedc1a 100644
--- a/ravenwood/runtime-helper-src/libcore-fake/android/system/OsConstants.java
+++ b/ravenwood/runtime-helper-src/libcore-fake/android/system/OsConstants.java
@@ -15,8 +15,6 @@
*/
package android.system;
-import com.android.ravenwood.common.RavenwoodCommonUtils;
-
/**
* Copied from libcore's version, with the local changes:
* - All the imports are removed. (they're only used in javadoc)
@@ -1252,8 +1250,6 @@
private static int placeholder() { return 0; }
// ...because we want to initialize them at runtime.
static {
- // [ravenwood-change] Load the JNI lib.
- RavenwoodCommonUtils.loadRavenwoodNativeRuntime();
Native.initConstants();
}
}
diff --git a/ravenwood/runtime-helper-src/libcore-fake/com/android/ravenwood/RavenwoodRuntimeNative.java b/ravenwood/runtime-helper-src/libcore-fake/com/android/ravenwood/RavenwoodRuntimeNative.java
index ad80d92..f13189f 100644
--- a/ravenwood/runtime-helper-src/libcore-fake/com/android/ravenwood/RavenwoodRuntimeNative.java
+++ b/ravenwood/runtime-helper-src/libcore-fake/com/android/ravenwood/RavenwoodRuntimeNative.java
@@ -19,7 +19,6 @@
import android.system.StructStat;
import com.android.ravenwood.common.JvmWorkaround;
-import com.android.ravenwood.common.RavenwoodCommonUtils;
import java.io.FileDescriptor;
@@ -30,11 +29,6 @@
private RavenwoodRuntimeNative() {
}
- static {
- RavenwoodCommonUtils.ensureOnRavenwood();
- RavenwoodCommonUtils.loadRavenwoodNativeRuntime();
- }
-
public static native void applyFreeFunction(long freeFunction, long nativePtr);
private static native long nLseek(int fd, long offset, int whence) throws ErrnoException;
@@ -56,6 +50,14 @@
public static native void setenv(String name, String value, boolean overwrite)
throws ErrnoException;
+ public static native void reloadNativeLibrary(String libFile);
+
+ public static native String getSystemProperty(String key);
+
+ public static native boolean setSystemProperty(String key, String value);
+
+ public static native void clearSystemProperties();
+
public static long lseek(FileDescriptor fd, long offset, int whence) throws ErrnoException {
return nLseek(JvmWorkaround.getInstance().getFdInt(fd), offset, whence);
}
diff --git a/ravenwood/runtime-jni/jni_helper.h b/ravenwood/runtime-jni/jni_helper.h
new file mode 100644
index 0000000..561fb3b
--- /dev/null
+++ b/ravenwood/runtime-jni/jni_helper.h
@@ -0,0 +1,99 @@
+/*
+ * 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.
+ */
+
+#include <jni.h>
+#include <log/log.h>
+#include <nativehelper/JNIHelp.h>
+#include <nativehelper/ScopedLocalRef.h>
+#include <nativehelper/ScopedPrimitiveArray.h>
+#include <nativehelper/ScopedUtfChars.h>
+
+#include <string>
+
+constexpr const char* kCommonUtils = "com/android/ravenwood/common/RavenwoodCommonUtils";
+constexpr const char* kRuntimeEnvController =
+ "android/platform/test/ravenwood/RavenwoodRuntimeEnvironmentController";
+constexpr const char* kRuntimeNative = "com/android/ravenwood/RavenwoodRuntimeNative";
+
+// We have to explicitly decode the string to real UTF-8, because when using GetStringUTFChars
+// we only get modified UTF-8, which is not the platform string type used in host JVM.
+struct ScopedRealUtf8Chars {
+ ScopedRealUtf8Chars(JNIEnv* env, jstring s) : valid_(false) {
+ if (s == nullptr) {
+ jniThrowNullPointerException(env);
+ return;
+ }
+ jclass clazz = env->GetObjectClass(s);
+ jmethodID getBytes = env->GetMethodID(clazz, "getBytes", "(Ljava/lang/String;)[B");
+
+ ScopedLocalRef<jstring> utf8(env, env->NewStringUTF("UTF-8"));
+ ScopedLocalRef<jbyteArray> jbytes(env,
+ (jbyteArray)env->CallObjectMethod(s, getBytes,
+ utf8.get()));
+
+ ScopedByteArrayRO bytes(env, jbytes.get());
+ string_.append((const char*)bytes.get(), bytes.size());
+ valid_ = true;
+ }
+
+ const char* c_str() const {
+ return valid_ ? string_.c_str() : nullptr;
+ }
+
+ size_t size() const {
+ return string_.size();
+ }
+
+ const char& operator[](size_t n) const {
+ return string_[n];
+ }
+
+private:
+ std::string string_;
+ bool valid_;
+};
+
+static inline JNIEnv* GetJNIEnvOrDie(JavaVM* vm) {
+ JNIEnv* env = nullptr;
+ vm->GetEnv((void**)&env, JNI_VERSION_1_4);
+ LOG_ALWAYS_FATAL_IF(env == nullptr, "Could not retrieve JNIEnv.");
+ return env;
+}
+
+static inline jclass FindClassOrDie(JNIEnv* env, const char* class_name) {
+ jclass clazz = env->FindClass(class_name);
+ LOG_ALWAYS_FATAL_IF(clazz == NULL, "Unable to find class %s", class_name);
+ return clazz;
+}
+
+template <typename T>
+static inline T MakeGlobalRefOrDie(JNIEnv* env, T in) {
+ jobject res = env->NewGlobalRef(in);
+ LOG_ALWAYS_FATAL_IF(res == NULL, "Unable to create global reference.");
+ return static_cast<T>(res);
+}
+
+static inline jclass FindGlobalClassOrDie(JNIEnv* env, const char* class_name) {
+ return MakeGlobalRefOrDie(env, FindClassOrDie(env, class_name));
+}
+
+static inline jmethodID GetStaticMethodIDOrDie(JNIEnv* env, jclass clazz, const char* method_name,
+ const char* method_signature) {
+ jmethodID res = env->GetStaticMethodID(clazz, method_name, method_signature);
+ LOG_ALWAYS_FATAL_IF(res == NULL, "Unable to find static method %s with signature %s",
+ method_name, method_signature);
+ return res;
+}
diff --git a/ravenwood/runtime-jni/ravenwood_runtime.cpp b/ravenwood/runtime-jni/ravenwood_runtime.cpp
index c255be5..3ff0848 100644
--- a/ravenwood/runtime-jni/ravenwood_runtime.cpp
+++ b/ravenwood/runtime-jni/ravenwood_runtime.cpp
@@ -15,21 +15,14 @@
*/
#include <fcntl.h>
-#include <sys/stat.h>
#include <string.h>
+#include <sys/stat.h>
#include <unistd.h>
+#include <utils/misc.h>
+
#include <string>
-#include <nativehelper/JNIHelp.h>
-#include <nativehelper/ScopedLocalRef.h>
-#include <nativehelper/ScopedUtfChars.h>
-#include <nativehelper/ScopedPrimitiveArray.h>
-#include "jni.h"
-#include "utils/Log.h"
-#include "utils/misc.h"
-
-// Defined in ravenwood_os_constants.cpp
-void register_android_system_OsConstants(JNIEnv* env);
+#include "jni_helper.h"
// ---- Exception related ----
@@ -51,53 +44,6 @@
static jclass g_StructStat;
static jclass g_StructTimespecClass;
-// We have to explicitly decode the string to real UTF-8, because when using GetStringUTFChars
-// we only get modified UTF-8, which is not the platform string type used in host JVM.
-struct ScopedRealUtf8Chars {
- ScopedRealUtf8Chars(JNIEnv* env, jstring s) : valid_(false) {
- if (s == nullptr) {
- jniThrowNullPointerException(env);
- return;
- }
- jclass clazz = env->GetObjectClass(s);
- jmethodID getBytes = env->GetMethodID(clazz, "getBytes", "(Ljava/lang/String;)[B");
-
- ScopedLocalRef<jstring> utf8(env, env->NewStringUTF("UTF-8"));
- ScopedLocalRef<jbyteArray> jbytes(env,
- (jbyteArray) env->CallObjectMethod(s, getBytes, utf8.get()));
-
- ScopedByteArrayRO bytes(env, jbytes.get());
- string_.append((const char *) bytes.get(), bytes.size());
- valid_ = true;
- }
-
- const char* c_str() const {
- return valid_ ? string_.c_str() : nullptr;
- }
-
- size_t size() const {
- return string_.size();
- }
-
- const char& operator[](size_t n) const {
- return string_[n];
- }
-
-private:
- std::string string_;
- bool valid_;
-};
-
-static jclass findClass(JNIEnv* env, const char* name) {
- ScopedLocalRef<jclass> localClass(env, env->FindClass(name));
- jclass result = reinterpret_cast<jclass>(env->NewGlobalRef(localClass.get()));
- if (result == NULL) {
- ALOGE("failed to find class '%s'", name);
- abort();
- }
- return result;
-}
-
static jobject makeStructTimespec(JNIEnv* env, const struct timespec& ts) {
static jmethodID ctor = env->GetMethodID(g_StructTimespecClass, "<init>",
"(JJ)V");
@@ -229,6 +175,8 @@
// ---- Registration ----
+extern void register_android_system_OsConstants(JNIEnv* env);
+
static const JNINativeMethod sMethods[] =
{
{ "applyFreeFunction", "(JJ)V", (void*)nApplyFreeFunction },
@@ -243,24 +191,14 @@
{ "setenv", "(Ljava/lang/String;Ljava/lang/String;Z)V", (void*)Linux_setenv },
};
-extern "C" jint JNI_OnLoad(JavaVM* vm, void* /* reserved */)
-{
- JNIEnv* env = NULL;
- jint result = -1;
-
- if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
- ALOGE("GetEnv failed!");
- return result;
- }
- ALOG_ASSERT(env, "Could not retrieve the env!");
-
+extern "C" jint JNI_OnLoad(JavaVM* vm, void* /* reserved */) {
ALOGI("%s: JNI_OnLoad", __FILE__);
- g_StructStat = findClass(env, "android/system/StructStat");
- g_StructTimespecClass = findClass(env, "android/system/StructTimespec");
+ JNIEnv* env = GetJNIEnvOrDie(vm);
+ g_StructStat = FindGlobalClassOrDie(env, "android/system/StructStat");
+ g_StructTimespecClass = FindGlobalClassOrDie(env, "android/system/StructTimespec");
- jint res = jniRegisterNativeMethods(env, "com/android/ravenwood/RavenwoodRuntimeNative",
- sMethods, NELEM(sMethods));
+ jint res = jniRegisterNativeMethods(env, kRuntimeNative, sMethods, NELEM(sMethods));
if (res < 0) {
return res;
}
diff --git a/ravenwood/runtime-jni/ravenwood_sysprop.cpp b/ravenwood/runtime-jni/ravenwood_sysprop.cpp
new file mode 100644
index 0000000..4fb61b6
--- /dev/null
+++ b/ravenwood/runtime-jni/ravenwood_sysprop.cpp
@@ -0,0 +1,187 @@
+/*
+ * 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.
+ */
+
+#include <dlfcn.h>
+
+#include <set>
+
+#include "jni_helper.h"
+
+// Implement a rudimentary system properties data store
+
+#define PROP_VALUE_MAX 92
+
+namespace {
+
+struct prop_info {
+ std::string key;
+ mutable std::string value;
+ mutable uint32_t serial;
+
+ prop_info(const char* key, const char* value) : key(key), value(value), serial(0) {}
+};
+
+struct prop_info_cmp {
+ using is_transparent = void;
+ bool operator()(const prop_info& lhs, const prop_info& rhs) {
+ return lhs.key < rhs.key;
+ }
+ bool operator()(std::string_view lhs, const prop_info& rhs) {
+ return lhs < rhs.key;
+ }
+ bool operator()(const prop_info& lhs, std::string_view rhs) {
+ return lhs.key < rhs;
+ }
+};
+
+} // namespace
+
+static auto& g_properties_lock = *new std::mutex;
+static auto& g_properties = *new std::set<prop_info, prop_info_cmp>;
+
+static bool property_set(const char* key, const char* value) {
+ if (key == nullptr || *key == '\0') return false;
+ if (value == nullptr) value = "";
+ bool read_only = !strncmp(key, "ro.", 3);
+ if (!read_only && strlen(value) >= PROP_VALUE_MAX) return -1;
+
+ std::lock_guard lock(g_properties_lock);
+ auto [it, success] = g_properties.emplace(key, value);
+ if (read_only) return success;
+ if (!success) {
+ it->value = value;
+ ++it->serial;
+ }
+ return true;
+}
+
+template <typename Func>
+static void property_get(const char* key, Func callback) {
+ std::lock_guard lock(g_properties_lock);
+ auto it = g_properties.find(key);
+ if (it != g_properties.end()) {
+ callback(*it);
+ }
+}
+
+// Redefine the __system_property_XXX functions here so we can perform
+// logging and access checks for all sysprops in native code.
+
+static void check_system_property_access(const char* key, bool write);
+
+extern "C" {
+
+int __system_property_set(const char* key, const char* value) {
+ check_system_property_access(key, true);
+ return property_set(key, value) ? 0 : -1;
+}
+
+int __system_property_get(const char* key, char* value) {
+ check_system_property_access(key, false);
+ *value = '\0';
+ property_get(key, [&](const prop_info& info) {
+ snprintf(value, PROP_VALUE_MAX, "%s", info.value.c_str());
+ });
+ return strlen(value);
+}
+
+const prop_info* __system_property_find(const char* key) {
+ check_system_property_access(key, false);
+ const prop_info* pi = nullptr;
+ property_get(key, [&](const prop_info& info) { pi = &info; });
+ return pi;
+}
+
+void __system_property_read_callback(const prop_info* pi,
+ void (*callback)(void*, const char*, const char*, uint32_t),
+ void* cookie) {
+ std::lock_guard lock(g_properties_lock);
+ callback(cookie, pi->key.c_str(), pi->value.c_str(), pi->serial);
+}
+
+} // extern "C"
+
+// ---- JNI ----
+
+static JavaVM* gVM = nullptr;
+static jclass gEnvController = nullptr;
+static jmethodID gCheckSystemPropertyAccess;
+
+static void reloadNativeLibrary(JNIEnv* env, jclass, jstring javaPath) {
+ ScopedUtfChars path(env, javaPath);
+ // Force reload ourselves as global
+ dlopen(path.c_str(), RTLD_LAZY | RTLD_GLOBAL | RTLD_NOLOAD);
+}
+
+// Call back into Java code to check property access
+static void check_system_property_access(const char* key, bool write) {
+ if (gVM != nullptr && gEnvController != nullptr) {
+ JNIEnv* env;
+ if (gVM->GetEnv((void**)&env, JNI_VERSION_1_4) >= 0) {
+ ALOGI("%s access to system property '%s'", write ? "Write" : "Read", key);
+ env->CallStaticVoidMethod(gEnvController, gCheckSystemPropertyAccess,
+ env->NewStringUTF(key), write ? JNI_TRUE : JNI_FALSE);
+ return;
+ }
+ }
+ // Not on JVM thread, abort
+ LOG_ALWAYS_FATAL("Access to system property '%s' on non-JVM threads is not allowed.", key);
+}
+
+static jstring getSystemProperty(JNIEnv* env, jclass, jstring javaKey) {
+ ScopedUtfChars key(env, javaKey);
+ jstring value = nullptr;
+ property_get(key.c_str(),
+ [&](const prop_info& info) { value = env->NewStringUTF(info.value.c_str()); });
+ return value;
+}
+
+static jboolean setSystemProperty(JNIEnv* env, jclass, jstring javaKey, jstring javaValue) {
+ ScopedUtfChars key(env, javaKey);
+ ScopedUtfChars value(env, javaValue);
+ return property_set(key.c_str(), value.c_str()) ? JNI_TRUE : JNI_FALSE;
+}
+
+static void clearSystemProperties(JNIEnv*, jclass) {
+ std::lock_guard lock(g_properties_lock);
+ g_properties.clear();
+}
+
+static const JNINativeMethod sMethods[] = {
+ {"reloadNativeLibrary", "(Ljava/lang/String;)V", (void*)reloadNativeLibrary},
+ {"getSystemProperty", "(Ljava/lang/String;)Ljava/lang/String;", (void*)getSystemProperty},
+ {"setSystemProperty", "(Ljava/lang/String;Ljava/lang/String;)Z", (void*)setSystemProperty},
+ {"clearSystemProperties", "()V", (void*)clearSystemProperties},
+};
+
+extern "C" jint JNI_OnLoad(JavaVM* vm, void* /* reserved */) {
+ ALOGI("%s: JNI_OnLoad", __FILE__);
+
+ JNIEnv* env = GetJNIEnvOrDie(vm);
+ gVM = vm;
+
+ // Fetch several references for future use
+ gEnvController = FindGlobalClassOrDie(env, kRuntimeEnvController);
+ gCheckSystemPropertyAccess =
+ GetStaticMethodIDOrDie(env, gEnvController, "checkSystemPropertyAccess",
+ "(Ljava/lang/String;Z)V");
+
+ // Expose raw property methods as JNI methods
+ jint res = jniRegisterNativeMethods(env, kRuntimeNative, sMethods, NELEM(sMethods));
+ if (res < 0) return -1;
+
+ return JNI_VERSION_1_4;
+}
diff --git a/services/accessibility/java/com/android/server/accessibility/MouseKeysInterceptor.java b/services/accessibility/java/com/android/server/accessibility/MouseKeysInterceptor.java
index 54368ca..4b97745 100644
--- a/services/accessibility/java/com/android/server/accessibility/MouseKeysInterceptor.java
+++ b/services/accessibility/java/com/android/server/accessibility/MouseKeysInterceptor.java
@@ -73,12 +73,16 @@
private static final int MESSAGE_MOVE_MOUSE_POINTER = 1;
private static final int MESSAGE_SCROLL_MOUSE_POINTER = 2;
- private static final float MOUSE_POINTER_MOVEMENT_STEP = 1.8f;
private static final int KEY_NOT_SET = -1;
/** Time interval after which mouse action will be repeated */
private static final int INTERVAL_MILLIS = 10;
+ @VisibleForTesting
+ public static final float MOUSE_POINTER_MOVEMENT_STEP = 1.8f;
+ @VisibleForTesting
+ public static final float MOUSE_SCROLL_STEP = 0.2f;
+
private final AccessibilityManagerService mAms;
private final Handler mHandler;
private final InputManager mInputManager;
@@ -281,8 +285,8 @@
MouseKeyEvent mouseKeyEvent = MouseKeyEvent.from(
keyCode, mActiveInputDeviceId, mDeviceKeyCodeMap);
float y = switch (mouseKeyEvent) {
- case UP_MOVE_OR_SCROLL -> 1.0f;
- case DOWN_MOVE_OR_SCROLL -> -1.0f;
+ case UP_MOVE_OR_SCROLL -> MOUSE_SCROLL_STEP;
+ case DOWN_MOVE_OR_SCROLL -> -MOUSE_SCROLL_STEP;
default -> 0.0f;
};
waitForVirtualMouseCreation();
diff --git a/services/appfunctions/Android.bp b/services/appfunctions/Android.bp
index f8ee823..eb6e468 100644
--- a/services/appfunctions/Android.bp
+++ b/services/appfunctions/Android.bp
@@ -22,4 +22,7 @@
"java/**/*.logtags",
],
libs: ["services.core"],
+ lint: {
+ baseline_filename: "lint-baseline.xml",
+ },
}
diff --git a/services/appfunctions/java/com/android/server/appfunctions/AppFunctionManagerServiceImpl.java b/services/appfunctions/java/com/android/server/appfunctions/AppFunctionManagerServiceImpl.java
index 1e723b5..c8f8c2a 100644
--- a/services/appfunctions/java/com/android/server/appfunctions/AppFunctionManagerServiceImpl.java
+++ b/services/appfunctions/java/com/android/server/appfunctions/AppFunctionManagerServiceImpl.java
@@ -204,7 +204,8 @@
serviceIntent,
targetUser,
safeExecuteAppFunctionCallback,
- /* bindFlags= */ Context.BIND_AUTO_CREATE);
+ /* bindFlags= */ Context.BIND_AUTO_CREATE
+ | Context.BIND_FOREGROUND_SERVICE);
})
.exceptionally(
ex -> {
diff --git a/services/appfunctions/lint-baseline.xml b/services/appfunctions/lint-baseline.xml
new file mode 100644
index 0000000..fbcb9f3
--- /dev/null
+++ b/services/appfunctions/lint-baseline.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 8.4.0-alpha08" type="baseline" client="" dependencies="true" name="" variant="all" version="8.4.0-alpha08">
+
+ <issue
+ id="MissingPermissionAnnotation"
+ message="executeAppFunction should be annotated with either @EnforcePermission, @RequiresNoPermission or @PermissionManuallyEnforced."
+ errorLine1=" @Override"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/services/appfunctions/java/com/android/server/appfunctions/AppFunctionManagerServiceImpl.java"
+ line="101"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingPermissionAnnotation"
+ message="onResult should be annotated with either @EnforcePermission, @RequiresNoPermission or @PermissionManuallyEnforced."
+ errorLine1=" @Override"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/services/appfunctions/java/com/android/server/appfunctions/AppFunctionManagerServiceImpl.java"
+ line="243"
+ column="49"/>
+ </issue>
+
+</issues>
diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
index b53bf98..b2c679f 100644
--- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
+++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
@@ -18,6 +18,7 @@
import static android.appwidget.flags.Flags.remoteAdapterConversion;
import static android.appwidget.flags.Flags.removeAppWidgetServiceIoFromCriticalPath;
+import static android.appwidget.flags.Flags.securityPolicyInteractAcrossUsers;
import static android.appwidget.flags.Flags.supportResumeRestoreAfterReboot;
import static android.content.Context.KEYGUARD_SERVICE;
import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
@@ -32,6 +33,7 @@
import android.Manifest;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.PermissionName;
import android.annotation.RequiresPermission;
import android.annotation.UserIdInt;
import android.app.ActivityManager;
@@ -1463,13 +1465,15 @@
mSecurityPolicy.enforceCallFromPackage(callingPackage);
// Check that if a cross-profile binding is attempted, it is allowed.
- if (!mSecurityPolicy.isEnabledGroupProfile(providerProfileId)) {
+ // Cross-profile binding is also allowed if the caller has interact across users permission.
+ if (!mSecurityPolicy.isEnabledGroupProfile(providerProfileId)
+ && !mSecurityPolicy.hasCallerInteractAcrossUsersPermission()) {
return false;
}
- // If the provider is not under the calling user, make sure this
- // provider is allowlisted for access from the parent.
- if (!mSecurityPolicy.isProviderInCallerOrInProfileAndWhitelListed(
+ // If the provider is not under the calling user, make sure this provider is allowlisted for
+ // access from the parent, or that the caller has permission to interact across users.
+ if (!mSecurityPolicy.canAccessProvider(
providerComponent.getPackageName(), providerProfileId)) {
return false;
}
@@ -2190,8 +2194,10 @@
Slog.i(TAG, "getInstalledProvidersForProfiles() " + userId);
}
- // Ensure the profile is in the group and enabled.
- if (!mSecurityPolicy.isEnabledGroupProfile(profileId)) {
+ // Ensure the profile is in the group and enabled, or that the caller has permission to
+ // interact across users.
+ if (!mSecurityPolicy.isEnabledGroupProfile(profileId)
+ && !mSecurityPolicy.hasCallerInteractAcrossUsersPermission()) {
return null;
}
@@ -2226,7 +2232,7 @@
// Add providers only for the requested profile that are allowlisted.
final int providerProfileId = info.getProfile().getIdentifier();
if (providerProfileId == profileId
- && mSecurityPolicy.isProviderInCallerOrInProfileAndWhitelListed(
+ && mSecurityPolicy.canAccessProvider(
providerPackageName, providerProfileId)
&& !mPackageManagerInternal.filterAppAccess(providerPackageName, callingUid,
profileId)) {
@@ -4620,7 +4626,7 @@
final int callingUid = Binder.getCallingUid();
final String providerPackageName = componentName.getPackageName();
final boolean providerIsInCallerProfile =
- mSecurityPolicy.isProviderInCallerOrInProfileAndWhitelListed(
+ mSecurityPolicy.canAccessProvider(
providerPackageName, providerProfileId);
final boolean shouldFilterAppAccess = mPackageManagerInternal.filterAppAccess(
providerPackageName, callingUid, providerProfileId);
@@ -4948,8 +4954,7 @@
final int userId = UserHandle.getUserId(uid);
if ((widget.host.getUserId() == userId || (widget.provider != null
&& widget.provider.getUserId() == userId))
- && mContext.checkCallingPermission(android.Manifest.permission.BIND_APPWIDGET)
- == PackageManager.PERMISSION_GRANTED) {
+ && callerHasPermission(android.Manifest.permission.BIND_APPWIDGET)) {
// Apps that run in the same user as either the host or the provider and
// have the bind widget permission have access to the widget.
return true;
@@ -4968,12 +4973,20 @@
return getProfileParent(profileId) == parentId;
}
- public boolean isProviderInCallerOrInProfileAndWhitelListed(String packageName,
- int profileId) {
+ /**
+ * The provider is accessible by the caller if any of the following is true:
+ * - The provider belongs to the caller
+ * - The provider belongs to a profile of the caller and is allowlisted
+ * - The caller has permission to interact across users
+ */
+ public boolean canAccessProvider(String packageName, int profileId) {
final int callerId = UserHandle.getCallingUserId();
if (profileId == callerId) {
return true;
}
+ if (hasCallerInteractAcrossUsersPermission()) {
+ return true;
+ }
final int parentId = getProfileParent(profileId);
if (parentId != callerId) {
return false;
@@ -5041,6 +5054,20 @@
}
return true;
}
+
+ /** Returns true if the caller has permission to interact across users. */
+ public boolean hasCallerInteractAcrossUsersPermission() {
+ if (!securityPolicyInteractAcrossUsers()) {
+ return false;
+ }
+
+ return callerHasPermission(Manifest.permission.INTERACT_ACROSS_USERS)
+ || callerHasPermission(Manifest.permission.INTERACT_ACROSS_USERS_FULL);
+ }
+
+ private boolean callerHasPermission(@NonNull @PermissionName String permission) {
+ return mContext.checkCallingPermission(permission) == PackageManager.PERMISSION_GRANTED;
+ }
}
static final class Provider {
diff --git a/services/core/java/com/android/server/EventLogTags.logtags b/services/core/java/com/android/server/EventLogTags.logtags
index fd512a6..5b271a3 100644
--- a/services/core/java/com/android/server/EventLogTags.logtags
+++ b/services/core/java/com/android/server/EventLogTags.logtags
@@ -96,6 +96,8 @@
27535 notification_adjusted (key|3),(adjustment_type|3),(new_value|3)
# when a notification cancellation is prevented by the system
27536 notification_cancel_prevented (key|3)
+# when a summary notification is converted to a regular notification because of force autogrouping
+27537 notification_summary_converted (key|3)
# ---------------------------
# Watchdog.java
diff --git a/services/core/java/com/android/server/RescueParty.java b/services/core/java/com/android/server/RescueParty.java
index cadceb5..a6e21fc 100644
--- a/services/core/java/com/android/server/RescueParty.java
+++ b/services/core/java/com/android/server/RescueParty.java
@@ -659,7 +659,7 @@
@Override
public void run() {
try {
- RecoverySystem.rebootPromptAndWipeUserData(context, TAG);
+ RecoverySystem.rebootPromptAndWipeUserData(context, TAG + "," + failedPackage);
} catch (Throwable t) {
logRescueException(level, failedPackage, t);
}
diff --git a/services/core/java/com/android/server/VcnManagementService.java b/services/core/java/com/android/server/VcnManagementService.java
index d19899f..12e8c57 100644
--- a/services/core/java/com/android/server/VcnManagementService.java
+++ b/services/core/java/com/android/server/VcnManagementService.java
@@ -178,9 +178,10 @@
public static final boolean VDBG = false; // STOPSHIP: if true
+ // The system path is copied from Environment.getDataSystemDirectory
@VisibleForTesting(visibility = Visibility.PRIVATE)
static final String VCN_CONFIG_FILE =
- new File(Environment.getDataSystemDirectory(), "vcn/configs.xml").getPath();
+ new File(Environment.getDataDirectory(), "system/vcn/configs.xml").getPath();
// TODO(b/176956496): Directly use CarrierServiceBindHelper.UNBIND_DELAY_MILLIS
@VisibleForTesting(visibility = Visibility.PRIVATE)
@@ -379,10 +380,12 @@
}
/** Gets transports that need to be marked as restricted by the VCN from CarrierConfig */
+ // TODO: b/262269892 This method was created to perform experiments before the relevant API
+ // was exposed. Now it is obsolete and should be removed.
@VisibleForTesting(visibility = Visibility.PRIVATE)
public Set<Integer> getRestrictedTransportsFromCarrierConfig(
ParcelUuid subGrp, TelephonySubscriptionSnapshot lastSnapshot) {
- if (!Build.IS_ENG && !Build.IS_USERDEBUG) {
+ if (!Build.isDebuggable()) {
return RESTRICTED_TRANSPORTS_DEFAULT;
}
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 414a4e6..35323d6 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -262,6 +262,7 @@
import android.content.AttributionSource;
import android.content.AutofillOptions;
import android.content.BroadcastReceiver;
+import android.content.ClipData;
import android.content.ComponentCallbacks2;
import android.content.ComponentName;
import android.content.ContentCaptureOptions;
@@ -397,6 +398,7 @@
import com.android.internal.content.InstallLocationUtils;
import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
import com.android.internal.notification.SystemNotificationChannels;
+import com.android.internal.os.ApplicationSharedMemory;
import com.android.internal.os.BackgroundThread;
import com.android.internal.os.BinderCallHeavyHitterWatcher.BinderCallHeavyHitterListener;
import com.android.internal.os.BinderCallHeavyHitterWatcher.HeavyHitterContainer;
@@ -418,7 +420,6 @@
import com.android.internal.util.FrameworkStatsLog;
import com.android.internal.util.MemInfoReader;
import com.android.internal.util.Preconditions;
-import com.android.server.crashrecovery.CrashRecoveryHelper;
import com.android.server.AlarmManagerInternal;
import com.android.server.BootReceiver;
import com.android.server.DeviceIdleInternal;
@@ -438,6 +439,7 @@
import com.android.server.appop.AppOpsService;
import com.android.server.compat.PlatformCompat;
import com.android.server.contentcapture.ContentCaptureManagerInternal;
+import com.android.server.crashrecovery.CrashRecoveryHelper;
import com.android.server.criticalevents.CriticalEventLog;
import com.android.server.firewall.IntentFirewall;
import com.android.server.graphics.fonts.FontManagerInternal;
@@ -482,6 +484,7 @@
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
+import java.lang.ref.WeakReference;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
@@ -499,6 +502,7 @@
import java.util.Objects;
import java.util.Set;
import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
@@ -575,7 +579,7 @@
static final int RESERVED_BYTES_PER_LOGCAT_LINE = 100;
// How many seconds should the system wait before terminating the spawned logcat process.
- static final int LOGCAT_TIMEOUT_SEC = 10;
+ static final int LOGCAT_TIMEOUT_SEC = Flags.logcatLongerTimeout() ? 15 : 10;
// Necessary ApplicationInfo flags to mark an app as persistent
static final int PERSISTENT_MASK =
@@ -836,6 +840,8 @@
@GuardedBy("this")
final ComponentAliasResolver mComponentAliasResolver;
+ final FileDescriptor mApplicationSharedMemoryReadOnlyFd;
+
private static final long HOME_LAUNCH_TIMEOUT_MS = 15000;
private final AtomicBoolean mHasHomeDelay = new AtomicBoolean(false);
@@ -1038,13 +1044,14 @@
@Override
public void onIntentStarted(@NonNull Intent intent, long timestampNanos) {
synchronized (this) {
- mProcessList.getAppStartInfoTracker().onIntentStarted(intent, timestampNanos);
+ mProcessList.getAppStartInfoTracker()
+ .onActivityIntentStarted(intent, timestampNanos);
}
}
@Override
public void onIntentFailed(long id) {
- mProcessList.getAppStartInfoTracker().onIntentFailed(id);
+ mProcessList.getAppStartInfoTracker().onActivityIntentFailed(id);
}
@Override
@@ -1078,7 +1085,7 @@
@Override
public void onReportFullyDrawn(long id, long timestampNanos) {
- mProcessList.getAppStartInfoTracker().onReportFullyDrawn(id, timestampNanos);
+ mProcessList.getAppStartInfoTracker().onActivityReportFullyDrawn(id, timestampNanos);
}
};
@@ -2412,6 +2419,7 @@
mBroadcastQueue = injector.getBroadcastQueue(this);
mBroadcastController = new BroadcastController(mContext, this, mBroadcastQueue);
mComponentAliasResolver = new ComponentAliasResolver(this);
+ mApplicationSharedMemoryReadOnlyFd = null;
}
// Note: This method is invoked on the main thread but may need to attach various
@@ -2518,6 +2526,13 @@
mPendingStartActivityUids = new PendingStartActivityUids();
mTraceErrorLogger = new TraceErrorLogger();
mComponentAliasResolver = new ComponentAliasResolver(this);
+ try {
+ mApplicationSharedMemoryReadOnlyFd =
+ ApplicationSharedMemory.getInstance().getReadOnlyFileDescriptor();
+ } catch (IOException e) {
+ Slog.e(TAG, "Failed to get read only fd for shared memory", e);
+ throw new RuntimeException(e);
+ }
}
void setBroadcastQueueForTest(BroadcastQueue broadcastQueue) {
@@ -4724,6 +4739,7 @@
app.getDisabledCompatChanges(),
app.getLoggableCompatChanges(),
serializedSystemFontMap,
+ mApplicationSharedMemoryReadOnlyFd,
app.getStartElapsedTime(),
app.getStartUptime());
}
@@ -19084,4 +19100,87 @@
Freezer getFreezer() {
return mFreezer;
}
+
+ // Set of IntentCreatorToken objects that are currently active.
+ private static final Map<IntentCreatorToken.Key, WeakReference<IntentCreatorToken>>
+ sIntentCreatorTokenCache = new ConcurrentHashMap<>();
+
+ /**
+ * A binder token used to keep track of which app created the intent. This token can be used to
+ * defend against intent redirect attacks. It stores uid of the intent creator and key fields of
+ * the intent to make it impossible for attacker to fake uid with a malicious intent.
+ *
+ * @hide
+ */
+ public static final class IntentCreatorToken extends Binder {
+ @NonNull
+ private final Key mKeyFields;
+
+ public IntentCreatorToken(int creatorUid, Intent intent) {
+ super();
+ this.mKeyFields = new Key(creatorUid, intent);
+ }
+
+ public int getCreatorUid() {
+ return mKeyFields.mCreatorUid;
+ }
+
+ /** {@hide} */
+ public static boolean isValid(@NonNull Intent intent) {
+ IBinder binder = intent.getCreatorToken();
+ IntentCreatorToken token = null;
+ if (binder instanceof IntentCreatorToken) {
+ token = (IntentCreatorToken) binder;
+ }
+ return token != null && token.mKeyFields.equals(
+ new Key(token.mKeyFields.mCreatorUid, intent));
+ }
+
+ private static class Key {
+ private Key(int creatorUid, Intent intent) {
+ this.mCreatorUid = creatorUid;
+ this.mAction = intent.getAction();
+ this.mData = intent.getData();
+ this.mType = intent.getType();
+ this.mPackage = intent.getPackage();
+ this.mComponent = intent.getComponent();
+ this.mFlags = intent.getFlags() & Intent.IMMUTABLE_FLAGS;
+ ClipData clipData = intent.getClipData();
+ if (clipData != null) {
+ this.mClipDataUris = new ArrayList<>(clipData.getItemCount());
+ for (int i = 0; i < clipData.getItemCount(); i++) {
+ this.mClipDataUris.add(clipData.getItemAt(i).getUri());
+ }
+ }
+ }
+
+ private final int mCreatorUid;
+ private final String mAction;
+ private final Uri mData;
+ private final String mType;
+ private final String mPackage;
+ private final ComponentName mComponent;
+ private final int mFlags;
+ private List<Uri> mClipDataUris;
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ Key key = (Key) o;
+ return mCreatorUid == key.mCreatorUid && mFlags == key.mFlags && Objects.equals(
+ mAction, key.mAction) && Objects.equals(mData, key.mData)
+ && Objects.equals(mType, key.mType) && Objects.equals(mPackage,
+ key.mPackage) && Objects.equals(mComponent, key.mComponent)
+ && Objects.equals(mClipDataUris, key.mClipDataUris);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mCreatorUid, mAction, mData, mType, mPackage, mComponent,
+ mFlags,
+ mClipDataUris);
+ }
+ }
+ }
}
diff --git a/services/core/java/com/android/server/am/AppStartInfoTracker.java b/services/core/java/com/android/server/am/AppStartInfoTracker.java
index 6aadcdc..71b6456 100644
--- a/services/core/java/com/android/server/am/AppStartInfoTracker.java
+++ b/services/core/java/com/android/server/am/AppStartInfoTracker.java
@@ -280,7 +280,11 @@
mTemporaryInProgressIndexes.clear();
}
- void onIntentStarted(@NonNull Intent intent, long timestampNanos) {
+ /**
+ * Should only be called for Activity launch sequences from an instance of
+ * {@link ActivityMetricsLaunchObserver}.
+ */
+ void onActivityIntentStarted(@NonNull Intent intent, long timestampNanos) {
synchronized (mLock) {
if (!mEnabled) {
return;
@@ -291,6 +295,10 @@
start.setStartType(ApplicationStartInfo.START_TYPE_UNSET);
start.addStartupTimestamp(ApplicationStartInfo.START_TIMESTAMP_LAUNCH, timestampNanos);
+ if (android.app.Flags.appStartInfoComponent()) {
+ start.setStartComponent(ApplicationStartInfo.START_COMPONENT_ACTIVITY);
+ }
+
// TODO: handle possible alarm activity start.
if (intent != null && intent.getCategories() != null
&& intent.getCategories().contains(Intent.CATEGORY_LAUNCHER)) {
@@ -303,7 +311,11 @@
}
}
- void onIntentFailed(long id) {
+ /**
+ * Should only be called for Activity launch sequences from an instance of
+ * {@link ActivityMetricsLaunchObserver}.
+ */
+ void onActivityIntentFailed(long id) {
synchronized (mLock) {
if (!mEnabled) {
return;
@@ -322,6 +334,10 @@
}
}
+ /**
+ * Should only be called for Activity launch sequences from an instance of
+ * {@link ActivityMetricsLaunchObserver}.
+ */
void onActivityLaunched(long id, ComponentName name, long temperature, ProcessRecord app) {
synchronized (mLock) {
if (!mEnabled) {
@@ -349,6 +365,10 @@
}
}
+ /**
+ * Should only be called for Activity launch sequences from an instance of
+ * {@link ActivityMetricsLaunchObserver}.
+ */
void onActivityLaunchCancelled(long id) {
synchronized (mLock) {
if (!mEnabled) {
@@ -368,6 +388,10 @@
}
}
+ /**
+ * Should only be called for Activity launch sequences from an instance of
+ * {@link ActivityMetricsLaunchObserver}.
+ */
void onActivityLaunchFinished(long id, ComponentName name, long timestampNanos,
int launchMode) {
synchronized (mLock) {
@@ -391,7 +415,11 @@
}
}
- void onReportFullyDrawn(long id, long timestampNanos) {
+ /**
+ * Should only be called for Activity launch sequences from an instance of
+ * {@link ActivityMetricsLaunchObserver}.
+ */
+ void onActivityReportFullyDrawn(long id, long timestampNanos) {
synchronized (mLock) {
if (!mEnabled) {
return;
@@ -424,6 +452,10 @@
ApplicationStartInfo.START_TIMESTAMP_LAUNCH, startTimeNs);
start.setStartType(ApplicationStartInfo.START_TYPE_COLD);
+ if (android.app.Flags.appStartInfoComponent()) {
+ start.setStartComponent(ApplicationStartInfo.START_COMPONENT_SERVICE);
+ }
+
// TODO: handle possible alarm service start.
start.setReason(serviceRecord.permission != null
&& serviceRecord.permission.contains("android.permission.BIND_JOB_SERVICE")
@@ -455,6 +487,11 @@
start.setReason(ApplicationStartInfo.START_REASON_BROADCAST);
}
start.setIntent(intent);
+
+ if (android.app.Flags.appStartInfoComponent()) {
+ start.setStartComponent(ApplicationStartInfo.START_COMPONENT_BROADCAST);
+ }
+
addStartInfoLocked(start);
}
}
@@ -472,6 +509,11 @@
ApplicationStartInfo.START_TIMESTAMP_LAUNCH, startTimeNs);
start.setStartType(ApplicationStartInfo.START_TYPE_COLD);
start.setReason(ApplicationStartInfo.START_REASON_CONTENT_PROVIDER);
+
+ if (android.app.Flags.appStartInfoComponent()) {
+ start.setStartComponent(ApplicationStartInfo.START_COMPONENT_CONTENT_PROVIDER);
+ }
+
addStartInfoLocked(start);
}
}
@@ -490,6 +532,11 @@
start.setStartType(cold ? ApplicationStartInfo.START_TYPE_COLD
: ApplicationStartInfo.START_TYPE_WARM);
start.setReason(ApplicationStartInfo.START_REASON_BACKUP);
+
+ if (android.app.Flags.appStartInfoComponent()) {
+ start.setStartComponent(ApplicationStartInfo.START_COMPONENT_OTHER);
+ }
+
addStartInfoLocked(start);
}
}
diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java
index 75e9fad..15277ce 100644
--- a/services/core/java/com/android/server/am/BatteryStatsService.java
+++ b/services/core/java/com/android/server/am/BatteryStatsService.java
@@ -437,7 +437,6 @@
mBatteryUsageStatsProvider = new BatteryUsageStatsProvider(context,
mPowerAttributor, mPowerProfile, mCpuScalingPolicies,
mPowerStatsStore, Clock.SYSTEM_CLOCK);
- mStats.saveBatteryUsageStatsOnReset(mBatteryUsageStatsProvider, mPowerStatsStore);
mDumpHelper = new BatteryStatsDumpHelperImpl(mBatteryUsageStatsProvider);
mCpuWakeupStats = new CpuWakeupStats(context, R.xml.irq_device_map, mHandler);
mConfigFile = new AtomicFile(new File(systemDir, "battery_usage_stats_config"));
@@ -504,6 +503,9 @@
}
public void systemServicesReady() {
+ mStats.saveBatteryUsageStatsOnReset(mBatteryUsageStatsProvider, mPowerStatsStore,
+ Flags.accumulateBatteryUsageStats());
+
MultiStatePowerAttributor attributor = (MultiStatePowerAttributor) mPowerAttributor;
mStats.setPowerStatsCollectorEnabled(BatteryConsumer.POWER_COMPONENT_CPU,
Flags.streamlinedBatteryStats());
@@ -1100,14 +1102,17 @@
DEVICE_CONFIG_NAMESPACE,
MIN_CONSUMED_POWER_THRESHOLD_KEY,
0);
- final BatteryUsageStatsQuery query =
- new BatteryUsageStatsQuery.Builder()
- .setMaxStatsAgeMs(0)
- .includeProcessStateData()
- .includeVirtualUids()
- .setMinConsumedPowerThreshold(minConsumedPowerThreshold)
- .build();
- bus = getBatteryUsageStats(List.of(query)).get(0);
+ BatteryUsageStatsQuery.Builder query = new BatteryUsageStatsQuery.Builder()
+ .setMaxStatsAgeMs(0)
+ .includeProcessStateData()
+ .includeVirtualUids()
+ .setMinConsumedPowerThreshold(minConsumedPowerThreshold);
+
+ if (Flags.accumulateBatteryUsageStats()) {
+ query.accumulated();
+ }
+
+ bus = getBatteryUsageStats(List.of(query.build())).get(0);
final int pullResult =
new StatsPerUidLogger(new FrameworkStatsLogger()).logStats(bus, data);
try {
@@ -3016,6 +3021,9 @@
if (Flags.streamlinedBatteryStats()) {
pw.println(" --sample: collect and dump a sample of stats for debugging purpose");
}
+ if (Flags.accumulateBatteryUsageStats()) {
+ pw.println(" --accumulated: continuously accumulated since setup or reset-all");
+ }
pw.println(" <package.name>: optional name of package to filter output by.");
pw.println(" -h: print this help text.");
pw.println("Battery stats (batterystats) commands:");
@@ -3083,7 +3091,7 @@
}
private void dumpUsageStats(FileDescriptor fd, PrintWriter pw, int model,
- boolean proto) {
+ boolean proto, boolean accumulated) {
awaitCompletion();
syncStats("dump", BatteryExternalStatsWorker.UPDATE_ALL);
@@ -3097,6 +3105,9 @@
if (model == BatteryConsumer.POWER_MODEL_POWER_PROFILE) {
builder.powerProfileModeledOnly();
}
+ if (accumulated) {
+ builder.accumulated();
+ }
BatteryUsageStatsQuery query = builder.build();
synchronized (mStats) {
mStats.prepareForDumpLocked();
@@ -3287,6 +3298,7 @@
} else if ("--usage".equals(arg)) {
int model = BatteryConsumer.POWER_MODEL_UNDEFINED;
boolean proto = false;
+ boolean accumulated = false;
for (int j = i + 1; j < args.length; j++) {
switch (args[j]) {
case "--proto":
@@ -3309,9 +3321,12 @@
}
break;
}
+ case "--accumulated":
+ accumulated = true;
+ break;
}
}
- dumpUsageStats(fd, pw, model, proto);
+ dumpUsageStats(fd, pw, model, proto, accumulated);
return;
} else if ("--wakeups".equals(arg)) {
mCpuWakeupStats.dump(new IndentingPrintWriter(pw, " "),
diff --git a/services/core/java/com/android/server/am/flags.aconfig b/services/core/java/com/android/server/am/flags.aconfig
index 3334393..9b51b6a 100644
--- a/services/core/java/com/android/server/am/flags.aconfig
+++ b/services/core/java/com/android/server/am/flags.aconfig
@@ -194,4 +194,15 @@
metadata {
purpose: PURPOSE_BUGFIX
}
+}
+
+flag {
+ name: "logcat_longer_timeout"
+ namespace: "backstage_power"
+ description: "Wait longer during the logcat gathering operation"
+ bug: "292533246"
+ is_fixed_read_only: true
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
}
\ No newline at end of file
diff --git a/services/core/java/com/android/server/audio/AudioDeviceBroker.java b/services/core/java/com/android/server/audio/AudioDeviceBroker.java
index 0fd22c5..87504154 100644
--- a/services/core/java/com/android/server/audio/AudioDeviceBroker.java
+++ b/services/core/java/com/android/server/audio/AudioDeviceBroker.java
@@ -1321,9 +1321,9 @@
sendLMsgNoDelay(MSG_II_SET_LE_AUDIO_OUT_VOLUME, SENDMSG_REPLACE, info);
}
- /*package*/ void postSetModeOwner(int mode, int pid, int uid) {
- sendLMsgNoDelay(MSG_I_SET_MODE_OWNER, SENDMSG_REPLACE,
- new AudioModeInfo(mode, pid, uid));
+ /*package*/ void postSetModeOwner(int mode, int pid, int uid, boolean signal) {
+ sendILMsgNoDelay(MSG_IL_SET_MODE_OWNER, SENDMSG_REPLACE,
+ signal ? 1 : 0, new AudioModeInfo(mode, pid, uid));
}
/*package*/ void postBluetoothDeviceConfigChange(@NonNull BtDeviceInfo info) {
@@ -1564,38 +1564,6 @@
sendLMsgNoDelay(MSG_L_COMMUNICATION_ROUTE_CLIENT_DIED, SENDMSG_QUEUE, client);
}
- /*package*/ void postSaveSetPreferredDevicesForStrategy(int strategy,
- List<AudioDeviceAttributes> devices)
- {
- sendILMsgNoDelay(MSG_IL_SAVE_PREF_DEVICES_FOR_STRATEGY, SENDMSG_QUEUE, strategy, devices);
- }
-
- /*package*/ void postSaveRemovePreferredDevicesForStrategy(int strategy) {
- sendIMsgNoDelay(MSG_I_SAVE_REMOVE_PREF_DEVICES_FOR_STRATEGY, SENDMSG_QUEUE, strategy);
- }
-
- /*package*/ void postSaveSetDeviceAsNonDefaultForStrategy(
- int strategy, AudioDeviceAttributes device) {
- sendILMsgNoDelay(MSG_IL_SAVE_NDEF_DEVICE_FOR_STRATEGY, SENDMSG_QUEUE, strategy, device);
- }
-
- /*package*/ void postSaveRemoveDeviceAsNonDefaultForStrategy(
- int strategy, AudioDeviceAttributes device) {
- sendILMsgNoDelay(
- MSG_IL_SAVE_REMOVE_NDEF_DEVICE_FOR_STRATEGY, SENDMSG_QUEUE, strategy, device);
- }
-
- /*package*/ void postSaveSetPreferredDevicesForCapturePreset(
- int capturePreset, List<AudioDeviceAttributes> devices) {
- sendILMsgNoDelay(
- MSG_IL_SAVE_PREF_DEVICES_FOR_CAPTURE_PRESET, SENDMSG_QUEUE, capturePreset, devices);
- }
-
- /*package*/ void postSaveClearPreferredDevicesForCapturePreset(int capturePreset) {
- sendIMsgNoDelay(
- MSG_I_SAVE_CLEAR_PREF_DEVICES_FOR_CAPTURE_PRESET, SENDMSG_QUEUE, capturePreset);
- }
-
/*package*/ void postUpdateCommunicationRouteClient(
int btScoRequesterUid, String eventSource) {
sendILMsgNoDelay(MSG_IL_UPDATE_COMMUNICATION_ROUTE_CLIENT, SENDMSG_QUEUE,
@@ -2025,7 +1993,7 @@
mBtHelper.setAvrcpAbsoluteVolumeIndex(msg.arg1);
}
break;
- case MSG_I_SET_MODE_OWNER:
+ case MSG_IL_SET_MODE_OWNER:
synchronized (mSetModeLock) {
synchronized (mDeviceStateLock) {
int btScoRequesterUid = bluetoothScoRequestOwnerUid();
@@ -2036,6 +2004,9 @@
}
}
}
+ if (msg.arg1 == 1 /*signal*/) {
+ mAudioService.decrementAudioModeResetCount();
+ }
break;
case MSG_L_SET_COMMUNICATION_DEVICE_FOR_CLIENT:
@@ -2109,40 +2080,9 @@
mDeviceInventory.setBluetoothActiveDevice(btInfo);
}
} break;
- case MSG_IL_SAVE_PREF_DEVICES_FOR_STRATEGY: {
- final int strategy = msg.arg1;
- final List<AudioDeviceAttributes> devices =
- (List<AudioDeviceAttributes>) msg.obj;
- mDeviceInventory.onSaveSetPreferredDevices(strategy, devices);
- } break;
- case MSG_I_SAVE_REMOVE_PREF_DEVICES_FOR_STRATEGY: {
- final int strategy = msg.arg1;
- mDeviceInventory.onSaveRemovePreferredDevices(strategy);
- } break;
- case MSG_IL_SAVE_NDEF_DEVICE_FOR_STRATEGY: {
- final int strategy = msg.arg1;
- final AudioDeviceAttributes device = (AudioDeviceAttributes) msg.obj;
- mDeviceInventory.onSaveSetDeviceAsNonDefault(strategy, device);
- } break;
- case MSG_IL_SAVE_REMOVE_NDEF_DEVICE_FOR_STRATEGY: {
- final int strategy = msg.arg1;
- final AudioDeviceAttributes device = (AudioDeviceAttributes) msg.obj;
- mDeviceInventory.onSaveRemoveDeviceAsNonDefault(strategy, device);
- } break;
case MSG_CHECK_MUTE_MUSIC:
checkMessagesMuteMusic(0);
break;
- case MSG_IL_SAVE_PREF_DEVICES_FOR_CAPTURE_PRESET: {
- final int capturePreset = msg.arg1;
- final List<AudioDeviceAttributes> devices =
- (List<AudioDeviceAttributes>) msg.obj;
- mDeviceInventory.onSaveSetPreferredDevicesForCapturePreset(
- capturePreset, devices);
- } break;
- case MSG_I_SAVE_CLEAR_PREF_DEVICES_FOR_CAPTURE_PRESET: {
- final int capturePreset = msg.arg1;
- mDeviceInventory.onSaveClearPreferredDevicesForCapturePreset(capturePreset);
- } break;
case MSG_L_NOTIFY_PREFERRED_AUDIOPROFILE_APPLIED: {
final BluetoothDevice btDevice = (BluetoothDevice) msg.obj;
BtHelper.onNotifyPreferredAudioProfileApplied(btDevice);
@@ -2224,7 +2164,7 @@
private static final int MSG_REPORT_NEW_ROUTES = 13;
private static final int MSG_II_SET_HEARING_AID_VOLUME = 14;
private static final int MSG_I_SET_AVRCP_ABSOLUTE_VOLUME = 15;
- private static final int MSG_I_SET_MODE_OWNER = 16;
+ private static final int MSG_IL_SET_MODE_OWNER = 16;
private static final int MSG_I_BT_SERVICE_DISCONNECTED_PROFILE = 22;
private static final int MSG_IL_BT_SERVICE_CONNECTED_PROFILE = 23;
@@ -2235,16 +2175,10 @@
// process external command to (dis)connect a hearing aid device
private static final int MSG_L_HEARING_AID_DEVICE_CONNECTION_CHANGE_EXT = 31;
- private static final int MSG_IL_SAVE_PREF_DEVICES_FOR_STRATEGY = 32;
- private static final int MSG_I_SAVE_REMOVE_PREF_DEVICES_FOR_STRATEGY = 33;
-
private static final int MSG_L_COMMUNICATION_ROUTE_CLIENT_DIED = 34;
private static final int MSG_CHECK_MUTE_MUSIC = 35;
private static final int MSG_REPORT_NEW_ROUTES_A2DP = 36;
- private static final int MSG_IL_SAVE_PREF_DEVICES_FOR_CAPTURE_PRESET = 37;
- private static final int MSG_I_SAVE_CLEAR_PREF_DEVICES_FOR_CAPTURE_PRESET = 38;
-
private static final int MSG_L_SET_COMMUNICATION_DEVICE_FOR_CLIENT = 42;
private static final int MSG_IL_UPDATE_COMMUNICATION_ROUTE_CLIENT = 43;
@@ -2253,8 +2187,6 @@
// process set volume for Le Audio, obj is BleVolumeInfo
private static final int MSG_II_SET_LE_AUDIO_OUT_VOLUME = 46;
- private static final int MSG_IL_SAVE_NDEF_DEVICE_FOR_STRATEGY = 47;
- private static final int MSG_IL_SAVE_REMOVE_NDEF_DEVICE_FOR_STRATEGY = 48;
private static final int MSG_IIL_BTLEAUDIO_TIMEOUT = 49;
private static final int MSG_L_NOTIFY_PREFERRED_AUDIOPROFILE_APPLIED = 52;
diff --git a/services/core/java/com/android/server/audio/AudioDeviceInventory.java b/services/core/java/com/android/server/audio/AudioDeviceInventory.java
index a9bff8b..5fd12c2 100644
--- a/services/core/java/com/android/server/audio/AudioDeviceInventory.java
+++ b/services/core/java/com/android/server/audio/AudioDeviceInventory.java
@@ -548,14 +548,17 @@
@GuardedBy("mDevicesLock")
private final ArrayMap<Integer, String> mApmConnectedDevices = new ArrayMap<>();
+ @GuardedBy("mDevicesLock")
// List of preferred devices for strategies
private final ArrayMap<Integer, List<AudioDeviceAttributes>> mPreferredDevices =
new ArrayMap<>();
+ @GuardedBy("mDevicesLock")
// List of non-default devices for strategies
private final ArrayMap<Integer, List<AudioDeviceAttributes>> mNonDefaultDevices =
new ArrayMap<>();
+ @GuardedBy("mDevicesLock")
// List of preferred devices of capture preset
private final ArrayMap<Integer, List<AudioDeviceAttributes>> mPreferredDevicesForCapturePreset =
new ArrayMap<>();
@@ -808,24 +811,18 @@
synchronized (mDevicesLock) {
mAppliedStrategyRoles.clear();
mAppliedPresetRoles.clear();
- }
- synchronized (mPreferredDevices) {
mPreferredDevices.forEach((strategy, devices) -> {
setPreferredDevicesForStrategy(strategy, devices);
});
- }
- synchronized (mNonDefaultDevices) {
mNonDefaultDevices.forEach((strategy, devices) -> {
addDevicesRoleForStrategy(strategy, AudioSystem.DEVICE_ROLE_DISABLED,
devices, false /* internal */);
});
- }
- synchronized (mPreferredDevicesForCapturePreset) {
mPreferredDevicesForCapturePreset.forEach((capturePreset, devices) -> {
setDevicesRoleForCapturePreset(
capturePreset, AudioSystem.DEVICE_ROLE_PREFERRED, devices);
});
- }
+ }
}
/** only public for mocking/spying, do not call outside of AudioService */
@@ -1225,7 +1222,8 @@
mmi.record();
}
- /*package*/ void onSaveSetPreferredDevices(int strategy,
+ @GuardedBy("mDevicesLock")
+ private void saveSetPreferredDevices(int strategy,
@NonNull List<AudioDeviceAttributes> devices) {
mPreferredDevices.put(strategy, devices);
List<AudioDeviceAttributes> nonDefaultDevices = mNonDefaultDevices.get(strategy);
@@ -1243,12 +1241,14 @@
dispatchPreferredDevice(strategy, devices);
}
- /*package*/ void onSaveRemovePreferredDevices(int strategy) {
+ @GuardedBy("mDevicesLock")
+ private void saveRemovePreferredDevices(int strategy) {
mPreferredDevices.remove(strategy);
dispatchPreferredDevice(strategy, new ArrayList<AudioDeviceAttributes>());
}
- /*package*/ void onSaveSetDeviceAsNonDefault(int strategy,
+ @GuardedBy("mDevicesLock")
+ private void saveSetDeviceAsNonDefault(int strategy,
@NonNull AudioDeviceAttributes device) {
List<AudioDeviceAttributes> nonDefaultDevices = mNonDefaultDevices.get(strategy);
if (nonDefaultDevices == null) {
@@ -1272,7 +1272,8 @@
}
}
- /*package*/ void onSaveRemoveDeviceAsNonDefault(int strategy,
+ @GuardedBy("mDevicesLock")
+ private void saveRemoveDeviceAsNonDefault(int strategy,
@NonNull AudioDeviceAttributes device) {
List<AudioDeviceAttributes> nonDefaultDevices = mNonDefaultDevices.get(strategy);
if (nonDefaultDevices != null) {
@@ -1282,14 +1283,16 @@
}
}
- /*package*/ void onSaveSetPreferredDevicesForCapturePreset(
+ @GuardedBy("mDevicesLock")
+ private void saveSetPreferredDevicesForCapturePreset(
int capturePreset, @NonNull List<AudioDeviceAttributes> devices) {
mPreferredDevicesForCapturePreset.put(capturePreset, devices);
dispatchDevicesRoleForCapturePreset(
capturePreset, AudioSystem.DEVICE_ROLE_PREFERRED, devices);
}
- /*package*/ void onSaveClearPreferredDevicesForCapturePreset(int capturePreset) {
+ @GuardedBy("mDevicesLock")
+ private void saveClearPreferredDevicesForCapturePreset(int capturePreset) {
mPreferredDevicesForCapturePreset.remove(capturePreset);
dispatchDevicesRoleForCapturePreset(
capturePreset, AudioSystem.DEVICE_ROLE_PREFERRED,
@@ -1301,21 +1304,22 @@
/*package*/ int setPreferredDevicesForStrategyAndSave(int strategy,
@NonNull List<AudioDeviceAttributes> devices) {
- final int status = setPreferredDevicesForStrategy(strategy, devices);
- if (status == AudioSystem.SUCCESS) {
- mDeviceBroker.postSaveSetPreferredDevicesForStrategy(strategy, devices);
+ synchronized(mDevicesLock){
+ try (SafeCloseable ignored = ClearCallingIdentityContext.create()) {
+ final int status = setPreferredDevicesForStrategy(strategy, devices);
+ if (status == AudioSystem.SUCCESS) {
+ saveSetPreferredDevices(strategy, devices);
+ }
+ return status;
+ }
}
- return status;
}
// Only used for external requests coming from an API
/*package*/ int setPreferredDevicesForStrategy(int strategy,
@NonNull List<AudioDeviceAttributes> devices) {
- int status = AudioSystem.ERROR;
- try (SafeCloseable ignored = ClearCallingIdentityContext.create()) {
- status = setDevicesRoleForStrategy(
- strategy, AudioSystem.DEVICE_ROLE_PREFERRED, devices, false /* internal */);
- }
- return status;
+
+ return setDevicesRoleForStrategy(
+ strategy, AudioSystem.DEVICE_ROLE_PREFERRED, devices, false /* internal */);
}
// Only used for internal requests
/*package*/ int setPreferredDevicesForStrategyInt(int strategy,
@@ -1326,21 +1330,21 @@
}
/*package*/ int removePreferredDevicesForStrategyAndSave(int strategy) {
- final int status = removePreferredDevicesForStrategy(strategy);
- if (status == AudioSystem.SUCCESS) {
- mDeviceBroker.postSaveRemovePreferredDevicesForStrategy(strategy);
+ synchronized(mDevicesLock){
+ try (SafeCloseable ignored = ClearCallingIdentityContext.create()) {
+ final int status = removePreferredDevicesForStrategy(strategy);
+ if (status == AudioSystem.SUCCESS) {
+ saveRemovePreferredDevices(strategy);
+ }
+ return status;
+ }
}
- return status;
}
// Only used for external requests coming from an API
/*package*/ int removePreferredDevicesForStrategy(int strategy) {
- int status = AudioSystem.ERROR;
- try (SafeCloseable ignored = ClearCallingIdentityContext.create()) {
- status = clearDevicesRoleForStrategy(
+ return clearDevicesRoleForStrategy(
strategy, AudioSystem.DEVICE_ROLE_PREFERRED, false /*internal */);
- }
- return status;
}
// Only used for internal requests
/*package*/ int removePreferredDevicesForStrategyInt(int strategy) {
@@ -1351,16 +1355,17 @@
/*package*/ int setDeviceAsNonDefaultForStrategyAndSave(int strategy,
@NonNull AudioDeviceAttributes device) {
int status = AudioSystem.ERROR;
-
- try (SafeCloseable ignored = ClearCallingIdentityContext.create()) {
- List<AudioDeviceAttributes> devices = new ArrayList<>();
- devices.add(device);
- status = addDevicesRoleForStrategy(
+ synchronized(mDevicesLock){
+ try (SafeCloseable ignored = ClearCallingIdentityContext.create()) {
+ List<AudioDeviceAttributes> devices = new ArrayList<>();
+ devices.add(device);
+ status = addDevicesRoleForStrategy(
strategy, AudioSystem.DEVICE_ROLE_DISABLED, devices, false /* internal */);
- }
- if (status == AudioSystem.SUCCESS) {
- mDeviceBroker.postSaveSetDeviceAsNonDefaultForStrategy(strategy, device);
+ if (status == AudioSystem.SUCCESS) {
+ saveSetDeviceAsNonDefault(strategy, device);
+ }
+ }
}
return status;
}
@@ -1368,16 +1373,17 @@
/*package*/ int removeDeviceAsNonDefaultForStrategyAndSave(int strategy,
@NonNull AudioDeviceAttributes device) {
int status = AudioSystem.ERROR;
-
- try (SafeCloseable ignored = ClearCallingIdentityContext.create()) {
- List<AudioDeviceAttributes> devices = new ArrayList<>();
- devices.add(device);
- status = removeDevicesRoleForStrategy(
+ synchronized(mDevicesLock){
+ try (SafeCloseable ignored = ClearCallingIdentityContext.create()) {
+ List<AudioDeviceAttributes> devices = new ArrayList<>();
+ devices.add(device);
+ status = removeDevicesRoleForStrategy(
strategy, AudioSystem.DEVICE_ROLE_DISABLED, devices, false /* internal */);
- }
- if (status == AudioSystem.SUCCESS) {
- mDeviceBroker.postSaveRemoveDeviceAsNonDefaultForStrategy(strategy, device);
+ if (status == AudioSystem.SUCCESS) {
+ saveRemoveDeviceAsNonDefault(strategy, device);
+ }
+ }
}
return status;
}
@@ -1405,41 +1411,40 @@
/*package*/ int setPreferredDevicesForCapturePresetAndSave(
int capturePreset, @NonNull List<AudioDeviceAttributes> devices) {
- final int status = setPreferredDevicesForCapturePreset(capturePreset, devices);
- if (status == AudioSystem.SUCCESS) {
- mDeviceBroker.postSaveSetPreferredDevicesForCapturePreset(capturePreset, devices);
+ synchronized(mDevicesLock){
+ try (SafeCloseable ignored = ClearCallingIdentityContext.create()) {
+ final int status = setPreferredDevicesForCapturePreset(capturePreset, devices);
+ if (status == AudioSystem.SUCCESS) {
+ saveSetPreferredDevicesForCapturePreset(capturePreset, devices);
+ }
+ return status;
+ }
}
- return status;
}
// Only used for external requests coming from an API
private int setPreferredDevicesForCapturePreset(
int capturePreset, @NonNull List<AudioDeviceAttributes> devices) {
- int status = AudioSystem.ERROR;
- try (SafeCloseable ignored = ClearCallingIdentityContext.create()) {
- status = setDevicesRoleForCapturePreset(
+ return setDevicesRoleForCapturePreset(
capturePreset, AudioSystem.DEVICE_ROLE_PREFERRED, devices);
- }
- return status;
}
/*package*/ int clearPreferredDevicesForCapturePresetAndSave(int capturePreset) {
- final int status = clearPreferredDevicesForCapturePreset(capturePreset);
- if (status == AudioSystem.SUCCESS) {
- mDeviceBroker.postSaveClearPreferredDevicesForCapturePreset(capturePreset);
+ synchronized(mDevicesLock){
+ try (SafeCloseable ignored = ClearCallingIdentityContext.create()) {
+ final int status = clearPreferredDevicesForCapturePreset(capturePreset);
+ if (status == AudioSystem.SUCCESS) {
+ saveClearPreferredDevicesForCapturePreset(capturePreset);
+ }
+ return status;
+ }
}
- return status;
}
// Only used for external requests coming from an API
private int clearPreferredDevicesForCapturePreset(int capturePreset) {
- int status = AudioSystem.ERROR;
-
- try (SafeCloseable ignored = ClearCallingIdentityContext.create()) {
- status = clearDevicesRoleForCapturePreset(
+ return clearDevicesRoleForCapturePreset(
capturePreset, AudioSystem.DEVICE_ROLE_PREFERRED);
- }
- return status;
}
// Only used for internal requests
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index e83b036..561030e 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -1915,7 +1915,7 @@
// Restore call state
synchronized (mDeviceBroker.mSetModeLock) {
onUpdateAudioMode(AudioSystem.MODE_CURRENT, android.os.Process.myPid(),
- mContext.getPackageName(), true /*force*/);
+ mContext.getPackageName(), true /*force*/, false /*signal*/);
}
final int forSys;
synchronized (mSettingsLock) {
@@ -4743,17 +4743,50 @@
}
}
if (updateAudioMode) {
- sendMsg(mAudioHandler,
- MSG_UPDATE_AUDIO_MODE,
- existingMsgPolicy,
- AudioSystem.MODE_CURRENT,
- android.os.Process.myPid(),
- mContext.getPackageName(),
- delay);
+ postUpdateAudioMode(existingMsgPolicy, AudioSystem.MODE_CURRENT,
+ android.os.Process.myPid(), mContext.getPackageName(),
+ false /*signal*/, delay);
}
}
}
+ static class UpdateAudioModeInfo {
+ UpdateAudioModeInfo(int mode, int pid, String packageName, boolean signal) {
+ mMode = mode;
+ mPid = pid;
+ mPackageName = packageName;
+ mSignal = signal;
+ }
+ private final int mMode;
+ private final int mPid;
+ private final String mPackageName;
+ private final boolean mSignal;
+
+ int getMode() {
+ return mMode;
+ }
+ int getPid() {
+ return mPid;
+ }
+ String getPackageName() {
+ return mPackageName;
+ }
+ boolean getSignal() {
+ return mSignal;
+ }
+ }
+
+ void postUpdateAudioMode(int msgPolicy, int mode, int pid, String packageName,
+ boolean signal, int delay) {
+ synchronized (mAudioModeResetLock) {
+ if (signal) {
+ mAudioModeResetCount++;
+ }
+ sendMsg(mAudioHandler, MSG_UPDATE_AUDIO_MODE, msgPolicy, 0, 0,
+ new UpdateAudioModeInfo(mode, pid, packageName, signal), delay);
+ }
+ }
+
private final IRecordingConfigDispatcher mVoiceRecordingActivityMonitor =
new IRecordingConfigDispatcher.Stub() {
@Override
@@ -6152,13 +6185,9 @@
} else {
SetModeDeathHandler h = mSetModeDeathHandlers.get(index);
mSetModeDeathHandlers.remove(index);
- sendMsg(mAudioHandler,
- MSG_UPDATE_AUDIO_MODE,
- SENDMSG_QUEUE,
- AudioSystem.MODE_CURRENT,
- android.os.Process.myPid(),
- mContext.getPackageName(),
- 0);
+ postUpdateAudioMode(SENDMSG_QUEUE, AudioSystem.MODE_CURRENT,
+ android.os.Process.myPid(), mContext.getPackageName(),
+ false /*signal*/, 0);
}
}
}
@@ -6404,19 +6433,14 @@
}
}
- sendMsg(mAudioHandler,
- MSG_UPDATE_AUDIO_MODE,
- SENDMSG_REPLACE,
- mode,
- pid,
- callingPackage,
- 0);
+ postUpdateAudioMode(SENDMSG_REPLACE, mode, pid, callingPackage,
+ hasModifyPhoneStatePermission && mode == AudioSystem.MODE_NORMAL, 0);
}
}
@GuardedBy("mDeviceBroker.mSetModeLock")
void onUpdateAudioMode(int requestedMode, int requesterPid, String requesterPackage,
- boolean force) {
+ boolean force, boolean signal) {
if (requestedMode == AudioSystem.MODE_CURRENT) {
requestedMode = getMode();
}
@@ -6431,7 +6455,7 @@
}
if (DEBUG_MODE) {
Log.v(TAG, "onUpdateAudioMode() new mode: " + mode + ", current mode: "
- + mMode.get() + " requested mode: " + requestedMode);
+ + mMode.get() + " requested mode: " + requestedMode + " signal: " + signal);
}
if (mode != mMode.get() || force) {
int status = AudioSystem.SUCCESS;
@@ -6477,7 +6501,7 @@
// when entering RINGTONE, IN_CALL or IN_COMMUNICATION mode, clear all SCO
// connections not started by the application changing the mode when pid changes
- mDeviceBroker.postSetModeOwner(mode, pid, uid);
+ mDeviceBroker.postSetModeOwner(mode, pid, uid, signal);
} else {
Log.w(TAG, "onUpdateAudioMode: failed to set audio mode to: " + mode);
}
@@ -10162,7 +10186,7 @@
h.setRecordingActive(isRecordingActiveForUid(h.getUid()));
if (wasActive != h.isActive()) {
onUpdateAudioMode(AudioSystem.MODE_CURRENT, android.os.Process.myPid(),
- mContext.getPackageName(), false /*force*/);
+ mContext.getPackageName(), false /*force*/, false /*signal*/);
}
}
break;
@@ -10192,7 +10216,9 @@
case MSG_UPDATE_AUDIO_MODE:
synchronized (mDeviceBroker.mSetModeLock) {
- onUpdateAudioMode(msg.arg1, msg.arg2, (String) msg.obj, false /*force*/);
+ UpdateAudioModeInfo info = (UpdateAudioModeInfo) msg.obj;
+ onUpdateAudioMode(info.getMode(), info.getPid(), info.getPackageName(),
+ false /*force*/, info.getSignal());
}
break;
@@ -10895,9 +10921,59 @@
return AudioManager.AUDIOFOCUS_REQUEST_FAILED;
}
mmi.record();
+ //delay abandon focus requests from Telecom if an audio mode reset from Telecom
+ // is still being processed
+ final boolean abandonFromTelecom = (mContext.checkCallingOrSelfPermission(
+ MODIFY_PHONE_STATE) == PackageManager.PERMISSION_GRANTED)
+ && ((aa != null && aa.getUsage() == AudioAttributes.USAGE_VOICE_COMMUNICATION)
+ || AudioSystem.IN_VOICE_COMM_FOCUS_ID.equals(clientId));
+ if (abandonFromTelecom) {
+ synchronized (mAudioModeResetLock) {
+ final long start = java.lang.System.currentTimeMillis();
+ long elapsed = 0;
+ while (mAudioModeResetCount > 0) {
+ if (DEBUG_MODE) {
+ Log.i(TAG, "Abandon focus from Telecom, waiting for mode change");
+ }
+ try {
+ mAudioModeResetLock.wait(
+ AUDIO_MODE_RESET_TIMEOUT_MS - elapsed);
+ } catch (InterruptedException e) {
+ Log.w(TAG, "Interrupted while waiting for audio mode reset");
+ }
+ elapsed = java.lang.System.currentTimeMillis() - start;
+ if (elapsed >= AUDIO_MODE_RESET_TIMEOUT_MS) {
+ Log.e(TAG, "Timeout waiting for audio mode reset");
+ break;
+ }
+ }
+ if (DEBUG_MODE && elapsed != 0) {
+ Log.i(TAG, "Abandon focus from Telecom done waiting");
+ }
+ }
+ }
return mMediaFocusControl.abandonAudioFocus(fd, clientId, aa, callingPackageName);
}
+ /** synchronization between setMode(NORMAL) and abandonAudioFocus() frmo Telecom */
+ private static final long AUDIO_MODE_RESET_TIMEOUT_MS = 3000;
+
+ private final Object mAudioModeResetLock = new Object();
+
+ @GuardedBy("mAudioModeResetLock")
+ private int mAudioModeResetCount = 0;
+
+ void decrementAudioModeResetCount() {
+ synchronized (mAudioModeResetLock) {
+ if (mAudioModeResetCount > 0) {
+ mAudioModeResetCount--;
+ } else {
+ Log.w(TAG, "mAudioModeResetCount already 0");
+ }
+ mAudioModeResetLock.notify();
+ }
+ }
+
/** see {@link AudioManager#abandonAudioFocusForTest(AudioFocusRequest, String)} */
public int abandonAudioFocusForTest(IAudioFocusDispatcher fd, String clientId,
AudioAttributes aa, String callingPackageName) {
diff --git a/services/core/java/com/android/server/audio/BtHelper.java b/services/core/java/com/android/server/audio/BtHelper.java
index ce92dfb..b421264 100644
--- a/services/core/java/com/android/server/audio/BtHelper.java
+++ b/services/core/java/com/android/server/audio/BtHelper.java
@@ -605,7 +605,11 @@
break;
case BluetoothProfile.LE_AUDIO:
if (mLeAudio != null && mLeAudioCallback != null) {
- mLeAudio.unregisterCallback(mLeAudioCallback);
+ try {
+ mLeAudio.unregisterCallback(mLeAudioCallback);
+ } catch (Exception e) {
+ Log.e(TAG, "Exception while unregistering callback for LE audio", e);
+ }
}
mLeAudio = null;
mLeAudioCallback = null;
@@ -682,12 +686,21 @@
return;
}
if (mLeAudio != null && mLeAudioCallback != null) {
- mLeAudio.unregisterCallback(mLeAudioCallback);
+ try {
+ mLeAudio.unregisterCallback(mLeAudioCallback);
+ } catch (Exception e) {
+ Log.e(TAG, "Exception while unregistering callback for LE audio", e);
+ }
}
mLeAudio = (BluetoothLeAudio) proxy;
mLeAudioCallback = new MyLeAudioCallback();
- mLeAudio.registerCallback(
- mContext.getMainExecutor(), mLeAudioCallback);
+ try{
+ mLeAudio.registerCallback(
+ mContext.getMainExecutor(), mLeAudioCallback);
+ } catch (Exception e) {
+ mLeAudioCallback = null;
+ Log.e(TAG, "Exception while registering callback for LE audio", e);
+ }
break;
case BluetoothProfile.A2DP_SINK:
case BluetoothProfile.LE_AUDIO_BROADCAST:
diff --git a/services/core/java/com/android/server/display/AutomaticBrightnessController.java b/services/core/java/com/android/server/display/AutomaticBrightnessController.java
index 86015ac..7740411 100644
--- a/services/core/java/com/android/server/display/AutomaticBrightnessController.java
+++ b/services/core/java/com/android/server/display/AutomaticBrightnessController.java
@@ -1279,8 +1279,9 @@
private boolean shouldApplyDozeScaleFactor() {
// We don't apply the doze scale factor if we have a designated brightness curve for doze.
return (mDisplayManagerFlags.isNormalBrightnessForDozeParameterEnabled()
- ? !mUseNormalBrightnessForDoze && mDisplayPolicy == POLICY_DOZE
- : Display.isDozeState(mDisplayState)) && getMode() != AUTO_BRIGHTNESS_MODE_DOZE;
+ ? (!mUseNormalBrightnessForDoze && mDisplayPolicy == POLICY_DOZE)
+ || Display.isDozeState(mDisplayState) : Display.isDozeState(mDisplayState))
+ && getMode() != AUTO_BRIGHTNESS_MODE_DOZE;
}
private class ShortTermModel {
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
index 04573f4..711bc79 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -1357,6 +1357,13 @@
mDisplayStateController.shouldPerformScreenOffTransition());
state = mPowerState.getScreenState();
+ // Use doze brightness if one of following is true:
+ // 1. The target `state` isDozeState.
+ // 2. Doze power request(POLICY_DOZE) if there's no exception(useNormalBrightnessForDoze).
+ final boolean useDozeBrightness = mFlags.isNormalBrightnessForDozeParameterEnabled()
+ ? (!mPowerRequest.useNormalBrightnessForDoze && mPowerRequest.policy == POLICY_DOZE)
+ || Display.isDozeState(state) : Display.isDozeState(state);
+
DisplayBrightnessState displayBrightnessState = mDisplayBrightnessController
.updateBrightness(mPowerRequest, state, mDisplayOffloadSession);
float brightnessState = displayBrightnessState.getBrightness();
@@ -1399,7 +1406,7 @@
&& !mAutomaticBrightnessController.isInIdleMode()) {
// Set sendUpdate to false, we're already in updatePowerState() so there's no need
// to trigger it again
- mAutomaticBrightnessController.switchMode(Display.isDozeState(state)
+ mAutomaticBrightnessController.switchMode(useDozeBrightness
? AUTO_BRIGHTNESS_MODE_DOZE : AUTO_BRIGHTNESS_MODE_DEFAULT,
/* sendUpdate= */ false);
}
@@ -1472,9 +1479,7 @@
brightnessState = clampScreenBrightness(brightnessState);
}
- if (mFlags.isNormalBrightnessForDozeParameterEnabled()
- ? !mPowerRequest.useNormalBrightnessForDoze && mPowerRequest.policy == POLICY_DOZE
- : Display.isDozeState(state)) {
+ if (useDozeBrightness) {
// TODO(b/329676661): Introduce a config property to choose between this brightness
// strategy and DOZE_DEFAULT
// On some devices, when auto-brightness is disabled and the device is dozing, we use
diff --git a/services/core/java/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy.java b/services/core/java/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy.java
index bf01f2d..2fdec78 100644
--- a/services/core/java/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy.java
+++ b/services/core/java/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy.java
@@ -510,10 +510,10 @@
&& mAutomaticBrightnessController != null
&& !mAutomaticBrightnessController.isInIdleMode()) {
- boolean shouldUseDozeMode =
+ final boolean shouldUseDozeMode =
mDisplayManagerFlags.isNormalBrightnessForDozeParameterEnabled()
- ? !useNormalBrightnessForDoze && policy == POLICY_DOZE
- : Display.isDozeState(state);
+ ? (!useNormalBrightnessForDoze && policy == POLICY_DOZE)
+ || Display.isDozeState(state) : Display.isDozeState(state);
mAutomaticBrightnessController.switchMode(shouldUseDozeMode
? AUTO_BRIGHTNESS_MODE_DOZE : AUTO_BRIGHTNESS_MODE_DEFAULT, sendUpdate);
}
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index b15fcc9..bcc2019 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -4116,20 +4116,31 @@
}
@Override
- @FlaggedApi(android.app.Flags.FLAG_UI_RICH_ONGOING)
- public boolean canBePromoted(String pkg, int uid) {
+ @FlaggedApi(android.app.Flags.FLAG_API_RICH_ONGOING)
+ public boolean appCanBePromoted(String pkg, int uid) {
checkCallerIsSystemOrSystemUiOrShell();
- if (!android.app.Flags.uiRichOngoing()) {
+ if (!android.app.Flags.apiRichOngoing()) {
return false;
}
return mPreferencesHelper.canBePromoted(pkg, uid);
}
@Override
- @FlaggedApi(android.app.Flags.FLAG_UI_RICH_ONGOING)
+ @FlaggedApi(android.app.Flags.FLAG_API_RICH_ONGOING)
+ public boolean canBePromoted(String callingPkg) {
+ checkCallerIsSameApp(callingPkg);
+ if (!android.app.Flags.apiRichOngoing()) {
+ return false;
+ }
+ return mPreferencesHelper.canBePromoted(callingPkg, Binder.getCallingUid());
+ }
+
+
+ @Override
+ @FlaggedApi(android.app.Flags.FLAG_API_RICH_ONGOING)
public void setCanBePromoted(String pkg, int uid, boolean promote) {
checkCallerIsSystemOrSystemUiOrShell();
- if (!android.app.Flags.uiRichOngoing()) {
+ if (!android.app.Flags.apiRichOngoing()) {
return;
}
boolean changed = mPreferencesHelper.setCanBePromoted(pkg, uid, promote);
@@ -6866,6 +6877,9 @@
if (notificationForceGrouping()) {
if (r.getSbn().isAppGroup()) {
mListeners.notifyPostedLocked(r, r);
+
+ mNotificationRecordLogger.log(
+ NotificationRecordLogger.NotificationEvent.NOTIFICATION_FORCE_GROUP, r);
}
}
}
@@ -7046,6 +7060,10 @@
// Clear summary flag
StatusBarNotification sbn = r.getSbn();
sbn.getNotification().flags = (r.mOriginalFlags & ~FLAG_GROUP_SUMMARY);
+
+ EventLogTags.writeNotificationSummaryConverted(key);
+ mNotificationRecordLogger.log(
+ NotificationRecordLogger.NotificationEvent.NOTIFICATION_FORCE_GROUP_SUMMARY, r);
return true;
}
return false;
@@ -7769,7 +7787,7 @@
return false;
}
- if (android.app.Flags.uiRichOngoing()) {
+ if (android.app.Flags.apiRichOngoing()) {
// This would normally be done in fixNotification(), but we need the channel info so
// it's done a little late
if (mPreferencesHelper.canBePromoted(pkg, notificationUid)
@@ -10733,7 +10751,7 @@
}
@GuardedBy("mNotificationLock")
- @FlaggedApi(android.app.Flags.FLAG_UI_RICH_ONGOING)
+ @FlaggedApi(android.app.Flags.FLAG_API_RICH_ONGOING)
private @NonNull List<NotificationRecord> findAppNotificationByListLocked(
ArrayList<NotificationRecord> list, String pkg, int userId) {
List<NotificationRecord> records = new ArrayList<>();
diff --git a/services/core/java/com/android/server/notification/NotificationRecordLogger.java b/services/core/java/com/android/server/notification/NotificationRecordLogger.java
index 65ef53f..3943aa5 100644
--- a/services/core/java/com/android/server/notification/NotificationRecordLogger.java
+++ b/services/core/java/com/android/server/notification/NotificationRecordLogger.java
@@ -313,7 +313,11 @@
@UiEvent(doc = "Notification assistant generated notification action at 1 was clicked.")
NOTIFICATION_ASSIST_ACTION_CLICKED_1(457),
@UiEvent(doc = "Notification assistant generated notification action at 2 was clicked.")
- NOTIFICATION_ASSIST_ACTION_CLICKED_2(458);
+ NOTIFICATION_ASSIST_ACTION_CLICKED_2(458),
+ @UiEvent(doc = "Notification was force autogrouped.")
+ NOTIFICATION_FORCE_GROUP(1843),
+ @UiEvent(doc = "Notification summary was force autogrouped.")
+ NOTIFICATION_FORCE_GROUP_SUMMARY(1844);
private final int mId;
NotificationEvent(int id) {
diff --git a/services/core/java/com/android/server/notification/PreferencesHelper.java b/services/core/java/com/android/server/notification/PreferencesHelper.java
index fcc8d2f..fdb9f67 100644
--- a/services/core/java/com/android/server/notification/PreferencesHelper.java
+++ b/services/core/java/com/android/server/notification/PreferencesHelper.java
@@ -850,14 +850,14 @@
}
}
- @FlaggedApi(android.app.Flags.FLAG_UI_RICH_ONGOING)
+ @FlaggedApi(android.app.Flags.FLAG_API_RICH_ONGOING)
public boolean canBePromoted(String packageName, int uid) {
synchronized (mLock) {
return getOrCreatePackagePreferencesLocked(packageName, uid).canHavePromotedNotifs;
}
}
- @FlaggedApi(android.app.Flags.FLAG_UI_RICH_ONGOING)
+ @FlaggedApi(android.app.Flags.FLAG_API_RICH_ONGOING)
public boolean setCanBePromoted(String packageName, int uid, boolean promote) {
boolean changed = false;
synchronized (mLock) {
@@ -3065,7 +3065,7 @@
boolean migrateToPm = false;
long creationTime;
- @FlaggedApi(android.app.Flags.FLAG_UI_RICH_ONGOING)
+ @FlaggedApi(android.app.Flags.FLAG_API_RICH_ONGOING)
boolean canHavePromotedNotifs = false;
@UserIdInt int userId;
diff --git a/services/core/java/com/android/server/ondeviceintelligence/OnDeviceIntelligenceManagerService.java b/services/core/java/com/android/server/ondeviceintelligence/OnDeviceIntelligenceManagerService.java
index f6d9dc2..03a34f2 100644
--- a/services/core/java/com/android/server/ondeviceintelligence/OnDeviceIntelligenceManagerService.java
+++ b/services/core/java/com/android/server/ondeviceintelligence/OnDeviceIntelligenceManagerService.java
@@ -87,6 +87,7 @@
import com.android.internal.os.BackgroundThread;
import com.android.server.LocalServices;
import com.android.server.SystemService;
+import com.android.server.SystemService.TargetUser;
import com.android.server.ondeviceintelligence.callbacks.ListenableDownloadCallback;
import java.io.FileDescriptor;
@@ -194,9 +195,13 @@
mIsServiceEnabled = isServiceEnabled();
}
+ }
- //connect to remote services(if available) during boot phase.
- if (phase == SystemService.PHASE_THIRD_PARTY_APPS_CAN_START) {
+ @Override
+ public void onUserUnlocked(@NonNull TargetUser user) {
+ Slog.d(TAG, "onUserUnlocked: " + user.getUserHandle());
+ //connect to remote services(if available) during boot.
+ if(user.getUserHandle().equals(UserHandle.SYSTEM)) {
try {
ensureRemoteInferenceServiceInitialized();
ensureRemoteIntelligenceServiceInitialized();
diff --git a/services/core/java/com/android/server/pm/ComputerEngine.java b/services/core/java/com/android/server/pm/ComputerEngine.java
index 4665a72..89ced12 100644
--- a/services/core/java/com/android/server/pm/ComputerEngine.java
+++ b/services/core/java/com/android/server/pm/ComputerEngine.java
@@ -2208,10 +2208,10 @@
return true;
}
boolean permissionGranted = requireFullPermission ? hasPermission(
- Manifest.permission.INTERACT_ACROSS_USERS_FULL)
+ Manifest.permission.INTERACT_ACROSS_USERS_FULL, callingUid)
: (hasPermission(
- android.Manifest.permission.INTERACT_ACROSS_USERS_FULL)
- || hasPermission(Manifest.permission.INTERACT_ACROSS_USERS));
+ android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, callingUid)
+ || hasPermission(Manifest.permission.INTERACT_ACROSS_USERS, callingUid));
if (!permissionGranted) {
if (Process.isIsolatedUid(callingUid) && isKnownIsolatedComputeApp(callingUid)) {
return checkIsolatedOwnerHasPermission(callingUid, requireFullPermission);
diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java
index f449126..aca65bf 100644
--- a/services/core/java/com/android/server/pm/InstallPackageHelper.java
+++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java
@@ -1019,7 +1019,9 @@
&& scanInstallPackages(requests, createdAppId, versionInfos)) {
List<ReconciledPackage> reconciledPackages =
reconcileInstallPackages(requests, versionInfos);
- if (reconciledPackages != null && commitInstallPackages(reconciledPackages)) {
+ if (reconciledPackages != null
+ && renameAndUpdatePaths(requests)
+ && commitInstallPackages(reconciledPackages)) {
success = true;
}
}
@@ -1029,24 +1031,49 @@
}
}
- private boolean prepareInstallPackages(List<InstallRequest> requests) {
- // TODO: will remove the locking after doRename is moved out of prepare
+ private boolean renameAndUpdatePaths(List<InstallRequest> requests) {
try (PackageManagerTracedLock installLock = mPm.mInstallLock.acquireLock()) {
for (InstallRequest request : requests) {
- try {
- Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "preparePackage");
- request.onPrepareStarted();
- preparePackageLI(request);
- } catch (PrepareFailure prepareFailure) {
- request.setError(prepareFailure.error,
- prepareFailure.getMessage());
- request.setOriginPackage(prepareFailure.mConflictingPackage);
- request.setOriginPermission(prepareFailure.mConflictingPermission);
- return false;
- } finally {
- request.onPrepareFinished();
- Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
+ ParsedPackage parsedPackage = request.getParsedPackage();
+ final boolean isApex = (request.getScanFlags() & SCAN_AS_APEX) != 0;
+ if (isApex) {
+ continue;
}
+ try {
+ doRenameLI(request, parsedPackage);
+ setUpFsVerity(parsedPackage);
+ } catch (Installer.InstallerException | IOException | DigestException
+ | NoSuchAlgorithmException | PrepareFailure e) {
+ request.setError(PackageManagerException.INTERNAL_ERROR_VERITY_SETUP,
+ "Failed to set up verity: " + e);
+ return false;
+ }
+
+ // update paths that are set before renaming
+ PackageSetting scannedPackageSetting = request.getScannedPackageSetting();
+ scannedPackageSetting.setPath(new File(parsedPackage.getPath()));
+ scannedPackageSetting.setLegacyNativeLibraryPath(
+ parsedPackage.getNativeLibraryRootDir());
+ }
+ return true;
+ }
+ }
+
+ private boolean prepareInstallPackages(List<InstallRequest> requests) {
+ for (InstallRequest request : requests) {
+ try {
+ Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "preparePackage");
+ request.onPrepareStarted();
+ preparePackage(request);
+ } catch (PrepareFailure prepareFailure) {
+ request.setError(prepareFailure.error,
+ prepareFailure.getMessage());
+ request.setOriginPackage(prepareFailure.mConflictingPackage);
+ request.setOriginPermission(prepareFailure.mConflictingPermission);
+ return false;
+ } finally {
+ request.onPrepareFinished();
+ Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
}
}
return true;
@@ -1231,8 +1258,7 @@
return newProp != null && newProp.getBoolean();
}
- @GuardedBy("mPm.mInstallLock")
- private void preparePackageLI(InstallRequest request) throws PrepareFailure {
+ private void preparePackage(InstallRequest request) throws PrepareFailure {
final int[] allUsers = mPm.mUserManager.getUserIds();
final int installFlags = request.getInstallFlags();
final boolean onExternal = request.getVolumeUuid() != null;
@@ -1739,18 +1765,7 @@
}
}
- if (!isApex) {
- doRenameLI(request, parsedPackage);
-
- try {
- setUpFsVerity(parsedPackage);
- } catch (Installer.InstallerException | IOException | DigestException
- | NoSuchAlgorithmException e) {
- throw PrepareFailure.ofInternalError(
- "Failed to set up verity: " + e,
- PackageManagerException.INTERNAL_ERROR_VERITY_SETUP);
- }
- } else {
+ if (isApex) {
// Use the path returned by apexd
parsedPackage.setPath(request.getApexInfo().modulePath);
parsedPackage.setBaseApkPath(request.getApexInfo().modulePath);
@@ -2092,7 +2107,21 @@
// Reflect the rename in scanned details
try {
- parsedPackage.setPath(afterCodeFile.getCanonicalPath());
+ String afterCanonicalPath = afterCodeFile.getCanonicalPath();
+ String beforeCanonicalPath = beforeCodeFile.getCanonicalPath();
+ parsedPackage.setPath(afterCanonicalPath);
+
+ parsedPackage.setNativeLibraryDir(
+ parsedPackage.getNativeLibraryDir()
+ .replace(beforeCanonicalPath, afterCanonicalPath));
+ parsedPackage.setNativeLibraryRootDir(
+ parsedPackage.getNativeLibraryRootDir()
+ .replace(beforeCanonicalPath, afterCanonicalPath));
+ String secondaryNativeLibraryDir = parsedPackage.getSecondaryNativeLibraryDir();
+ if (secondaryNativeLibraryDir != null) {
+ parsedPackage.setSecondaryNativeLibraryDir(
+ secondaryNativeLibraryDir.replace(beforeCanonicalPath, afterCanonicalPath));
+ }
} catch (IOException e) {
Slog.e(TAG, "Failed to get path: " + afterCodeFile, e);
throw new PrepareFailure(PackageManager.INSTALL_FAILED_MEDIA_UNAVAILABLE,
@@ -2102,6 +2131,7 @@
afterCodeFile, parsedPackage.getBaseApkPath()));
parsedPackage.setSplitCodePaths(FileUtils.rewriteAfterRename(beforeCodeFile,
afterCodeFile, parsedPackage.getSplitCodePaths()));
+ request.updateAllCodePaths(AndroidPackageUtils.getAllCodePaths(parsedPackage));
}
// TODO(b/168126411): Once staged install flow starts using the same folder as non-staged
diff --git a/services/core/java/com/android/server/pm/InstallRequest.java b/services/core/java/com/android/server/pm/InstallRequest.java
index ae7749b..1f79ac0 100644
--- a/services/core/java/com/android/server/pm/InstallRequest.java
+++ b/services/core/java/com/android/server/pm/InstallRequest.java
@@ -615,6 +615,20 @@
return mScanResult.mDynamicSharedLibraryInfos;
}
+ public void updateAllCodePaths(List<String> paths) {
+ if (mScanResult.mSdkSharedLibraryInfo != null) {
+ mScanResult.mSdkSharedLibraryInfo.setAllCodePaths(paths);
+ }
+ if (mScanResult.mStaticSharedLibraryInfo != null) {
+ mScanResult.mStaticSharedLibraryInfo.setAllCodePaths(paths);
+ }
+ if (mScanResult.mDynamicSharedLibraryInfos != null) {
+ for (SharedLibraryInfo info : mScanResult.mDynamicSharedLibraryInfos) {
+ info.setAllCodePaths(paths);
+ }
+ }
+ }
+
@Nullable
public PackageSetting getScannedPackageSetting() {
assertScanResultExists();
diff --git a/services/core/java/com/android/server/pm/LauncherAppsService.java b/services/core/java/com/android/server/pm/LauncherAppsService.java
index efd58ed..8657de2 100644
--- a/services/core/java/com/android/server/pm/LauncherAppsService.java
+++ b/services/core/java/com/android/server/pm/LauncherAppsService.java
@@ -716,7 +716,7 @@
visiblePackages.add(info.getActivityInfo().packageName);
}
final List<ApplicationInfo> installedPackages =
- mPackageManagerInternal.getInstalledApplications(
+ mPackageManagerInternal.getInstalledApplicationsCrossUser(
/* flags= */ 0, user.getIdentifier(), callingUid);
for (ApplicationInfo applicationInfo : installedPackages) {
if (!visiblePackages.contains(applicationInfo.packageName)) {
@@ -1674,18 +1674,32 @@
@Override
public PendingIntent getActivityLaunchIntent(String callingPackage, ComponentName component,
UserHandle user) {
+ try {
+ Log.d(TAG,
+ "getActivityLaunchIntent callingPackage=" + callingPackage + " component="
+ + component + " user=" + user);
+ } catch (Exception e) {
+ Log.e(TAG, "getActivityLaunchIntent is called and error occurred when"
+ + " printing the logs", e);
+ }
if (mContext.checkPermission(android.Manifest.permission.START_TASKS_FROM_RECENTS,
injectBinderCallingPid(), injectBinderCallingUid())
!= PackageManager.PERMISSION_GRANTED) {
+ Log.d(TAG, "getActivityLaunchIntent no permission callingPid="
+ + injectBinderCallingPid() + " callingUid=" + injectBinderCallingUid());
throw new SecurityException("Permission START_TASKS_FROM_RECENTS required");
}
if (!canAccessProfile(user.getIdentifier(), "Cannot start activity")) {
+ Log.d(TAG, "getActivityLaunchIntent cannot access profile user="
+ + user.getIdentifier());
throw new ActivityNotFoundException("Activity could not be found");
}
final Intent launchIntent = getMainActivityLaunchIntent(component, user,
false /* includeArchivedApps */);
if (launchIntent == null) {
+ Log.d(TAG, "getActivityLaunchIntent cannot access profile user="
+ + user.getIdentifier() + " component=" + component);
throw new SecurityException("Attempt to launch activity without "
+ " category Intent.CATEGORY_LAUNCHER " + component);
}
@@ -1965,6 +1979,17 @@
canLaunch = true;
}
if (!canLaunch) {
+ try {
+ Log.w(TAG, "getMainActivityLaunchIntent return null because it can't launch"
+ + " component=" + component + " user=" + user + " appsSize=" + size
+ + " includeArchivedApps=" + includeArchivedApps
+ + " isArchivingEnabled=" + isArchivingEnabled()
+ + " matchingArchivedAppActivityInfo="
+ + getMatchingArchivedAppActivityInfo(component, user));
+ } catch (Exception e) {
+ Log.e(TAG, "getMainActivityLaunchIntent return null and error occurred when"
+ + " printing the logs", e);
+ }
return null;
}
} finally {
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index ff9c3e5..611e0d8 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -3389,18 +3389,31 @@
return true;
}
// Does it contain a device admin for any user?
- int[] users;
+ int[] allUsers = mUserManager.getUserIds();
+ int[] targetUsers;
if (userId == UserHandle.USER_ALL) {
- users = mUserManager.getUserIds();
+ targetUsers = allUsers;
} else {
- users = new int[]{userId};
+ targetUsers = new int[]{userId};
}
- for (int i = 0; i < users.length; ++i) {
- if (dpm.packageHasActiveAdmins(packageName, users[i])) {
+
+ for (int i = 0; i < targetUsers.length; ++i) {
+ if (dpm.packageHasActiveAdmins(packageName, targetUsers[i])) {
return true;
}
- if (isDeviceManagementRoleHolder(packageName, users[i])
- && dpmi.isUserOrganizationManaged(users[i])) {
+ }
+
+ // If a package is DMRH on a managed user, it should also be treated as an admin on
+ // that user. If that package is also a system package, it should also be protected
+ // on other users otherwise "uninstall updates" on an unmanaged user may break
+ // management on other users because apk version is shared between all users.
+ var packageState = snapshotComputer().getPackageStateInternal(packageName);
+ if (packageState == null) {
+ return false;
+ }
+ for (int user : packageState.isSystem() ? allUsers : targetUsers) {
+ if (isDeviceManagementRoleHolder(packageName, user)
+ && dpmi.isUserOrganizationManaged(user)) {
return true;
}
}
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 63491e8..ca60518 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -37,6 +37,7 @@
import static android.os.Build.VERSION_CODES.M;
import static android.os.Build.VERSION_CODES.O;
import static android.os.IInputConstants.INVALID_INPUT_DEVICE_ID;
+import static android.os.UserManager.isVisibleBackgroundUsersEnabled;
import static android.provider.Settings.Secure.VOLUME_HUSH_OFF;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.INVALID_DISPLAY;
@@ -184,6 +185,7 @@
import android.service.vr.IPersistentVrStateCallbacks;
import android.speech.RecognizerIntent;
import android.telecom.TelecomManager;
+import android.util.ArraySet;
import android.util.Log;
import android.util.MathUtils;
import android.util.MutableBoolean;
@@ -256,6 +258,7 @@
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
+import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@@ -718,6 +721,22 @@
// Timeout for showing the keyguard after the screen is on, in case no "ready" is received.
private int mKeyguardDrawnTimeout = 1000;
+ private final boolean mVisibleBackgroundUsersEnabled = isVisibleBackgroundUsersEnabled();
+
+ // Key codes that should be ignored for visible background users in MUMD environment.
+ private static final Set<Integer> KEY_CODES_IGNORED_FOR_VISIBLE_BACKGROUND_USERS =
+ new ArraySet<>(Arrays.asList(
+ KeyEvent.KEYCODE_POWER,
+ KeyEvent.KEYCODE_SLEEP,
+ KeyEvent.KEYCODE_WAKEUP,
+ KeyEvent.KEYCODE_CALL,
+ KeyEvent.KEYCODE_ENDCALL,
+ KeyEvent.KEYCODE_ASSIST,
+ KeyEvent.KEYCODE_VOICE_ASSIST,
+ KeyEvent.KEYCODE_MUTE,
+ KeyEvent.KEYCODE_VOLUME_MUTE
+ ));
+
private static final int MSG_DISPATCH_MEDIA_KEY_WITH_WAKE_LOCK = 3;
private static final int MSG_DISPATCH_MEDIA_KEY_REPEAT_WITH_WAKE_LOCK = 4;
private static final int MSG_KEYGUARD_DRAWN_COMPLETE = 5;
@@ -811,7 +830,11 @@
event.recycle();
break;
case MSG_HANDLE_ALL_APPS:
- launchAllAppsAction();
+ KeyEvent keyEvent = (KeyEvent) msg.obj;
+ if (isKeyEventForCurrentUser(keyEvent.getDisplayId(), keyEvent.getKeyCode(),
+ "launchAllAppsViaA11y")) {
+ launchAllAppsAction();
+ }
break;
case MSG_RINGER_TOGGLE_CHORD:
handleRingerChordGesture();
@@ -2082,7 +2105,10 @@
switch (mLongPressOnHomeBehavior) {
case LONG_PRESS_HOME_ALL_APPS:
notifyKeyGestureCompleted(event, KeyGestureEvent.KEY_GESTURE_TYPE_ALL_APPS);
- launchAllAppsAction();
+ if (isKeyEventForCurrentUser(event.getDisplayId(), event.getKeyCode(),
+ "launchAllAppsViaA11y")) {
+ launchAllAppsAction();
+ }
break;
case LONG_PRESS_HOME_ASSIST:
notifyKeyGestureCompleted(event,
@@ -3763,7 +3789,10 @@
KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_CAPS_LOCK);
} else if (mPendingMetaAction) {
if (!canceled) {
- launchAllAppsAction();
+ if (isKeyEventForCurrentUser(event.getDisplayId(), event.getKeyCode(),
+ "launchAllAppsViaA11y")) {
+ launchAllAppsAction();
+ }
notifyKeyGestureCompleted(event,
KeyGestureEvent.KEY_GESTURE_TYPE_ALL_APPS);
}
@@ -4030,7 +4059,8 @@
return true;
case KeyGestureEvent.KEY_GESTURE_TYPE_ALL_APPS:
case KeyGestureEvent.KEY_GESTURE_TYPE_ACCESSIBILITY_ALL_APPS:
- if (complete) {
+ if (complete && isKeyEventForCurrentUser(event.getDisplayId(),
+ event.getKeycodes()[0], "launchAllAppsViaA11y")) {
launchAllAppsAction();
}
return true;
@@ -4859,6 +4889,14 @@
boolean isWakeKey = (policyFlags & WindowManagerPolicy.FLAG_WAKE) != 0
|| event.isWakeKey();
+ // There are key events that perform the operation as the current user,
+ // and these should be ignored for visible background users.
+ if (mVisibleBackgroundUsersEnabled
+ && KEY_CODES_IGNORED_FOR_VISIBLE_BACKGROUND_USERS.contains(keyCode)
+ && !isKeyEventForCurrentUser(event.getDisplayId(), keyCode, null)) {
+ return 0;
+ }
+
if (!mSystemBooted) {
// If we have not yet booted, don't let key events do anything.
// Exception: Wake and power key events are forwarded to PowerManager to allow it to
@@ -5866,6 +5904,10 @@
}
private void wakeUpFromWakeKey(KeyEvent event) {
+ if (!isKeyEventForCurrentUser(
+ event.getDisplayId(), event.getKeyCode(), "wakeUpFromWakeKey")) {
+ return;
+ }
wakeUpFromWakeKey(
event.getEventTime(),
event.getKeyCode(),
@@ -6445,6 +6487,12 @@
// TODO (b/113840485): Move this logic to DisplayPolicy when lockscreen supports multi-display.
@Override
public void setAllowLockscreenWhenOn(int displayId, boolean allow) {
+ // We should ignore this operation for visible background users
+ // until lockscreen supports multi-display.
+ if (mVisibleBackgroundUsersEnabled
+ && mUserManagerInternal.getUserAssignedToDisplay(displayId) != mCurrentUserId) {
+ return;
+ }
if (allow) {
mAllowLockscreenWhenOnDisplays.add(displayId);
} else {
@@ -7253,4 +7301,29 @@
}
return DEFAULT_DISPLAY;
}
+
+ /**
+ * This method is intended to prevent key events for visible background users
+ * from interfering with the current user's experience in MUMD environment.
+ *
+ * @param displayId the displayId of the key event.
+ * @param keyCode the key code of the event.
+ *
+ * @return false if the key event is for a visible background user.
+ */
+ private boolean isKeyEventForCurrentUser(int displayId, int keyCode, @Nullable String purpose) {
+ if (!mVisibleBackgroundUsersEnabled) {
+ return true;
+ }
+ int assignedUser = mUserManagerInternal.getUserAssignedToDisplay(displayId);
+ if (assignedUser == mCurrentUserId) {
+ return true;
+ }
+ if (DEBUG_INPUT) {
+ Slog.w(TAG, "Cannot handle " + KeyEvent.keyCodeToString(keyCode)
+ + (purpose != null ? " to " + purpose : "")
+ + " for visible background user(u" + assignedUser + ")");
+ }
+ return false;
+ }
}
diff --git a/services/core/java/com/android/server/power/stats/AccumulatedBatteryUsageStatsSection.java b/services/core/java/com/android/server/power/stats/AccumulatedBatteryUsageStatsSection.java
new file mode 100644
index 0000000..dd6d5db
--- /dev/null
+++ b/services/core/java/com/android/server/power/stats/AccumulatedBatteryUsageStatsSection.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.power.stats;
+
+import android.os.BatteryUsageStats;
+import android.util.IndentingPrintWriter;
+
+import com.android.modules.utils.TypedXmlPullParser;
+import com.android.modules.utils.TypedXmlSerializer;
+
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+
+class AccumulatedBatteryUsageStatsSection extends PowerStatsSpan.Section {
+ public static final String TYPE = "accumulated-battery-usage-stats";
+ public static final long ID = Long.MAX_VALUE;
+
+ private final BatteryUsageStats.Builder mBatteryUsageStats;
+
+ AccumulatedBatteryUsageStatsSection(BatteryUsageStats.Builder batteryUsageStats) {
+ super(TYPE);
+ mBatteryUsageStats = batteryUsageStats;
+ }
+
+ public BatteryUsageStats.Builder getBatteryUsageStatsBuilder() {
+ return mBatteryUsageStats;
+ }
+
+ @Override
+ public void write(TypedXmlSerializer serializer) throws IOException {
+ mBatteryUsageStats.build().writeXml(serializer);
+ }
+
+ @Override
+ public void dump(IndentingPrintWriter ipw) {
+ mBatteryUsageStats.build().dump(ipw, "");
+ }
+
+ static class Reader implements PowerStatsSpan.SectionReader {
+ @Override
+ public String getType() {
+ return TYPE;
+ }
+
+ @Override
+ public PowerStatsSpan.Section read(String sectionType, TypedXmlPullParser parser)
+ throws IOException, XmlPullParserException {
+ return new AccumulatedBatteryUsageStatsSection(
+ BatteryUsageStats.createBuilderFromXml(parser));
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java b/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java
index cb8e1a0..3f1d9a3 100644
--- a/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java
+++ b/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java
@@ -509,6 +509,7 @@
}
private boolean mSaveBatteryUsageStatsOnReset;
+ private boolean mAccumulateBatteryUsageStats;
private BatteryUsageStatsProvider mBatteryUsageStatsProvider;
private PowerStatsStore mPowerStatsStore;
@@ -11975,10 +11976,12 @@
*/
public void saveBatteryUsageStatsOnReset(
@NonNull BatteryUsageStatsProvider batteryUsageStatsProvider,
- @NonNull PowerStatsStore powerStatsStore) {
+ @NonNull PowerStatsStore powerStatsStore,
+ boolean accumulateBatteryUsageStats) {
mSaveBatteryUsageStatsOnReset = true;
mBatteryUsageStatsProvider = batteryUsageStatsProvider;
mPowerStatsStore = powerStatsStore;
+ mAccumulateBatteryUsageStats = accumulateBatteryUsageStats;
}
@GuardedBy("this")
@@ -12179,29 +12182,33 @@
return;
}
- final BatteryUsageStats batteryUsageStats;
- synchronized (this) {
- batteryUsageStats = mBatteryUsageStatsProvider.getBatteryUsageStats(this,
- new BatteryUsageStatsQuery.Builder()
- .setMaxStatsAgeMs(0)
- .includePowerModels()
- .includeProcessStateData()
- .build());
- }
-
- // TODO(b/188068523): BatteryUsageStats should use monotonic time for start and end
- // Once that change is made, we will be able to use the BatteryUsageStats' monotonic
- // start time
- long monotonicStartTime =
- mMonotonicClock.monotonicTime() - batteryUsageStats.getStatsDuration();
- mHandler.post(() -> {
- mPowerStatsStore.storeBatteryUsageStats(monotonicStartTime, batteryUsageStats);
- try {
- batteryUsageStats.close();
- } catch (IOException e) {
- Log.e(TAG, "Cannot close BatteryUsageStats", e);
+ if (mAccumulateBatteryUsageStats) {
+ mBatteryUsageStatsProvider.accumulateBatteryUsageStats(this);
+ } else {
+ final BatteryUsageStats batteryUsageStats;
+ synchronized (this) {
+ batteryUsageStats = mBatteryUsageStatsProvider.getBatteryUsageStats(this,
+ new BatteryUsageStatsQuery.Builder()
+ .setMaxStatsAgeMs(0)
+ .includePowerModels()
+ .includeProcessStateData()
+ .build());
}
- });
+
+ // TODO(b/188068523): BatteryUsageStats should use monotonic time for start and end
+ // Once that change is made, we will be able to use the BatteryUsageStats' monotonic
+ // start time
+ long monotonicStartTime =
+ mMonotonicClock.monotonicTime() - batteryUsageStats.getStatsDuration();
+ mHandler.post(() -> {
+ mPowerStatsStore.storeBatteryUsageStats(monotonicStartTime, batteryUsageStats);
+ try {
+ batteryUsageStats.close();
+ } catch (IOException e) {
+ Log.e(TAG, "Cannot close BatteryUsageStats", e);
+ }
+ });
+ }
}
@GuardedBy("this")
diff --git a/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java b/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java
index 87a3e5e..d66e05b 100644
--- a/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java
+++ b/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java
@@ -33,6 +33,7 @@
import com.android.internal.os.CpuScalingPolicies;
import com.android.internal.os.PowerProfile;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -64,6 +65,7 @@
mClock = clock;
mPowerStatsStore.addSectionReader(new BatteryUsageStatsSection.Reader());
+ mPowerStatsStore.addSectionReader(new AccumulatedBatteryUsageStatsSection.Reader());
}
private List<PowerCalculator> getPowerCalculators() {
@@ -151,6 +153,56 @@
}
/**
+ * Compute BatteryUsageStats for the period since the last accumulated stats were stored,
+ * add them to the accumulated stats and save the result.
+ */
+ public void accumulateBatteryUsageStats(BatteryStatsImpl stats) {
+ BatteryUsageStats.Builder accumulatedBatteryUsageStatsBuilder = null;
+
+ PowerStatsSpan powerStatsSpan = mPowerStatsStore.loadPowerStatsSpan(
+ AccumulatedBatteryUsageStatsSection.ID,
+ AccumulatedBatteryUsageStatsSection.TYPE);
+ if (powerStatsSpan != null) {
+ List<PowerStatsSpan.Section> sections = powerStatsSpan.getSections();
+ for (int i = sections.size() - 1; i >= 0; i--) {
+ PowerStatsSpan.Section section = sections.get(i);
+ if (AccumulatedBatteryUsageStatsSection.TYPE.equals(section.getType())) {
+ accumulatedBatteryUsageStatsBuilder =
+ ((AccumulatedBatteryUsageStatsSection) section)
+ .getBatteryUsageStatsBuilder();
+ break;
+ }
+ }
+ }
+
+ // TODO(b/366493365): add the current batteryusagestats directly into the "accumulated"
+ // builder to avoid allocating a second CursorWindow
+ BatteryUsageStats.Builder currentBatteryUsageStatsBuilder =
+ getCurrentBatteryUsageStatsBuilder(stats,
+ new BatteryUsageStatsQuery.Builder()
+ .setMaxStatsAgeMs(0)
+ .includeProcessStateData()
+ .includePowerStateData()
+ .includeScreenStateData()
+ .build(),
+ mClock.currentTimeMillis());
+
+ if (accumulatedBatteryUsageStatsBuilder == null) {
+ accumulatedBatteryUsageStatsBuilder = currentBatteryUsageStatsBuilder;
+ } else {
+ accumulatedBatteryUsageStatsBuilder.add(currentBatteryUsageStatsBuilder.build());
+ currentBatteryUsageStatsBuilder.discard();
+ }
+
+ powerStatsSpan = new PowerStatsSpan(AccumulatedBatteryUsageStatsSection.ID);
+ powerStatsSpan.addSection(
+ new AccumulatedBatteryUsageStatsSection(accumulatedBatteryUsageStatsBuilder));
+
+ mPowerStatsStore.storePowerStatsSpanAsync(powerStatsSpan,
+ accumulatedBatteryUsageStatsBuilder::discard);
+ }
+
+ /**
* Returns true if the last update was too long ago for the tolerances specified
* by the supplied queries.
*/
@@ -192,15 +244,67 @@
private BatteryUsageStats getBatteryUsageStats(BatteryStatsImpl stats,
BatteryUsageStatsQuery query, long currentTimeMs) {
- if (query.getToTimestamp() == 0) {
+ if ((query.getFlags()
+ & BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_ACCUMULATED) != 0) {
+ return getAccumulatedBatteryUsageStats(stats, query);
+ } else if (query.getToTimestamp() == 0) {
return getCurrentBatteryUsageStats(stats, query, currentTimeMs);
} else {
return getAggregatedBatteryUsageStats(stats, query);
}
}
+ private BatteryUsageStats getAccumulatedBatteryUsageStats(BatteryStatsImpl stats,
+ BatteryUsageStatsQuery query) {
+ PowerStatsSpan powerStatsSpan = mPowerStatsStore.loadPowerStatsSpan(
+ AccumulatedBatteryUsageStatsSection.ID,
+ AccumulatedBatteryUsageStatsSection.TYPE);
+
+ BatteryUsageStats.Builder accumulatedBatteryUsageStatsBuilder = null;
+ if (powerStatsSpan != null) {
+ List<PowerStatsSpan.Section> sections = powerStatsSpan.getSections();
+ if (sections.size() == 1) {
+ accumulatedBatteryUsageStatsBuilder =
+ ((AccumulatedBatteryUsageStatsSection) sections.get(0))
+ .getBatteryUsageStatsBuilder();
+ } else {
+ Slog.wtf(TAG, "Unexpected number of sections for type "
+ + AccumulatedBatteryUsageStatsSection.TYPE);
+ }
+ }
+
+ BatteryUsageStats currentBatteryUsageStats = getCurrentBatteryUsageStats(stats, query,
+ mClock.currentTimeMillis());
+
+ BatteryUsageStats result;
+ if (accumulatedBatteryUsageStatsBuilder == null) {
+ result = currentBatteryUsageStats;
+ } else {
+ accumulatedBatteryUsageStatsBuilder.add(currentBatteryUsageStats);
+ try {
+ currentBatteryUsageStats.close();
+ } catch (IOException ex) {
+ Slog.e(TAG, "Closing BatteryUsageStats", ex);
+ }
+ result = accumulatedBatteryUsageStatsBuilder.build();
+ }
+
+ return result;
+ }
+
private BatteryUsageStats getCurrentBatteryUsageStats(BatteryStatsImpl stats,
BatteryUsageStatsQuery query, long currentTimeMs) {
+ BatteryUsageStats.Builder builder = getCurrentBatteryUsageStatsBuilder(stats, query,
+ currentTimeMs);
+ BatteryUsageStats batteryUsageStats = builder.build();
+ if (batteryUsageStats.isProcessStateDataIncluded()) {
+ verify(batteryUsageStats);
+ }
+ return batteryUsageStats;
+ }
+
+ private BatteryUsageStats.Builder getCurrentBatteryUsageStatsBuilder(BatteryStatsImpl stats,
+ BatteryUsageStatsQuery query, long currentTimeMs) {
final long realtimeUs = mClock.elapsedRealtime() * 1000;
final long uptimeUs = mClock.uptimeMillis() * 1000;
@@ -274,11 +378,7 @@
mPowerAttributor.estimatePowerConsumption(batteryUsageStatsBuilder, stats.getHistory(),
monotonicStartTime, monotonicEndTime);
- BatteryUsageStats batteryUsageStats = batteryUsageStatsBuilder.build();
- if (includeProcessStateData) {
- verify(batteryUsageStats);
- }
- return batteryUsageStats;
+ return batteryUsageStatsBuilder;
}
// STOPSHIP(b/229906525): remove verification before shipping
diff --git a/services/core/java/com/android/server/power/stats/PowerStatsStore.java b/services/core/java/com/android/server/power/stats/PowerStatsStore.java
index a875c30..5a6f973 100644
--- a/services/core/java/com/android/server/power/stats/PowerStatsStore.java
+++ b/services/core/java/com/android/server/power/stats/PowerStatsStore.java
@@ -133,6 +133,19 @@
}
/**
+ * Schedules saving the specified span on the background thread.
+ */
+ public void storePowerStatsSpanAsync(PowerStatsSpan span, Runnable onComplete) {
+ mHandler.post(() -> {
+ try {
+ storePowerStatsSpan(span);
+ } finally {
+ onComplete.run();
+ }
+ });
+ }
+
+ /**
* Saves the specified span in the store.
*/
public void storePowerStatsSpan(PowerStatsSpan span) {
@@ -172,6 +185,9 @@
lockStoreDirectory();
try {
File file = makePowerStatsSpanFilename(id);
+ if (!file.exists()) {
+ return null;
+ }
try (InputStream inputStream = new BufferedInputStream(new FileInputStream(file))) {
return PowerStatsSpan.read(inputStream, parser, mSectionReaders, sectionTypes);
} catch (IOException | XmlPullParserException e) {
diff --git a/services/core/java/com/android/server/power/stats/flags.aconfig b/services/core/java/com/android/server/power/stats/flags.aconfig
index 05d29f5..ce6f57f 100644
--- a/services/core/java/com/android/server/power/stats/flags.aconfig
+++ b/services/core/java/com/android/server/power/stats/flags.aconfig
@@ -76,3 +76,13 @@
bug: "364350206"
is_fixed_read_only: true
}
+
+flag {
+ name: "accumulate_battery_usage_stats"
+ namespace: "backstage_power"
+ description: "Add support for monotonically accumulated BatteryUsageStats"
+ bug: "345022340"
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+}
diff --git a/services/core/java/com/android/server/security/forensic/OWNERS b/services/core/java/com/android/server/security/forensic/OWNERS
new file mode 100644
index 0000000..3bc3eb5
--- /dev/null
+++ b/services/core/java/com/android/server/security/forensic/OWNERS
@@ -0,0 +1 @@
+file:platform/frameworks/base:main:/core/java/android/security/forensic/OWNERS
diff --git a/services/core/java/com/android/server/timedetector/TimeDetectorStrategyImpl.java b/services/core/java/com/android/server/timedetector/TimeDetectorStrategyImpl.java
index 374dd89..6405353 100644
--- a/services/core/java/com/android/server/timedetector/TimeDetectorStrategyImpl.java
+++ b/services/core/java/com/android/server/timedetector/TimeDetectorStrategyImpl.java
@@ -37,12 +37,14 @@
import android.app.timedetector.TelephonyTimeSuggestion;
import android.content.Context;
import android.os.Handler;
+import android.os.SystemClock;
import android.util.ArraySet;
import android.util.IndentingPrintWriter;
import android.util.Slog;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.os.ApplicationSharedMemory;
import com.android.server.SystemClockTime;
import com.android.server.SystemClockTime.TimeConfidence;
import com.android.server.timezonedetector.ArrayMapWithHistory;
@@ -315,6 +317,17 @@
// detected time if, for example, the age of all suggestions are considered.
NetworkTimeSuggestion lastNetworkSuggestion = mLastNetworkSuggestion.get();
if (lastNetworkSuggestion == null || !lastNetworkSuggestion.equals(suggestion)) {
+ if (com.android.internal.os.Flags.applicationSharedMemoryEnabled()
+ && android.os.Flags.networkTimeUsesSharedMemory()) {
+ UnixEpochTime networkUnixEpochTime = suggestion.getUnixEpochTime();
+ long lastNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis =
+ networkUnixEpochTime.getUnixEpochTimeMillis()
+ - networkUnixEpochTime.getElapsedRealtimeMillis();
+ ApplicationSharedMemory.getInstance()
+ .setLatestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis(
+ lastNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis);
+ }
+
mLastNetworkSuggestion.set(suggestion);
notifyNetworkTimeUpdateListenersAsynchronously();
}
@@ -347,8 +360,12 @@
@Override
public synchronized void clearLatestNetworkSuggestion() {
+ if (com.android.internal.os.Flags.applicationSharedMemoryEnabled()
+ && android.os.Flags.networkTimeUsesSharedMemory()) {
+ ApplicationSharedMemory.getInstance()
+ .clearLatestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis();
+ }
mLastNetworkSuggestion.set(null);
-
notifyNetworkTimeUpdateListenersAsynchronously();
// The loss of network time may change the time signal to use to set the system clock.
diff --git a/services/core/java/com/android/server/vcn/Vcn.java b/services/core/java/com/android/server/vcn/Vcn.java
index 5a5f7ef..5bc2c2d 100644
--- a/services/core/java/com/android/server/vcn/Vcn.java
+++ b/services/core/java/com/android/server/vcn/Vcn.java
@@ -86,6 +86,9 @@
private static final int MSG_EVENT_BASE = 0;
private static final int MSG_CMD_BASE = 100;
+ // Copied from Settings.Global.MOBILE_DATA
+ private static final String SETTINGS_GLOBAL_MOBILE_DATA_STRING = "mobile_data";
+
/**
* A carrier app updated the configuration.
*
@@ -219,7 +222,8 @@
mContentResolver = mDeps.newVcnContentResolver(mVcnContext);
mMobileDataSettingsObserver = new VcnMobileDataContentObserver(this /* handler */);
- final Uri uri = Settings.Global.getUriFor(Settings.Global.MOBILE_DATA);
+ // TODO: b/364740845: Replace it with DataEnabledListener
+ final Uri uri = Settings.Global.getUriFor(SETTINGS_GLOBAL_MOBILE_DATA_STRING);
mContentResolver.registerContentObserver(
uri, true /* notifyForDescendants */, mMobileDataSettingsObserver);
diff --git a/services/core/java/com/android/server/vibrator/ExternalVibrationSession.java b/services/core/java/com/android/server/vibrator/ExternalVibrationSession.java
index b4d3862..b5a7fcb 100644
--- a/services/core/java/com/android/server/vibrator/ExternalVibrationSession.java
+++ b/services/core/java/com/android/server/vibrator/ExternalVibrationSession.java
@@ -16,6 +16,7 @@
package com.android.server.vibrator;
+import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
import android.os.ExternalVibration;
@@ -24,6 +25,7 @@
import android.os.VibrationAttributes;
import android.os.vibrator.Flags;
+import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.FrameworkStatsLog;
/**
@@ -32,14 +34,16 @@
final class ExternalVibrationSession extends Vibration
implements VibrationSession, IBinder.DeathRecipient {
+ private final Object mLock = new Object();
private final ExternalVibration mExternalVibration;
private final ExternalVibrationScale mScale = new ExternalVibrationScale();
+ @GuardedBy("mLock")
@Nullable
private Runnable mBinderDeathCallback;
ExternalVibrationSession(ExternalVibration externalVibration) {
- super(externalVibration.getToken(), new CallerInfo(
+ super(new CallerInfo(
externalVibration.getVibrationAttributes(), externalVibration.getUid(),
// TODO(b/249785241): Find a way to link ExternalVibration to a VirtualDevice
// instead of using DEVICE_ID_INVALID here and relying on the UID checks.
@@ -82,24 +86,25 @@
}
@Override
- public void linkToDeath(Runnable callback) {
- synchronized (this) {
+ public boolean linkToDeath(Runnable callback) {
+ synchronized (mLock) {
mBinderDeathCallback = callback;
}
mExternalVibration.linkToDeath(this);
+ return true;
}
@Override
public void unlinkToDeath() {
mExternalVibration.unlinkToDeath(this);
- synchronized (this) {
+ synchronized (mLock) {
mBinderDeathCallback = null;
}
}
@Override
public void binderDied() {
- synchronized (this) {
+ synchronized (mLock) {
if (mBinderDeathCallback != null) {
mBinderDeathCallback.run();
}
@@ -119,9 +124,11 @@
}
@Override
- public void notifyEnded() {
+ public void requestEnd(@NonNull Status status, @Nullable CallerInfo endedBy,
+ boolean immediate) {
// Notify external client that this vibration should stop sending data to the vibrator.
mExternalVibration.mute();
+ end(new EndInfo(status, endedBy));
}
boolean isHoldingSameVibration(ExternalVibration vib) {
diff --git a/services/core/java/com/android/server/vibrator/HalVibration.java b/services/core/java/com/android/server/vibrator/HalVibration.java
index ea4bd01..ce9c47b 100644
--- a/services/core/java/com/android/server/vibrator/HalVibration.java
+++ b/services/core/java/com/android/server/vibrator/HalVibration.java
@@ -36,6 +36,7 @@
final class HalVibration extends Vibration {
public final SparseArray<VibrationEffect> mFallbacks = new SparseArray<>();
+ public final IBinder callerToken;
/** A {@link CountDownLatch} to enable waiting for completion. */
private final CountDownLatch mCompletionLatch = new CountDownLatch(1);
@@ -55,9 +56,10 @@
private int mScaleLevel;
private float mAdaptiveScale;
- HalVibration(@NonNull IBinder token, @NonNull CombinedVibration effect,
+ HalVibration(@NonNull IBinder callerToken, @NonNull CombinedVibration effect,
@NonNull VibrationSession.CallerInfo callerInfo) {
- super(token, callerInfo);
+ super(callerInfo);
+ this.callerToken = callerToken;
mOriginalEffect = effect;
mEffectToPlay = effect;
mScaleLevel = VibrationScaler.SCALE_NONE;
diff --git a/services/core/java/com/android/server/vibrator/Vibration.java b/services/core/java/com/android/server/vibrator/Vibration.java
index 9a04793..21fd4ce 100644
--- a/services/core/java/com/android/server/vibrator/Vibration.java
+++ b/services/core/java/com/android/server/vibrator/Vibration.java
@@ -53,16 +53,13 @@
public final long id;
public final VibrationSession.CallerInfo callerInfo;
public final VibrationStats stats = new VibrationStats();
- public final IBinder callerToken;
private VibrationSession.Status mStatus;
- Vibration(@NonNull IBinder token, @NonNull VibrationSession.CallerInfo callerInfo) {
- Objects.requireNonNull(token);
+ Vibration(@NonNull VibrationSession.CallerInfo callerInfo) {
Objects.requireNonNull(callerInfo);
mStatus = VibrationSession.Status.RUNNING;
this.id = sNextVibrationId.getAndIncrement();
- this.callerToken = token;
this.callerInfo = callerInfo;
}
diff --git a/services/core/java/com/android/server/vibrator/VibrationSession.java b/services/core/java/com/android/server/vibrator/VibrationSession.java
index 5640b49..70477a2 100644
--- a/services/core/java/com/android/server/vibrator/VibrationSession.java
+++ b/services/core/java/com/android/server/vibrator/VibrationSession.java
@@ -49,14 +49,26 @@
* Links this session to the app process death with given callback to handle it.
*
* <p>This can be used by the service to end the vibration session when the app process dies.
+ *
+ * @param callback The service callback to be triggered when the binder dies
+ * @return true if the link was successful, false otherwise
*/
- void linkToDeath(Runnable callback);
+ boolean linkToDeath(@Nullable Runnable callback);
/** Removes link to the app process death. */
void unlinkToDeath();
- /** Notify the session end was requested, which might be acted upon asynchronously. */
- void notifyEnded();
+ /**
+ * Notify the session end was requested, which might be acted upon asynchronously.
+ *
+ * <p>Only the first end signal will be used to end a session, but subsequent calls with
+ * {@code immediate} flag set to true can still force it to take effect urgently.
+ *
+ * @param status the end status.
+ * @param endedBy the {@link CallerInfo} of the session that requested this session to end.
+ * @param immediate indicates whether cancellation should abort urgently and skip cleanup steps.
+ */
+ void requestEnd(@NonNull Status status, @Nullable CallerInfo endedBy, boolean immediate);
/**
* Session status with reference to values from vibratormanagerservice.proto for logging.
@@ -119,7 +131,7 @@
public final String reason;
CallerInfo(@NonNull VibrationAttributes attrs, int uid, int deviceId, String opPkg,
- String reason) {
+ @Nullable String reason) {
Objects.requireNonNull(attrs);
this.attrs = attrs;
this.uid = uid;
diff --git a/services/core/java/com/android/server/vibrator/VibrationSettings.java b/services/core/java/com/android/server/vibrator/VibrationSettings.java
index 69cdcf4..9cb8c1a 100644
--- a/services/core/java/com/android/server/vibrator/VibrationSettings.java
+++ b/services/core/java/com/android/server/vibrator/VibrationSettings.java
@@ -31,6 +31,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityManager;
+import android.app.IActivityManager;
import android.app.SynchronousUserSwitchObserver;
import android.app.UidObserver;
import android.content.BroadcastReceiver;
@@ -74,6 +75,7 @@
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
+import java.util.Objects;
import java.util.Set;
/** Controls all the system settings related to vibration. */
@@ -147,9 +149,6 @@
PowerManager.GO_TO_SLEEP_REASON_INATTENTIVE,
PowerManager.GO_TO_SLEEP_REASON_TIMEOUT));
- private static final IntentFilter INTERNAL_RINGER_MODE_CHANGED_INTENT_FILTER =
- new IntentFilter(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION);
-
/** Listener for changes on vibration settings. */
interface OnVibratorSettingsChanged {
/** Callback triggered when any of the vibrator settings change. */
@@ -158,15 +157,18 @@
private final Object mLock = new Object();
private final Context mContext;
- private final String mSystemUiPackage;
@VisibleForTesting
final SettingsContentObserver mSettingObserver;
@VisibleForTesting
- final SettingsBroadcastReceiver mSettingChangeReceiver;
+ final RingerModeBroadcastReceiver mRingerModeBroadcastReceiver;
+ @VisibleForTesting
+ final BatteryBroadcastReceiver mBatteryBroadcastReceiver;
@VisibleForTesting
final VibrationUidObserver mUidObserver;
@VisibleForTesting
final VibrationUserSwitchObserver mUserSwitchObserver;
+ @VisibleForTesting
+ final VibrationLowPowerModeListener mLowPowerModeListener;
@GuardedBy("mLock")
private final List<OnVibratorSettingsChanged> mListeners = new ArrayList<>();
@@ -180,10 +182,13 @@
@GuardedBy("mLock")
@Nullable
private PowerManagerInternal mPowerManagerInternal;
+ @GuardedBy("mLock")
@Nullable
private VirtualDeviceManagerInternal mVirtualDeviceManagerInternal;
@GuardedBy("mLock")
+ private String mSystemUiPackage;
+ @GuardedBy("mLock")
private boolean mVibrateInputDevices;
@GuardedBy("mLock")
private SparseIntArray mCurrentVibrationIntensities = new SparseIntArray();
@@ -205,11 +210,11 @@
mContext = context;
mVibrationConfig = config;
mSettingObserver = new SettingsContentObserver(handler);
- mSettingChangeReceiver = new SettingsBroadcastReceiver();
+ mRingerModeBroadcastReceiver = new RingerModeBroadcastReceiver();
+ mBatteryBroadcastReceiver = new BatteryBroadcastReceiver();
mUidObserver = new VibrationUidObserver();
mUserSwitchObserver = new VibrationUserSwitchObserver();
- mSystemUiPackage = LocalServices.getService(PackageManagerInternal.class)
- .getSystemUiServiceComponent().getPackageName();
+ mLowPowerModeListener = new VibrationLowPowerModeListener();
VibrationEffect clickEffect = createEffectFromResource(
com.android.internal.R.array.config_virtualKeyVibePattern);
@@ -233,18 +238,34 @@
}
public void onSystemReady() {
- PowerManagerInternal pm = LocalServices.getService(PowerManagerInternal.class);
- AudioManager am = mContext.getSystemService(AudioManager.class);
- int ringerMode = am.getRingerModeInternal();
+ onSystemReady(LocalServices.getService(PackageManagerInternal.class),
+ LocalServices.getService(PowerManagerInternal.class),
+ ActivityManager.getService(),
+ LocalServices.getService(VirtualDeviceManagerInternal.class),
+ mContext.getSystemService(AudioManager.class));
+ }
+
+ @VisibleForTesting
+ void onSystemReady(PackageManagerInternal packageManagerInternal,
+ PowerManagerInternal powerManagerInternal,
+ IActivityManager activityManagerInternal,
+ @Nullable VirtualDeviceManagerInternal virtualDeviceManagerInternal,
+ @Nullable AudioManager audioManager) {
+ int ringerMode = (audioManager == null)
+ ? AudioManager.RINGER_MODE_NORMAL
+ : audioManager.getRingerModeInternal();
+ String sysUiPackage = packageManagerInternal.getSystemUiServiceComponent().getPackageName();
synchronized (mLock) {
- mPowerManagerInternal = pm;
- mAudioManager = am;
+ mPowerManagerInternal = powerManagerInternal;
+ mVirtualDeviceManagerInternal = virtualDeviceManagerInternal;
+ mAudioManager = audioManager;
mRingerMode = ringerMode;
+ mSystemUiPackage = sysUiPackage;
}
try {
- ActivityManager.getService().registerUidObserver(mUidObserver,
+ activityManagerInternal.registerUidObserver(mUidObserver,
ActivityManager.UID_OBSERVER_PROCSTATE | ActivityManager.UID_OBSERVER_GONE,
ActivityManager.PROCESS_STATE_UNKNOWN, /* callingPackage= */ null);
} catch (RemoteException e) {
@@ -252,32 +273,16 @@
}
try {
- ActivityManager.getService().registerUserSwitchObserver(mUserSwitchObserver, TAG);
+ activityManagerInternal.registerUserSwitchObserver(mUserSwitchObserver, TAG);
} catch (RemoteException e) {
// ignored; both services live in system_server
}
- pm.registerLowPowerModeObserver(
- new PowerManagerInternal.LowPowerModeListener() {
- @Override
- public int getServiceType() {
- return PowerManager.ServiceType.VIBRATION;
- }
+ powerManagerInternal.registerLowPowerModeObserver(mLowPowerModeListener);
- @Override
- public void onLowPowerModeChanged(PowerSaveState result) {
- boolean shouldNotifyListeners;
- synchronized (mLock) {
- shouldNotifyListeners = result.batterySaverEnabled != mBatterySaverMode;
- mBatterySaverMode = result.batterySaverEnabled;
- }
- if (shouldNotifyListeners) {
- notifyListeners();
- }
- }
- });
-
- registerSettingsChangeReceiver(INTERNAL_RINGER_MODE_CHANGED_INTENT_FILTER);
+ mContext.registerReceiver(mRingerModeBroadcastReceiver,
+ new IntentFilter(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION),
+ Context.RECEIVER_EXPORTED_UNAUDITED);
// Listen to all settings that might affect the result of Vibrator.getVibrationIntensity.
registerSettingsObserver(Settings.System.getUriFor(Settings.System.VIBRATE_INPUT_DEVICES));
@@ -301,12 +306,7 @@
if (mVibrationConfig.ignoreVibrationsOnWirelessCharger()) {
Intent batteryStatus = mContext.registerReceiver(
- new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- updateBatteryInfo(intent);
- }
- },
+ mBatteryBroadcastReceiver,
new IntentFilter(Intent.ACTION_BATTERY_CHANGED),
Context.RECEIVER_NOT_EXPORTED);
// After registering the receiver for battery status, process the sticky broadcast that
@@ -476,8 +476,10 @@
public boolean shouldCancelVibrationOnScreenOff(@NonNull CallerInfo callerInfo,
long vibrationStartUptimeMillis) {
PowerManagerInternal pm;
+ String sysUiPackageName;
synchronized (mLock) {
pm = mPowerManagerInternal;
+ sysUiPackageName = mSystemUiPackage;
}
if (pm != null) {
// The SleepData from PowerManager may refer to a more recent sleep than the broadcast
@@ -501,7 +503,7 @@
}
// Only allow vibrations from System packages to continue vibrating when the screen goes off
return callerInfo.uid != Process.SYSTEM_UID && callerInfo.uid != 0
- && !mSystemUiPackage.equals(callerInfo.opPkg);
+ && !Objects.equals(sysUiPackageName, callerInfo.opPkg);
}
/**
@@ -782,11 +784,6 @@
UserHandle.USER_ALL);
}
- private void registerSettingsChangeReceiver(IntentFilter intentFilter) {
- mContext.registerReceiver(mSettingChangeReceiver, intentFilter,
- Context.RECEIVER_EXPORTED_UNAUDITED);
- }
-
@Nullable
private VibrationEffect createEffectFromResource(int resId) {
return createEffectFromResource(mContext.getResources(), resId);
@@ -833,12 +830,11 @@
}
private boolean isAppRunningOnAnyVirtualDevice(int uid) {
- if (mVirtualDeviceManagerInternal == null) {
- mVirtualDeviceManagerInternal =
- LocalServices.getService(VirtualDeviceManagerInternal.class);
+ VirtualDeviceManagerInternal vdm;
+ synchronized (mLock) {
+ vdm = mVirtualDeviceManagerInternal;
}
- return mVirtualDeviceManagerInternal != null
- && mVirtualDeviceManagerInternal.isAppRunningOnAnyVirtualDevice(uid);
+ return vdm != null && vdm.isAppRunningOnAnyVirtualDevice(uid);
}
/** Implementation of {@link ContentObserver} to be registered to a setting {@link Uri}. */
@@ -857,7 +853,7 @@
/** Implementation of {@link BroadcastReceiver} to update on ringer mode change. */
@VisibleForTesting
- final class SettingsBroadcastReceiver extends BroadcastReceiver {
+ final class RingerModeBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
@@ -868,6 +864,18 @@
}
}
+ /** Implementation of {@link BroadcastReceiver} to update on battery mode change. */
+ @VisibleForTesting
+ final class BatteryBroadcastReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (Intent.ACTION_BATTERY_CHANGED.equals(action)) {
+ updateBatteryInfo(intent);
+ }
+ }
+ }
+
/** Implementation of {@link ContentObserver} to be registered to a setting {@link Uri}. */
@VisibleForTesting
final class VibrationUidObserver extends UidObserver {
@@ -913,4 +921,25 @@
update();
}
}
+
+ /** Implementation of {@link PowerManagerInternal.LowPowerModeListener} for low battery. */
+ @VisibleForTesting
+ final class VibrationLowPowerModeListener implements PowerManagerInternal.LowPowerModeListener {
+ @Override
+ public int getServiceType() {
+ return PowerManager.ServiceType.VIBRATION;
+ }
+
+ @Override
+ public void onLowPowerModeChanged(PowerSaveState result) {
+ boolean shouldNotifyListeners;
+ synchronized (mLock) {
+ shouldNotifyListeners = result.batterySaverEnabled != mBatterySaverMode;
+ mBatterySaverMode = result.batterySaverEnabled;
+ }
+ if (shouldNotifyListeners) {
+ notifyListeners();
+ }
+ }
+ }
}
diff --git a/services/core/java/com/android/server/vibrator/VibrationStepConductor.java b/services/core/java/com/android/server/vibrator/VibrationStepConductor.java
index 5137d19..1d52e3c 100644
--- a/services/core/java/com/android/server/vibrator/VibrationStepConductor.java
+++ b/services/core/java/com/android/server/vibrator/VibrationStepConductor.java
@@ -21,6 +21,7 @@
import android.os.Build;
import android.os.CombinedVibration;
import android.os.IBinder;
+import android.os.RemoteException;
import android.os.VibrationEffect;
import android.os.vibrator.Flags;
import android.os.vibrator.PrebakedSegment;
@@ -38,6 +39,7 @@
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
+import java.util.NoSuchElementException;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.concurrent.CancellationException;
@@ -358,6 +360,28 @@
}
/**
+ * Returns true if successfully linked this conductor to the death of the binder that requested
+ * the vibration.
+ */
+ public boolean linkToDeath() {
+ try {
+ mVibration.callerToken.linkToDeath(this, 0);
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Error linking vibration to token death", e);
+ return false;
+ }
+ return true;
+ }
+
+ public void unlinkToDeath() {
+ try {
+ mVibration.callerToken.unlinkToDeath(this, 0);
+ } catch (NoSuchElementException e) {
+ Slog.wtf(TAG, "Failed to unlink vibration to token death", e);
+ }
+ }
+
+ /**
* Notify the execution that cancellation is requested. This will be acted upon
* asynchronously in the VibrationThread.
*
@@ -452,6 +476,23 @@
}
}
+ /**
+ * Notify that the VibrationThread has completed the vibration effect playback.
+ *
+ * <p>This is a lightweight method intended to be called by the vibration thread directly. The
+ * VibrationThread may still be continuing with cleanup tasks, and should not be given new work
+ * until it notifies the manager that it has been released.
+ */
+ public void notifyVibrationComplete(@NonNull Vibration.EndInfo endInfo) {
+ if (Build.IS_DEBUGGABLE) {
+ expectIsVibrationThread(true);
+ }
+ if (DEBUG) {
+ Slog.d(TAG, "Vibration " + mVibration.id + " finished with " + endInfo);
+ }
+ mVibration.end(endInfo);
+ }
+
/** Returns true if a cancellation signal was sent via {@link #notifyCancelled}. */
public boolean wasNotifiedToCancel() {
if (Build.IS_DEBUGGABLE) {
diff --git a/services/core/java/com/android/server/vibrator/VibrationThread.java b/services/core/java/com/android/server/vibrator/VibrationThread.java
index 4c1e16c..5b22c10 100644
--- a/services/core/java/com/android/server/vibrator/VibrationThread.java
+++ b/services/core/java/com/android/server/vibrator/VibrationThread.java
@@ -16,12 +16,12 @@
package com.android.server.vibrator;
+import static android.os.Trace.TRACE_TAG_VIBRATOR;
+
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.os.IBinder;
import android.os.PowerManager;
import android.os.Process;
-import android.os.RemoteException;
import android.os.SystemClock;
import android.os.Trace;
import android.os.WorkSource;
@@ -31,7 +31,6 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.server.vibrator.VibrationSession.Status;
-import java.util.NoSuchElementException;
import java.util.Objects;
/** Plays a {@link HalVibration} in dedicated thread. */
@@ -72,14 +71,6 @@
void noteVibratorOff(int uid);
/**
- * Tell the manager that the currently active vibration has completed its vibration, from
- * the perspective of the Effect. However, the VibrationThread may still be continuing with
- * cleanup tasks, and should not be given new work until {@link #onVibrationThreadReleased}
- * is called.
- */
- void onVibrationCompleted(long vibrationId, @NonNull Vibration.EndInfo vibrationEndInfo);
-
- /**
* Tells the manager that the VibrationThread is finished with the previous vibration and
* all of its cleanup tasks, and the vibrators can now be used for another vibration.
*/
@@ -128,7 +119,7 @@
* before the release callback.
*/
boolean runVibrationOnVibrationThread(VibrationStepConductor conductor) {
- Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "runVibrationOnVibrationThread");
+ Trace.traceBegin(TRACE_TAG_VIBRATOR, "runVibrationOnVibrationThread");
try {
synchronized (mLock) {
if (mRequestedActiveConductor != null) {
@@ -140,7 +131,7 @@
}
return true;
} finally {
- Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
+ Trace.traceEnd(TRACE_TAG_VIBRATOR);
}
}
@@ -243,7 +234,7 @@
mWakeLock.acquire();
try {
try {
- runCurrentVibrationWithWakeLockAndDeathLink();
+ playVibration();
} finally {
clientVibrationCompleteIfNotAlready(
new Vibration.EndInfo(Status.FINISHED_UNEXPECTED));
@@ -254,46 +245,23 @@
}
}
- /**
- * Runs the VibrationThread with the binder death link, handling link/unlink failures.
- * Called from within runWithWakeLock.
- */
- private void runCurrentVibrationWithWakeLockAndDeathLink() {
- IBinder vibrationBinderToken = mExecutingConductor.getVibration().callerToken;
- try {
- vibrationBinderToken.linkToDeath(mExecutingConductor, 0);
- } catch (RemoteException e) {
- Slog.e(TAG, "Error linking vibration to token death", e);
- clientVibrationCompleteIfNotAlready(
- new Vibration.EndInfo(Status.IGNORED_ERROR_TOKEN));
- return;
- }
- // Ensure that the unlink always occurs now.
- try {
- // This is the actual execution of the vibration.
- playVibration();
- } finally {
- try {
- vibrationBinderToken.unlinkToDeath(mExecutingConductor, 0);
- } catch (NoSuchElementException e) {
- Slog.wtf(TAG, "Failed to unlink token", e);
- }
- }
- }
-
// Indicate that the vibration is complete. This can be called multiple times only for
// convenience of handling error conditions - an error after the client is complete won't
// affect the status.
private void clientVibrationCompleteIfNotAlready(@NonNull Vibration.EndInfo vibrationEndInfo) {
if (!mCalledVibrationCompleteCallback) {
mCalledVibrationCompleteCallback = true;
- mVibratorManagerHooks.onVibrationCompleted(
- mExecutingConductor.getVibration().id, vibrationEndInfo);
+ Trace.traceBegin(TRACE_TAG_VIBRATOR, "notifyVibrationComplete");
+ try {
+ mExecutingConductor.notifyVibrationComplete(vibrationEndInfo);
+ } finally {
+ Trace.traceEnd(TRACE_TAG_VIBRATOR);
+ }
}
}
private void playVibration() {
- Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "playVibration");
+ Trace.traceBegin(TRACE_TAG_VIBRATOR, "playVibration");
try {
mExecutingConductor.prepareToStart();
while (!mExecutingConductor.isFinished()) {
@@ -317,7 +285,7 @@
}
}
} finally {
- Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
+ Trace.traceEnd(TRACE_TAG_VIBRATOR);
}
}
}
diff --git a/services/core/java/com/android/server/vibrator/VibratorController.java b/services/core/java/com/android/server/vibrator/VibratorController.java
index 3c47850..c120fc7 100644
--- a/services/core/java/com/android/server/vibrator/VibratorController.java
+++ b/services/core/java/com/android/server/vibrator/VibratorController.java
@@ -16,6 +16,8 @@
package com.android.server.vibrator;
+import static android.os.Trace.TRACE_TAG_VIBRATOR;
+
import android.annotation.Nullable;
import android.hardware.vibrator.IVibrator;
import android.os.Binder;
@@ -124,7 +126,7 @@
/** Reruns the query to the vibrator to load the {@link VibratorInfo}, if not yet successful. */
public void reloadVibratorInfoIfNeeded() {
- Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "VibratorController#reloadVibratorInfoIfNeeded");
+ Trace.traceBegin(TRACE_TAG_VIBRATOR, "VibratorController#reloadVibratorInfoIfNeeded");
try {
// Early check outside lock, for quick return.
if (mVibratorInfoLoadSuccessful) {
@@ -143,7 +145,7 @@
}
}
} finally {
- Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
+ Trace.traceEnd(TRACE_TAG_VIBRATOR);
}
}
@@ -199,13 +201,13 @@
/** Return {@code true} if the underlying vibrator is currently available, false otherwise. */
public boolean isAvailable() {
- Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "VibratorController#isAvailable");
+ Trace.traceBegin(TRACE_TAG_VIBRATOR, "VibratorController#isAvailable");
try {
synchronized (mLock) {
return mNativeWrapper.isAvailable();
}
} finally {
- Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
+ Trace.traceEnd(TRACE_TAG_VIBRATOR);
}
}
@@ -215,7 +217,9 @@
* <p>This will affect the state of {@link #isUnderExternalControl()}.
*/
public void setExternalControl(boolean externalControl) {
- Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "setExternalControl(" + externalControl + ")");
+ Trace.traceBegin(TRACE_TAG_VIBRATOR,
+ externalControl ? "VibratorController#enableExternalControl"
+ : "VibratorController#disableExternalControl");
try {
if (!mVibratorInfo.hasCapability(IVibrator.CAP_EXTERNAL_CONTROL)) {
return;
@@ -225,7 +229,7 @@
mNativeWrapper.setExternalControl(externalControl);
}
} finally {
- Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
+ Trace.traceEnd(TRACE_TAG_VIBRATOR);
}
}
@@ -234,7 +238,7 @@
* if given {@code effect} is {@code null}.
*/
public void updateAlwaysOn(int id, @Nullable PrebakedSegment prebaked) {
- Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "VibratorController#updateAlwaysOn");
+ Trace.traceBegin(TRACE_TAG_VIBRATOR, "VibratorController#updateAlwaysOn");
try {
if (!mVibratorInfo.hasCapability(IVibrator.CAP_ALWAYS_ON_CONTROL)) {
return;
@@ -248,13 +252,13 @@
}
}
} finally {
- Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
+ Trace.traceEnd(TRACE_TAG_VIBRATOR);
}
}
/** Set the vibration amplitude. This will NOT affect the state of {@link #isVibrating()}. */
public void setAmplitude(float amplitude) {
- Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "VibratorController#setAmplitude");
+ Trace.traceBegin(TRACE_TAG_VIBRATOR, "VibratorController#setAmplitude");
try {
synchronized (mLock) {
if (mVibratorInfo.hasCapability(IVibrator.CAP_AMPLITUDE_CONTROL)) {
@@ -265,7 +269,7 @@
}
}
} finally {
- Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
+ Trace.traceEnd(TRACE_TAG_VIBRATOR);
}
}
@@ -279,7 +283,7 @@
* do not support the input or a negative number if the operation failed.
*/
public long on(long milliseconds, long vibrationId) {
- Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "VibratorController#on");
+ Trace.traceBegin(TRACE_TAG_VIBRATOR, "VibratorController#on");
try {
synchronized (mLock) {
long duration = mNativeWrapper.on(milliseconds, vibrationId);
@@ -290,7 +294,7 @@
return duration;
}
} finally {
- Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
+ Trace.traceEnd(TRACE_TAG_VIBRATOR);
}
}
@@ -304,7 +308,7 @@
* do not support the input or a negative number if the operation failed.
*/
public long on(VibrationEffect.VendorEffect vendorEffect, long vibrationId) {
- Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "VibratorController#on (vendor)");
+ Trace.traceBegin(TRACE_TAG_VIBRATOR, "VibratorController#on (vendor)");
synchronized (mLock) {
Parcel vendorData = Parcel.obtain();
try {
@@ -320,7 +324,7 @@
return duration;
} finally {
vendorData.recycle();
- Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
+ Trace.traceEnd(TRACE_TAG_VIBRATOR);
}
}
}
@@ -335,7 +339,7 @@
* do not support the input or a negative number if the operation failed.
*/
public long on(PrebakedSegment prebaked, long vibrationId) {
- Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "VibratorController#on (Prebaked)");
+ Trace.traceBegin(TRACE_TAG_VIBRATOR, "VibratorController#on (Prebaked)");
try {
synchronized (mLock) {
long duration = mNativeWrapper.perform(prebaked.getEffectId(),
@@ -347,7 +351,7 @@
return duration;
}
} finally {
- Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
+ Trace.traceEnd(TRACE_TAG_VIBRATOR);
}
}
@@ -361,7 +365,7 @@
* do not support the input or a negative number if the operation failed.
*/
public long on(PrimitiveSegment[] primitives, long vibrationId) {
- Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "VibratorController#on (Primitive)");
+ Trace.traceBegin(TRACE_TAG_VIBRATOR, "VibratorController#on (Primitive)");
try {
if (!mVibratorInfo.hasCapability(IVibrator.CAP_COMPOSE_EFFECTS)) {
return 0;
@@ -375,7 +379,7 @@
return duration;
}
} finally {
- Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
+ Trace.traceEnd(TRACE_TAG_VIBRATOR);
}
}
@@ -388,7 +392,7 @@
* @return The duration of the effect playing, or 0 if unsupported.
*/
public long on(RampSegment[] primitives, long vibrationId) {
- Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "VibratorController#on (PWLE)");
+ Trace.traceBegin(TRACE_TAG_VIBRATOR, "VibratorController#on (PWLE)");
try {
if (!mVibratorInfo.hasCapability(IVibrator.CAP_COMPOSE_PWLE_EFFECTS)) {
return 0;
@@ -403,7 +407,7 @@
return duration;
}
} finally {
- Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
+ Trace.traceEnd(TRACE_TAG_VIBRATOR);
}
}
@@ -413,7 +417,7 @@
* <p>This will affect the state of {@link #isVibrating()}.
*/
public void off() {
- Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "VibratorController#off");
+ Trace.traceBegin(TRACE_TAG_VIBRATOR, "VibratorController#off");
try {
synchronized (mLock) {
mNativeWrapper.off();
@@ -421,7 +425,7 @@
notifyListenerOnVibrating(false);
}
} finally {
- Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
+ Trace.traceEnd(TRACE_TAG_VIBRATOR);
}
}
diff --git a/services/core/java/com/android/server/vibrator/VibratorManagerService.java b/services/core/java/com/android/server/vibrator/VibratorManagerService.java
index a76d8d6..95c6483 100644
--- a/services/core/java/com/android/server/vibrator/VibratorManagerService.java
+++ b/services/core/java/com/android/server/vibrator/VibratorManagerService.java
@@ -16,6 +16,7 @@
package com.android.server.vibrator;
+import static android.os.Trace.TRACE_TAG_VIBRATOR;
import static android.os.VibrationAttributes.USAGE_CLASS_ALARM;
import static android.os.VibrationEffect.VibrationParameter.targetAmplitude;
import static android.os.VibrationEffect.VibrationParameter.targetFrequency;
@@ -333,7 +334,7 @@
@VisibleForTesting
void systemReady() {
Slog.v(TAG, "Initializing VibratorManager service...");
- Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "systemReady");
+ Trace.traceBegin(TRACE_TAG_VIBRATOR, "systemReady");
try {
// Will retry to load each vibrator's info, if any request have failed.
for (int i = 0; i < mVibrators.size(); i++) {
@@ -352,7 +353,7 @@
mServiceReady = true;
}
Slog.v(TAG, "VibratorManager service initialized");
- Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
+ Trace.traceEnd(TRACE_TAG_VIBRATOR);
}
}
@@ -413,7 +414,7 @@
@Override // Binder call
public boolean setAlwaysOnEffect(int uid, String opPkg, int alwaysOnId,
@Nullable CombinedVibration effect, @Nullable VibrationAttributes attrs) {
- Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "setAlwaysOnEffect");
+ Trace.traceBegin(TRACE_TAG_VIBRATOR, "setAlwaysOnEffect");
try {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.VIBRATE_ALWAYS_ON,
@@ -449,20 +450,25 @@
}
return true;
} finally {
- Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
+ Trace.traceEnd(TRACE_TAG_VIBRATOR);
}
}
@Override // Binder call
public void vibrate(int uid, int deviceId, String opPkg, @NonNull CombinedVibration effect,
@Nullable VibrationAttributes attrs, String reason, IBinder token) {
- vibrateWithPermissionCheck(uid, deviceId, opPkg, effect, attrs, reason, token);
+ Trace.traceBegin(TRACE_TAG_VIBRATOR, "vibrate");
+ try {
+ vibrateWithPermissionCheck(uid, deviceId, opPkg, effect, attrs, reason, token);
+ } finally {
+ Trace.traceEnd(TRACE_TAG_VIBRATOR);
+ }
}
@Override // Binder call
public void performHapticFeedback(int uid, int deviceId, String opPkg, int constant,
String reason, int flags, int privFlags) {
- Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "performHapticFeedback");
+ Trace.traceBegin(TRACE_TAG_VIBRATOR, "performHapticFeedback");
// Note that the `performHapticFeedback` method does not take a token argument from the
// caller, and instead, uses this service as the token. This is to mitigate performance
// impact that would otherwise be caused due to marshal latency. Haptic feedback effects are
@@ -471,7 +477,7 @@
performHapticFeedbackInternal(uid, deviceId, opPkg, constant, reason, /* token= */
this, flags, privFlags);
} finally {
- Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
+ Trace.traceEnd(TRACE_TAG_VIBRATOR);
}
}
@@ -479,13 +485,13 @@
public void performHapticFeedbackForInputDevice(int uid, int deviceId, String opPkg,
int constant, int inputDeviceId, int inputSource, String reason, int flags,
int privFlags) {
- Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "performHapticFeedbackForInputDevice");
+ Trace.traceBegin(TRACE_TAG_VIBRATOR, "performHapticFeedbackForInputDevice");
try {
performHapticFeedbackForInputDeviceInternal(uid, deviceId, opPkg, constant,
inputDeviceId,
inputSource, reason, /* token= */ this, flags, privFlags);
} finally {
- Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
+ Trace.traceEnd(TRACE_TAG_VIBRATOR);
}
}
@@ -563,26 +569,16 @@
HalVibration vibrateWithPermissionCheck(int uid, int deviceId, String opPkg,
@NonNull CombinedVibration effect, @Nullable VibrationAttributes attrs,
String reason, IBinder token) {
- Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "vibrate, reason = " + reason);
- try {
- attrs = fixupVibrationAttributes(attrs, effect);
- mContext.enforceCallingOrSelfPermission(
- android.Manifest.permission.VIBRATE, "vibrate");
- return vibrateInternal(uid, deviceId, opPkg, effect, attrs, reason, token);
- } finally {
- Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
- }
+ attrs = fixupVibrationAttributes(attrs, effect);
+ mContext.enforceCallingOrSelfPermission(
+ android.Manifest.permission.VIBRATE, "vibrate");
+ return vibrateInternal(uid, deviceId, opPkg, effect, attrs, reason, token);
}
HalVibration vibrateWithoutPermissionCheck(int uid, int deviceId, String opPkg,
@NonNull CombinedVibration effect, @NonNull VibrationAttributes attrs,
String reason, IBinder token) {
- Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "vibrate no perm check, reason = " + reason);
- try {
- return vibrateInternal(uid, deviceId, opPkg, effect, attrs, reason, token);
- } finally {
- Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
- }
+ return vibrateInternal(uid, deviceId, opPkg, effect, attrs, reason, token);
}
private HalVibration vibrateInternal(int uid, int deviceId, String opPkg,
@@ -633,12 +629,9 @@
final long ident = Binder.clearCallingIdentity();
try {
if (mCurrentExternalVibration != null) {
- mCurrentExternalVibration.notifyEnded();
vib.stats.reportInterruptedAnotherVibration(
- mCurrentExternalVibration.callerInfo);
- endExternalVibrateLocked(
- new Vibration.EndInfo(Status.CANCELLED_SUPERSEDED,
- vib.callerInfo),
+ mCurrentExternalVibration.getCallerInfo());
+ endExternalVibrateLocked(Status.CANCELLED_SUPERSEDED, vib.callerInfo,
/* continueExternalControl= */ false);
} else if (mCurrentVibration != null) {
if (mCurrentVibration.getVibration().canPipelineWith(vib)) {
@@ -666,7 +659,7 @@
// Ignored or failed to start the vibration, end it and report metrics right away.
if (vibrationEndInfo != null) {
- endVibrationLocked(vib, vibrationEndInfo, /* shouldWriteStats= */ true);
+ endVibrationLocked(vib, vibrationEndInfo);
}
return vib;
}
@@ -674,7 +667,7 @@
@Override // Binder call
public void cancelVibrate(int usageFilter, IBinder token) {
- Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "cancelVibrate");
+ Trace.traceBegin(TRACE_TAG_VIBRATOR, "cancelVibrate");
try {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.VIBRATE,
@@ -703,16 +696,15 @@
&& shouldCancelVibration(
mCurrentExternalVibration.getCallerInfo().attrs,
usageFilter)) {
- mCurrentExternalVibration.notifyEnded();
- endExternalVibrateLocked(
- cancelledByUserInfo, /* continueExternalControl= */ false);
+ endExternalVibrateLocked(cancelledByUserInfo.status,
+ cancelledByUserInfo.endedBy, /* continueExternalControl= */ false);
}
} finally {
Binder.restoreCallingIdentity(ident);
}
}
} finally {
- Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
+ Trace.traceEnd(TRACE_TAG_VIBRATOR);
}
}
@@ -903,7 +895,7 @@
@GuardedBy("mLock")
@Nullable
private Vibration.EndInfo startVibrationLocked(HalVibration vib) {
- Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "startVibrationLocked");
+ Trace.traceBegin(TRACE_TAG_VIBRATOR, "startVibrationLocked");
try {
if (mInputDeviceDelegate.isAvailable()) {
return startVibrationOnInputDevicesLocked(vib);
@@ -923,7 +915,7 @@
mNextVibration = conductor;
return null;
} finally {
- Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
+ Trace.traceEnd(TRACE_TAG_VIBRATOR);
}
}
@@ -934,9 +926,14 @@
int mode = startAppOpModeLocked(vib.callerInfo);
switch (mode) {
case AppOpsManager.MODE_ALLOWED:
- Trace.asyncTraceBegin(Trace.TRACE_TAG_VIBRATOR, "vibration", 0);
+ Trace.asyncTraceBegin(TRACE_TAG_VIBRATOR, "vibration", 0);
// Make sure mCurrentVibration is set while triggering the VibrationThread.
mCurrentVibration = conductor;
+ if (!mCurrentVibration.linkToDeath()) {
+ // Shouldn't happen. The method call already logs a wtf.
+ mCurrentVibration = null; // Aborted.
+ return new Vibration.EndInfo(Status.IGNORED_ERROR_TOKEN);
+ }
if (!mVibrationThread.runVibrationOnVibrationThread(mCurrentVibration)) {
// Shouldn't happen. The method call already logs a wtf.
mCurrentVibration = null; // Aborted.
@@ -953,14 +950,21 @@
}
@GuardedBy("mLock")
- private void endVibrationLocked(Vibration vib, Vibration.EndInfo vibrationEndInfo,
- boolean shouldWriteStats) {
+ private void endVibrationLocked(Vibration vib, Status status) {
+ endVibrationLocked(vib, new Vibration.EndInfo(status));
+ }
+
+ @GuardedBy("mLock")
+ private void endVibrationLocked(Vibration vib, Vibration.EndInfo vibrationEndInfo) {
vib.end(vibrationEndInfo);
+ reportEndedVibrationLocked(vib);
+ }
+
+ @GuardedBy("mLock")
+ private void reportEndedVibrationLocked(Vibration vib) {
logAndRecordVibration(vib.getDebugInfo());
- if (shouldWriteStats) {
- mFrameworkStatsLogger.writeVibrationReportedAsync(
- vib.getStatsInfo(/* completionUptimeMillis= */ SystemClock.uptimeMillis()));
- }
+ mFrameworkStatsLogger.writeVibrationReportedAsync(
+ vib.getStatsInfo(/* completionUptimeMillis= */ SystemClock.uptimeMillis()));
}
private VibrationStepConductor createVibrationStepConductor(HalVibration vib) {
@@ -1055,17 +1059,15 @@
}
@GuardedBy("mLock")
- private void reportFinishedVibrationLocked(Vibration.EndInfo vibrationEndInfo) {
+ private void reportFinishedVibrationLocked() {
Trace.asyncTraceEnd(Trace.TRACE_TAG_VIBRATOR, "vibration", 0);
+ mCurrentVibration.unlinkToDeath();
HalVibration vib = mCurrentVibration.getVibration();
if (DEBUG) {
- Slog.d(TAG, "Reporting vibration " + vib.id + " finished with "
- + vibrationEndInfo);
+ Slog.d(TAG, "Reporting vibration " + vib.id + " finished with " + vib.getStatus());
}
- // DO NOT write metrics at this point, wait for the VibrationThread to report the
- // vibration was released, after all cleanup. The metrics will be reported then.
- endVibrationLocked(vib, vibrationEndInfo, /* shouldWriteStats= */ false);
finishAppOpModeLocked(vib.callerInfo);
+ reportEndedVibrationLocked(vib);
}
private void onSyncedVibrationComplete(long vibrationId) {
@@ -1575,7 +1577,7 @@
@Override
public boolean prepareSyncedVibration(long requiredCapabilities, int[] vibratorIds) {
- Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "prepareSyncedVibration");
+ Trace.traceBegin(TRACE_TAG_VIBRATOR, "prepareSyncedVibration");
try {
if ((mCapabilities & requiredCapabilities) != requiredCapabilities) {
// This sync step requires capabilities this device doesn't have, skipping
@@ -1584,33 +1586,33 @@
}
return mNativeWrapper.prepareSynced(vibratorIds);
} finally {
- Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
+ Trace.traceEnd(TRACE_TAG_VIBRATOR);
}
}
@Override
public boolean triggerSyncedVibration(long vibrationId) {
- Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "triggerSyncedVibration");
+ Trace.traceBegin(TRACE_TAG_VIBRATOR, "triggerSyncedVibration");
try {
return mNativeWrapper.triggerSynced(vibrationId);
} finally {
- Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
+ Trace.traceEnd(TRACE_TAG_VIBRATOR);
}
}
@Override
public void cancelSyncedVibration() {
- Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "cancelSyncedVibration");
+ Trace.traceBegin(TRACE_TAG_VIBRATOR, "cancelSyncedVibration");
try {
mNativeWrapper.cancelSynced();
} finally {
- Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
+ Trace.traceEnd(TRACE_TAG_VIBRATOR);
}
}
@Override
public void noteVibratorOn(int uid, long duration) {
- Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "noteVibratorOn");
+ Trace.traceBegin(TRACE_TAG_VIBRATOR, "noteVibratorOn");
try {
if (duration <= 0) {
// Tried to turn vibrator ON and got:
@@ -1629,38 +1631,20 @@
} catch (RemoteException e) {
Slog.e(TAG, "Error logging VibratorStateChanged to ON", e);
} finally {
- Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
+ Trace.traceEnd(TRACE_TAG_VIBRATOR);
}
}
@Override
public void noteVibratorOff(int uid) {
- Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "noteVibratorOff");
+ Trace.traceBegin(TRACE_TAG_VIBRATOR, "noteVibratorOff");
try {
mBatteryStatsService.noteVibratorOff(uid);
mFrameworkStatsLogger.writeVibratorStateOffAsync(uid);
} catch (RemoteException e) {
Slog.e(TAG, "Error logging VibratorStateChanged to OFF", e);
} finally {
- Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
- }
- }
-
- @Override
- public void onVibrationCompleted(long vibrationId, Vibration.EndInfo vibrationEndInfo) {
- if (DEBUG) {
- Slog.d(TAG, "Vibration " + vibrationId + " finished with " + vibrationEndInfo);
- }
- Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "onVibrationCompleted");
- try {
- synchronized (mLock) {
- if (mCurrentVibration != null
- && mCurrentVibration.getVibration().id == vibrationId) {
- reportFinishedVibrationLocked(vibrationEndInfo);
- }
- }
- } finally {
- Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
+ Trace.traceEnd(TRACE_TAG_VIBRATOR);
}
}
@@ -1669,7 +1653,8 @@
if (DEBUG) {
Slog.d(TAG, "VibrationThread released after finished vibration");
}
- Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "onVibrationThreadReleased: " + vibrationId);
+ Trace.traceBegin(TRACE_TAG_VIBRATOR, "onVibrationThreadReleased");
+
try {
synchronized (mLock) {
if (DEBUG) {
@@ -1682,11 +1667,8 @@
mCurrentVibration.getVibration().id, vibrationId));
}
if (mCurrentVibration != null) {
- // This is when we consider the current vibration complete, so report
- // metrics.
- mFrameworkStatsLogger.writeVibrationReportedAsync(
- mCurrentVibration.getVibration().getStatsInfo(
- /* completionUptimeMillis= */ SystemClock.uptimeMillis()));
+ // This is when we consider the current vibration complete, report metrics.
+ reportFinishedVibrationLocked();
mCurrentVibration = null;
}
if (mNextVibration != null) {
@@ -1696,13 +1678,12 @@
nextConductor);
if (vibrationEndInfo != null) {
// Failed to start the vibration, end it and report metrics right away.
- endVibrationLocked(nextConductor.getVibration(),
- vibrationEndInfo, /* shouldWriteStats= */ true);
+ endVibrationLocked(nextConductor.getVibration(), vibrationEndInfo);
}
}
}
} finally {
- Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
+ Trace.traceEnd(TRACE_TAG_VIBRATOR);
}
}
}
@@ -1929,8 +1910,7 @@
+ " with end info: " + vibrationEndInfo);
}
// Clearing next vibration before playing it, end it and report metrics right away.
- endVibrationLocked(mNextVibration.getVibration(), vibrationEndInfo,
- /* shouldWriteStats= */ true);
+ endVibrationLocked(mNextVibration.getVibration(), vibrationEndInfo);
mNextVibration = null;
}
}
@@ -1938,23 +1918,24 @@
/**
* Ends the external vibration, and clears related service state.
*
- * @param vibrationEndInfo the status and related info to end the associated Vibration
+ * @param status the status to end the associated Vibration
+ * @param endedBy the caller that caused this vibration to end
* @param continueExternalControl indicates whether external control will continue. If not, the
* HAL will have external control turned off.
*/
@GuardedBy("mLock")
- private void endExternalVibrateLocked(Vibration.EndInfo vibrationEndInfo,
+ private void endExternalVibrateLocked(Status status, CallerInfo endedBy,
boolean continueExternalControl) {
if (mCurrentExternalVibration == null) {
return;
}
+ mCurrentExternalVibration.requestEnd(status, endedBy, /* immediate= */ true);
mCurrentExternalVibration.unlinkToDeath();
if (!continueExternalControl) {
setExternalControl(false, mCurrentExternalVibration.stats);
}
// The external control was turned off, end it and report metrics right away.
- endVibrationLocked(mCurrentExternalVibration, vibrationEndInfo,
- /* shouldWriteStats= */ true);
+ reportEndedVibrationLocked(mCurrentExternalVibration);
mCurrentExternalVibration = null;
}
@@ -2010,7 +1991,7 @@
@Override
public ExternalVibrationScale onExternalVibrationStart(ExternalVibration vib) {
- Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "onExternalVibrationStart");
+ Trace.traceBegin(TRACE_TAG_VIBRATOR, "onExternalVibrationStart");
try {
// Create Vibration.Stats as close to the received request as possible, for
// tracking.
@@ -2022,9 +2003,7 @@
synchronized (mLock) {
if (!hasExternalControlCapability()) {
- endVibrationLocked(externalVibration,
- new Vibration.EndInfo(Status.IGNORED_UNSUPPORTED),
- /* shouldWriteStats= */ true);
+ endVibrationLocked(externalVibration, Status.IGNORED_UNSUPPORTED);
return externalVibration.getScale();
}
@@ -2035,9 +2014,7 @@
Slog.w(TAG, "pkg=" + vib.getPackage() + ", uid=" + vib.getUid()
+ " tried to play externally controlled vibration"
+ " without VIBRATE permission, ignoring.");
- endVibrationLocked(externalVibration,
- new Vibration.EndInfo(Status.IGNORED_MISSING_PERMISSION),
- /* shouldWriteStats= */ true);
+ endVibrationLocked(externalVibration, Status.IGNORED_MISSING_PERMISSION);
return externalVibration.getScale();
}
@@ -2058,8 +2035,7 @@
}
if (vibrationEndInfo != null) {
- endVibrationLocked(externalVibration, vibrationEndInfo,
- /* shouldWriteStats= */ true);
+ endVibrationLocked(externalVibration, vibrationEndInfo);
return externalVibration.getScale();
}
@@ -2092,15 +2068,32 @@
// as we would need to mute the old one still if it came from a different
// controller.
alreadyUnderExternalControl = true;
- mCurrentExternalVibration.notifyEnded();
externalVibration.stats.reportInterruptedAnotherVibration(
- mCurrentExternalVibration.callerInfo);
- endExternalVibrateLocked(
- new Vibration.EndInfo(Status.CANCELLED_SUPERSEDED,
- externalVibration.callerInfo),
- /* continueExternalControl= */ true);
+ mCurrentExternalVibration.getCallerInfo());
+ endExternalVibrateLocked(Status.CANCELLED_SUPERSEDED,
+ externalVibration.callerInfo, /* continueExternalControl= */ true);
}
-
+ }
+ // Wait for lock and interact with HAL to set external control outside main lock.
+ if (waitForCompletion) {
+ if (!mVibrationThread.waitForThreadIdle(VIBRATION_CANCEL_WAIT_MILLIS)) {
+ Slog.e(TAG, "Timed out waiting for vibration to cancel");
+ synchronized (mLock) {
+ endVibrationLocked(externalVibration, Status.IGNORED_ERROR_CANCELLING);
+ return externalVibration.getScale();
+ }
+ }
+ }
+ if (!alreadyUnderExternalControl) {
+ if (DEBUG) {
+ Slog.d(TAG, "Vibrator going under external control.");
+ }
+ setExternalControl(true, externalVibration.stats);
+ }
+ synchronized (mLock) {
+ if (DEBUG) {
+ Slog.d(TAG, "Playing external vibration: " + vib);
+ }
VibrationAttributes attrs = fixupVibrationAttributes(
vib.getVibrationAttributes(),
/* effect= */ null);
@@ -2113,43 +2106,20 @@
mCurrentExternalVibration = externalVibration;
externalVibration.linkToDeath(this::onExternalVibrationBinderDied);
externalVibration.scale(mVibrationScaler, attrs.getUsage());
- }
- if (waitForCompletion) {
- if (!mVibrationThread.waitForThreadIdle(VIBRATION_CANCEL_WAIT_MILLIS)) {
- Slog.e(TAG, "Timed out waiting for vibration to cancel");
- synchronized (mLock) {
- // Trigger endExternalVibrateLocked to unlink to death recipient.
- endExternalVibrateLocked(
- new Vibration.EndInfo(Status.IGNORED_ERROR_CANCELLING),
- /* continueExternalControl= */ false);
- // Mute the request, vibration will be ignored.
- externalVibration.muteScale();
- }
- return externalVibration.getScale();
- }
+ // Vibrator will start receiving data from external channels after this point.
+ // Report current time as the vibration start time, for debugging.
+ externalVibration.stats.reportStarted();
+ return externalVibration.getScale();
}
- if (!alreadyUnderExternalControl) {
- if (DEBUG) {
- Slog.d(TAG, "Vibrator going under external control.");
- }
- setExternalControl(true, externalVibration.stats);
- }
- if (DEBUG) {
- Slog.d(TAG, "Playing external vibration: " + vib);
- }
- // Vibrator will start receiving data from external channels after this point.
- // Report current time as the vibration start time, for debugging.
- externalVibration.stats.reportStarted();
- return externalVibration.getScale();
} finally {
- Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
+ Trace.traceEnd(TRACE_TAG_VIBRATOR);
}
}
@Override
public void onExternalVibrationStop(ExternalVibration vib) {
- Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "onExternalVibrationStop");
+ Trace.traceBegin(TRACE_TAG_VIBRATOR, "onExternalVibrationStop");
try {
synchronized (mLock) {
if (mCurrentExternalVibration != null
@@ -2157,13 +2127,12 @@
if (DEBUG) {
Slog.d(TAG, "Stopping external vibration: " + vib);
}
- endExternalVibrateLocked(
- new Vibration.EndInfo(Status.FINISHED),
+ endExternalVibrateLocked(Status.FINISHED, /* endedBy= */ null,
/* continueExternalControl= */ false);
}
}
} finally {
- Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
+ Trace.traceEnd(TRACE_TAG_VIBRATOR);
}
}
@@ -2182,8 +2151,7 @@
if (DEBUG) {
Slog.d(TAG, "External vibration finished because binder died");
}
- endExternalVibrateLocked(
- new Vibration.EndInfo(Status.CANCELLED_BINDER_DIED),
+ endExternalVibrateLocked(Status.CANCELLED_BINDER_DIED, /* endedBy= */ null,
/* continueExternalControl= */ false);
}
}
@@ -2232,32 +2200,39 @@
@Override
public int onCommand(String cmd) {
- Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "onCommand " + cmd);
try {
if ("list".equals(cmd)) {
+ Trace.traceBegin(TRACE_TAG_VIBRATOR, "onCommand: list");
return runListVibrators();
}
if ("synced".equals(cmd)) {
+ Trace.traceBegin(TRACE_TAG_VIBRATOR, "onCommand: synced");
return runMono();
}
if ("combined".equals(cmd)) {
+ Trace.traceBegin(TRACE_TAG_VIBRATOR, "onCommand: combined");
return runStereo();
}
if ("sequential".equals(cmd)) {
+ Trace.traceBegin(TRACE_TAG_VIBRATOR, "onCommand: sequential");
return runSequential();
}
if ("xml".equals(cmd)) {
+ Trace.traceBegin(TRACE_TAG_VIBRATOR, "onCommand: xml");
return runXml();
}
if ("cancel".equals(cmd)) {
+ Trace.traceBegin(TRACE_TAG_VIBRATOR, "onCommand: cancel");
return runCancel();
}
if ("feedback".equals(cmd)) {
+ Trace.traceBegin(TRACE_TAG_VIBRATOR, "onCommand: feedback");
return runHapticFeedback();
}
+ Trace.traceBegin(TRACE_TAG_VIBRATOR, "onCommand: default");
return handleDefaultCommands(cmd);
} finally {
- Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
+ Trace.traceEnd(TRACE_TAG_VIBRATOR);
}
}
diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java
index bc11bac..d29ff54 100644
--- a/services/core/java/com/android/server/wm/ActivityStarter.java
+++ b/services/core/java/com/android/server/wm/ActivityStarter.java
@@ -1749,12 +1749,13 @@
mIntent.setFlags(mLaunchFlags);
boolean dreamStopping = false;
-
- for (ActivityRecord stoppingActivity : mSupervisor.mStoppingActivities) {
- if (stoppingActivity.getActivityType()
- == WindowConfiguration.ACTIVITY_TYPE_DREAM) {
- dreamStopping = true;
- break;
+ if (!com.android.window.flags.Flags.removeActivityStarterDreamCallback()) {
+ for (ActivityRecord stoppingActivity : mSupervisor.mStoppingActivities) {
+ if (stoppingActivity.getActivityType()
+ == WindowConfiguration.ACTIVITY_TYPE_DREAM) {
+ dreamStopping = true;
+ break;
+ }
}
}
@@ -1878,8 +1879,21 @@
if (mDoResume) {
if (!avoidMoveToFront()) {
mTargetRootTask.getRootTask().moveToFront("reuseOrNewTask", targetTask);
- if (!mTargetRootTask.isTopRootTaskInDisplayArea() && mService.isDreaming()
- && !dreamStopping) {
+
+ final boolean launchBehindDream;
+ if (com.android.window.flags.Flags.removeActivityStarterDreamCallback()) {
+ final TaskDisplayArea tda = mTargetRootTask.getTaskDisplayArea();
+ final Task top = (tda != null ? tda.getTopRootTask() : null);
+ launchBehindDream = (top != null && top != mTargetRootTask)
+ && top.getActivityType() == WindowConfiguration.ACTIVITY_TYPE_DREAM
+ && top.getTopNonFinishingActivity() != null;
+ } else {
+ launchBehindDream = !mTargetRootTask.isTopRootTaskInDisplayArea()
+ && mService.isDreaming()
+ && !dreamStopping;
+ }
+
+ if (launchBehindDream) {
// Launching underneath dream activity (fullscreen, always-on-top). Run the
// launch--behind transition so the Activity gets created and starts
// in visible state.
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index 6009b4a..de95d1b 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -6706,6 +6706,14 @@
synchronized (mGlobalLockWithoutBoost) {
mTaskSupervisor.getActivityMetricsLogger().notifyBindApplication(wpc.mInfo);
wpc.onConfigurationChanged(getGlobalConfiguration());
+ // Let the application initialize with consistent configuration as its activity.
+ for (int i = mStartingProcessActivities.size() - 1; i >= 0; i--) {
+ final ActivityRecord r = mStartingProcessActivities.get(i);
+ if (wpc.mUid == r.info.applicationInfo.uid && wpc.mName.equals(r.processName)) {
+ wpc.registerActivityConfigurationListener(r);
+ break;
+ }
+ }
// The "info" can be the target of instrumentation.
return new PreBindInfo(compatibilityInfoForPackageLocked(info),
new Configuration(wpc.getConfiguration()));
diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java
index 0fa1a21..e6f6215 100644
--- a/services/core/java/com/android/server/wm/DisplayPolicy.java
+++ b/services/core/java/com/android/server/wm/DisplayPolicy.java
@@ -2131,7 +2131,8 @@
final DecorInsets.Info newInfo = mDecorInsets.mTmpInfo;
final InsetsState newInsetsState = newInfo.update(mDisplayContent, rotation, dw, dh);
final DecorInsets.Info currentInfo = getDecorInsetsInfo(rotation, dw, dh);
- if (newInfo.mConfigFrame.equals(currentInfo.mConfigFrame)
+ final boolean sameConfigFrame = newInfo.mConfigFrame.equals(currentInfo.mConfigFrame);
+ if (sameConfigFrame
&& newInfo.mOverrideConfigFrame.equals(currentInfo.mOverrideConfigFrame)) {
// Even if the config frame is not changed in current rotation, it may change the
// insets in other rotations if the frame of insets source is changed.
@@ -2155,7 +2156,7 @@
}
mDecorInsets.invalidate();
mDecorInsets.mInfoForRotation[rotation].set(newInfo);
- return true;
+ return !sameConfigFrame;
}
DecorInsets.Info getDecorInsetsInfo(int rotation, int w, int h) {
diff --git a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java
index e178203..8cc2fd1 100644
--- a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java
+++ b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java
@@ -132,15 +132,15 @@
}
@Override
- protected boolean isLeashReadyForDispatching(InsetsControlTarget target) {
+ protected boolean isLeashReadyForDispatching() {
if (android.view.inputmethod.Flags.refactorInsetsController()) {
final WindowState ws =
mWindowContainer != null ? mWindowContainer.asWindowState() : null;
final boolean isDrawn = ws != null && ws.isDrawn();
- return super.isLeashReadyForDispatching(target)
+ return super.isLeashReadyForDispatching()
&& mServerVisible && isDrawn && mGivenInsetsReady;
} else {
- return super.isLeashReadyForDispatching(target);
+ return super.isLeashReadyForDispatching();
}
}
@@ -636,7 +636,7 @@
sb.append(", leash is: ").append(hasLeash ? "non-null" : "null");
if (!hasLeash) {
sb.append(", control is: ").append(mControl != null ? "non-null" : "null");
- sb.append(", mIsLeashReadyForDispatching: ").append(mIsLeashReadyForDispatching);
+ sb.append(", mIsLeashInitialized: ").append(mIsLeashInitialized);
}
sb.append(", isImeLayeringTarget: ");
sb.append(isImeLayeringTarget(mImeRequester, dcTarget));
diff --git a/services/core/java/com/android/server/wm/InsetsSourceProvider.java b/services/core/java/com/android/server/wm/InsetsSourceProvider.java
index 57b8792..4f8332a 100644
--- a/services/core/java/com/android/server/wm/InsetsSourceProvider.java
+++ b/services/core/java/com/android/server/wm/InsetsSourceProvider.java
@@ -71,7 +71,7 @@
protected @Nullable WindowContainer mWindowContainer;
protected @Nullable InsetsSourceControl mControl;
protected @Nullable InsetsControlTarget mControlTarget;
- protected boolean mIsLeashReadyForDispatching;
+ protected boolean mIsLeashInitialized;
private final Rect mTmpRect = new Rect();
private final InsetsSourceControl mFakeControl;
@@ -565,8 +565,8 @@
ANIMATION_TYPE_INSETS_CONTROL);
// The leash was just created. We cannot dispatch it until its surface transaction is
- // applied. Otherwise, the client's operation to the leash might be overwritten by us.
- mIsLeashReadyForDispatching = false;
+ // committed. Otherwise, the client's operation to the leash might be overwritten by us.
+ mIsLeashInitialized = false;
final SurfaceControl leash = mAdapter.mCapturedLeash;
mControlTarget = target;
@@ -602,7 +602,7 @@
* @param id Indicates which transaction is committed so that stale callbacks can be dropped.
*/
void onSurfaceTransactionCommitted(long id) {
- if (mIsLeashReadyForDispatching) {
+ if (mIsLeashInitialized) {
return;
}
if (mControl == null) {
@@ -611,7 +611,7 @@
if (id != getSurfaceTransactionId(mControl.getLeash())) {
return;
}
- mIsLeashReadyForDispatching = true;
+ mIsLeashInitialized = true;
mStateController.notifySurfaceTransactionReady(this, 0, false);
}
@@ -662,9 +662,12 @@
mServerVisible, mClientVisible);
}
- protected boolean isLeashReadyForDispatching(InsetsControlTarget target) {
- // If the target is not the control target, we are ready for dispatching a null-leash to it.
- return target != mControlTarget || mIsLeashReadyForDispatching;
+ protected boolean isLeashReadyForDispatching() {
+ return isLeashInitialized();
+ }
+
+ boolean isLeashInitialized() {
+ return mIsLeashInitialized;
}
/**
@@ -677,7 +680,7 @@
@Nullable
InsetsSourceControl getControl(InsetsControlTarget target) {
if (target == mControlTarget) {
- if (!isLeashReadyForDispatching(target) && mControl != null) {
+ if (!isLeashReadyForDispatching() && mControl != null) {
// The surface transaction of preparing leash is not applied yet. We don't send it
// to the client in case that the client applies its transaction sooner than ours
// that we could unexpectedly overwrite the surface state.
@@ -702,7 +705,7 @@
*/
@Nullable
protected SurfaceControl getLeash(@NonNull InsetsControlTarget target) {
- return target == mControlTarget && mIsLeashReadyForDispatching && mControl != null
+ return target == mControlTarget && mIsLeashInitialized && mControl != null
? mControl.getLeash() : null;
}
@@ -751,7 +754,7 @@
pw.println();
}
pw.print(prefix);
- pw.print("mIsLeashReadyForDispatching="); pw.print(mIsLeashReadyForDispatching);
+ pw.print("mIsLeashInitialized="); pw.print(mIsLeashInitialized);
pw.print(" mHasPendingPosition="); pw.print(mHasPendingPosition);
pw.println();
if (mWindowContainer != null) {
@@ -797,7 +800,7 @@
if (mAdapter != null && mAdapter.mCapturedLeash != null) {
mAdapter.mCapturedLeash.dumpDebug(proto, CAPTURED_LEASH);
}
- proto.write(IS_LEASH_READY_FOR_DISPATCHING, mIsLeashReadyForDispatching);
+ proto.write(IS_LEASH_READY_FOR_DISPATCHING, isLeashReadyForDispatching());
proto.write(CLIENT_VISIBLE, mClientVisible);
proto.write(SERVER_VISIBLE, mServerVisible);
proto.write(SEAMLESS_ROTATING, mSeamlessRotating);
diff --git a/services/core/java/com/android/server/wm/InsetsStateController.java b/services/core/java/com/android/server/wm/InsetsStateController.java
index 3e39a45..03fadba 100644
--- a/services/core/java/com/android/server/wm/InsetsStateController.java
+++ b/services/core/java/com/android/server/wm/InsetsStateController.java
@@ -420,7 +420,7 @@
final ArrayList<InsetsSourceProvider> providers = pendingControlMap.valueAt(i);
for (int p = providers.size() - 1; p >= 0; p--) {
final InsetsSourceProvider provider = providers.get(p);
- if (provider.isLeashReadyForDispatching(target)) {
+ if (provider.isLeashInitialized() || provider.getControlTarget() != target) {
// Stop waiting for this provider.
providers.remove(p);
}
diff --git a/services/core/java/com/android/server/wm/LaunchParamsPersister.java b/services/core/java/com/android/server/wm/LaunchParamsPersister.java
index 2394da9..4aa4f22 100644
--- a/services/core/java/com/android/server/wm/LaunchParamsPersister.java
+++ b/services/core/java/com/android/server/wm/LaunchParamsPersister.java
@@ -22,6 +22,7 @@
import android.content.pm.PackageManagerInternal;
import android.graphics.Rect;
import android.os.Environment;
+import android.os.Process;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.AtomicFile;
@@ -50,6 +51,9 @@
import java.util.Map;
import java.util.Objects;
import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.FutureTask;
import java.util.function.IntFunction;
/**
@@ -84,6 +88,12 @@
private PackageList mPackageList;
/**
+ * A map from user ID to the active {@link LoadingTask} when we're loading the launch params for
+ * that user.
+ */
+ private final SparseArray<LoadingTask> mLoadingTaskMap = new SparseArray<>();
+
+ /**
* A dual layer map that first maps user ID to a secondary map, which maps component name (the
* launching activity of tasks) to {@link PersistableLaunchParams} that stores launch metadata
* that are stable across reboots.
@@ -117,113 +127,33 @@
}
void onUnlockUser(int userId) {
- loadLaunchParams(userId);
- }
-
- void onCleanupUser(int userId) {
- mLaunchParamsMap.remove(userId);
- }
-
- private void loadLaunchParams(int userId) {
- final List<File> filesToDelete = new ArrayList<>();
- final File launchParamsFolder = getLaunchParamFolder(userId);
- if (!launchParamsFolder.isDirectory()) {
- Slog.i(TAG, "Didn't find launch param folder for user " + userId);
+ if (mLoadingTaskMap.contains(userId)) {
+ Slog.e(TAG, "Duplicated onUnlockUser " + userId);
return;
}
- final Set<String> packages = new ArraySet<>(mPackageList.getPackageNames());
+ final LoadingTask task = new LoadingTask(userId);
+ mLoadingTaskMap.put(userId, task);
+ task.execute();
+ }
- final File[] paramsFiles = launchParamsFolder.listFiles();
- final ArrayMap<ComponentName, PersistableLaunchParams> map =
- new ArrayMap<>(paramsFiles.length);
+ void onCleanupUser(int userId) {
+ // There is no need to abort the task itself. Just let the loading task finish silently
+ // without modifying any state.
+ mLoadingTaskMap.remove(userId);
+ mLaunchParamsMap.remove(userId);
+ }
+
+ private void waitAndMoveResultIfLoading(int userId) {
+ final LoadingTask task = mLoadingTaskMap.removeReturnOld(userId);
+ if (task == null) {
+ return;
+ }
+ final ArrayMap<ComponentName, PersistableLaunchParams> map = task.get();
+ if (map == null) {
+ return;
+ }
mLaunchParamsMap.put(userId, map);
-
- for (File paramsFile : paramsFiles) {
- if (!paramsFile.isFile()) {
- Slog.w(TAG, paramsFile.getAbsolutePath() + " is not a file.");
- continue;
- }
- if (!paramsFile.getName().endsWith(LAUNCH_PARAMS_FILE_SUFFIX)) {
- Slog.w(TAG, "Unexpected params file name: " + paramsFile.getName());
- filesToDelete.add(paramsFile);
- continue;
- }
- String paramsFileName = paramsFile.getName();
- // Migrate all records from old separator to new separator.
- final int oldSeparatorIndex =
- paramsFileName.indexOf(OLD_ESCAPED_COMPONENT_SEPARATOR);
- if (oldSeparatorIndex != -1) {
- if (paramsFileName.indexOf(
- OLD_ESCAPED_COMPONENT_SEPARATOR, oldSeparatorIndex + 1) != -1) {
- // Rare case. We have more than one old escaped component separator probably
- // because this app uses underscore in their package name. We can't distinguish
- // which one is the real separator so let's skip it.
- filesToDelete.add(paramsFile);
- continue;
- }
- paramsFileName = paramsFileName.replace(
- OLD_ESCAPED_COMPONENT_SEPARATOR, ESCAPED_COMPONENT_SEPARATOR);
- final File newFile = new File(launchParamsFolder, paramsFileName);
- if (paramsFile.renameTo(newFile)) {
- paramsFile = newFile;
- } else {
- // Rare case. For some reason we can't rename the file. Let's drop this record
- // instead.
- filesToDelete.add(paramsFile);
- continue;
- }
- }
- final String componentNameString = paramsFileName.substring(
- 0 /* beginIndex */,
- paramsFileName.length() - LAUNCH_PARAMS_FILE_SUFFIX.length())
- .replace(ESCAPED_COMPONENT_SEPARATOR, ORIGINAL_COMPONENT_SEPARATOR);
- final ComponentName name = ComponentName.unflattenFromString(
- componentNameString);
- if (name == null) {
- Slog.w(TAG, "Unexpected file name: " + paramsFileName);
- filesToDelete.add(paramsFile);
- continue;
- }
-
- if (!packages.contains(name.getPackageName())) {
- // Rare case. PersisterQueue doesn't have a chance to remove files for removed
- // packages last time.
- filesToDelete.add(paramsFile);
- continue;
- }
-
- try (InputStream in = new FileInputStream(paramsFile)) {
- final PersistableLaunchParams params = new PersistableLaunchParams();
- final TypedXmlPullParser parser = Xml.resolvePullParser(in);
- int event;
- while ((event = parser.next()) != XmlPullParser.END_DOCUMENT
- && event != XmlPullParser.END_TAG) {
- if (event != XmlPullParser.START_TAG) {
- continue;
- }
-
- final String tagName = parser.getName();
- if (!TAG_LAUNCH_PARAMS.equals(tagName)) {
- Slog.w(TAG, "Unexpected tag name: " + tagName);
- continue;
- }
-
- params.restore(paramsFile, parser);
- }
-
- map.put(name, params);
- addComponentNameToLaunchParamAffinityMapIfNotNull(
- name, params.mWindowLayoutAffinity);
- } catch (Exception e) {
- Slog.w(TAG, "Failed to restore launch params for " + name, e);
- filesToDelete.add(paramsFile);
- }
- }
-
- if (!filesToDelete.isEmpty()) {
- mPersisterQueue.addItem(new CleanUpComponentQueueItem(filesToDelete), true);
- }
}
void saveTask(Task task) {
@@ -236,6 +166,7 @@
return;
}
final int userId = task.mUserId;
+ waitAndMoveResultIfLoading(userId);
PersistableLaunchParams params;
ArrayMap<ComponentName, PersistableLaunchParams> map = mLaunchParamsMap.get(userId);
if (map == null) {
@@ -297,6 +228,7 @@
void getLaunchParams(Task task, ActivityRecord activity, LaunchParams outParams) {
final ComponentName name = task != null ? task.realActivity : activity.mActivityComponent;
final int userId = task != null ? task.mUserId : activity.mUserId;
+ waitAndMoveResultIfLoading(userId);
final String windowLayoutAffinity;
if (task != null) {
windowLayoutAffinity = task.mWindowLayoutAffinity;
@@ -394,6 +326,137 @@
}
}
+ private class LoadingTask
+ implements Callable<ArrayMap<ComponentName, PersistableLaunchParams>> {
+ private final int mUserId;
+ private final FutureTask<ArrayMap<ComponentName, PersistableLaunchParams>> mFutureTask;
+
+ private LoadingTask(int userId) {
+ mUserId = userId;
+ mFutureTask = new FutureTask<>(this);
+ }
+
+ private void execute() {
+ new Thread(mFutureTask).start();
+ }
+
+ private ArrayMap<ComponentName, PersistableLaunchParams> get() {
+ try {
+ return mFutureTask.get();
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ } catch (ExecutionException e) {
+ Slog.e(TAG, "Failed to load launch params for user#" + mUserId, e);
+ return null;
+ }
+ }
+
+ @Override
+ public ArrayMap<ComponentName, PersistableLaunchParams> call() {
+ Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
+
+ final List<File> filesToDelete = new ArrayList<>();
+ final File launchParamsFolder = getLaunchParamFolder(mUserId);
+ if (!launchParamsFolder.isDirectory()) {
+ Slog.i(TAG, "Didn't find launch param folder for user " + mUserId);
+ return null;
+ }
+
+ final Set<String> packages = new ArraySet<>(mPackageList.getPackageNames());
+
+ final File[] paramsFiles = launchParamsFolder.listFiles();
+ final ArrayMap<ComponentName, PersistableLaunchParams> map =
+ new ArrayMap<>(paramsFiles.length);
+
+ for (File paramsFile : paramsFiles) {
+ if (!paramsFile.isFile()) {
+ Slog.w(TAG, paramsFile.getAbsolutePath() + " is not a file.");
+ continue;
+ }
+ if (!paramsFile.getName().endsWith(LAUNCH_PARAMS_FILE_SUFFIX)) {
+ Slog.w(TAG, "Unexpected params file name: " + paramsFile.getName());
+ filesToDelete.add(paramsFile);
+ continue;
+ }
+ String paramsFileName = paramsFile.getName();
+ // Migrate all records from old separator to new separator.
+ final int oldSeparatorIndex =
+ paramsFileName.indexOf(OLD_ESCAPED_COMPONENT_SEPARATOR);
+ if (oldSeparatorIndex != -1) {
+ if (paramsFileName.indexOf(
+ OLD_ESCAPED_COMPONENT_SEPARATOR, oldSeparatorIndex + 1) != -1) {
+ // Rare case. We have more than one old escaped component separator probably
+ // because this app uses underscore in their package name. We can't
+ // distinguish which one is the real separator so let's skip it.
+ filesToDelete.add(paramsFile);
+ continue;
+ }
+ paramsFileName = paramsFileName.replace(
+ OLD_ESCAPED_COMPONENT_SEPARATOR, ESCAPED_COMPONENT_SEPARATOR);
+ final File newFile = new File(launchParamsFolder, paramsFileName);
+ if (paramsFile.renameTo(newFile)) {
+ paramsFile = newFile;
+ } else {
+ // Rare case. For some reason we can't rename the file. Let's drop this
+ // record instead.
+ filesToDelete.add(paramsFile);
+ continue;
+ }
+ }
+ final String componentNameString = paramsFileName.substring(
+ 0 /* beginIndex */,
+ paramsFileName.length() - LAUNCH_PARAMS_FILE_SUFFIX.length())
+ .replace(ESCAPED_COMPONENT_SEPARATOR, ORIGINAL_COMPONENT_SEPARATOR);
+ final ComponentName name = ComponentName.unflattenFromString(
+ componentNameString);
+ if (name == null) {
+ Slog.w(TAG, "Unexpected file name: " + paramsFileName);
+ filesToDelete.add(paramsFile);
+ continue;
+ }
+
+ if (!packages.contains(name.getPackageName())) {
+ // Rare case. PersisterQueue doesn't have a chance to remove files for removed
+ // packages last time.
+ filesToDelete.add(paramsFile);
+ continue;
+ }
+
+ try (InputStream in = new FileInputStream(paramsFile)) {
+ final PersistableLaunchParams params = new PersistableLaunchParams();
+ final TypedXmlPullParser parser = Xml.resolvePullParser(in);
+ int event;
+ while ((event = parser.next()) != XmlPullParser.END_DOCUMENT
+ && event != XmlPullParser.END_TAG) {
+ if (event != XmlPullParser.START_TAG) {
+ continue;
+ }
+
+ final String tagName = parser.getName();
+ if (!TAG_LAUNCH_PARAMS.equals(tagName)) {
+ Slog.w(TAG, "Unexpected tag name: " + tagName);
+ continue;
+ }
+
+ params.restore(paramsFile, parser);
+ }
+
+ map.put(name, params);
+ addComponentNameToLaunchParamAffinityMapIfNotNull(
+ name, params.mWindowLayoutAffinity);
+ } catch (Exception e) {
+ Slog.w(TAG, "Failed to restore launch params for " + name, e);
+ filesToDelete.add(paramsFile);
+ }
+ }
+
+ if (!filesToDelete.isEmpty()) {
+ mPersisterQueue.addItem(new CleanUpComponentQueueItem(filesToDelete), true);
+ }
+ return map;
+ }
+ }
+
private class LaunchParamsWriteQueueItem
implements PersisterQueue.WriteQueueItem<LaunchParamsWriteQueueItem> {
private final int mUserId;
@@ -466,7 +529,7 @@
}
}
- private class CleanUpComponentQueueItem implements PersisterQueue.WriteQueueItem {
+ private static class CleanUpComponentQueueItem implements PersisterQueue.WriteQueueItem {
private final List<File> mComponentFiles;
private CleanUpComponentQueueItem(List<File> componentFiles) {
@@ -483,7 +546,7 @@
}
}
- private class PersistableLaunchParams {
+ private static class PersistableLaunchParams {
private static final String ATTR_WINDOWING_MODE = "windowing_mode";
private static final String ATTR_DISPLAY_UNIQUE_ID = "display_unique_id";
private static final String ATTR_BOUNDS = "bounds";
diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java
index 0a47522..2451ca8 100644
--- a/services/core/java/com/android/server/wm/Transition.java
+++ b/services/core/java/com/android/server/wm/Transition.java
@@ -1356,6 +1356,11 @@
mController.mAtm.setLastResumedActivityUncheckLocked(ar,
"transitionFinished");
}
+
+ // Prevent spurious background app switches.
+ if (ar.mDisplayContent.mFocusedApp == ar) {
+ mController.mAtm.stopAppSwitches();
+ }
}
continue;
}
@@ -1410,8 +1415,6 @@
if (enterAutoPip) {
mController.mAtm.getTaskChangeNotificationController().notifyTaskStackChanged();
}
- // Prevent spurious background app switches.
- mController.mAtm.stopAppSwitches();
// The end of transient launch may not reorder task, so make sure to compute the latest
// task rank according to the current visibility.
mController.mAtm.mRootWindowContainer.rankTaskLayers();
@@ -3498,14 +3501,14 @@
}
boolean hasChanged() {
+ final boolean currVisible = mContainer.isVisibleRequested();
// the task including transient launch must promote to root task
- if ((mFlags & ChangeInfo.FLAG_TRANSIENT_LAUNCH) != 0
- || (mFlags & ChangeInfo.FLAG_ABOVE_TRANSIENT_LAUNCH) != 0) {
+ if (currVisible && ((mFlags & ChangeInfo.FLAG_TRANSIENT_LAUNCH) != 0
+ || (mFlags & ChangeInfo.FLAG_ABOVE_TRANSIENT_LAUNCH) != 0)) {
return true;
}
// If it's invisible and hasn't changed visibility, always return false since even if
// something changed, it wouldn't be a visible change.
- final boolean currVisible = mContainer.isVisibleRequested();
if (currVisible == mVisible && !mVisible) return false;
return currVisible != mVisible
|| mKnownConfigChanges != 0
diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java
index 32fe303..2d9e848 100644
--- a/services/core/java/com/android/server/wm/WindowProcessController.java
+++ b/services/core/java/com/android/server/wm/WindowProcessController.java
@@ -1543,6 +1543,11 @@
unregisterConfigurationListeners();
mConfigActivityRecord = activityRecord;
activityRecord.registerConfigurationChangeListener(this);
+ // If the process hasn't attached, make sure that prepareConfigurationForLaunchingActivity
+ // will use the newer configuration sequence.
+ if (mThread == null) {
+ mHasPendingConfigurationChange = true;
+ }
}
private void unregisterActivityConfigurationListener() {
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 6314b85..b6a4481 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -3515,6 +3515,48 @@
return true;
}
+ @GuardedBy("getLockObject()")
+ private boolean maybeMigrateResetPasswordTokenLocked(String backupId) {
+ if (!Flags.resetPasswordWithTokenCoexistence()) {
+ Slog.i(LOG_TAG, "ResetPasswordWithToken not migrated because coexistence "
+ + "support is not enabled.");
+ return false;
+ }
+ if (mOwners.isResetPasswordWithTokenMigrated()) {
+ // TODO(b/359187209): Remove log after Flags.resetPasswordWithTokenCoexistence full
+ // rollout.
+ Slog.v(LOG_TAG, "ResetPasswordWithToken was previously migrated to "
+ + "policy engine.");
+ return false;
+ }
+
+ Slog.i(LOG_TAG, "Migrating ResetPasswordWithToken to policy engine");
+
+ // Create backup if none exists
+ mDevicePolicyEngine.createBackup(backupId);
+ try {
+ iterateThroughDpcAdminsLocked((admin, enforcingAdmin) -> {
+ int userId = enforcingAdmin.getUserId();
+ DevicePolicyData policy = getUserData(userId);
+ if (policy.mPasswordTokenHandle != 0) {
+ Slog.i(LOG_TAG, "Setting RESET_PASSWORD_TOKEN policy");
+ mDevicePolicyEngine.setLocalPolicy(
+ PolicyDefinition.RESET_PASSWORD_TOKEN,
+ enforcingAdmin,
+ new LongPolicyValue(policy.mPasswordTokenHandle),
+ userId);
+ }
+ });
+ } catch (Exception e) {
+ Slog.wtf(LOG_TAG,
+ "Failed to migrate ResetPasswordWithToken to policy engine", e);
+ }
+
+ Slog.i(LOG_TAG, "Marking ResetPasswordWithToken migration complete");
+ mOwners.markResetPasswordWithTokenMigrated();
+ return true;
+ }
+
/** Register callbacks for statsd pulled atoms. */
private void registerStatsCallbacks() {
final StatsManager statsManager = mContext.getSystemService(StatsManager.class);
@@ -6395,7 +6437,7 @@
@Override
public void lockNow(int flags, String callerPackageName, boolean parent) {
CallerIdentity caller;
- if (isUnicornFlagEnabled()) {
+ if (Flags.lockNowCoexistence()) {
caller = getCallerIdentity(callerPackageName);
} else {
caller = getCallerIdentity();
@@ -6407,7 +6449,7 @@
ActiveAdmin admin;
// Make sure the caller has any active admin with the right policy or
// the required permission.
- if (isUnicornFlagEnabled()) {
+ if (Flags.lockNowCoexistence()) {
admin = enforcePermissionsAndGetEnforcingAdmin(
/* admin= */ null,
/* permissions= */ new String[]{MANAGE_DEVICE_POLICY_LOCK, LOCK_DEVICE},
@@ -9179,13 +9221,13 @@
}
CallerIdentity caller;
- if (isUnicornFlagEnabled()) {
+ if (Flags.setAutoTimeEnabledCoexistence()) {
caller = getCallerIdentity(who, callerPackageName);
} else {
caller = getCallerIdentity(who);
}
- if (isUnicornFlagEnabled()) {
+ if (Flags.setAutoTimeEnabledCoexistence()) {
// The effect of this policy is device-wide.
enforcePermission(SET_TIME, caller.getPackageName(), UserHandle.USER_ALL);
} else {
@@ -9213,13 +9255,13 @@
return false;
}
CallerIdentity caller;
- if (isUnicornFlagEnabled()) {
+ if (Flags.setAutoTimeEnabledCoexistence()) {
caller = getCallerIdentity(who, callerPackageName);
} else {
caller = getCallerIdentity(who);
}
- if (isUnicornFlagEnabled()) {
+ if (Flags.setAutoTimeEnabledCoexistence()) {
enforceCanQuery(SET_TIME, caller.getPackageName(), UserHandle.USER_ALL);
} else {
Objects.requireNonNull(who, "ComponentName is null");
@@ -9242,13 +9284,13 @@
}
CallerIdentity caller;
- if (isUnicornFlagEnabled()) {
+ if (Flags.setAutoTimeZoneEnabledCoexistence()) {
caller = getCallerIdentity(who, callerPackageName);
} else {
caller = getCallerIdentity(who);
}
- if (isUnicornFlagEnabled()) {
+ if (Flags.setAutoTimeZoneEnabledCoexistence()) {
// The effect of this policy is device-wide.
EnforcingAdmin enforcingAdmin = enforcePermissionAndGetEnforcingAdmin(
who,
@@ -9288,13 +9330,13 @@
}
CallerIdentity caller;
- if (isUnicornFlagEnabled()) {
+ if (Flags.setAutoTimeZoneEnabledCoexistence()) {
caller = getCallerIdentity(who, callerPackageName);
} else {
caller = getCallerIdentity(who);
}
- if (isUnicornFlagEnabled()) {
+ if (Flags.setAutoTimeZoneEnabledCoexistence()) {
// The effect of this policy is device-wide.
enforceCanQuery(SET_TIME_ZONE, caller.getPackageName(), UserHandle.USER_ALL);
} else {
@@ -9544,7 +9586,7 @@
}
CallerIdentity caller;
- if (isUnicornFlagEnabled()) {
+ if (Flags.setKeyguardDisabledFeaturesCoexistence()) {
caller = getCallerIdentity(who, callerPackageName);
} else {
caller = getCallerIdentity(who);
@@ -9554,7 +9596,7 @@
final int userHandle = caller.getUserId();
int affectedUserId = parent ? getProfileParentId(userHandle) : userHandle;
synchronized (getLockObject()) {
- if (isUnicornFlagEnabled()) {
+ if (Flags.setKeyguardDisabledFeaturesCoexistence()) {
// SUPPORT USES_POLICY_DISABLE_KEYGUARD_FEATURES
EnforcingAdmin admin = enforcePermissionAndGetEnforcingAdmin(
who, MANAGE_DEVICE_POLICY_KEYGUARD, caller.getPackageName(),
@@ -9633,7 +9675,7 @@
synchronized (getLockObject()) {
if (who != null) {
- if (isUnicornFlagEnabled()) {
+ if (Flags.setKeyguardDisabledFeaturesCoexistence()) {
EnforcingAdmin admin = getEnforcingAdminForPackage(
who, who.getPackageName(), userHandle);
Integer features = mDevicePolicyEngine.getLocalPolicySetByAdmin(
@@ -9652,7 +9694,7 @@
// the different behaviour between a profile with separate challenge vs a profile with
// unified challenge, which was part of getActiveAdminsForLockscreenPoliciesLocked()
// before the migration.
- if (isUnicornFlagEnabled()) {
+ if (Flags.setKeyguardDisabledFeaturesCoexistence()) {
Integer features = mDevicePolicyEngine.getResolvedPolicy(
PolicyDefinition.KEYGUARD_DISABLED_FEATURES,
affectedUserId);
@@ -11845,7 +11887,7 @@
throw new IllegalArgumentException("Invalid package name: " + validationResult);
}
- if (isUnicornFlagEnabled()) {
+ if (Flags.setApplicationRestrictionsCoexistence()) {
EnforcingAdmin enforcingAdmin = enforcePermissionAndGetEnforcingAdmin(
who,
MANAGE_DEVICE_POLICY_APP_RESTRICTIONS,
@@ -13228,7 +13270,10 @@
String packageName, boolean parent) {
final CallerIdentity caller = getCallerIdentity(who, callerPackage);
- if (isUnicornFlagEnabled()) {
+ // IMPORTANT: The code behind the if branch is OUTDATED and requires additional work before
+ // enabling the feature flag below.
+ // TODO(b/369141952): Update DPM.getApplicationRestrictions coexistence code
+ if (Flags.setApplicationRestrictionsCoexistence()) {
EnforcingAdmin enforcingAdmin = enforceCanQueryAndGetEnforcingAdmin(
who,
MANAGE_DEVICE_POLICY_APP_RESTRICTIONS,
@@ -13328,21 +13373,12 @@
final CallerIdentity caller = getCallerIdentity(who, callerPackage);
ActiveAdmin admin;
- if (isUnicornFlagEnabled()) {
- EnforcingAdmin enforcingAdmin = enforcePermissionAndGetEnforcingAdmin(
- who,
- MANAGE_DEVICE_POLICY_PACKAGE_STATE,
- caller.getPackageName(),
- caller.getUserId());
- admin = enforcingAdmin.getActiveAdmin();
- } else {
- Preconditions.checkCallAuthorization((caller.hasAdminComponent()
- && (isProfileOwner(caller) || isDefaultDeviceOwner(caller)))
- || (caller.hasPackage() && isCallerDelegate(caller,
- DELEGATION_PACKAGE_ACCESS)));
- synchronized (getLockObject()) {
- admin = getProfileOwnerOrDeviceOwnerLocked(caller.getUserId());
- }
+ Preconditions.checkCallAuthorization((caller.hasAdminComponent()
+ && (isProfileOwner(caller) || isDefaultDeviceOwner(caller)))
+ || (caller.hasPackage() && isCallerDelegate(caller,
+ DELEGATION_PACKAGE_ACCESS)));
+ synchronized (getLockObject()) {
+ admin = getProfileOwnerOrDeviceOwnerLocked(caller.getUserId());
}
checkCanExecuteOrThrowUnsafe(DevicePolicyManager.OPERATION_SET_PACKAGES_SUSPENDED);
@@ -15585,12 +15621,12 @@
public boolean setStatusBarDisabled(ComponentName who, String callerPackageName,
boolean disabled) {
CallerIdentity caller;
- if (isUnicornFlagEnabled()) {
+ if (isSetStatusBarDisabledCoexistenceEnabled()) {
caller = getCallerIdentity(who, callerPackageName);
} else {
caller = getCallerIdentity(who);
}
- if (isUnicornFlagEnabled()) {
+ if (isSetStatusBarDisabledCoexistenceEnabled()) {
enforcePermission(MANAGE_DEVICE_POLICY_STATUS_BAR, caller.getPackageName(),
UserHandle.USER_ALL);
} else {
@@ -15601,7 +15637,7 @@
int userId = caller.getUserId();
synchronized (getLockObject()) {
- if (!isUnicornFlagEnabled()) {
+ if (!isSetStatusBarDisabledCoexistenceEnabled()) {
Preconditions.checkCallAuthorization(isUserAffiliatedWithDeviceLocked(userId),
"Admin " + who + " is neither the device owner or affiliated "
+ "user's profile owner.");
@@ -15660,7 +15696,7 @@
@Override
public boolean isStatusBarDisabled(String callerPackage) {
final CallerIdentity caller = getCallerIdentity(callerPackage);
- if (isUnicornFlagEnabled()) {
+ if (isSetStatusBarDisabledCoexistenceEnabled()) {
enforceCanQuery(
MANAGE_DEVICE_POLICY_STATUS_BAR, caller.getPackageName(), caller.getUserId());
} else {
@@ -15670,7 +15706,7 @@
int userId = caller.getUserId();
synchronized (getLockObject()) {
- if (!isUnicornFlagEnabled()) {
+ if (!isSetStatusBarDisabledCoexistenceEnabled()) {
Preconditions.checkCallAuthorization(isUserAffiliatedWithDeviceLocked(userId),
"Admin " + callerPackage
+ " is neither the device owner or affiliated user's profile owner.");
@@ -16862,7 +16898,7 @@
}
}
EnforcingAdmin enforcingAdmin;
- if (isUnicornFlagEnabled()) {
+ if (Flags.setPermissionGrantStateCoexistence()) {
enforcingAdmin = enforcePermissionAndGetEnforcingAdmin(
admin,
MANAGE_DEVICE_POLICY_RUNTIME_PERMISSIONS,
@@ -17047,7 +17083,7 @@
public int getPermissionGrantState(ComponentName admin, String callerPackage,
String packageName, String permission) throws RemoteException {
final CallerIdentity caller = getCallerIdentity(admin, callerPackage);
- if (isUnicornFlagEnabled()) {
+ if (Flags.setPermissionGrantStateCoexistence()) {
enforceCanQuery(MANAGE_DEVICE_POLICY_RUNTIME_PERMISSIONS, caller.getPackageName(),
caller.getUserId());
} else {
@@ -19331,14 +19367,14 @@
throw new IllegalArgumentException("token must be at least 32-byte long");
}
CallerIdentity caller;
- if (isUnicornFlagEnabled()) {
+ if (Flags.resetPasswordWithTokenCoexistence()) {
caller = getCallerIdentity(admin, callerPackageName);
} else {
caller = getCallerIdentity(admin);
}
final int userId = caller.getUserId();
- if (isUnicornFlagEnabled()) {
+ if (Flags.resetPasswordWithTokenCoexistence()) {
EnforcingAdmin enforcingAdmin = enforcePermissionAndGetEnforcingAdmin(
admin,
MANAGE_DEVICE_POLICY_RESET_PASSWORD,
@@ -19351,6 +19387,10 @@
long tokenHandle = addEscrowToken(
token, currentTokenHandle == null ? 0 : currentTokenHandle, userId);
if (tokenHandle == 0) {
+ mDevicePolicyEngine.removeLocalPolicy(
+ PolicyDefinition.RESET_PASSWORD_TOKEN,
+ enforcingAdmin,
+ userId);
return false;
}
mDevicePolicyEngine.setLocalPolicy(
@@ -19394,7 +19434,7 @@
return false;
}
CallerIdentity caller;
- if (isUnicornFlagEnabled()) {
+ if (Flags.resetPasswordWithTokenCoexistence()) {
caller = getCallerIdentity(admin, callerPackageName);
} else {
caller = getCallerIdentity(admin);
@@ -19402,7 +19442,7 @@
final int userId = caller.getUserId();
boolean result = false;
- if (isUnicornFlagEnabled()) {
+ if (Flags.resetPasswordWithTokenCoexistence()) {
EnforcingAdmin enforcingAdmin = enforcePermissionAndGetEnforcingAdmin(
admin,
MANAGE_DEVICE_POLICY_RESET_PASSWORD,
@@ -19441,14 +19481,14 @@
return false;
}
CallerIdentity caller;
- if (isUnicornFlagEnabled()) {
+ if (Flags.resetPasswordWithTokenCoexistence()) {
caller = getCallerIdentity(admin, callerPackageName);
} else {
caller = getCallerIdentity(admin);
}
int userId = caller.getUserId();
- if (isUnicornFlagEnabled()) {
+ if (Flags.resetPasswordWithTokenCoexistence()) {
EnforcingAdmin enforcingAdmin = enforcePermissionAndGetEnforcingAdmin(
admin,
MANAGE_DEVICE_POLICY_RESET_PASSWORD,
@@ -19490,7 +19530,7 @@
Objects.requireNonNull(token);
CallerIdentity caller;
- if (isUnicornFlagEnabled()) {
+ if (Flags.resetPasswordWithTokenCoexistence()) {
caller = getCallerIdentity(admin, callerPackageName);
} else {
caller = getCallerIdentity(admin);
@@ -19500,7 +19540,7 @@
boolean result = false;
final String password = passwordOrNull != null ? passwordOrNull : "";
- if (isUnicornFlagEnabled()) {
+ if (Flags.resetPasswordWithTokenCoexistence()) {
EnforcingAdmin enforcingAdmin = enforcePermissionAndGetEnforcingAdmin(
admin,
MANAGE_DEVICE_POLICY_RESET_PASSWORD,
@@ -19531,7 +19571,7 @@
}
if (result) {
- if (isUnicornFlagEnabled()) {
+ if (Flags.resetPasswordWithTokenCoexistence()) {
DevicePolicyEventLogger
.createEvent(DevicePolicyEnums.RESET_PASSWORD_WITH_TOKEN)
.setAdmin(callerPackageName)
@@ -23812,7 +23852,7 @@
DEFAULT_VALUE_PERMISSION_BASED_ACCESS_FLAG);
}
- static boolean isUnicornFlagEnabled() {
+ private static boolean isSetStatusBarDisabledCoexistenceEnabled() {
return false;
}
@@ -24255,8 +24295,11 @@
synchronized (getLockObject()) {
Slogf.i(LOG_TAG,
"Started device policies migration to the device policy engine.");
- if (isUnicornFlagEnabled()) {
+ // TODO(b/359188869): Move this to the current migration method.
+ if (Flags.setAutoTimeZoneEnabledCoexistence()) {
migrateAutoTimezonePolicy();
+ }
+ if (Flags.setPermissionGrantStateCoexistence()) {
migratePermissionGrantStatePolicies();
}
migratePermittedInputMethodsPolicyLocked();
@@ -24283,12 +24326,21 @@
maybeMigrateSecurityLoggingPolicyLocked();
// ID format: <sdk-int>.<auto_increment_id>.<descriptions>'
String unmanagedBackupId = "35.1.unmanaged-mode";
- boolean migrated = false;
- migrated = migrated | maybeMigrateRequiredPasswordComplexityLocked(unmanagedBackupId);
- migrated = migrated | maybeMigrateSuspendedPackagesLocked(unmanagedBackupId);
- if (migrated) {
+ boolean unmanagedMigrated = false;
+ unmanagedMigrated =
+ unmanagedMigrated | maybeMigrateRequiredPasswordComplexityLocked(unmanagedBackupId);
+ unmanagedMigrated =
+ unmanagedMigrated | maybeMigrateSuspendedPackagesLocked(unmanagedBackupId);
+ if (unmanagedMigrated) {
Slogf.i(LOG_TAG, "Backup made: " + unmanagedBackupId);
}
+
+ String supervisionBackupId = "36.2.supervision-support";
+ boolean supervisionMigrated = maybeMigrateResetPasswordTokenLocked(supervisionBackupId);
+ if (supervisionMigrated) {
+ Slogf.i(LOG_TAG, "Backup made: " + supervisionBackupId);
+ }
+
// Additional migration steps should repeat the pattern above with a new backupId.
}
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/Owners.java b/services/devicepolicy/java/com/android/server/devicepolicy/Owners.java
index 3f9605a..b3c8408 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/Owners.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/Owners.java
@@ -669,6 +669,19 @@
}
}
+ void markResetPasswordWithTokenMigrated() {
+ synchronized (mData) {
+ mData.mResetPasswordWithTokenMigrated = true;
+ mData.writeDeviceOwner();
+ }
+ }
+
+ boolean isResetPasswordWithTokenMigrated() {
+ synchronized (mData) {
+ return mData.mResetPasswordWithTokenMigrated;
+ }
+ }
+
@GuardedBy("mData")
void pushToAppOpsLocked() {
if (!mSystemReady) {
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/OwnersData.java b/services/devicepolicy/java/com/android/server/devicepolicy/OwnersData.java
index 87fd002..10e43d9 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/OwnersData.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/OwnersData.java
@@ -91,6 +91,8 @@
private static final String ATTR_REQUIRED_PASSWORD_COMPLEXITY_MIGRATED =
"passwordComplexityMigrated";
private static final String ATTR_SUSPENDED_PACKAGES_MIGRATED = "suspendedPackagesMigrated";
+ private static final String ATTR_RESET_PASSWORD_WITH_TOKEN_MIGRATED =
+ "resetPasswordWithTokenMigrated";
private static final String ATTR_MIGRATED_POST_UPGRADE = "migratedPostUpgrade";
// Internal state for the device owner package.
@@ -122,6 +124,7 @@
boolean mSecurityLoggingMigrated = false;
boolean mRequiredPasswordComplexityMigrated = false;
boolean mSuspendedPackagesMigrated = false;
+ boolean mResetPasswordWithTokenMigrated = false;
boolean mPoliciesMigratedPostUpdate = false;
@@ -417,7 +420,10 @@
mSuspendedPackagesMigrated);
}
-
+ if (Flags.resetPasswordWithTokenCoexistence()) {
+ out.attributeBoolean(null, ATTR_RESET_PASSWORD_WITH_TOKEN_MIGRATED,
+ mResetPasswordWithTokenMigrated);
+ }
out.endTag(null, TAG_POLICY_ENGINE_MIGRATION);
}
@@ -488,6 +494,9 @@
mSuspendedPackagesMigrated = Flags.unmanagedModeMigration()
&& parser.getAttributeBoolean(null,
ATTR_SUSPENDED_PACKAGES_MIGRATED, false);
+ mResetPasswordWithTokenMigrated = Flags.resetPasswordWithTokenCoexistence()
+ && parser.getAttributeBoolean(null,
+ ATTR_RESET_PASSWORD_WITH_TOKEN_MIGRATED, false);
break;
default:
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/PolicyEnforcerCallbacks.java b/services/devicepolicy/java/com/android/server/devicepolicy/PolicyEnforcerCallbacks.java
index 8068d46..4d9abf1 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/PolicyEnforcerCallbacks.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/PolicyEnforcerCallbacks.java
@@ -78,7 +78,7 @@
}
static boolean setAutoTimezoneEnabled(@Nullable Boolean enabled, @NonNull Context context) {
- if (!DevicePolicyManagerService.isUnicornFlagEnabled()) {
+ if (!Flags.setAutoTimeZoneEnabledCoexistence()) {
Slogf.w(LOG_TAG, "Trying to enforce setAutoTimezoneEnabled while flag is off.");
return true;
}
@@ -95,7 +95,7 @@
static boolean setPermissionGrantState(
@Nullable Integer grantState, @NonNull Context context, int userId,
@NonNull PolicyKey policyKey) {
- if (!DevicePolicyManagerService.isUnicornFlagEnabled()) {
+ if (!Flags.setPermissionGrantStateCoexistence()) {
Slogf.w(LOG_TAG, "Trying to enforce setPermissionGrantState while flag is off.");
return true;
}
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 3b334ec..5cf260a 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -103,6 +103,7 @@
import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.notification.SystemNotificationChannels;
+import com.android.internal.os.ApplicationSharedMemory;
import com.android.internal.os.BinderInternal;
import com.android.internal.os.RuntimeInit;
import com.android.internal.policy.AttributeCache;
@@ -940,6 +941,12 @@
// Setup the default WTF handler
RuntimeInit.setDefaultApplicationWtfHandler(SystemServer::handleEarlySystemWtf);
+ // Initialize the application shared memory region.
+ // This needs to happen before any system services are started,
+ // as they may rely on the shared memory region having been initialized.
+ ApplicationSharedMemory instance = ApplicationSharedMemory.create();
+ ApplicationSharedMemory.setInstance(instance);
+
// Start services.
try {
t.traceBegin("StartServices");
@@ -3009,9 +3016,13 @@
}
t.traceEnd();
- t.traceBegin("GameManagerService");
- mSystemServiceManager.startService(GameManagerService.Lifecycle.class);
- t.traceEnd();
+ if (!isWatch || !android.server.Flags.removeGameManagerServiceFromWear()) {
+ t.traceBegin("GameManagerService");
+ mSystemServiceManager.startService(GameManagerService.Lifecycle.class);
+ t.traceEnd();
+ } else {
+ Slog.d(TAG, "Not starting GameManagerService");
+ }
if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_UWB)) {
t.traceBegin("UwbService");
diff --git a/services/java/com/android/server/flags.aconfig b/services/java/com/android/server/flags.aconfig
index ec74ef19..0990691 100644
--- a/services/java/com/android/server/flags.aconfig
+++ b/services/java/com/android/server/flags.aconfig
@@ -35,4 +35,12 @@
namespace: "wear_systems"
description: "Allow NetworkTimeUpdateService on Wear"
bug: "327508176"
+}
+
+flag {
+ name: "remove_game_manager_service_from_wear"
+ namespace: "wear_frameworks"
+ description: "Remove GameManagerService from Wear"
+ bug: "340929737"
+ is_fixed_read_only: true
}
\ No newline at end of file
diff --git a/services/supervision/Android.bp b/services/supervision/Android.bp
index 93a0c4a..aefbbca 100644
--- a/services/supervision/Android.bp
+++ b/services/supervision/Android.bp
@@ -19,4 +19,7 @@
defaults: ["platform_service_defaults"],
srcs: [":services.supervision-sources"],
libs: ["services.core"],
+ lint: {
+ baseline_filename: "lint-baseline.xml",
+ },
}
diff --git a/services/supervision/java/com/android/server/supervision/SupervisionManagerInternal.java b/services/supervision/java/com/android/server/supervision/SupervisionManagerInternal.java
new file mode 100644
index 0000000..fead05b
--- /dev/null
+++ b/services/supervision/java/com/android/server/supervision/SupervisionManagerInternal.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.supervision;
+
+import android.annotation.Nullable;
+import android.annotation.UserIdInt;
+import android.os.Bundle;
+
+/**
+ * Local system service interface for {@link SupervisionService}.
+ *
+ * @hide Only for use within Android OS.
+ */
+public abstract class SupervisionManagerInternal {
+ /**
+ * Returns whether supervision is enabled for the specified user
+ *
+ * @param userId The user to retrieve the supervision state for
+ * @return whether the user is supervised
+ */
+ public abstract boolean isSupervisionEnabledForUser(@UserIdInt int userId);
+
+ /**
+ * Sets whether the supervision lock screen should be shown for the specified user
+ *
+ * @param userId The user set the superivision state for
+ * @param enabled Whether or not the superivision lock screen needs to be shown
+ * @param options Optional configuration parameters for the supervision lock screen
+ */
+ public abstract void setSupervisionLockscreenEnabledForUser(
+ @UserIdInt int userId, boolean enabled, @Nullable Bundle options);
+}
diff --git a/services/supervision/java/com/android/server/supervision/SupervisionService.java b/services/supervision/java/com/android/server/supervision/SupervisionService.java
index 7ffd0ec..4c515c1 100644
--- a/services/supervision/java/com/android/server/supervision/SupervisionService.java
+++ b/services/supervision/java/com/android/server/supervision/SupervisionService.java
@@ -18,14 +18,22 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.UserIdInt;
import android.app.supervision.ISupervisionManager;
import android.content.Context;
+import android.content.pm.UserInfo;
+import android.os.Bundle;
import android.os.RemoteException;
import android.os.ResultReceiver;
import android.os.ShellCallback;
+import android.util.SparseArray;
+import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.DumpUtils;
+import com.android.internal.util.IndentingPrintWriter;
+import com.android.server.LocalServices;
import com.android.server.SystemService;
+import com.android.server.pm.UserManagerInternal;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -38,13 +46,25 @@
private final Context mContext;
+ // TODO(b/362756788): Does this need to be a LockGuard lock?
+ private final Object mLockDoNoUseDirectly = new Object();
+
+ @GuardedBy("getLockObject()")
+ private final SparseArray<SupervisionUserData> mUserData = new SparseArray<>();
+
+ private final UserManagerInternal mUserManagerInternal;
+
public SupervisionService(Context context) {
- mContext = context.createAttributionContext("SupervisionService");
+ mContext = context.createAttributionContext(LOG_TAG);
+ mUserManagerInternal = LocalServices.getService(UserManagerInternal.class);
+ mUserManagerInternal.addUserLifecycleListener(new UserLifecycleListener());
}
@Override
- public boolean isSupervisionEnabled() {
- return false;
+ public boolean isSupervisionEnabledForUser(@UserIdInt int userId) {
+ synchronized (getLockObject()) {
+ return getUserDataLocked(userId).supervisionEnabled;
+ }
}
@Override
@@ -60,11 +80,44 @@
}
@Override
- protected void dump(
- @NonNull FileDescriptor fd, @NonNull PrintWriter fout, @Nullable String[] args) {
- if (!DumpUtils.checkDumpPermission(mContext, LOG_TAG, fout)) return;
+ protected void dump(@NonNull FileDescriptor fd,
+ @NonNull PrintWriter printWriter, @Nullable String[] args) {
+ if (!DumpUtils.checkDumpPermission(mContext, LOG_TAG, printWriter)) return;
- fout.println("Supervision enabled: " + isSupervisionEnabled());
+ try (var pw = new IndentingPrintWriter(printWriter, " ")) {
+ pw.println("SupervisionService state:");
+ pw.increaseIndent();
+
+ var users = mUserManagerInternal.getUsers(false);
+ synchronized (getLockObject()) {
+ for (var user : users) {
+ getUserDataLocked(user.id).dump(pw);
+ pw.println();
+ }
+ }
+ }
+ }
+
+ private Object getLockObject() {
+ return mLockDoNoUseDirectly;
+ }
+
+ @NonNull
+ @GuardedBy("getLockObject()")
+ SupervisionUserData getUserDataLocked(@UserIdInt int userId) {
+ SupervisionUserData data = mUserData.get(userId);
+ if (data == null) {
+ // TODO(b/362790738): Do not create user data for nonexistent users.
+ data = new SupervisionUserData(userId);
+ mUserData.append(userId, data);
+ }
+ return data;
+ }
+
+ void setSupervisionEnabledForUser(@UserIdInt int userId, boolean enabled) {
+ synchronized (getLockObject()) {
+ getUserDataLocked(userId).supervisionEnabled = enabled;
+ }
}
public static class Lifecycle extends SystemService {
@@ -77,7 +130,35 @@
@Override
public void onStart() {
+ publishLocalService(SupervisionManagerInternal.class, mSupervisionService.mInternal);
publishBinderService(Context.SUPERVISION_SERVICE, mSupervisionService);
}
}
+
+ final SupervisionManagerInternal mInternal = new SupervisionManagerInternal() {
+ public boolean isSupervisionEnabledForUser(@UserIdInt int userId) {
+ synchronized (getLockObject()) {
+ return getUserDataLocked(userId).supervisionEnabled;
+ }
+ }
+
+ @Override
+ public void setSupervisionLockscreenEnabledForUser(
+ @UserIdInt int userId, boolean enabled, @Nullable Bundle options) {
+ synchronized (getLockObject()) {
+ SupervisionUserData data = getUserDataLocked(userId);
+ data.supervisionLockScreenEnabled = enabled;
+ data.supervisionLockScreenOptions = options;
+ }
+ }
+ };
+
+ private final class UserLifecycleListener implements UserManagerInternal.UserLifecycleListener {
+ @Override
+ public void onUserRemoved(UserInfo user) {
+ synchronized (getLockObject()) {
+ mUserData.remove(user.id);
+ }
+ }
+ }
}
diff --git a/services/supervision/java/com/android/server/supervision/SupervisionServiceShellCommand.java b/services/supervision/java/com/android/server/supervision/SupervisionServiceShellCommand.java
index 3aba24a..2adaae3 100644
--- a/services/supervision/java/com/android/server/supervision/SupervisionServiceShellCommand.java
+++ b/services/supervision/java/com/android/server/supervision/SupervisionServiceShellCommand.java
@@ -17,8 +17,7 @@
package com.android.server.supervision;
import android.os.ShellCommand;
-
-import java.io.PrintWriter;
+import android.os.UserHandle;
public class SupervisionServiceShellCommand extends ShellCommand {
private final SupervisionService mService;
@@ -32,30 +31,29 @@
if (cmd == null) {
return handleDefaultCommands(null);
}
- final PrintWriter pw = getOutPrintWriter();
switch (cmd) {
- case "help": return help(pw);
- case "is-enabled": return isEnabled(pw);
+ case "enable": return setEnabled(true);
+ case "disable": return setEnabled(false);
default: return handleDefaultCommands(cmd);
}
}
- private int help(PrintWriter pw) {
- pw.println("Supervision service commands:");
- pw.println(" help");
- pw.println(" Prints this help text");
- pw.println(" is-enabled");
- pw.println(" Is supervision enabled");
- return 0;
- }
-
- private int isEnabled(PrintWriter pw) {
- pw.println(mService.isSupervisionEnabled());
+ private int setEnabled(boolean enabled) {
+ final var pw = getOutPrintWriter();
+ final var userId = UserHandle.parseUserArg(getNextArgRequired());
+ mService.setSupervisionEnabledForUser(userId, enabled);
return 0;
}
@Override
public void onHelp() {
- help(getOutPrintWriter());
+ final var pw = getOutPrintWriter();
+ pw.println("Supervision service (supervision) commands:");
+ pw.println(" help");
+ pw.println(" Prints this help text");
+ pw.println(" enable <USER_ID>");
+ pw.println(" Enables supervision for the given user.");
+ pw.println(" disable <USER_ID>");
+ pw.println(" Disables supervision for the given user.");
}
}
diff --git a/services/supervision/java/com/android/server/supervision/SupervisionUserData.java b/services/supervision/java/com/android/server/supervision/SupervisionUserData.java
new file mode 100644
index 0000000..5616237
--- /dev/null
+++ b/services/supervision/java/com/android/server/supervision/SupervisionUserData.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.supervision;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.UserIdInt;
+import android.os.Bundle;
+import android.util.IndentingPrintWriter;
+
+/** User specific data, used internally by the {@link SupervisionService}. */
+public class SupervisionUserData {
+ public final @UserIdInt int userId;
+ public boolean supervisionEnabled;
+ public boolean supervisionLockScreenEnabled;
+ @Nullable public Bundle supervisionLockScreenOptions;
+
+ public SupervisionUserData(@UserIdInt int userId) {
+ this.userId = userId;
+ }
+
+ void dump(@NonNull IndentingPrintWriter pw) {
+ pw.println();
+ pw.println("User " + userId + ":");
+ pw.increaseIndent();
+ pw.println("supervisionEnabled: " + supervisionEnabled);
+ pw.println("supervisionLockScreenEnabled: " + supervisionLockScreenEnabled);
+ pw.println("supervisionLockScreenOptions: " + supervisionLockScreenOptions);
+ pw.decreaseIndent();
+ }
+}
diff --git a/services/supervision/lint-baseline.xml b/services/supervision/lint-baseline.xml
new file mode 100644
index 0000000..f2a5010
--- /dev/null
+++ b/services/supervision/lint-baseline.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 8.4.0-alpha08" type="baseline" client="" dependencies="true" name="" variant="all" version="8.4.0-alpha08">
+
+ <issue
+ id="MissingPermissionAnnotation"
+ message="isSupervisionEnabled should be annotated with either @EnforcePermission, @RequiresNoPermission or @PermissionManuallyEnforced."
+ errorLine1=" @Override"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/services/supervision/java/com/android/server/supervision/SupervisionService.java"
+ line="45"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingPermissionAnnotation"
+ message="onShellCommand should be annotated with either @EnforcePermission, @RequiresNoPermission or @PermissionManuallyEnforced."
+ errorLine1=" @Override"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/services/supervision/java/com/android/server/supervision/SupervisionService.java"
+ line="50"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingPermissionAnnotation"
+ message="dump should be annotated with either @EnforcePermission, @RequiresNoPermission or @PermissionManuallyEnforced."
+ errorLine1=" @Override"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/services/supervision/java/com/android/server/supervision/SupervisionService.java"
+ line="62"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="SimpleRequiresNoPermission"
+ message="Method isSupervisionEnabled doesn't perform any permission checks, meaning it should be annotated with @RequiresNoPermission."
+ errorLine1=" @Override"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/services/supervision/java/com/android/server/supervision/SupervisionService.java"
+ line="45"
+ column="5"/>
+ </issue>
+
+</issues>
diff --git a/services/tests/PackageManagerComponentOverrideTests/src/com/android/server/pm/test/override/PackageManagerComponentLabelIconOverrideTest.kt b/services/tests/PackageManagerComponentOverrideTests/src/com/android/server/pm/test/override/PackageManagerComponentLabelIconOverrideTest.kt
index 5c4716d..7d5532f 100644
--- a/services/tests/PackageManagerComponentOverrideTests/src/com/android/server/pm/test/override/PackageManagerComponentLabelIconOverrideTest.kt
+++ b/services/tests/PackageManagerComponentOverrideTests/src/com/android/server/pm/test/override/PackageManagerComponentLabelIconOverrideTest.kt
@@ -57,6 +57,7 @@
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.Parameterized
+import org.mockito.ArgumentMatchers.eq
import org.mockito.Mockito.any
import org.mockito.Mockito.anyInt
import org.mockito.Mockito.doReturn
@@ -383,6 +384,10 @@
android.Manifest.permission.INTERACT_ACROSS_USERS_FULL)) {
PackageManager.PERMISSION_GRANTED
}
+ whenever(this.checkPermission(
+ eq(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL), anyInt(), anyInt())) {
+ PackageManager.PERMISSION_GRANTED
+ }
}
val mockSharedLibrariesImpl: SharedLibrariesImpl = mock {
whenever(this.snapshot()) { this@mock }
diff --git a/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java b/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java
index bf5a692..c70bf8a 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java
@@ -2127,6 +2127,48 @@
}
@Test
+ public void testManualBrightness_stateDozePolicyOnUseNormalBrightnessForDozeTrue_brightnessDoze() {
+ when(mDisplayManagerFlagsMock.isDisplayOffloadEnabled()).thenReturn(true);
+ when(mDisplayManagerFlagsMock.isNormalBrightnessForDozeParameterEnabled()).thenReturn(true);
+ mHolder.dpc.setDisplayOffloadSession(mDisplayOffloadSession);
+ Settings.System.putInt(mContext.getContentResolver(),
+ Settings.System.SCREEN_BRIGHTNESS_MODE,
+ Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
+ float brightness = 0.277f;
+ when(mHolder.displayPowerState.getColorFadeLevel()).thenReturn(1.0f);
+ when(mHolder.brightnessSetting.getBrightness()).thenReturn(brightness);
+ when(mHolder.hbmController.getCurrentBrightnessMax())
+ .thenReturn(PowerManager.BRIGHTNESS_MAX);
+ when(mHolder.displayPowerState.getScreenState()).thenReturn(Display.STATE_ON);
+ // Start with state=DOZE.
+ when(mHolder.displayPowerState.getScreenState()).thenReturn(Display.STATE_DOZE);
+ DisplayPowerRequest dprInit = new DisplayPowerRequest();
+ dprInit.policy = DisplayPowerRequest.POLICY_DOZE;
+ mHolder.dpc.requestPowerState(dprInit, /* waitForNegativeProximity= */ false);
+ advanceTime(1); // Run updatePowerState; initialize to DOZE
+ // Go to state=ON. But state change would be blocked. so, state=DOZE.
+ when(mDisplayOffloadSession.blockScreenOn(any())).thenReturn(true);
+ DisplayPowerRequest dpr = new DisplayPowerRequest();
+ dpr.dozeScreenState = Display.STATE_ON;
+ dpr.policy = DisplayPowerRequest.POLICY_BRIGHT;
+ dpr.useNormalBrightnessForDoze = true;
+ mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false);
+ advanceTime(1); // Run updatePowerState; process turning on.
+
+ ArgumentCaptor<BrightnessSetting.BrightnessSettingListener> listenerCaptor =
+ ArgumentCaptor.forClass(BrightnessSetting.BrightnessSettingListener.class);
+ verify(mHolder.brightnessSetting).registerListener(listenerCaptor.capture());
+ BrightnessSetting.BrightnessSettingListener listener = listenerCaptor.getValue();
+ listener.onBrightnessChanged(brightness);
+ advanceTime(1); // Send messages, run updatePowerState
+
+ // When state=DOZE, force doze brightness regardless the requested policy.
+ verify(mHolder.animator).animateTo(eq(brightness * DOZE_SCALE_FACTOR),
+ /* linearSecondTarget= */ anyFloat(), /* rate= */ anyFloat(),
+ /* ignoreAnimationLimits= */ anyBoolean());
+ }
+
+ @Test
public void testDozeManualBrightness_AbcIsNull() {
when(mDisplayManagerFlagsMock.isDisplayOffloadEnabled()).thenReturn(true);
mHolder = createDisplayPowerController(DISPLAY_ID, UNIQUE_ID, /* isEnabled= */ true,
diff --git a/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategyTest.java b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategyTest.java
index 50f814d..efa8b3e 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategyTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategyTest.java
@@ -397,9 +397,9 @@
mAutomaticBrightnessStrategy.setAutoBrightnessState(Display.STATE_DOZE,
allowAutoBrightnessWhileDozing, brightnessReason, policy,
useNormalBrightnessForDoze, lastUserSetBrightness, userSetBrightnessChanged);
- // 1st AUTO_BRIGHTNESS_MODE_DEFAULT
- verify(mAutomaticBrightnessController).switchMode(
- AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_DEFAULT,
+ // 3rd AUTO_BRIGHTNESS_MODE_DOZE
+ verify(mAutomaticBrightnessController, times(3)).switchMode(
+ AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_DOZE,
/* sendUpdate= */ false);
// Validate interaction when automaticBrightnessController is in non-idle mode, display
@@ -407,8 +407,8 @@
mAutomaticBrightnessStrategy.setAutoBrightnessState(Display.STATE_ON,
allowAutoBrightnessWhileDozing, brightnessReason, policy,
useNormalBrightnessForDoze, lastUserSetBrightness, userSetBrightnessChanged);
- // 2nd AUTO_BRIGHTNESS_MODE_DEFAULT
- verify(mAutomaticBrightnessController, times(2)).switchMode(
+ // AUTO_BRIGHTNESS_MODE_DEFAULT
+ verify(mAutomaticBrightnessController).switchMode(
AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_DEFAULT,
/* sendUpdate= */ false);
}
diff --git a/services/tests/mockingservicestests/src/com/android/server/am/ApplicationStartInfoTest.java b/services/tests/mockingservicestests/src/com/android/server/am/ApplicationStartInfoTest.java
index 1cad255..e863f15 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/ApplicationStartInfoTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/ApplicationStartInfoTest.java
@@ -40,7 +40,9 @@
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Process;
+import android.platform.test.annotations.EnableFlags;
import android.platform.test.annotations.Presubmit;
+import android.platform.test.flag.junit.SetFlagsRule;
import android.text.TextUtils;
import com.android.internal.os.Clock;
@@ -87,6 +89,7 @@
private static final String APP_1_PACKAGE_NAME = "com.android.test.stub1";
@Rule public ServiceThreadRule mServiceThreadRule = new ServiceThreadRule();
+ @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
@Mock private AppOpsService mAppOpsService;
@Mock private PackageManagerInternal mPackageManagerInt;
@@ -144,6 +147,7 @@
}
@Test
+ @EnableFlags(android.app.Flags.FLAG_APP_START_INFO_COMPONENT)
public void testApplicationStartInfo() throws Exception {
// Make sure we can write to the file.
assertTrue(FileUtils.createDir(mAppStartInfoTracker.mProcStartStoreDir));
@@ -167,7 +171,7 @@
ArrayList<ApplicationStartInfo> list = new ArrayList<ApplicationStartInfo>();
// Case 1: Activity start intent failed
- mAppStartInfoTracker.onIntentStarted(buildIntent(COMPONENT),
+ mAppStartInfoTracker.onActivityIntentStarted(buildIntent(COMPONENT),
appStartTimestampIntentStarted);
mAppStartInfoTracker.getStartInfo(APP_1_PACKAGE_NAME, APP_1_UID, APP_1_PID_1, 0, list);
verifyInProgressRecordsSize(1);
@@ -185,7 +189,7 @@
ApplicationStartInfo.START_TYPE_UNSET, // state type
ApplicationStartInfo.LAUNCH_MODE_STANDARD); // launch mode
- mAppStartInfoTracker.onIntentFailed(appStartTimestampIntentStarted);
+ mAppStartInfoTracker.onActivityIntentFailed(appStartTimestampIntentStarted);
list.clear();
mAppStartInfoTracker.getStartInfo(APP_1_PACKAGE_NAME, APP_1_UID, APP_1_PID_1, 0, list);
verifyInProgressRecordsSize(0);
@@ -194,7 +198,7 @@
mAppStartInfoTracker.clearProcessStartInfo(true);
// Case 2: Activity start launch cancelled
- mAppStartInfoTracker.onIntentStarted(buildIntent(COMPONENT),
+ mAppStartInfoTracker.onActivityIntentStarted(buildIntent(COMPONENT),
appStartTimestampIntentStarted);
list.clear();
mAppStartInfoTracker.getStartInfo(APP_1_PACKAGE_NAME, APP_1_UID, APP_1_PID_1, 0, list);
@@ -236,12 +240,13 @@
ApplicationStartInfo.START_REASON_START_ACTIVITY, // reason
ApplicationStartInfo.STARTUP_STATE_ERROR, // startup state
ApplicationStartInfo.START_TYPE_COLD, // state type
- ApplicationStartInfo.LAUNCH_MODE_STANDARD); // launch mode
+ ApplicationStartInfo.LAUNCH_MODE_STANDARD, // launch mode
+ ApplicationStartInfo.START_COMPONENT_ACTIVITY); // start component
mAppStartInfoTracker.clearProcessStartInfo(true);
// Case 3: Activity start success
- mAppStartInfoTracker.onIntentStarted(buildIntent(COMPONENT),
+ mAppStartInfoTracker.onActivityIntentStarted(buildIntent(COMPONENT),
appStartTimestampIntentStarted);
list.clear();
mAppStartInfoTracker.getStartInfo(APP_1_PACKAGE_NAME, APP_1_UID, APP_1_PID_1, 0, list);
@@ -255,6 +260,7 @@
verifyInProgressRecordsSize(1);
assertEquals(list.size(), 1);
+ // The records will now be in both backing data structures, so verify in each.
verifyInProgressApplicationStartInfo(
0, // index
APP_1_PID_1, // pid
@@ -277,7 +283,8 @@
ApplicationStartInfo.START_REASON_START_ACTIVITY, // reason
ApplicationStartInfo.STARTUP_STATE_STARTED, // startup state
ApplicationStartInfo.START_TYPE_COLD, // state type
- ApplicationStartInfo.LAUNCH_MODE_STANDARD); // launch mode
+ ApplicationStartInfo.LAUNCH_MODE_STANDARD, // launch mode
+ ApplicationStartInfo.START_COMPONENT_ACTIVITY); // start component
mAppStartInfoTracker.onActivityLaunchFinished(appStartTimestampIntentStarted, COMPONENT,
appStartTimestampActivityLaunchFinished, ApplicationStartInfo.LAUNCH_MODE_STANDARD);
@@ -300,7 +307,7 @@
ApplicationStartInfo.START_TYPE_COLD, // state type
ApplicationStartInfo.LAUNCH_MODE_STANDARD); // launch mode
- mAppStartInfoTracker.onReportFullyDrawn(appStartTimestampIntentStarted,
+ mAppStartInfoTracker.onActivityReportFullyDrawn(appStartTimestampIntentStarted,
appStartTimestampReportFullyDrawn);
list.clear();
mAppStartInfoTracker.getStartInfo(APP_1_PACKAGE_NAME, APP_1_UID, APP_1_PID_1, 0, list);
@@ -317,7 +324,8 @@
ApplicationStartInfo.START_REASON_START_ACTIVITY, // reason
ApplicationStartInfo.STARTUP_STATE_FIRST_FRAME_DRAWN, // startup state
ApplicationStartInfo.START_TYPE_COLD, // state type
- ApplicationStartInfo.LAUNCH_MODE_STANDARD); // launch mode
+ ApplicationStartInfo.LAUNCH_MODE_STANDARD, // launch mode
+ ApplicationStartInfo.START_COMPONENT_ACTIVITY); // start component
// Don't clear records for use in subsequent cases.
@@ -347,7 +355,8 @@
ApplicationStartInfo.START_REASON_SERVICE, // reason
ApplicationStartInfo.STARTUP_STATE_STARTED, // startup state
ApplicationStartInfo.START_TYPE_COLD, // state type
- ApplicationStartInfo.LAUNCH_MODE_STANDARD); // launch mode
+ ApplicationStartInfo.LAUNCH_MODE_STANDARD, // launch mode
+ ApplicationStartInfo.START_COMPONENT_SERVICE); // start component
// Case 5: Create an instance of app1 with a different user started for a broadcast
sleep(1);
@@ -376,7 +385,8 @@
ApplicationStartInfo.START_REASON_BROADCAST, // reason
ApplicationStartInfo.STARTUP_STATE_STARTED, // startup state
ApplicationStartInfo.START_TYPE_COLD, // state type
- ApplicationStartInfo.LAUNCH_MODE_STANDARD); // launch mode
+ ApplicationStartInfo.LAUNCH_MODE_STANDARD, // launch mode
+ ApplicationStartInfo.START_COMPONENT_BROADCAST); // start component
// Case 6: User 2 gets removed
mAppStartInfoTracker.onPackageRemoved(APP_1_PACKAGE_NAME, APP_1_UID_USER_2, false);
@@ -422,7 +432,9 @@
ApplicationStartInfo.START_REASON_CONTENT_PROVIDER, // reason
ApplicationStartInfo.STARTUP_STATE_STARTED, // startup state
ApplicationStartInfo.START_TYPE_COLD, // state type
- ApplicationStartInfo.LAUNCH_MODE_STANDARD); // launch mode
+ ApplicationStartInfo.LAUNCH_MODE_STANDARD, // launch mode
+ ApplicationStartInfo.START_COMPONENT_CONTENT_PROVIDER // start component
+ );
// Case 8: Save and load again
ArrayList<ApplicationStartInfo> original = new ArrayList<ApplicationStartInfo>();
@@ -453,6 +465,7 @@
*/
@SuppressWarnings("GuardedBy")
@Test
+ @EnableFlags(android.app.Flags.FLAG_APP_START_INFO_COMPONENT)
public void testInProgressRecordsLimit() throws Exception {
ProcessRecord app = makeProcessRecord(
APP_1_PID_1, // pid
@@ -466,7 +479,7 @@
// never exceeds the expected size of MAX_IN_PROGRESS_RECORDS.
for (int i = 0; i < AppStartInfoTracker.MAX_IN_PROGRESS_RECORDS * 2; i++) {
Long startTime = Long.valueOf(i);
- mAppStartInfoTracker.onIntentStarted(buildIntent(COMPONENT), startTime);
+ mAppStartInfoTracker.onActivityIntentStarted(buildIntent(COMPONENT), startTime);
verifyInProgressRecordsSize(
Math.min(i + 1, AppStartInfoTracker.MAX_IN_PROGRESS_RECORDS));
@@ -618,6 +631,10 @@
}
}
+ /**
+ * Convenience helper to access the record from the in progress data structure. Only applies for
+ * activity starts.
+ */
private void verifyInProgressApplicationStartInfo(int index,
Integer pid, Integer uid, Integer packageUid,
Integer definingUid, String processName,
@@ -625,14 +642,15 @@
synchronized (mAppStartInfoTracker.mLock) {
verifyApplicationStartInfo(mAppStartInfoTracker.mInProgressRecords.valueAt(index),
pid, uid, packageUid, definingUid, processName, reason, startupState,
- startType, launchMode);
+ startType, launchMode, ApplicationStartInfo.START_COMPONENT_ACTIVITY);
}
}
private void verifyApplicationStartInfo(ApplicationStartInfo info,
Integer pid, Integer uid, Integer packageUid,
Integer definingUid, String processName,
- Integer reason, Integer startupState, Integer startType, Integer launchMode) {
+ Integer reason, Integer startupState, Integer startType, Integer launchMode,
+ Integer startComponent) {
assertNotNull(info);
if (pid != null) {
@@ -662,6 +680,9 @@
if (launchMode != null) {
assertEquals(launchMode.intValue(), info.getLaunchMode());
}
+ if (startComponent != null) {
+ assertEquals(startComponent.intValue(), info.getStartComponent());
+ }
}
private class TestInjector extends Injector {
diff --git a/services/tests/mockingservicestests/src/com/android/server/am/AsyncProcessStartTest.java b/services/tests/mockingservicestests/src/com/android/server/am/AsyncProcessStartTest.java
index 93066d8..67475335 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/AsyncProcessStartTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/AsyncProcessStartTest.java
@@ -213,7 +213,7 @@
any(), any(), any(),
any(), any(),
any(), any(),
- any(), any(),
+ any(), any(), any(),
anyLong(), anyLong());
final ProcessRecord r = spy(new ProcessRecord(mAms, ai, ai.processName, ai.uid));
@@ -277,7 +277,7 @@
null, null,
null,
null, null, null,
- null, null, null,
+ null, null, null, null,
0, 0);
// Sleep until timeout should have triggered
diff --git a/services/tests/mockingservicestests/src/com/android/server/am/ProcessObserverTest.java b/services/tests/mockingservicestests/src/com/android/server/am/ProcessObserverTest.java
index 014b98c..43becc5 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/ProcessObserverTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/ProcessObserverTest.java
@@ -216,7 +216,7 @@
any(), any(), any(),
any(), any(),
any(), any(),
- any(), any(),
+ any(), any(), any(),
anyLong(), anyLong());
final ProcessRecord r = spy(new ProcessRecord(mAms, ai, ai.processName, ai.uid));
r.setPid(myPid());
@@ -265,7 +265,7 @@
null, null,
null,
null, null, null,
- null, null, null,
+ null, null, null, null,
0, 0);
return app;
}
diff --git a/services/tests/mockingservicestests/src/com/android/server/rollback/RollbackPackageHealthObserverTest.java b/services/tests/mockingservicestests/src/com/android/server/rollback/RollbackPackageHealthObserverTest.java
index 6e41685..e0c7bfe 100644
--- a/services/tests/mockingservicestests/src/com/android/server/rollback/RollbackPackageHealthObserverTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/rollback/RollbackPackageHealthObserverTest.java
@@ -26,6 +26,7 @@
import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.never;
@@ -36,6 +37,7 @@
import android.content.Context;
import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.VersionedPackage;
import android.content.rollback.PackageRollbackInfo;
@@ -47,6 +49,7 @@
import android.os.SystemProperties;
import android.platform.test.flag.junit.SetFlagsRule;
+import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.runner.AndroidJUnit4;
import com.android.dx.mockito.inline.extended.ExtendedMockito;
@@ -145,6 +148,22 @@
}
).when(() -> SystemProperties.getBoolean(anyString(), anyBoolean()));
+ try {
+ when(mMockPackageManager.getPackageInfo(anyString(), anyInt())).then(inv -> {
+ final PackageInfo res = new PackageInfo();
+ res.packageName = inv.getArgument(0);
+ res.setApexPackageName(res.packageName);
+ return res;
+ });
+ } catch (PackageManager.NameNotFoundException e) {
+ throw new RuntimeException(e);
+ }
+
+ Context testContext = InstrumentationRegistry.getInstrumentation()
+ .getTargetContext();
+ when(mMockContext.getUser()).thenReturn(testContext.getUser());
+ when(mMockContext.getPackageName()).thenReturn(testContext.getPackageName());
+
SystemProperties.set(PROP_DISABLE_HIGH_IMPACT_ROLLBACK_FLAG, Boolean.toString(false));
}
diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryStatsImplTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryStatsImplTest.java
index 1d20538..c037f97 100644
--- a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryStatsImplTest.java
+++ b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryStatsImplTest.java
@@ -927,7 +927,7 @@
assertThat(mPowerStatsStore.getTableOfContents()).isEmpty();
mBatteryStatsImpl.saveBatteryUsageStatsOnReset(mBatteryUsageStatsProvider,
- mPowerStatsStore);
+ mPowerStatsStore, /* accumulateBatteryUsageStats */ false);
synchronized (mBatteryStatsImpl) {
mBatteryStatsImpl.noteFlashlightOnLocked(42, mMockClock.realtime, mMockClock.uptime);
diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsProviderTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsProviderTest.java
index fde84e9..0e60156 100644
--- a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsProviderTest.java
+++ b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsProviderTest.java
@@ -419,7 +419,8 @@
mock(PowerAttributor.class), mStatsRule.getPowerProfile(),
mStatsRule.getCpuScalingPolicies(), powerStatsStore, mMockClock);
- batteryStats.saveBatteryUsageStatsOnReset(provider, powerStatsStore);
+ batteryStats.saveBatteryUsageStatsOnReset(provider, powerStatsStore,
+ /* accumulateBatteryUsageStats */ false);
synchronized (batteryStats) {
batteryStats.resetAllStatsAndHistoryLocked(BatteryStatsImpl.RESET_REASON_ADB_COMMAND);
}
@@ -505,6 +506,102 @@
.of(180.0);
}
+ @Test
+ public void accumulateBatteryUsageStats() {
+ BatteryStatsImpl batteryStats = mStatsRule.getBatteryStats();
+
+ setTime(5 * MINUTE_IN_MS);
+
+ // Capture the session start timestamp
+ synchronized (batteryStats) {
+ batteryStats.resetAllStatsAndHistoryLocked(BatteryStatsImpl.RESET_REASON_ADB_COMMAND);
+ }
+
+ PowerStatsStore powerStatsStore = new PowerStatsStore(
+ new File(mStatsRule.getHistoryDir(), getClass().getSimpleName()),
+ mStatsRule.getHandler());
+ powerStatsStore.reset();
+
+ BatteryUsageStatsProvider provider = new BatteryUsageStatsProvider(mContext,
+ mock(PowerAttributor.class), mStatsRule.getPowerProfile(),
+ mStatsRule.getCpuScalingPolicies(), powerStatsStore, mMockClock);
+
+ batteryStats.saveBatteryUsageStatsOnReset(provider, powerStatsStore,
+ /* accumulateBatteryUsageStats */ true);
+
+ synchronized (batteryStats) {
+ batteryStats.noteFlashlightOnLocked(APP_UID,
+ 10 * MINUTE_IN_MS, 10 * MINUTE_IN_MS);
+ }
+ synchronized (batteryStats) {
+ batteryStats.noteFlashlightOffLocked(APP_UID,
+ 20 * MINUTE_IN_MS, 20 * MINUTE_IN_MS);
+ }
+
+ synchronized (batteryStats) {
+ batteryStats.resetAllStatsAndHistoryLocked(BatteryStatsImpl.RESET_REASON_ADB_COMMAND);
+ }
+
+ synchronized (batteryStats) {
+ batteryStats.noteFlashlightOnLocked(APP_UID,
+ 30 * MINUTE_IN_MS, 30 * MINUTE_IN_MS);
+ }
+ synchronized (batteryStats) {
+ batteryStats.noteFlashlightOffLocked(APP_UID,
+ 50 * MINUTE_IN_MS, 50 * MINUTE_IN_MS);
+ }
+ setTime(55 * MINUTE_IN_MS);
+ synchronized (batteryStats) {
+ batteryStats.resetAllStatsAndHistoryLocked(BatteryStatsImpl.RESET_REASON_ADB_COMMAND);
+ }
+
+ // This section has not been saved yet, but should be added to the accumulated totals
+ synchronized (batteryStats) {
+ batteryStats.noteFlashlightOnLocked(APP_UID,
+ 80 * MINUTE_IN_MS, 80 * MINUTE_IN_MS);
+ }
+ synchronized (batteryStats) {
+ batteryStats.noteFlashlightOffLocked(APP_UID,
+ 110 * MINUTE_IN_MS, 110 * MINUTE_IN_MS);
+ }
+ setTime(115 * MINUTE_IN_MS);
+
+ // Await completion
+ ConditionVariable done = new ConditionVariable();
+ mStatsRule.getHandler().post(done::open);
+ done.block();
+
+ BatteryUsageStats stats = provider.getBatteryUsageStats(batteryStats,
+ new BatteryUsageStatsQuery.Builder().accumulated().build());
+
+ assertThat(stats.getStatsStartTimestamp()).isEqualTo(5 * MINUTE_IN_MS);
+ assertThat(stats.getStatsEndTimestamp()).isEqualTo(115 * MINUTE_IN_MS);
+
+ // Section 1 (saved): 20 - 10 = 10
+ // Section 2 (saved): 50 - 30 = 20
+ // Section 3 (fresh): 110 - 80 = 30
+ // Total: 10 + 20 + 30 = 60
+ assertThat(stats.getAggregateBatteryConsumer(
+ BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE)
+ .getConsumedPower(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT))
+ .isWithin(0.0001)
+ .of(360.0); // 360 mA * 1.0 hour
+ assertThat(stats.getAggregateBatteryConsumer(
+ BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE)
+ .getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT))
+ .isEqualTo(60 * MINUTE_IN_MS);
+
+ final UidBatteryConsumer uidBatteryConsumer = stats.getUidBatteryConsumers().stream()
+ .filter(uid -> uid.getUid() == APP_UID).findFirst().get();
+ assertThat(uidBatteryConsumer
+ .getConsumedPower(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT))
+ .isWithin(0.1)
+ .of(360.0);
+ assertThat(uidBatteryConsumer
+ .getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT))
+ .isEqualTo(60 * MINUTE_IN_MS);
+ }
+
private void setTime(long timeMs) {
mMockClock.currentTime = timeMs;
mMockClock.realtime = timeMs;
@@ -550,7 +647,8 @@
return null;
}).when(powerStatsStore).storeBatteryUsageStats(anyLong(), any());
- mStatsRule.getBatteryStats().saveBatteryUsageStatsOnReset(provider, powerStatsStore);
+ mStatsRule.getBatteryStats().saveBatteryUsageStatsOnReset(provider, powerStatsStore,
+ /* accumulateBatteryUsageStats */ false);
// Make an incompatible change of supported energy components. This will trigger
// a BatteryStats reset, which will generate a snapshot of battery stats.
diff --git a/services/tests/servicestests/Android.bp b/services/tests/servicestests/Android.bp
index bbe0755..ac1b7c6 100644
--- a/services/tests/servicestests/Android.bp
+++ b/services/tests/servicestests/Android.bp
@@ -54,6 +54,7 @@
"services.flags",
"services.net",
"services.people",
+ "services.supervision",
"services.usage",
"service-permission.stubs.system_server",
"guava",
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/MouseKeysInterceptorTest.kt b/services/tests/servicestests/src/com/android/server/accessibility/MouseKeysInterceptorTest.kt
index 019ccf9..c76392b 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/MouseKeysInterceptorTest.kt
+++ b/services/tests/servicestests/src/com/android/server/accessibility/MouseKeysInterceptorTest.kt
@@ -61,7 +61,6 @@
companion object {
const val DISPLAY_ID = 1
const val DEVICE_ID = 123
- const val MOUSE_POINTER_MOVEMENT_STEP = 1.8f
// This delay is required for key events to be sent and handled correctly.
// The handler only performs a move/scroll event if it receives the key event
// at INTERVAL_MILLIS (which happens in practice). Hence, we need this delay in the tests.
@@ -159,8 +158,8 @@
testLooper.dispatchAll()
// Verify the sendRelativeEvent method is called once and capture the arguments
- verifyRelativeEvents(arrayOf(-MOUSE_POINTER_MOVEMENT_STEP / sqrt(2.0f)),
- arrayOf(MOUSE_POINTER_MOVEMENT_STEP / sqrt(2.0f)))
+ verifyRelativeEvents(arrayOf(-MouseKeysInterceptor.MOUSE_POINTER_MOVEMENT_STEP / sqrt(2.0f)),
+ arrayOf(MouseKeysInterceptor.MOUSE_POINTER_MOVEMENT_STEP / sqrt(2.0f)))
}
@Test
@@ -232,7 +231,8 @@
testLooper.dispatchAll()
// Verify the sendScrollEvent method is called once and capture the arguments
- verifyScrollEvents(arrayOf<Float>(0f), arrayOf<Float>(1.0f))
+ verifyScrollEvents(arrayOf<Float>(0f),
+ arrayOf<Float>(MouseKeysInterceptor.MOUSE_SCROLL_STEP))
}
@Test
@@ -247,7 +247,8 @@
testLooper.dispatchAll()
// Verify the sendRelativeEvent method is called once and capture the arguments
- verifyRelativeEvents(arrayOf<Float>(0f), arrayOf<Float>(-MOUSE_POINTER_MOVEMENT_STEP))
+ verifyRelativeEvents(arrayOf<Float>(0f),
+ arrayOf<Float>(-MouseKeysInterceptor.MOUSE_POINTER_MOVEMENT_STEP))
}
private fun verifyRelativeEvents(expectedX: Array<Float>, expectedY: Array<Float>) {
diff --git a/services/tests/servicestests/src/com/android/server/supervision/SupervisionServiceTest.kt b/services/tests/servicestests/src/com/android/server/supervision/SupervisionServiceTest.kt
new file mode 100644
index 0000000..6bd4279
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/supervision/SupervisionServiceTest.kt
@@ -0,0 +1,90 @@
+/*
+ * 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.supervision
+
+import android.os.Bundle
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.server.LocalServices
+import com.android.server.pm.UserManagerInternal
+import com.google.common.truth.Truth.assertThat
+import androidx.test.platform.app.InstrumentationRegistry
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mock
+import org.mockito.junit.MockitoJUnit
+import org.mockito.junit.MockitoRule
+
+/**
+ * Unit tests for {@link SupervisionService}.
+ * <p/>
+ * Run with <code>atest SupervisionServiceTest</code>.
+ */
+@RunWith(AndroidJUnit4::class)
+class SupervisionServiceTest {
+ companion object {
+ const val USER_ID = 100
+ }
+
+ private lateinit var service: SupervisionService
+
+ @Rule
+ @JvmField
+ val mocks: MockitoRule = MockitoJUnit.rule()
+
+ @Mock
+ private lateinit var mockUserManagerInternal: UserManagerInternal
+
+ @Before
+ fun setup() {
+ val context = InstrumentationRegistry.getInstrumentation().context
+
+ LocalServices.removeServiceForTest(UserManagerInternal::class.java)
+ LocalServices.addService(UserManagerInternal::class.java, mockUserManagerInternal)
+
+ service = SupervisionService(context)
+ }
+
+ @Test
+ fun testSetSupervisionEnabledForUser() {
+ assertThat(service.isSupervisionEnabledForUser(USER_ID)).isFalse()
+
+ service.setSupervisionEnabledForUser(USER_ID, true)
+ assertThat(service.isSupervisionEnabledForUser(USER_ID)).isTrue()
+
+ service.setSupervisionEnabledForUser(USER_ID, false)
+ assertThat(service.isSupervisionEnabledForUser(USER_ID)).isFalse()
+ }
+
+ @Test
+ fun testSetSupervisionLockscreenEnabledForUser() {
+ var userData = service.getUserDataLocked(USER_ID)
+ assertThat(userData.supervisionLockScreenEnabled).isFalse()
+ assertThat(userData.supervisionLockScreenOptions).isNull()
+
+ service.mInternal.setSupervisionLockscreenEnabledForUser(USER_ID, true, Bundle())
+ userData = service.getUserDataLocked(USER_ID)
+ assertThat(userData.supervisionLockScreenEnabled).isTrue()
+ assertThat(userData.supervisionLockScreenOptions).isNotNull()
+
+ service.mInternal.setSupervisionLockscreenEnabledForUser(USER_ID, false, null)
+ userData = service.getUserDataLocked(USER_ID)
+ assertThat(userData.supervisionLockScreenEnabled).isFalse()
+ assertThat(userData.supervisionLockScreenOptions).isNull()
+ }
+}
diff --git a/services/tests/timetests/Android.bp b/services/tests/timetests/Android.bp
index aae6acc..65a694e 100644
--- a/services/tests/timetests/Android.bp
+++ b/services/tests/timetests/Android.bp
@@ -19,6 +19,7 @@
"platform-test-annotations",
"services.core",
"truth",
+ "ApplicationSharedMemoryTestRule",
],
libs: ["android.test.runner.stubs.system"],
platform_apis: true,
diff --git a/services/tests/timetests/src/com/android/server/timedetector/TimeDetectorStrategyImplTest.java b/services/tests/timetests/src/com/android/server/timedetector/TimeDetectorStrategyImplTest.java
index c64ec72..3836063 100644
--- a/services/tests/timetests/src/com/android/server/timedetector/TimeDetectorStrategyImplTest.java
+++ b/services/tests/timetests/src/com/android/server/timedetector/TimeDetectorStrategyImplTest.java
@@ -46,6 +46,7 @@
import android.os.TimestampedValue;
import android.util.IndentingPrintWriter;
+import com.android.internal.os.ApplicationSharedMemoryTestRule;
import com.android.server.SystemClockTime.TimeConfidence;
import com.android.server.timedetector.TimeDetectorStrategy.Origin;
import com.android.server.timezonedetector.StateChangeListener;
@@ -55,6 +56,7 @@
import junitparams.Parameters;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -125,6 +127,10 @@
.setAutoDetectionEnabledSetting(true)
.build();
+ @Rule
+ public final ApplicationSharedMemoryTestRule mApplicationSharedMemoryTestRule =
+ new ApplicationSharedMemoryTestRule();
+
private FakeEnvironment mFakeEnvironment;
private FakeServiceConfigAccessor mFakeServiceConfigAccessorSpy;
private TimeDetectorStrategyImpl mTimeDetectorStrategy;
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
index 130690d..d69d678 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -16556,7 +16556,7 @@
}
@Test
- @EnableFlags(android.app.Flags.FLAG_UI_RICH_ONGOING)
+ @EnableFlags(android.app.Flags.FLAG_API_RICH_ONGOING)
public void testSetCanBePromoted_granted() throws Exception {
mContext.getTestablePermissions().setPermission(
android.Manifest.permission.USE_COLORIZED_NOTIFICATIONS, PERMISSION_GRANTED);
@@ -16632,7 +16632,7 @@
}
@Test
- @EnableFlags(android.app.Flags.FLAG_UI_RICH_ONGOING)
+ @EnableFlags(android.app.Flags.FLAG_API_RICH_ONGOING)
public void testSetCanBePromoted_granted_onlyNotifiesOnce() throws Exception {
mContext.getTestablePermissions().setPermission(
android.Manifest.permission.USE_COLORIZED_NOTIFICATIONS, PERMISSION_GRANTED);
@@ -16663,7 +16663,7 @@
}
@Test
- @EnableFlags(android.app.Flags.FLAG_UI_RICH_ONGOING)
+ @EnableFlags(android.app.Flags.FLAG_API_RICH_ONGOING)
public void testSetCanBePromoted_revoked() throws Exception {
mContext.getTestablePermissions().setPermission(
android.Manifest.permission.USE_COLORIZED_NOTIFICATIONS, PERMISSION_GRANTED);
@@ -16728,7 +16728,7 @@
}
@Test
- @EnableFlags(android.app.Flags.FLAG_UI_RICH_ONGOING)
+ @EnableFlags(android.app.Flags.FLAG_API_RICH_ONGOING)
public void testSetCanBePromoted_revoked_onlyNotifiesOnce() throws Exception {
mContext.getTestablePermissions().setPermission(
android.Manifest.permission.USE_COLORIZED_NOTIFICATIONS, PERMISSION_GRANTED);
@@ -16763,10 +16763,10 @@
}
@Test
- @EnableFlags(android.app.Flags.FLAG_UI_RICH_ONGOING)
+ @EnableFlags(android.app.Flags.FLAG_API_RICH_ONGOING)
public void testPostPromotableNotification() throws Exception {
mBinderService.setCanBePromoted(mPkg, mUid, true);
- assertThat(mBinderService.canBePromoted(mPkg, mUid)).isTrue();
+ assertThat(mBinderService.appCanBePromoted(mPkg, mUid)).isTrue();
mContext.getTestablePermissions().setPermission(
android.Manifest.permission.USE_COLORIZED_NOTIFICATIONS, PERMISSION_GRANTED);
@@ -16776,7 +16776,6 @@
.setColor(Color.WHITE)
.setColorized(true)
.build();
- //assertThat(n.hasPromotableCharacteristics()).isTrue();
StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 9, null, mUid, 0,
n, UserHandle.getUserHandleForUid(mUid), null, 0);
@@ -16794,7 +16793,7 @@
}
@Test
- @EnableFlags(android.app.Flags.FLAG_UI_RICH_ONGOING)
+ @EnableFlags(android.app.Flags.FLAG_API_RICH_ONGOING)
public void testPostPromotableNotification_noPermission() throws Exception {
mContext.getTestablePermissions().setPermission(
android.Manifest.permission.USE_COLORIZED_NOTIFICATIONS, PERMISSION_GRANTED);
@@ -16822,7 +16821,7 @@
}
@Test
- @EnableFlags(android.app.Flags.FLAG_UI_RICH_ONGOING)
+ @EnableFlags(android.app.Flags.FLAG_API_RICH_ONGOING)
public void testPostPromotableNotification_unimportantNotification() throws Exception {
mBinderService.setCanBePromoted(mPkg, mUid, true);
mContext.getTestablePermissions().setPermission(
diff --git a/services/tests/vibrator/src/com/android/server/vibrator/VibrationSettingsTest.java b/services/tests/vibrator/src/com/android/server/vibrator/VibrationSettingsTest.java
index c7a136a..23ee893 100644
--- a/services/tests/vibrator/src/com/android/server/vibrator/VibrationSettingsTest.java
+++ b/services/tests/vibrator/src/com/android/server/vibrator/VibrationSettingsTest.java
@@ -44,7 +44,8 @@
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
@@ -52,12 +53,14 @@
import static org.mockito.Mockito.when;
import android.app.ActivityManager;
+import android.app.IActivityManager;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.Intent;
+import android.content.IntentFilter;
import android.content.pm.PackageManagerInternal;
import android.media.AudioManager;
import android.os.Handler;
@@ -79,12 +82,10 @@
import com.android.internal.util.test.FakeSettingsProvider;
import com.android.internal.util.test.FakeSettingsProviderRule;
-import com.android.server.LocalServices;
import com.android.server.companion.virtual.VirtualDeviceManagerInternal;
import com.android.server.vibrator.VibrationSession.CallerInfo;
import com.android.server.vibrator.VibrationSession.Status;
-import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
@@ -101,8 +102,7 @@
@Rule
public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
- private static final int OLD_USER_ID = 123;
- private static final int NEW_USER_ID = 456;
+ private static final int USER_ID = 123;
private static final int UID = 1;
private static final int VIRTUAL_DEVICE_ID = 1;
private static final String SYSUI_PACKAGE_NAME = "sysui";
@@ -132,13 +132,12 @@
@Mock private VirtualDeviceManagerInternal mVirtualDeviceManagerInternalMock;
@Mock private PackageManagerInternal mPackageManagerInternalMock;
@Mock private AudioManager mAudioManagerMock;
+ @Mock private IActivityManager mActivityManagerMock;
@Mock private VibrationConfig mVibrationConfigMock;
private TestLooper mTestLooper;
private ContextWrapper mContextSpy;
private VibrationSettings mVibrationSettings;
- private PowerManagerInternal.LowPowerModeListener mRegisteredPowerModeListener;
- private BroadcastReceiver mRegisteredBatteryBroadcastReceiver;
@Before
public void setUp() throws Exception {
@@ -146,24 +145,21 @@
mContextSpy = spy(new ContextWrapper(InstrumentationRegistry.getContext()));
ContentResolver contentResolver = mSettingsProviderRule.mockContentResolver(mContextSpy);
- when(mContextSpy.getContentResolver()).thenReturn(contentResolver);
- when(mContextSpy.getSystemService(eq(Context.AUDIO_SERVICE))).thenReturn(mAudioManagerMock);
- doAnswer(invocation -> {
- mRegisteredPowerModeListener = invocation.getArgument(0);
- return null;
- }).when(mPowerManagerInternalMock).registerLowPowerModeObserver(any());
+ doReturn(contentResolver).when(mContextSpy).getContentResolver();
+
+ // Make sure broadcast receivers are not registered for this test, to avoid flakes.
+ doReturn(null).when(mContextSpy)
+ .registerReceiver(any(BroadcastReceiver.class), any(IntentFilter.class), anyInt());
+
when(mPackageManagerInternalMock.getSystemUiServiceComponent())
.thenReturn(new ComponentName(SYSUI_PACKAGE_NAME, ""));
- removeServicesForTest();
- addServicesForTest();
-
setDefaultIntensity(VIBRATION_INTENSITY_MEDIUM);
setIgnoreVibrationsOnWirelessCharger(false);
- createSystemReadyVibrationSettings();
-
mockGoToSleep(/* goToSleepTime= */ 0, PowerManager.GO_TO_SLEEP_REASON_TIMEOUT);
+
+ createSystemReadyVibrationSettings();
}
private void createSystemReadyVibrationSettings() {
@@ -177,37 +173,18 @@
setUserSetting(Settings.System.APPLY_RAMPING_RINGER, 0);
setRingerMode(AudioManager.RINGER_MODE_NORMAL);
- mVibrationSettings.onSystemReady();
- }
-
- private void removeServicesForTest() {
- LocalServices.removeServiceForTest(PowerManagerInternal.class);
- LocalServices.removeServiceForTest(PackageManagerInternal.class);
- LocalServices.removeServiceForTest(VirtualDeviceManagerInternal.class);
- }
-
- private void addServicesForTest() {
- LocalServices.addService(PowerManagerInternal.class, mPowerManagerInternalMock);
- LocalServices.addService(PackageManagerInternal.class, mPackageManagerInternalMock);
- LocalServices.addService(VirtualDeviceManagerInternal.class,
- mVirtualDeviceManagerInternalMock);
- }
-
- @After
- public void tearDown() throws Exception {
- removeServicesForTest();
+ mVibrationSettings.onSystemReady(mPackageManagerInternalMock, mPowerManagerInternalMock,
+ mActivityManagerMock, mVirtualDeviceManagerInternalMock, mAudioManagerMock);
}
@Test
public void create_withOnlyRequiredSystemServices() {
- // The only core services that we depend on are PowerManager and PackageManager
- removeServicesForTest();
- LocalServices.addService(PowerManagerInternal.class, mPowerManagerInternalMock);
- LocalServices.addService(PackageManagerInternal.class, mPackageManagerInternalMock);
-
VibrationSettings minimalVibrationSettings = new VibrationSettings(mContextSpy,
new Handler(mTestLooper.getLooper()), mVibrationConfigMock);
- minimalVibrationSettings.onSystemReady();
+
+ // The only core services that we depend on are Power, Package and Activity managers
+ minimalVibrationSettings.onSystemReady(mPackageManagerInternalMock,
+ mPowerManagerInternalMock, mActivityManagerMock, null, null);
}
@Test
@@ -215,8 +192,8 @@
mVibrationSettings.addListener(mListenerMock);
// Testing the broadcast flow manually.
- mVibrationSettings.mUserSwitchObserver.onUserSwitching(NEW_USER_ID);
- mVibrationSettings.mUserSwitchObserver.onUserSwitchComplete(NEW_USER_ID);
+ mVibrationSettings.mUserSwitchObserver.onUserSwitching(USER_ID);
+ mVibrationSettings.mUserSwitchObserver.onUserSwitchComplete(USER_ID);
verify(mListenerMock, times(2)).onChange();
}
@@ -226,9 +203,9 @@
mVibrationSettings.addListener(mListenerMock);
// Testing the broadcast flow manually.
- mVibrationSettings.mSettingChangeReceiver.onReceive(mContextSpy,
+ mVibrationSettings.mRingerModeBroadcastReceiver.onReceive(mContextSpy,
new Intent(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION));
- mVibrationSettings.mSettingChangeReceiver.onReceive(mContextSpy,
+ mVibrationSettings.mRingerModeBroadcastReceiver.onReceive(mContextSpy,
new Intent(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION));
verify(mListenerMock, times(2)).onChange();
@@ -250,9 +227,9 @@
mVibrationSettings.addListener(mListenerMock);
// Testing the broadcast flow manually.
- mRegisteredPowerModeListener.onLowPowerModeChanged(LOW_POWER_STATE);
- mRegisteredPowerModeListener.onLowPowerModeChanged(NORMAL_POWER_STATE);
- mRegisteredPowerModeListener.onLowPowerModeChanged(NORMAL_POWER_STATE); // No change.
+ mVibrationSettings.mLowPowerModeListener.onLowPowerModeChanged(LOW_POWER_STATE);
+ mVibrationSettings.mLowPowerModeListener.onLowPowerModeChanged(NORMAL_POWER_STATE);
+ mVibrationSettings.mLowPowerModeListener.onLowPowerModeChanged(NORMAL_POWER_STATE); // Noop.
verify(mListenerMock, times(2)).onChange();
}
@@ -268,9 +245,9 @@
// Trigger multiple observers manually.
mVibrationSettings.mSettingObserver.onChange(false);
- mRegisteredPowerModeListener.onLowPowerModeChanged(LOW_POWER_STATE);
- mVibrationSettings.mUserSwitchObserver.onUserSwitchComplete(NEW_USER_ID);
- mVibrationSettings.mSettingChangeReceiver.onReceive(mContextSpy,
+ mVibrationSettings.mLowPowerModeListener.onLowPowerModeChanged(LOW_POWER_STATE);
+ mVibrationSettings.mUserSwitchObserver.onUserSwitchComplete(USER_ID);
+ mVibrationSettings.mRingerModeBroadcastReceiver.onReceive(mContextSpy,
new Intent(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION));
verifyNoMoreInteractions(mListenerMock);
@@ -311,11 +288,12 @@
@Test
public void wirelessChargingVibrationsEnabled_doesNotRegisterBatteryReceiver_allowsAnyUsage() {
- setBatteryReceiverRegistrationResult(getBatteryChangedIntent(BATTERY_PLUGGED_WIRELESS));
setIgnoreVibrationsOnWirelessCharger(false);
createSystemReadyVibrationSettings();
- assertNull(mRegisteredBatteryBroadcastReceiver);
+ verify(mContextSpy, never()).registerReceiver(any(BroadcastReceiver.class),
+ argThat(filter -> filter.matchAction(Intent.ACTION_BATTERY_CHANGED)), anyInt());
+
for (int usage : ALL_USAGES) {
assertVibrationNotIgnoredForUsage(usage);
}
@@ -323,7 +301,6 @@
@Test
public void shouldIgnoreVibration_noBatteryIntentWhenSystemReady_allowsAnyUsage() {
- setBatteryReceiverRegistrationResult(null);
setIgnoreVibrationsOnWirelessCharger(true);
createSystemReadyVibrationSettings();
@@ -335,7 +312,10 @@
@Test
public void shouldIgnoreVibration_onNonWirelessChargerWhenSystemReady_allowsAnyUsage() {
Intent nonWirelessChargingIntent = getBatteryChangedIntent(BATTERY_PLUGGED_USB);
- setBatteryReceiverRegistrationResult(nonWirelessChargingIntent);
+ doReturn(nonWirelessChargingIntent).when(mContextSpy).registerReceiver(
+ any(BroadcastReceiver.class),
+ argThat(filter -> filter.matchAction(Intent.ACTION_BATTERY_CHANGED)), anyInt());
+
setIgnoreVibrationsOnWirelessCharger(true);
createSystemReadyVibrationSettings();
@@ -347,7 +327,10 @@
@Test
public void shouldIgnoreVibration_onWirelessChargerWhenSystemReady_doesNotAllowFromAnyUsage() {
Intent wirelessChargingIntent = getBatteryChangedIntent(BATTERY_PLUGGED_WIRELESS);
- setBatteryReceiverRegistrationResult(wirelessChargingIntent);
+ doReturn(wirelessChargingIntent).when(mContextSpy).registerReceiver(
+ any(BroadcastReceiver.class),
+ argThat(filter -> filter.matchAction(Intent.ACTION_BATTERY_CHANGED)), anyInt());
+
setIgnoreVibrationsOnWirelessCharger(true);
createSystemReadyVibrationSettings();
@@ -358,13 +341,12 @@
@Test
public void shouldIgnoreVibration_receivesWirelessChargingIntent_doesNotAllowFromAnyUsage() {
- Intent nonWirelessChargingIntent = getBatteryChangedIntent(BATTERY_PLUGGED_USB);
- setBatteryReceiverRegistrationResult(nonWirelessChargingIntent);
setIgnoreVibrationsOnWirelessCharger(true);
createSystemReadyVibrationSettings();
Intent wirelessChargingIntent = getBatteryChangedIntent(BATTERY_PLUGGED_WIRELESS);
- mRegisteredBatteryBroadcastReceiver.onReceive(mContextSpy, wirelessChargingIntent);
+ mVibrationSettings.mBatteryBroadcastReceiver.onReceive(
+ mContextSpy, wirelessChargingIntent);
for (int usage : ALL_USAGES) {
assertVibrationIgnoredForUsage(usage, Status.IGNORED_ON_WIRELESS_CHARGER);
@@ -373,17 +355,21 @@
@Test
public void shouldIgnoreVibration_receivesNonWirelessChargingIntent_allowsAnyUsage() {
- Intent wirelessChargingIntent = getBatteryChangedIntent(BATTERY_PLUGGED_WIRELESS);
- setBatteryReceiverRegistrationResult(wirelessChargingIntent);
setIgnoreVibrationsOnWirelessCharger(true);
createSystemReadyVibrationSettings();
+
+ Intent wirelessChargingIntent = getBatteryChangedIntent(BATTERY_PLUGGED_WIRELESS);
+ mVibrationSettings.mBatteryBroadcastReceiver.onReceive(
+ mContextSpy, wirelessChargingIntent);
+
// Check that initially, all usages are ignored due to the wireless charging.
for (int usage : ALL_USAGES) {
assertVibrationIgnoredForUsage(usage, Status.IGNORED_ON_WIRELESS_CHARGER);
}
Intent nonWirelessChargingIntent = getBatteryChangedIntent(BATTERY_PLUGGED_USB);
- mRegisteredBatteryBroadcastReceiver.onReceive(mContextSpy, nonWirelessChargingIntent);
+ mVibrationSettings.mBatteryBroadcastReceiver.onReceive(
+ mContextSpy, nonWirelessChargingIntent);
for (int usage : ALL_USAGES) {
assertVibrationNotIgnoredForUsage(usage);
@@ -400,7 +386,7 @@
USAGE_HARDWARE_FEEDBACK
));
- mRegisteredPowerModeListener.onLowPowerModeChanged(LOW_POWER_STATE);
+ mVibrationSettings.mLowPowerModeListener.onLowPowerModeChanged(LOW_POWER_STATE);
for (int usage : ALL_USAGES) {
if (expectedAllowedVibrations.contains(usage)) {
@@ -413,7 +399,7 @@
@Test
public void shouldIgnoreVibration_notInBatterySaverMode_allowsAnyUsage() {
- mRegisteredPowerModeListener.onLowPowerModeChanged(NORMAL_POWER_STATE);
+ mVibrationSettings.mLowPowerModeListener.onLowPowerModeChanged(NORMAL_POWER_STATE);
for (int usage : ALL_USAGES) {
assertVibrationNotIgnoredForUsage(usage);
@@ -596,7 +582,7 @@
// Testing the broadcast flow manually.
when(mAudioManagerMock.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_SILENT);
- mVibrationSettings.mSettingChangeReceiver.onReceive(mContextSpy,
+ mVibrationSettings.mRingerModeBroadcastReceiver.onReceive(mContextSpy,
new Intent(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION));
assertVibrationIgnoredForUsage(USAGE_RINGTONE, Status.IGNORED_FOR_RINGER_MODE);
@@ -852,16 +838,15 @@
mVibrationSettings.getCurrentIntensity(USAGE_RINGTONE));
// Test early update of settings based on new user id.
- putUserSetting(Settings.System.RING_VIBRATION_INTENSITY, VIBRATION_INTENSITY_LOW,
- NEW_USER_ID);
- mVibrationSettings.mUserSwitchObserver.onUserSwitching(NEW_USER_ID);
+ putUserSetting(Settings.System.RING_VIBRATION_INTENSITY, VIBRATION_INTENSITY_LOW, USER_ID);
+ mVibrationSettings.mUserSwitchObserver.onUserSwitching(USER_ID);
assertEquals(VIBRATION_INTENSITY_LOW,
mVibrationSettings.getCurrentIntensity(USAGE_RINGTONE));
// Test later update of settings for UserHandle.USER_CURRENT.
putUserSetting(Settings.System.RING_VIBRATION_INTENSITY, VIBRATION_INTENSITY_LOW,
UserHandle.USER_CURRENT);
- mVibrationSettings.mUserSwitchObserver.onUserSwitchComplete(NEW_USER_ID);
+ mVibrationSettings.mUserSwitchObserver.onUserSwitchComplete(USER_ID);
assertEquals(VIBRATION_INTENSITY_LOW,
mVibrationSettings.getCurrentIntensity(USAGE_RINGTONE));
}
@@ -1009,7 +994,7 @@
private void setRingerMode(int ringerMode) {
when(mAudioManagerMock.getRingerModeInternal()).thenReturn(ringerMode);
// Mock AudioManager broadcast of internal ringer mode change.
- mVibrationSettings.mSettingChangeReceiver.onReceive(mContextSpy,
+ mVibrationSettings.mRingerModeBroadcastReceiver.onReceive(mContextSpy,
new Intent(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION));
}
@@ -1024,14 +1009,6 @@
return new CallerInfo(attrs, uid, VIRTUAL_DEVICE_ID, opPkg, null);
}
- private void setBatteryReceiverRegistrationResult(Intent result) {
- doAnswer(invocation -> {
- mRegisteredBatteryBroadcastReceiver = invocation.getArgument(0);
- return result;
- }).when(mContextSpy).registerReceiver(any(BroadcastReceiver.class),
- argThat(filter -> filter.matchAction(Intent.ACTION_BATTERY_CHANGED)), anyInt());
- }
-
private Intent getBatteryChangedIntent(int extraPluggedValue) {
Intent batteryIntent = new Intent(Intent.ACTION_BATTERY_CHANGED);
batteryIntent.putExtra(EXTRA_PLUGGED, extraPluggedValue);
diff --git a/services/tests/vibrator/src/com/android/server/vibrator/VibrationThreadTest.java b/services/tests/vibrator/src/com/android/server/vibrator/VibrationThreadTest.java
index 31cc50f1..e83a4b2 100644
--- a/services/tests/vibrator/src/com/android/server/vibrator/VibrationThreadTest.java
+++ b/services/tests/vibrator/src/com/android/server/vibrator/VibrationThreadTest.java
@@ -29,13 +29,11 @@
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.ArgumentMatchers.same;
import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.timeout;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -96,8 +94,6 @@
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
import java.util.function.BooleanSupplier;
import java.util.stream.Collectors;
@@ -187,11 +183,11 @@
mVibratorProviders.clear();
CombinedVibration effect = CombinedVibration.createParallel(
VibrationEffect.get(VibrationEffect.EFFECT_CLICK));
- long vibrationId = startThreadAndDispatcher(effect);
+ HalVibration vibration = startThreadAndDispatcher(effect);
waitForCompletion();
- verify(mControllerCallbacks, never()).onComplete(anyInt(), eq(vibrationId));
- verifyCallbacksTriggered(vibrationId, Status.IGNORED_UNSUPPORTED);
+ verify(mControllerCallbacks, never()).onComplete(anyInt(), eq(vibration.id));
+ verifyCallbacksTriggered(vibration, Status.IGNORED_UNSUPPORTED);
}
@Test
@@ -200,11 +196,11 @@
.addNext(2, VibrationEffect.get(VibrationEffect.EFFECT_CLICK))
.addNext(3, VibrationEffect.get(VibrationEffect.EFFECT_TICK))
.combine();
- long vibrationId = startThreadAndDispatcher(effect);
+ HalVibration vibration = startThreadAndDispatcher(effect);
waitForCompletion();
- verify(mControllerCallbacks, never()).onComplete(anyInt(), eq(vibrationId));
- verifyCallbacksTriggered(vibrationId, Status.IGNORED_UNSUPPORTED);
+ verify(mControllerCallbacks, never()).onComplete(anyInt(), eq(vibration.id));
+ verifyCallbacksTriggered(vibration, Status.IGNORED_UNSUPPORTED);
}
@Test
@@ -212,34 +208,34 @@
mVibratorProviders.get(VIBRATOR_ID).setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL);
VibrationEffect effect = VibrationEffect.createOneShot(10, 100);
- long vibrationId = startThreadAndDispatcher(effect);
+ HalVibration vibration = startThreadAndDispatcher(effect);
waitForCompletion();
verify(mManagerHooks).noteVibratorOn(eq(UID), eq(10L));
verify(mManagerHooks).noteVibratorOff(eq(UID));
- verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibrationId));
- verifyCallbacksTriggered(vibrationId, Status.FINISHED);
+ verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibration.id));
+ verifyCallbacksTriggered(vibration, Status.FINISHED);
assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
assertEquals(Arrays.asList(expectedOneShot(10)),
- mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibrationId));
+ mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id));
assertEquals(expectedAmplitudes(100), mVibratorProviders.get(VIBRATOR_ID).getAmplitudes());
}
@Test
public void vibrate_oneShotWithoutAmplitudeControl_runsVibrationWithDefaultAmplitude() {
VibrationEffect effect = VibrationEffect.createOneShot(10, 100);
- long vibrationId = startThreadAndDispatcher(effect);
+ HalVibration vibration = startThreadAndDispatcher(effect);
waitForCompletion();
verify(mManagerHooks).noteVibratorOn(eq(UID), eq(10L));
verify(mManagerHooks).noteVibratorOff(eq(UID));
- verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibrationId));
- verifyCallbacksTriggered(vibrationId, Status.FINISHED);
+ verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibration.id));
+ verifyCallbacksTriggered(vibration, Status.FINISHED);
assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
assertEquals(Arrays.asList(expectedOneShot(10)),
- mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibrationId));
+ mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id));
assertTrue(mVibratorProviders.get(VIBRATOR_ID).getAmplitudes().isEmpty());
}
@@ -249,17 +245,17 @@
VibrationEffect effect = VibrationEffect.createWaveform(
new long[]{5, 5, 5}, new int[]{1, 2, 3}, -1);
- long vibrationId = startThreadAndDispatcher(effect);
+ HalVibration vibration = startThreadAndDispatcher(effect);
waitForCompletion();
verify(mManagerHooks).noteVibratorOn(eq(UID), eq(15L));
verify(mManagerHooks).noteVibratorOff(eq(UID));
- verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibrationId));
- verifyCallbacksTriggered(vibrationId, Status.FINISHED);
+ verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibration.id));
+ verifyCallbacksTriggered(vibration, Status.FINISHED);
assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
assertEquals(Arrays.asList(expectedOneShot(15)),
- mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibrationId));
+ mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id));
assertEquals(expectedAmplitudes(1, 2, 3),
mVibratorProviders.get(VIBRATOR_ID).getAmplitudes());
}
@@ -277,13 +273,13 @@
mVibrationScaler.updateAdaptiveHapticsScale(USAGE_RINGTONE, 0.5f);
CompletableFuture<Void> mRequestVibrationParamsFuture = CompletableFuture.completedFuture(
null);
- long vibrationId = startThreadAndDispatcher(effect, mRequestVibrationParamsFuture,
+ HalVibration vibration = startThreadAndDispatcher(effect, mRequestVibrationParamsFuture,
USAGE_RINGTONE);
waitForCompletion();
verify(mStatsLoggerMock, never()).logVibrationParamRequestTimeout(UID);
assertEquals(Arrays.asList(expectedOneShot(15)),
- mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibrationId));
+ mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id));
List<Float> amplitudes = mVibratorProviders.get(VIBRATOR_ID).getAmplitudes();
for (int i = 0; i < amplitudes.size(); i++) {
assertTrue(amplitudes.get(i) < 1 / 255f);
@@ -301,12 +297,13 @@
new long[]{5, 5, 5}, new int[]{1, 1, 1}, -1);
CompletableFuture<Void> neverCompletingFuture = new CompletableFuture<>();
- long vibrationId = startThreadAndDispatcher(effect, neverCompletingFuture, USAGE_RINGTONE);
+ HalVibration vibration = startThreadAndDispatcher(effect, neverCompletingFuture,
+ USAGE_RINGTONE);
waitForCompletion();
verify(mStatsLoggerMock).logVibrationParamRequestTimeout(UID);
assertEquals(Arrays.asList(expectedOneShot(15)),
- mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibrationId));
+ mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id));
assertEquals(expectedAmplitudes(1, 1, 1),
mVibratorProviders.get(VIBRATOR_ID).getAmplitudes());
}
@@ -319,13 +316,13 @@
int[] amplitudes = new int[]{1, 2, 3};
VibrationEffect effect = VibrationEffect.createWaveform(new long[]{5, 5, 5}, amplitudes, 0);
- long vibrationId = startThreadAndDispatcher(effect);
+ HalVibration vibration = startThreadAndDispatcher(effect);
assertTrue(
waitUntil(() -> fakeVibrator.getAmplitudes().size() > 2 * amplitudes.length,
TEST_TIMEOUT_MILLIS));
// Vibration still running after 2 cycles.
- assertTrue(mThread.isRunningVibrationId(vibrationId));
+ assertTrue(mThread.isRunningVibrationId(vibration.id));
assertTrue(mControllers.get(VIBRATOR_ID).isVibrating());
Vibration.EndInfo cancelVibrationInfo = new Vibration.EndInfo(Status.CANCELLED_SUPERSEDED,
@@ -333,15 +330,15 @@
/* uid= */ 1, /* deviceId= */ -1, /* opPkg= */ null, /* reason= */ null));
mVibrationConductor.notifyCancelled(cancelVibrationInfo, /* immediate= */ false);
waitForCompletion();
- assertFalse(mThread.isRunningVibrationId(vibrationId));
+ assertFalse(mThread.isRunningVibrationId(vibration.id));
verify(mManagerHooks).noteVibratorOn(eq(UID), anyLong());
verify(mManagerHooks).noteVibratorOff(eq(UID));
- verifyCallbacksTriggered(vibrationId, cancelVibrationInfo);
+ verifyCallbacksTriggered(vibration, Status.CANCELLED_SUPERSEDED);
assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
List<Float> playedAmplitudes = fakeVibrator.getAmplitudes();
- assertFalse(fakeVibrator.getEffectSegments(vibrationId).isEmpty());
+ assertFalse(fakeVibrator.getEffectSegments(vibration.id).isEmpty());
assertFalse(playedAmplitudes.isEmpty());
for (int i = 0; i < playedAmplitudes.size(); i++) {
@@ -358,17 +355,17 @@
int[] amplitudes = new int[]{1, 2, 3};
VibrationEffect effect = VibrationEffect.createWaveform(
new long[]{1, 10, 100}, amplitudes, 0);
- long vibrationId = startThreadAndDispatcher(effect);
+ HalVibration vibration = startThreadAndDispatcher(effect);
assertTrue(waitUntil(() -> !fakeVibrator.getAmplitudes().isEmpty(), TEST_TIMEOUT_MILLIS));
mVibrationConductor.notifyCancelled(
new Vibration.EndInfo(Status.CANCELLED_BY_USER), /* immediate= */ false);
waitForCompletion();
- verifyCallbacksTriggered(vibrationId, Status.CANCELLED_BY_USER);
+ verifyCallbacksTriggered(vibration, Status.CANCELLED_BY_USER);
assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
assertEquals(Arrays.asList(expectedOneShot(5000)),
- fakeVibrator.getEffectSegments(vibrationId));
+ fakeVibrator.getEffectSegments(vibration.id));
}
@Test
@@ -377,16 +374,16 @@
VibrationEffect effect = VibrationEffect.createWaveform(
/* timings= */ new long[]{0, 100, 50, 100, 0, 0, 0, 50}, /* repeat= */ -1);
- long vibrationId = startThreadAndDispatcher(effect);
+ HalVibration vibration = startThreadAndDispatcher(effect);
waitForCompletion();
verify(mManagerHooks).noteVibratorOn(eq(UID), eq(300L));
verify(mManagerHooks).noteVibratorOff(eq(UID));
- verifyCallbacksTriggered(vibrationId, Status.FINISHED);
+ verifyCallbacksTriggered(vibration, Status.FINISHED);
assertThat(mControllers.get(VIBRATOR_ID).isVibrating()).isFalse();
- assertThat(mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibrationId))
+ assertThat(mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id))
.isEqualTo(expectedOneShots(100L, 150L));
}
@@ -398,16 +395,16 @@
VibrationEffect effect = VibrationEffect.createWaveform(
/* timings= */ new long[]{0, 100, 0, 50, 50, 0, 100, 50}, amplitudes,
/* repeat= */ -1);
- long vibrationId = startThreadAndDispatcher(effect);
+ HalVibration vibration = startThreadAndDispatcher(effect);
waitForCompletion();
verify(mManagerHooks).noteVibratorOn(eq(UID), eq(350L));
verify(mManagerHooks).noteVibratorOff(eq(UID));
- verifyCallbacksTriggered(vibrationId, Status.FINISHED);
+ verifyCallbacksTriggered(vibration, Status.FINISHED);
assertThat(mControllers.get(VIBRATOR_ID).isVibrating()).isFalse();
- assertThat(mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibrationId))
+ assertThat(mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id))
.isEqualTo(expectedOneShots(200L, 50L));
}
@@ -420,7 +417,7 @@
VibrationEffect effect = VibrationEffect.createWaveform(
/* timings= */ new long[]{0, 200, 50, 100, 0, 50, 50, 100}, /* repeat= */ 0);
- long vibrationId = startThreadAndDispatcher(effect);
+ HalVibration vibration = startThreadAndDispatcher(effect);
// We are expect this test to repeat the vibration effect twice, which would result in 5
// segments being played:
// 200ms ON
@@ -428,16 +425,17 @@
// 300ms ON (100ms + 200ms looping to the start and skipping first 0ms)
// 150ms ON (100ms + 50ms, skips 0ms)
// 300ms ON (100ms + 200ms looping to the start and skipping first 0ms)
- assertTrue(waitUntil(() -> fakeVibrator.getEffectSegments(vibrationId).size() >= 5,
+ assertTrue(waitUntil(() -> fakeVibrator.getEffectSegments(vibration.id).size() >= 5,
5000L + TEST_TIMEOUT_MILLIS));
mVibrationConductor.notifyCancelled(
new Vibration.EndInfo(Status.CANCELLED_BY_USER), /* immediate= */ false);
waitForCompletion();
- verifyCallbacksTriggered(vibrationId, Status.CANCELLED_BY_USER);
+ verifyCallbacksTriggered(vibration, Status.CANCELLED_BY_USER);
assertThat(mControllers.get(VIBRATOR_ID).isVibrating()).isFalse();
- assertThat(mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibrationId).subList(0, 5))
+ assertThat(
+ mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id).subList(0, 5))
.isEqualTo(expectedOneShots(200L, 150L, 300L, 150L, 300L));
}
@@ -458,18 +456,18 @@
VibrationEffect repeatingEffect = VibrationEffect.startComposition()
.repeatEffectIndefinitely(effect)
.compose();
- long vibrationId = startThreadAndDispatcher(repeatingEffect);
+ HalVibration vibration = startThreadAndDispatcher(repeatingEffect);
- assertTrue(waitUntil(() -> !fakeVibrator.getEffectSegments(vibrationId).isEmpty(),
+ assertTrue(waitUntil(() -> !fakeVibrator.getEffectSegments(vibration.id).isEmpty(),
TEST_TIMEOUT_MILLIS));
mVibrationConductor.notifyCancelled(
new Vibration.EndInfo(Status.CANCELLED_BY_USER), /* immediate= */ false);
waitForCompletion();
// PWLE size max was used to generate a single vibrate call with 10 segments.
- verifyCallbacksTriggered(vibrationId, Status.CANCELLED_BY_USER);
+ verifyCallbacksTriggered(vibration, Status.CANCELLED_BY_USER);
assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
- assertEquals(10, fakeVibrator.getEffectSegments(vibrationId).size());
+ assertEquals(10, fakeVibrator.getEffectSegments(vibration.id).size());
}
@Test
@@ -487,18 +485,18 @@
VibrationEffect repeatingEffect = VibrationEffect.startComposition()
.repeatEffectIndefinitely(effect)
.compose();
- long vibrationId = startThreadAndDispatcher(repeatingEffect);
+ HalVibration vibration = startThreadAndDispatcher(repeatingEffect);
- assertTrue(waitUntil(() -> !fakeVibrator.getEffectSegments(vibrationId).isEmpty(),
+ assertTrue(waitUntil(() -> !fakeVibrator.getEffectSegments(vibration.id).isEmpty(),
TEST_TIMEOUT_MILLIS));
mVibrationConductor.notifyCancelled(
new Vibration.EndInfo(Status.CANCELLED_BY_SCREEN_OFF), /* immediate= */ false);
waitForCompletion();
// Composition size max was used to generate a single vibrate call with 10 primitives.
- verifyCallbacksTriggered(vibrationId, Status.CANCELLED_BY_SCREEN_OFF);
+ verifyCallbacksTriggered(vibration, Status.CANCELLED_BY_SCREEN_OFF);
assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
- assertEquals(10, fakeVibrator.getEffectSegments(vibrationId).size());
+ assertEquals(10, fakeVibrator.getEffectSegments(vibration.id).size());
}
@Test
@@ -510,17 +508,17 @@
int[] amplitudes = new int[]{1, 2, 3};
VibrationEffect effect = VibrationEffect.createWaveform(
new long[]{5000, 500, 50}, amplitudes, 0);
- long vibrationId = startThreadAndDispatcher(effect);
+ HalVibration vibration = startThreadAndDispatcher(effect);
assertTrue(waitUntil(() -> !fakeVibrator.getAmplitudes().isEmpty(), TEST_TIMEOUT_MILLIS));
mVibrationConductor.notifyCancelled(
new Vibration.EndInfo(Status.CANCELLED_BY_USER), /* immediate= */ false);
waitForCompletion();
- verifyCallbacksTriggered(vibrationId, Status.CANCELLED_BY_USER);
+ verifyCallbacksTriggered(vibration, Status.CANCELLED_BY_USER);
assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
assertEquals(Arrays.asList(expectedOneShot(5550)),
- fakeVibrator.getEffectSegments(vibrationId));
+ fakeVibrator.getEffectSegments(vibration.id));
}
@LargeTest
@@ -534,17 +532,17 @@
VibrationEffect effect = VibrationEffect.createWaveform(
/* timings= */ new long[]{expectedOnDuration - 100, 50},
/* amplitudes= */ new int[]{1, 2}, /* repeat= */ 0);
- long vibrationId = startThreadAndDispatcher(effect);
+ HalVibration vibration = startThreadAndDispatcher(effect);
- assertTrue(waitUntil(() -> fakeVibrator.getEffectSegments(vibrationId).size() > 1,
+ assertTrue(waitUntil(() -> fakeVibrator.getEffectSegments(vibration.id).size() > 1,
expectedOnDuration + TEST_TIMEOUT_MILLIS));
mVibrationConductor.notifyCancelled(
new Vibration.EndInfo(Status.CANCELLED_BY_USER), /* immediate= */ false);
waitForCompletion();
- verifyCallbacksTriggered(vibrationId, Status.CANCELLED_BY_USER);
+ verifyCallbacksTriggered(vibration, Status.CANCELLED_BY_USER);
assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
- List<VibrationEffectSegment> effectSegments = fakeVibrator.getEffectSegments(vibrationId);
+ List<VibrationEffectSegment> effectSegments = fakeVibrator.getEffectSegments(vibration.id);
// First time, turn vibrator ON for the expected fixed duration.
assertEquals(expectedOnDuration, effectSegments.get(0).getDuration());
// Vibrator turns off in the middle of the second execution of the first step. Expect it to
@@ -567,11 +565,11 @@
.addPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK, 1f, 100)
.addPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK, 1f, 100)
.compose();
- long vibrationId = startThreadAndDispatcher(effect);
+ HalVibration vibration = startThreadAndDispatcher(effect);
assertTrue(waitUntil(() -> mControllers.get(VIBRATOR_ID).isVibrating(),
TEST_TIMEOUT_MILLIS));
- assertTrue(mThread.isRunningVibrationId(vibrationId));
+ assertTrue(mThread.isRunningVibrationId(vibration.id));
// Run cancel in a separate thread so if VibrationThread.cancel blocks then this test should
// fail at waitForCompletion(vibrationThread) if the vibration not cancelled immediately.
@@ -584,7 +582,7 @@
waitForCompletion(/* timeout= */ 50);
cancellingThread.join();
- verifyCallbacksTriggered(vibrationId, Status.CANCELLED_BY_SETTINGS_UPDATE);
+ verifyCallbacksTriggered(vibration, Status.CANCELLED_BY_SETTINGS_UPDATE);
assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
}
@@ -597,11 +595,11 @@
mVibratorProviders.get(VIBRATOR_ID).setVendorEffectDuration(10 * TEST_TIMEOUT_MILLIS);
VibrationEffect effect = VibrationEffect.createVendorEffect(createTestVendorData());
- long vibrationId = startThreadAndDispatcher(effect);
+ HalVibration vibration = startThreadAndDispatcher(effect);
assertTrue(waitUntil(() -> mControllers.get(VIBRATOR_ID).isVibrating(),
TEST_TIMEOUT_MILLIS));
- assertTrue(mThread.isRunningVibrationId(vibrationId));
+ assertTrue(mThread.isRunningVibrationId(vibration.id));
// Run cancel in a separate thread so if VibrationThread.cancel blocks then this test should
// fail at waitForCompletion(vibrationThread) if the vibration not cancelled immediately.
@@ -614,7 +612,7 @@
waitForCompletion(/* timeout= */ 50);
cancellingThread.join();
- verifyCallbacksTriggered(vibrationId, Status.CANCELLED_BY_SETTINGS_UPDATE);
+ verifyCallbacksTriggered(vibration, Status.CANCELLED_BY_SETTINGS_UPDATE);
assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
}
@@ -624,11 +622,11 @@
mVibratorProviders.get(VIBRATOR_ID).setCapabilities(IVibrator.CAP_COMPOSE_EFFECTS);
VibrationEffect effect = VibrationEffect.createWaveform(new long[]{100}, new int[]{100}, 0);
- long vibrationId = startThreadAndDispatcher(effect);
+ HalVibration vibration = startThreadAndDispatcher(effect);
assertTrue(waitUntil(() -> mControllers.get(VIBRATOR_ID).isVibrating(),
TEST_TIMEOUT_MILLIS));
- assertTrue(mThread.isRunningVibrationId(vibrationId));
+ assertTrue(mThread.isRunningVibrationId(vibration.id));
// Run cancel in a separate thread so if VibrationThread.cancel blocks then this test should
// fail at waitForCompletion(vibrationThread) if the vibration not cancelled immediately.
@@ -641,7 +639,7 @@
waitForCompletion(/* timeout= */ 50);
cancellingThread.join();
- verifyCallbacksTriggered(vibrationId, Status.CANCELLED_BY_SCREEN_OFF);
+ verifyCallbacksTriggered(vibration, Status.CANCELLED_BY_SCREEN_OFF);
assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
}
@@ -650,17 +648,17 @@
mVibratorProviders.get(1).setSupportedEffects(VibrationEffect.EFFECT_THUD);
VibrationEffect effect = VibrationEffect.get(VibrationEffect.EFFECT_THUD);
- long vibrationId = startThreadAndDispatcher(effect);
+ HalVibration vibration = startThreadAndDispatcher(effect);
waitForCompletion();
verify(mManagerHooks).noteVibratorOn(eq(UID), eq(20L));
verify(mManagerHooks).noteVibratorOff(eq(UID));
- verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibrationId));
- verifyCallbacksTriggered(vibrationId, Status.FINISHED);
+ verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibration.id));
+ verifyCallbacksTriggered(vibration, Status.FINISHED);
assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
assertEquals(Arrays.asList(expectedPrebaked(VibrationEffect.EFFECT_THUD)),
- mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibrationId));
+ mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id));
}
@Test
@@ -671,31 +669,31 @@
HalVibration vibration = createVibration(CombinedVibration.createParallel(
VibrationEffect.get(VibrationEffect.EFFECT_CLICK)));
vibration.addFallback(VibrationEffect.EFFECT_CLICK, fallback);
- long vibrationId = startThreadAndDispatcher(vibration);
+ startThreadAndDispatcher(vibration);
waitForCompletion();
verify(mManagerHooks).noteVibratorOn(eq(UID), eq(10L));
verify(mManagerHooks).noteVibratorOff(eq(UID));
- verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibrationId));
- verifyCallbacksTriggered(vibrationId, Status.FINISHED);
+ verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibration.id));
+ verifyCallbacksTriggered(vibration, Status.FINISHED);
assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
assertEquals(Arrays.asList(expectedOneShot(10)),
- mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibrationId));
+ mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id));
assertEquals(expectedAmplitudes(100), mVibratorProviders.get(VIBRATOR_ID).getAmplitudes());
}
@Test
public void vibrate_singleVibratorPrebakedAndUnsupportedEffect_ignoresVibration() {
VibrationEffect effect = VibrationEffect.get(VibrationEffect.EFFECT_CLICK);
- long vibrationId = startThreadAndDispatcher(effect);
+ HalVibration vibration = startThreadAndDispatcher(effect);
waitForCompletion();
verify(mManagerHooks).noteVibratorOn(eq(UID), eq(0L));
verify(mManagerHooks, never()).noteVibratorOff(eq(UID));
- verify(mControllerCallbacks, never()).onComplete(eq(VIBRATOR_ID), eq(vibrationId));
- verifyCallbacksTriggered(vibrationId, Status.IGNORED_UNSUPPORTED);
- assertTrue(mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibrationId).isEmpty());
+ verify(mControllerCallbacks, never()).onComplete(eq(VIBRATOR_ID), eq(vibration.id));
+ verifyCallbacksTriggered(vibration, Status.IGNORED_UNSUPPORTED);
+ assertTrue(mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id).isEmpty());
}
@Test
@@ -704,17 +702,17 @@
mVibratorProviders.get(1).setCapabilities(IVibrator.CAP_PERFORM_VENDOR_EFFECTS);
VibrationEffect effect = VibrationEffect.createVendorEffect(createTestVendorData());
- long vibrationId = startThreadAndDispatcher(effect);
+ HalVibration vibration = startThreadAndDispatcher(effect);
waitForCompletion();
verify(mManagerHooks).noteVibratorOn(eq(UID),
eq(PerformVendorEffectVibratorStep.VENDOR_EFFECT_MAX_DURATION_MS));
verify(mManagerHooks).noteVibratorOff(eq(UID));
- verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibrationId));
- verifyCallbacksTriggered(vibrationId, Status.FINISHED);
+ verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibration.id));
+ verifyCallbacksTriggered(vibration, Status.FINISHED);
assertThat(mControllers.get(VIBRATOR_ID).isVibrating()).isFalse();
- assertThat(mVibratorProviders.get(VIBRATOR_ID).getVendorEffects(vibrationId))
+ assertThat(mVibratorProviders.get(VIBRATOR_ID).getVendorEffects(vibration.id))
.containsExactly(effect)
.inOrder();
}
@@ -730,18 +728,18 @@
.addPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK, 1f)
.addPrimitive(VibrationEffect.Composition.PRIMITIVE_TICK, 0.5f)
.compose();
- long vibrationId = startThreadAndDispatcher(effect);
+ HalVibration vibration = startThreadAndDispatcher(effect);
waitForCompletion();
verify(mManagerHooks).noteVibratorOn(eq(UID), eq(40L));
verify(mManagerHooks).noteVibratorOff(eq(UID));
- verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibrationId));
- verifyCallbacksTriggered(vibrationId, Status.FINISHED);
+ verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibration.id));
+ verifyCallbacksTriggered(vibration, Status.FINISHED);
assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
assertEquals(Arrays.asList(
expectedPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK, 1, 0),
expectedPrimitive(VibrationEffect.Composition.PRIMITIVE_TICK, 0.5f, 0)),
- fakeVibrator.getEffectSegments(vibrationId));
+ fakeVibrator.getEffectSegments(vibration.id));
}
@Test
@@ -749,14 +747,14 @@
VibrationEffect effect = VibrationEffect.startComposition()
.addPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK, 1f)
.compose();
- long vibrationId = startThreadAndDispatcher(effect);
+ HalVibration vibration = startThreadAndDispatcher(effect);
waitForCompletion();
verify(mManagerHooks).noteVibratorOn(eq(UID), eq(0L));
verify(mManagerHooks, never()).noteVibratorOff(eq(UID));
- verify(mControllerCallbacks, never()).onComplete(eq(VIBRATOR_ID), eq(vibrationId));
- verifyCallbacksTriggered(vibrationId, Status.IGNORED_UNSUPPORTED);
- assertTrue(mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibrationId).isEmpty());
+ verify(mControllerCallbacks, never()).onComplete(eq(VIBRATOR_ID), eq(vibration.id));
+ verifyCallbacksTriggered(vibration, Status.IGNORED_UNSUPPORTED);
+ assertTrue(mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id).isEmpty());
}
@Test
@@ -774,13 +772,13 @@
.addPrimitive(VibrationEffect.Composition.PRIMITIVE_TICK, 0.5f)
.addPrimitive(VibrationEffect.Composition.PRIMITIVE_SPIN, 0.8f)
.compose();
- long vibrationId = startThreadAndDispatcher(effect);
+ HalVibration vibration = startThreadAndDispatcher(effect);
waitForCompletion();
- verifyCallbacksTriggered(vibrationId, Status.FINISHED);
+ verifyCallbacksTriggered(vibration, Status.FINISHED);
// Vibrator compose called twice.
- verify(mControllerCallbacks, times(2)).onComplete(eq(VIBRATOR_ID), eq(vibrationId));
- assertEquals(3, fakeVibrator.getEffectSegments(vibrationId).size());
+ verify(mControllerCallbacks, times(2)).onComplete(eq(VIBRATOR_ID), eq(vibration.id));
+ assertEquals(3, fakeVibrator.getEffectSegments(vibration.id).size());
}
@Test
@@ -810,14 +808,14 @@
.build())
.addEffect(VibrationEffect.get(VibrationEffect.EFFECT_CLICK))
.compose();
- long vibrationId = startThreadAndDispatcher(effect);
+ HalVibration vibration = startThreadAndDispatcher(effect);
waitForCompletion();
// Use first duration the vibrator is turned on since we cannot estimate the clicks.
verify(mManagerHooks).noteVibratorOn(eq(UID), eq(10L));
verify(mManagerHooks).noteVibratorOff(eq(UID));
- verify(mControllerCallbacks, times(5)).onComplete(eq(VIBRATOR_ID), eq(vibrationId));
- verifyCallbacksTriggered(vibrationId, Status.FINISHED);
+ verify(mControllerCallbacks, times(5)).onComplete(eq(VIBRATOR_ID), eq(vibration.id));
+ verifyCallbacksTriggered(vibration, Status.FINISHED);
assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
assertEquals(Arrays.asList(
expectedOneShot(10),
@@ -829,7 +827,7 @@
expectedRamp(/* startAmplitude= */ 0.5f, /* endAmplitude= */ 0.7f,
/* startFrequencyHz= */ 100, /* endFrequencyHz= */ 120, /* duration= */ 20),
expectedPrebaked(VibrationEffect.EFFECT_CLICK)),
- mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibrationId));
+ mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id));
assertEquals(expectedAmplitudes(100), mVibratorProviders.get(VIBRATOR_ID).getAmplitudes());
}
@@ -851,18 +849,18 @@
.compose();
HalVibration vibration = createVibration(CombinedVibration.createParallel(effect));
vibration.addFallback(VibrationEffect.EFFECT_TICK, fallback);
- long vibrationId = startThreadAndDispatcher(vibration);
+ startThreadAndDispatcher(vibration);
waitForCompletion();
// Use first duration the vibrator is turned on since we cannot estimate the clicks.
verify(mManagerHooks).noteVibratorOn(eq(UID), anyLong());
verify(mManagerHooks).noteVibratorOff(eq(UID));
- verify(mControllerCallbacks, times(4)).onComplete(eq(VIBRATOR_ID), eq(vibrationId));
- verifyCallbacksTriggered(vibrationId, Status.FINISHED);
+ verify(mControllerCallbacks, times(4)).onComplete(eq(VIBRATOR_ID), eq(vibration.id));
+ verifyCallbacksTriggered(vibration, Status.FINISHED);
assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
List<VibrationEffectSegment> segments =
- mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibrationId);
+ mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id);
assertTrue("Wrong segments: " + segments, segments.size() >= 4);
assertTrue(segments.get(0) instanceof PrebakedSegment);
assertTrue(segments.get(1) instanceof PrimitiveSegment);
@@ -891,13 +889,13 @@
.addSustain(Duration.ofMillis(30))
.addTransition(Duration.ofMillis(40), targetAmplitude(0.6f), targetFrequency(200))
.build();
- long vibrationId = startThreadAndDispatcher(effect);
+ HalVibration vibration = startThreadAndDispatcher(effect);
waitForCompletion();
verify(mManagerHooks).noteVibratorOn(eq(UID), eq(100L));
verify(mManagerHooks).noteVibratorOff(eq(UID));
- verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibrationId));
- verifyCallbacksTriggered(vibrationId, Status.FINISHED);
+ verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibration.id));
+ verifyCallbacksTriggered(vibration, Status.FINISHED);
assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
assertEquals(Arrays.asList(
expectedRamp(/* amplitude= */ 1, /* frequencyHz= */ 150, /* duration= */ 10),
@@ -907,8 +905,8 @@
expectedRamp(/* startAmplitude= */ 0.5f, /* endAmplitude= */ 0.6f,
/* startFrequencyHz= */ 100, /* endFrequencyHz= */ 200,
/* duration= */ 40)),
- fakeVibrator.getEffectSegments(vibrationId));
- assertEquals(Arrays.asList(Braking.CLAB), fakeVibrator.getBraking(vibrationId));
+ fakeVibrator.getEffectSegments(vibration.id));
+ assertEquals(Arrays.asList(Braking.CLAB), fakeVibrator.getBraking(vibration.id));
}
@Test
@@ -932,15 +930,15 @@
.addTransition(Duration.ofMillis(40), targetAmplitude(0.7f), targetFrequency(200))
.addTransition(Duration.ofMillis(40), targetAmplitude(0.6f), targetFrequency(200))
.build();
- long vibrationId = startThreadAndDispatcher(effect);
+ HalVibration vibration = startThreadAndDispatcher(effect);
waitForCompletion();
- verifyCallbacksTriggered(vibrationId, Status.FINISHED);
+ verifyCallbacksTriggered(vibration, Status.FINISHED);
// Vibrator compose called 3 times with 2 segments instead of 2 times with 3 segments.
// Using best split points instead of max-packing PWLEs.
- verify(mControllerCallbacks, times(3)).onComplete(eq(VIBRATOR_ID), eq(vibrationId));
- assertEquals(6, fakeVibrator.getEffectSegments(vibrationId).size());
+ verify(mControllerCallbacks, times(3)).onComplete(eq(VIBRATOR_ID), eq(vibration.id));
+ assertEquals(6, fakeVibrator.getEffectSegments(vibration.id).size());
}
@Test
@@ -949,28 +947,28 @@
fakeVibrator.setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL);
VibrationEffect effect = VibrationEffect.createWaveform(new long[]{5}, new int[]{100}, 0);
- long vibrationId = startThreadAndDispatcher(effect);
+ HalVibration vibration = startThreadAndDispatcher(effect);
assertTrue(waitUntil(() -> fakeVibrator.getAmplitudes().size() > 2, TEST_TIMEOUT_MILLIS));
// Vibration still running after 2 cycles.
- assertTrue(mThread.isRunningVibrationId(vibrationId));
+ assertTrue(mThread.isRunningVibrationId(vibration.id));
assertTrue(mControllers.get(VIBRATOR_ID).isVibrating());
mVibrationConductor.binderDied();
waitForCompletion();
assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
- verifyCallbacksTriggered(vibrationId, Status.CANCELLED_BINDER_DIED);
+ verifyCallbacksTriggered(vibration, Status.CANCELLED_BINDER_DIED);
}
@Test
public void vibrate_singleVibrator_skipsSyncedCallbacks() {
mVibratorProviders.get(1).setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL);
- long vibrationId = startThreadAndDispatcher(VibrationEffect.createOneShot(10, 100));
+ HalVibration vibration = startThreadAndDispatcher(VibrationEffect.createOneShot(10, 100));
waitForCompletion();
- verifyCallbacksTriggered(vibrationId, Status.FINISHED);
+ verifyCallbacksTriggered(vibration, Status.FINISHED);
verify(mManagerHooks, never()).prepareSyncedVibration(anyLong(), any());
verify(mManagerHooks, never()).triggerSyncedVibration(anyLong());
verify(mManagerHooks, never()).cancelSyncedVibration();
@@ -984,18 +982,18 @@
.addVibrator(VIBRATOR_ID, VibrationEffect.get(VibrationEffect.EFFECT_TICK))
.addVibrator(2, VibrationEffect.get(VibrationEffect.EFFECT_TICK))
.combine();
- long vibrationId = startThreadAndDispatcher(effect);
+ HalVibration vibration = startThreadAndDispatcher(effect);
waitForCompletion();
verify(mManagerHooks).noteVibratorOn(eq(UID), eq(20L));
verify(mManagerHooks).noteVibratorOff(eq(UID));
- verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibrationId));
- verify(mControllerCallbacks, never()).onComplete(eq(2), eq(vibrationId));
- verifyCallbacksTriggered(vibrationId, Status.FINISHED);
+ verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibration.id));
+ verify(mControllerCallbacks, never()).onComplete(eq(2), eq(vibration.id));
+ verifyCallbacksTriggered(vibration, Status.FINISHED);
assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
assertEquals(Arrays.asList(expectedPrebaked(VibrationEffect.EFFECT_TICK)),
- mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibrationId));
+ mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id));
}
@Test
@@ -1007,26 +1005,26 @@
CombinedVibration effect = CombinedVibration.createParallel(
VibrationEffect.get(VibrationEffect.EFFECT_CLICK));
- long vibrationId = startThreadAndDispatcher(effect);
+ HalVibration vibration = startThreadAndDispatcher(effect);
waitForCompletion();
verify(mManagerHooks).noteVibratorOn(eq(UID), eq(20L));
verify(mManagerHooks).noteVibratorOff(eq(UID));
- verify(mControllerCallbacks).onComplete(eq(1), eq(vibrationId));
- verify(mControllerCallbacks).onComplete(eq(2), eq(vibrationId));
- verify(mControllerCallbacks).onComplete(eq(3), eq(vibrationId));
- verifyCallbacksTriggered(vibrationId, Status.FINISHED);
+ verify(mControllerCallbacks).onComplete(eq(1), eq(vibration.id));
+ verify(mControllerCallbacks).onComplete(eq(2), eq(vibration.id));
+ verify(mControllerCallbacks).onComplete(eq(3), eq(vibration.id));
+ verifyCallbacksTriggered(vibration, Status.FINISHED);
assertFalse(mControllers.get(1).isVibrating());
assertFalse(mControllers.get(2).isVibrating());
assertFalse(mControllers.get(3).isVibrating());
VibrationEffectSegment expected = expectedPrebaked(VibrationEffect.EFFECT_CLICK);
assertEquals(Arrays.asList(expected),
- mVibratorProviders.get(1).getEffectSegments(vibrationId));
+ mVibratorProviders.get(1).getEffectSegments(vibration.id));
assertEquals(Arrays.asList(expected),
- mVibratorProviders.get(2).getEffectSegments(vibrationId));
+ mVibratorProviders.get(2).getEffectSegments(vibration.id));
assertEquals(Arrays.asList(expected),
- mVibratorProviders.get(3).getEffectSegments(vibrationId));
+ mVibratorProviders.get(3).getEffectSegments(vibration.id));
}
@Test
@@ -1049,32 +1047,32 @@
new long[]{10, 10}, new int[]{1, 2}, -1))
.addVibrator(4, composed)
.combine();
- long vibrationId = startThreadAndDispatcher(effect);
+ HalVibration vibration = startThreadAndDispatcher(effect);
waitForCompletion();
verify(mManagerHooks).noteVibratorOn(eq(UID), eq(20L));
verify(mManagerHooks).noteVibratorOff(eq(UID));
- verify(mControllerCallbacks).onComplete(eq(1), eq(vibrationId));
- verify(mControllerCallbacks).onComplete(eq(2), eq(vibrationId));
- verify(mControllerCallbacks).onComplete(eq(3), eq(vibrationId));
- verify(mControllerCallbacks).onComplete(eq(4), eq(vibrationId));
- verifyCallbacksTriggered(vibrationId, Status.FINISHED);
+ verify(mControllerCallbacks).onComplete(eq(1), eq(vibration.id));
+ verify(mControllerCallbacks).onComplete(eq(2), eq(vibration.id));
+ verify(mControllerCallbacks).onComplete(eq(3), eq(vibration.id));
+ verify(mControllerCallbacks).onComplete(eq(4), eq(vibration.id));
+ verifyCallbacksTriggered(vibration, Status.FINISHED);
assertFalse(mControllers.get(1).isVibrating());
assertFalse(mControllers.get(2).isVibrating());
assertFalse(mControllers.get(3).isVibrating());
assertFalse(mControllers.get(4).isVibrating());
assertEquals(Arrays.asList(expectedPrebaked(VibrationEffect.EFFECT_CLICK)),
- mVibratorProviders.get(1).getEffectSegments(vibrationId));
+ mVibratorProviders.get(1).getEffectSegments(vibration.id));
assertEquals(Arrays.asList(expectedOneShot(10)),
- mVibratorProviders.get(2).getEffectSegments(vibrationId));
+ mVibratorProviders.get(2).getEffectSegments(vibration.id));
assertEquals(expectedAmplitudes(100), mVibratorProviders.get(2).getAmplitudes());
assertEquals(Arrays.asList(expectedOneShot(20)),
- mVibratorProviders.get(3).getEffectSegments(vibrationId));
+ mVibratorProviders.get(3).getEffectSegments(vibration.id));
assertEquals(expectedAmplitudes(1, 2), mVibratorProviders.get(3).getAmplitudes());
assertEquals(Arrays.asList(
expectedPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK, 1, 0)),
- mVibratorProviders.get(4).getEffectSegments(vibrationId));
+ mVibratorProviders.get(4).getEffectSegments(vibration.id));
}
@Test
@@ -1094,13 +1092,13 @@
.addNext(1, VibrationEffect.createOneShot(10, 100), /* delay= */ 50)
.addNext(2, composed, /* delay= */ 50)
.combine();
- long vibrationId = startThreadAndDispatcher(effect);
+ HalVibration vibration = startThreadAndDispatcher(effect);
waitForCompletion();
InOrder controllerVerifier = inOrder(mControllerCallbacks);
- controllerVerifier.verify(mControllerCallbacks).onComplete(eq(3), eq(vibrationId));
- controllerVerifier.verify(mControllerCallbacks).onComplete(eq(1), eq(vibrationId));
- controllerVerifier.verify(mControllerCallbacks).onComplete(eq(2), eq(vibrationId));
+ controllerVerifier.verify(mControllerCallbacks).onComplete(eq(3), eq(vibration.id));
+ controllerVerifier.verify(mControllerCallbacks).onComplete(eq(1), eq(vibration.id));
+ controllerVerifier.verify(mControllerCallbacks).onComplete(eq(2), eq(vibration.id));
InOrder batteryVerifier = inOrder(mManagerHooks);
batteryVerifier.verify(mManagerHooks).noteVibratorOn(eq(UID), eq(20L));
@@ -1110,19 +1108,19 @@
batteryVerifier.verify(mManagerHooks).noteVibratorOn(eq(UID), eq(20L));
batteryVerifier.verify(mManagerHooks).noteVibratorOff(eq(UID));
- verifyCallbacksTriggered(vibrationId, Status.FINISHED);
+ verifyCallbacksTriggered(vibration, Status.FINISHED);
assertFalse(mControllers.get(1).isVibrating());
assertFalse(mControllers.get(2).isVibrating());
assertFalse(mControllers.get(3).isVibrating());
assertEquals(Arrays.asList(expectedOneShot(10)),
- mVibratorProviders.get(1).getEffectSegments(vibrationId));
+ mVibratorProviders.get(1).getEffectSegments(vibration.id));
assertEquals(expectedAmplitudes(100), mVibratorProviders.get(1).getAmplitudes());
assertEquals(Arrays.asList(
expectedPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK, 1, 0)),
- mVibratorProviders.get(2).getEffectSegments(vibrationId));
+ mVibratorProviders.get(2).getEffectSegments(vibration.id));
assertEquals(Arrays.asList(expectedPrebaked(VibrationEffect.EFFECT_CLICK)),
- mVibratorProviders.get(3).getEffectSegments(vibrationId));
+ mVibratorProviders.get(3).getEffectSegments(vibration.id));
}
@Test
@@ -1143,30 +1141,29 @@
CombinedVibration effect = CombinedVibration.createParallel(composed);
// We create the HalVibration here to obtain the vibration id and use it to mock the
// required response when calling triggerSyncedVibration.
- HalVibration halVibration = createVibration(effect);
- long vibrationId = halVibration.id;
- when(mManagerHooks.triggerSyncedVibration(eq(vibrationId))).thenReturn(true);
- startThreadAndDispatcher(halVibration);
+ HalVibration vibration = createVibration(effect);
+ when(mManagerHooks.triggerSyncedVibration(eq(vibration.id))).thenReturn(true);
+ startThreadAndDispatcher(vibration);
assertTrue(waitUntil(
- () -> !mVibratorProviders.get(1).getEffectSegments(vibrationId).isEmpty()
- && !mVibratorProviders.get(2).getEffectSegments(vibrationId).isEmpty(),
+ () -> !mVibratorProviders.get(1).getEffectSegments(vibration.id).isEmpty()
+ && !mVibratorProviders.get(2).getEffectSegments(vibration.id).isEmpty(),
TEST_TIMEOUT_MILLIS));
mVibrationConductor.notifySyncedVibrationComplete();
waitForCompletion();
long expectedCap = IVibratorManager.CAP_SYNC | IVibratorManager.CAP_PREPARE_COMPOSE;
verify(mManagerHooks).prepareSyncedVibration(eq(expectedCap), eq(vibratorIds));
- verify(mManagerHooks).triggerSyncedVibration(eq(vibrationId));
+ verify(mManagerHooks).triggerSyncedVibration(eq(vibration.id));
verify(mManagerHooks, never()).cancelSyncedVibration();
- verifyCallbacksTriggered(vibrationId, Status.FINISHED);
+ verifyCallbacksTriggered(vibration, Status.FINISHED);
VibrationEffectSegment expected = expectedPrimitive(
VibrationEffect.Composition.PRIMITIVE_CLICK, 1, 100);
assertEquals(Arrays.asList(expected),
- mVibratorProviders.get(1).getEffectSegments(vibrationId));
+ mVibratorProviders.get(1).getEffectSegments(vibration.id));
assertEquals(Arrays.asList(expected),
- mVibratorProviders.get(2).getEffectSegments(vibrationId));
+ mVibratorProviders.get(2).getEffectSegments(vibration.id));
}
@Test
@@ -1190,10 +1187,9 @@
.combine();
// We create the HalVibration here to obtain the vibration id and use it to mock the
// required response when calling triggerSyncedVibration.
- HalVibration halVibration = createVibration(effect);
- long vibrationId = halVibration.id;
- when(mManagerHooks.triggerSyncedVibration(eq(vibrationId))).thenReturn(true);
- startThreadAndDispatcher(halVibration);
+ HalVibration vibration = createVibration(effect);
+ when(mManagerHooks.triggerSyncedVibration(eq(vibration.id))).thenReturn(true);
+ startThreadAndDispatcher(vibration);
waitForCompletion();
long expectedCap = IVibratorManager.CAP_SYNC
@@ -1204,9 +1200,9 @@
| IVibratorManager.CAP_MIXED_TRIGGER_PERFORM
| IVibratorManager.CAP_MIXED_TRIGGER_COMPOSE;
verify(mManagerHooks).prepareSyncedVibration(eq(expectedCap), eq(vibratorIds));
- verify(mManagerHooks).triggerSyncedVibration(eq(vibrationId));
+ verify(mManagerHooks).triggerSyncedVibration(eq(vibration.id));
verify(mManagerHooks, never()).cancelSyncedVibration();
- verifyCallbacksTriggered(vibrationId, Status.FINISHED);
+ verifyCallbacksTriggered(vibration, Status.FINISHED);
}
@Test
@@ -1221,19 +1217,19 @@
.addVibrator(1, VibrationEffect.createOneShot(10, 100))
.addVibrator(2, VibrationEffect.createWaveform(new long[]{5}, new int[]{200}, -1))
.combine();
- long vibrationId = startThreadAndDispatcher(effect);
+ HalVibration vibration = startThreadAndDispatcher(effect);
waitForCompletion();
long expectedCap = IVibratorManager.CAP_SYNC | IVibratorManager.CAP_PREPARE_ON;
verify(mManagerHooks).prepareSyncedVibration(eq(expectedCap), eq(vibratorIds));
- verify(mManagerHooks, never()).triggerSyncedVibration(eq(vibrationId));
+ verify(mManagerHooks, never()).triggerSyncedVibration(eq(vibration.id));
verify(mManagerHooks, never()).cancelSyncedVibration();
assertEquals(Arrays.asList(expectedOneShot(10)),
- mVibratorProviders.get(1).getEffectSegments(vibrationId));
+ mVibratorProviders.get(1).getEffectSegments(vibration.id));
assertEquals(expectedAmplitudes(100), mVibratorProviders.get(1).getAmplitudes());
assertEquals(Arrays.asList(expectedOneShot(5)),
- mVibratorProviders.get(2).getEffectSegments(vibrationId));
+ mVibratorProviders.get(2).getEffectSegments(vibration.id));
assertEquals(expectedAmplitudes(200), mVibratorProviders.get(2).getAmplitudes());
}
@@ -1250,10 +1246,9 @@
.combine();
// We create the HalVibration here to obtain the vibration id and use it to mock the
// required response when calling triggerSyncedVibration.
- HalVibration halVibration = createVibration(effect);
- long vibrationId = halVibration.id;
- when(mManagerHooks.triggerSyncedVibration(eq(vibrationId))).thenReturn(false);
- startThreadAndDispatcher(halVibration);
+ HalVibration vibration = createVibration(effect);
+ when(mManagerHooks.triggerSyncedVibration(eq(vibration.id))).thenReturn(false);
+ startThreadAndDispatcher(vibration);
waitForCompletion();
long expectedCap = IVibratorManager.CAP_SYNC
@@ -1262,7 +1257,7 @@
| IVibratorManager.CAP_MIXED_TRIGGER_ON
| IVibratorManager.CAP_MIXED_TRIGGER_PERFORM;
verify(mManagerHooks).prepareSyncedVibration(eq(expectedCap), eq(vibratorIds));
- verify(mManagerHooks).triggerSyncedVibration(eq(vibrationId));
+ verify(mManagerHooks).triggerSyncedVibration(eq(vibration.id));
verify(mManagerHooks).cancelSyncedVibration();
assertTrue(mVibratorProviders.get(1).getAmplitudes().isEmpty());
}
@@ -1282,7 +1277,7 @@
.addVibrator(3, VibrationEffect.createWaveform(
new long[]{60}, new int[]{6}, -1))
.combine();
- long vibrationId = startThreadAndDispatcher(effect);
+ HalVibration vibration = startThreadAndDispatcher(effect);
// All vibrators are turned on in parallel.
assertTrue(waitUntil(
@@ -1295,20 +1290,20 @@
verify(mManagerHooks).noteVibratorOn(eq(UID), eq(80L));
verify(mManagerHooks).noteVibratorOff(eq(UID));
- verify(mControllerCallbacks).onComplete(eq(1), eq(vibrationId));
- verify(mControllerCallbacks).onComplete(eq(2), eq(vibrationId));
- verify(mControllerCallbacks).onComplete(eq(3), eq(vibrationId));
- verifyCallbacksTriggered(vibrationId, Status.FINISHED);
+ verify(mControllerCallbacks).onComplete(eq(1), eq(vibration.id));
+ verify(mControllerCallbacks).onComplete(eq(2), eq(vibration.id));
+ verify(mControllerCallbacks).onComplete(eq(3), eq(vibration.id));
+ verifyCallbacksTriggered(vibration, Status.FINISHED);
assertFalse(mControllers.get(1).isVibrating());
assertFalse(mControllers.get(2).isVibrating());
assertFalse(mControllers.get(3).isVibrating());
assertEquals(Arrays.asList(expectedOneShot(25)),
- mVibratorProviders.get(1).getEffectSegments(vibrationId));
+ mVibratorProviders.get(1).getEffectSegments(vibration.id));
assertEquals(Arrays.asList(expectedOneShot(80)),
- mVibratorProviders.get(2).getEffectSegments(vibrationId));
+ mVibratorProviders.get(2).getEffectSegments(vibration.id));
assertEquals(Arrays.asList(expectedOneShot(60)),
- mVibratorProviders.get(3).getEffectSegments(vibrationId));
+ mVibratorProviders.get(3).getEffectSegments(vibration.id));
assertEquals(expectedAmplitudes(1, 2, 3), mVibratorProviders.get(1).getAmplitudes());
assertEquals(expectedAmplitudes(4, 5), mVibratorProviders.get(2).getAmplitudes());
assertEquals(expectedAmplitudes(6), mVibratorProviders.get(3).getAmplitudes());
@@ -1327,17 +1322,11 @@
CombinedVibration.createParallel(
VibrationEffect.createOneShot(
expectedDuration, VibrationEffect.DEFAULT_AMPLITUDE)));
- CountDownLatch vibrationCompleteLatch = new CountDownLatch(1);
- doAnswer(unused -> {
- vibrationCompleteLatch.countDown();
- return null;
- }).when(mManagerHooks).onVibrationCompleted(eq(vibration.id), any());
startThreadAndDispatcher(vibration);
long startTime = SystemClock.elapsedRealtime();
- assertTrue(vibrationCompleteLatch.await(expectedDuration + TEST_TIMEOUT_MILLIS,
- TimeUnit.MILLISECONDS));
+ vibration.waitForEnd();
long vibrationEndTime = SystemClock.elapsedRealtime();
waitForCompletion(rampDownDuration + TEST_TIMEOUT_MILLIS);
@@ -1363,17 +1352,11 @@
CombinedVibration.createParallel(
VibrationEffect.createOneShot(
expectedDuration, VibrationEffect.DEFAULT_AMPLITUDE)));
- CountDownLatch vibrationCompleteLatch = new CountDownLatch(1);
- doAnswer(unused -> {
- vibrationCompleteLatch.countDown();
- return null;
- }).when(mManagerHooks).onVibrationCompleted(eq(vibration.id), any());
startThreadAndDispatcher(vibration);
long startTime = SystemClock.elapsedRealtime();
- assertTrue(vibrationCompleteLatch.await(callbackDelay + TEST_TIMEOUT_MILLIS,
- TimeUnit.MILLISECONDS));
+ vibration.waitForEnd();
long vibrationEndTime = SystemClock.elapsedRealtime();
waitForCompletion(TEST_TIMEOUT_MILLIS);
@@ -1397,17 +1380,11 @@
CombinedVibration.createParallel(
VibrationEffect.createOneShot(
expectedDuration, VibrationEffect.DEFAULT_AMPLITUDE)));
- CountDownLatch vibrationCompleteLatch = new CountDownLatch(1);
- doAnswer(unused -> {
- vibrationCompleteLatch.countDown();
- return null;
- }).when(mManagerHooks).onVibrationCompleted(eq(vibration.id), any());
startThreadAndDispatcher(vibration);
long startTime = SystemClock.elapsedRealtime();
- assertTrue(vibrationCompleteLatch.await(callbackTimeout + TEST_TIMEOUT_MILLIS,
- TimeUnit.MILLISECONDS));
+ vibration.waitForEnd();
long vibrationEndTime = SystemClock.elapsedRealtime();
waitForCompletion(callbackDelay + TEST_TIMEOUT_MILLIS);
@@ -1461,11 +1438,11 @@
fakeVibrator.setOnLatency(latency);
VibrationEffect effect = VibrationEffect.get(VibrationEffect.EFFECT_CLICK);
- long vibrationId = startThreadAndDispatcher(effect);
+ HalVibration vibration = startThreadAndDispatcher(effect);
- assertTrue(waitUntil(() -> !fakeVibrator.getEffectSegments(vibrationId).isEmpty(),
+ assertTrue(waitUntil(() -> !fakeVibrator.getEffectSegments(vibration.id).isEmpty(),
TEST_TIMEOUT_MILLIS));
- assertTrue(mThread.isRunningVibrationId(vibrationId));
+ assertTrue(mThread.isRunningVibrationId(vibration.id));
// Run cancel in a separate thread so if VibrationThread.cancel blocks then this test should
// fail at waitForCompletion(cancellingThread).
@@ -1480,7 +1457,7 @@
// After the vibrator call ends the vibration is cancelled and the vibrator is turned off.
waitForCompletion(/* timeout= */ latency + TEST_TIMEOUT_MILLIS);
- verifyCallbacksTriggered(vibrationId, Status.CANCELLED_BY_USER);
+ verifyCallbacksTriggered(vibration, Status.CANCELLED_BY_USER);
assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
}
@@ -1500,10 +1477,10 @@
.addPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK, 1f, 100)
.compose())
.combine();
- long vibrationId = startThreadAndDispatcher(effect);
+ HalVibration vibration = startThreadAndDispatcher(effect);
assertTrue(waitUntil(() -> mControllers.get(2).isVibrating(), TEST_TIMEOUT_MILLIS));
- assertTrue(mThread.isRunningVibrationId(vibrationId));
+ assertTrue(mThread.isRunningVibrationId(vibration.id));
// Run cancel in a separate thread so if VibrationThread.cancel blocks then this test should
// fail at waitForCompletion(vibrationThread) if the vibration not cancelled immediately.
@@ -1516,7 +1493,7 @@
waitForCompletion(/* timeout= */ 50);
cancellingThread.join();
- verifyCallbacksTriggered(vibrationId, Status.CANCELLED_BY_SCREEN_OFF);
+ verifyCallbacksTriggered(vibration, Status.CANCELLED_BY_SCREEN_OFF);
assertFalse(mControllers.get(1).isVibrating());
assertFalse(mControllers.get(2).isVibrating());
}
@@ -1534,10 +1511,10 @@
.addVibrator(1, VibrationEffect.createVendorEffect(createTestVendorData()))
.addVibrator(2, VibrationEffect.createVendorEffect(createTestVendorData()))
.combine();
- long vibrationId = startThreadAndDispatcher(effect);
+ HalVibration vibration = startThreadAndDispatcher(effect);
assertTrue(waitUntil(() -> mControllers.get(2).isVibrating(), TEST_TIMEOUT_MILLIS));
- assertTrue(mThread.isRunningVibrationId(vibrationId));
+ assertTrue(mThread.isRunningVibrationId(vibration.id));
// Run cancel in a separate thread so if VibrationThread.cancel blocks then this test should
// fail at waitForCompletion(vibrationThread) if the vibration not cancelled immediately.
@@ -1550,7 +1527,7 @@
waitForCompletion(/* timeout= */ 50);
cancellingThread.join();
- verifyCallbacksTriggered(vibrationId, Status.CANCELLED_BY_SCREEN_OFF);
+ verifyCallbacksTriggered(vibration, Status.CANCELLED_BY_SCREEN_OFF);
assertFalse(mControllers.get(1).isVibrating());
assertFalse(mControllers.get(2).isVibrating());
}
@@ -1566,12 +1543,12 @@
new long[]{100, 100}, new int[]{1, 2}, 0))
.addVibrator(2, VibrationEffect.createOneShot(100, 100))
.combine();
- long vibrationId = startThreadAndDispatcher(effect);
+ HalVibration vibration = startThreadAndDispatcher(effect);
assertTrue(waitUntil(() -> mControllers.get(1).isVibrating()
&& mControllers.get(2).isVibrating(),
TEST_TIMEOUT_MILLIS));
- assertTrue(mThread.isRunningVibrationId(vibrationId));
+ assertTrue(mThread.isRunningVibrationId(vibration.id));
// Run cancel in a separate thread so if VibrationThread.cancel blocks then this test should
// fail at waitForCompletion(vibrationThread) if the vibration not cancelled immediately.
@@ -1584,7 +1561,7 @@
waitForCompletion(/* timeout= */ 50);
cancellingThread.join();
- verifyCallbacksTriggered(vibrationId, Status.CANCELLED_BY_SCREEN_OFF);
+ verifyCallbacksTriggered(vibration, Status.CANCELLED_BY_SCREEN_OFF);
assertFalse(mControllers.get(1).isVibrating());
assertFalse(mControllers.get(2).isVibrating());
}
@@ -1592,19 +1569,17 @@
@Test
public void vibrate_binderDied_cancelsVibration() throws Exception {
VibrationEffect effect = VibrationEffect.createWaveform(new long[]{5}, new int[]{100}, 0);
- long vibrationId = startThreadAndDispatcher(effect);
+ HalVibration vibration = startThreadAndDispatcher(effect);
assertTrue(waitUntil(() -> mControllers.get(VIBRATOR_ID).isVibrating(),
TEST_TIMEOUT_MILLIS));
- assertTrue(mThread.isRunningVibrationId(vibrationId));
+ assertTrue(mThread.isRunningVibrationId(vibration.id));
mVibrationConductor.binderDied();
waitForCompletion();
- verify(mVibrationToken).linkToDeath(same(mVibrationConductor), eq(0));
- verify(mVibrationToken).unlinkToDeath(same(mVibrationConductor), eq(0));
- verifyCallbacksTriggered(vibrationId, Status.CANCELLED_BINDER_DIED);
- assertFalse(mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibrationId).isEmpty());
+ verifyCallbacksTriggered(vibration, Status.CANCELLED_BINDER_DIED);
+ assertFalse(mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id).isEmpty());
assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
}
@@ -1615,15 +1590,15 @@
VibrationEffect effect = VibrationEffect.createWaveform(
new long[]{5, 5, 5}, new int[]{60, 120, 240}, -1);
- long vibrationId = startThreadAndDispatcher(effect);
+ HalVibration vibration = startThreadAndDispatcher(effect);
waitForCompletion();
- verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibrationId));
- verifyCallbacksTriggered(vibrationId, Status.FINISHED);
+ verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibration.id));
+ verifyCallbacksTriggered(vibration, Status.FINISHED);
// Duration extended for 5 + 5 + 5 + 15.
assertEquals(Arrays.asList(expectedOneShot(30)),
- mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibrationId));
+ mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id));
List<Float> amplitudes = mVibratorProviders.get(VIBRATOR_ID).getAmplitudes();
assertTrue(amplitudes.size() > 3);
assertEquals(expectedAmplitudes(60, 120, 240), amplitudes.subList(0, 3));
@@ -1633,24 +1608,24 @@
}
@Test
- public void vibrate_waveformWithRampDown_triggersCallbackWhenOriginalVibrationEnds() {
+ public void vibrate_waveformWithRampDown_triggersCallbackWhenOriginalVibrationEnds()
+ throws Exception {
when(mVibrationConfigMock.getRampDownDurationMs()).thenReturn(10_000);
mVibratorProviders.get(VIBRATOR_ID).setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL);
VibrationEffect effect = VibrationEffect.createOneShot(10, 200);
- long vibrationId = startThreadAndDispatcher(effect);
+ HalVibration vibration = startThreadAndDispatcher(effect);
// Vibration completed but vibrator not yet released.
- verify(mManagerHooks, timeout(TEST_TIMEOUT_MILLIS)).onVibrationCompleted(eq(vibrationId),
- eq(new Vibration.EndInfo(Status.FINISHED)));
+ vibration.waitForEnd();
verify(mManagerHooks, never()).onVibrationThreadReleased(anyLong());
// Thread still running ramp down.
- assertTrue(mThread.isRunningVibrationId(vibrationId));
+ assertTrue(mThread.isRunningVibrationId(vibration.id));
// Duration extended for 10 + 10000.
assertEquals(Arrays.asList(expectedOneShot(10_010)),
- mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibrationId));
+ mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id));
// Will stop the ramp down right away.
mVibrationConductor.notifyCancelled(
@@ -1658,9 +1633,8 @@
waitForCompletion();
// Does not cancel already finished vibration, but releases vibrator.
- verify(mManagerHooks, never()).onVibrationCompleted(eq(vibrationId),
- eq(new Vibration.EndInfo(Status.CANCELLED_BY_SETTINGS_UPDATE)));
- verify(mManagerHooks).onVibrationThreadReleased(vibrationId);
+ assertThat(vibration.getStatus()).isNotEqualTo(Status.CANCELLED_BY_SETTINGS_UPDATE);
+ verify(mManagerHooks).onVibrationThreadReleased(vibration.id);
}
@Test
@@ -1670,18 +1644,18 @@
mVibratorProviders.get(VIBRATOR_ID).setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL);
VibrationEffect effect = VibrationEffect.createOneShot(10_000, 240);
- long vibrationId = startThreadAndDispatcher(effect);
+ HalVibration vibration = startThreadAndDispatcher(effect);
assertTrue(waitUntil(() -> mControllers.get(VIBRATOR_ID).isVibrating(),
TEST_TIMEOUT_MILLIS));
mVibrationConductor.notifyCancelled(
new Vibration.EndInfo(Status.CANCELLED_BY_USER), /* immediate= */ false);
waitForCompletion();
- verifyCallbacksTriggered(vibrationId, Status.CANCELLED_BY_USER);
+ verifyCallbacksTriggered(vibration, Status.CANCELLED_BY_USER);
// Duration extended for 10000 + 15.
assertEquals(Arrays.asList(expectedOneShot(10_015)),
- mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibrationId));
+ mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id));
List<Float> amplitudes = mVibratorProviders.get(VIBRATOR_ID).getAmplitudes();
assertTrue(amplitudes.size() > 1);
for (int i = 1; i < amplitudes.size(); i++) {
@@ -1696,14 +1670,14 @@
mVibratorProviders.get(VIBRATOR_ID).setSupportedEffects(VibrationEffect.EFFECT_CLICK);
VibrationEffect effect = VibrationEffect.get(VibrationEffect.EFFECT_CLICK);
- long vibrationId = startThreadAndDispatcher(effect);
+ HalVibration vibration = startThreadAndDispatcher(effect);
waitForCompletion();
- verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibrationId));
- verifyCallbacksTriggered(vibrationId, Status.FINISHED);
+ verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibration.id));
+ verifyCallbacksTriggered(vibration, Status.FINISHED);
assertEquals(Arrays.asList(expectedPrebaked(VibrationEffect.EFFECT_CLICK)),
- mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibrationId));
+ mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id));
assertTrue(mVibratorProviders.get(VIBRATOR_ID).getAmplitudes().isEmpty());
}
@@ -1714,13 +1688,13 @@
mVibratorProviders.get(VIBRATOR_ID).setCapabilities(IVibrator.CAP_PERFORM_VENDOR_EFFECTS);
VibrationEffect effect = VibrationEffect.createVendorEffect(createTestVendorData());
- long vibrationId = startThreadAndDispatcher(effect);
+ HalVibration vibration = startThreadAndDispatcher(effect);
waitForCompletion();
- verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibrationId));
- verifyCallbacksTriggered(vibrationId, Status.FINISHED);
+ verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibration.id));
+ verifyCallbacksTriggered(vibration, Status.FINISHED);
- assertThat(mVibratorProviders.get(VIBRATOR_ID).getVendorEffects(vibrationId))
+ assertThat(mVibratorProviders.get(VIBRATOR_ID).getVendorEffects(vibration.id))
.containsExactly(effect)
.inOrder();
assertThat(mVibratorProviders.get(VIBRATOR_ID).getAmplitudes()).isEmpty();
@@ -1737,15 +1711,15 @@
VibrationEffect effect = VibrationEffect.startComposition()
.addPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK)
.compose();
- long vibrationId = startThreadAndDispatcher(effect);
+ HalVibration vibration = startThreadAndDispatcher(effect);
waitForCompletion();
- verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibrationId));
- verifyCallbacksTriggered(vibrationId, Status.FINISHED);
+ verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibration.id));
+ verifyCallbacksTriggered(vibration, Status.FINISHED);
assertEquals(
Arrays.asList(expectedPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK, 1, 0)),
- mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibrationId));
+ mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id));
assertTrue(mVibratorProviders.get(VIBRATOR_ID).getAmplitudes().isEmpty());
}
@@ -1764,14 +1738,14 @@
VibrationEffect effect = VibrationEffect.startWaveform()
.addTransition(Duration.ofMillis(1), targetAmplitude(1))
.build();
- long vibrationId = startThreadAndDispatcher(effect);
+ HalVibration vibration = startThreadAndDispatcher(effect);
waitForCompletion();
- verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibrationId));
- verifyCallbacksTriggered(vibrationId, Status.FINISHED);
+ verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibration.id));
+ verifyCallbacksTriggered(vibration, Status.FINISHED);
assertEquals(Arrays.asList(expectedRamp(0, 1, 150, 150, 1)),
- fakeVibrator.getEffectSegments(vibrationId));
+ fakeVibrator.getEffectSegments(vibration.id));
assertTrue(fakeVibrator.getAmplitudes().isEmpty());
}
@@ -1796,69 +1770,68 @@
VibrationEffect effect4 = VibrationEffect.createOneShot(8000, 100);
VibrationEffect effect5 = VibrationEffect.get(VibrationEffect.EFFECT_CLICK);
- long vibrationId1 = startThreadAndDispatcher(effect1);
+ HalVibration vibration1 = startThreadAndDispatcher(effect1);
waitForCompletion();
- verify(mControllerCallbacks).onComplete(VIBRATOR_ID, vibrationId1);
- verifyCallbacksTriggered(vibrationId1, Status.FINISHED);
- long vibrationId2 = startThreadAndDispatcher(effect2);
+ HalVibration vibration2 = startThreadAndDispatcher(effect2);
// Effect2 won't complete on its own. Cancel it after a couple of repeats.
Thread.sleep(150); // More than two TICKs.
mVibrationConductor.notifyCancelled(
new Vibration.EndInfo(Status.CANCELLED_BY_USER), /* immediate= */ false);
waitForCompletion();
- long vibrationId3 = startThreadAndDispatcher(effect3);
+ HalVibration vibration3 = startThreadAndDispatcher(effect3);
waitForCompletion();
// Effect4 is a long oneshot, but it gets cancelled as fast as possible.
long start4 = System.currentTimeMillis();
- long vibrationId4 = startThreadAndDispatcher(effect4);
+ HalVibration vibration4 = startThreadAndDispatcher(effect4);
mVibrationConductor.notifyCancelled(
new Vibration.EndInfo(Status.CANCELLED_BY_SCREEN_OFF), /* immediate= */ true);
waitForCompletion();
long duration4 = System.currentTimeMillis() - start4;
// Effect5 is to show that things keep going after the immediate cancel.
- long vibrationId5 = startThreadAndDispatcher(effect5);
+ HalVibration vibration5 = startThreadAndDispatcher(effect5);
waitForCompletion();
FakeVibratorControllerProvider fakeVibrator = mVibratorProviders.get(VIBRATOR_ID);
assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
// Effect1
- verify(mControllerCallbacks).onComplete(VIBRATOR_ID, vibrationId1);
- verifyCallbacksTriggered(vibrationId1, Status.FINISHED);
+ verify(mControllerCallbacks).onComplete(VIBRATOR_ID, vibration1.id);
+ verifyCallbacksTriggered(vibration1, Status.FINISHED);
assertEquals(Arrays.asList(expectedPrebaked(VibrationEffect.EFFECT_CLICK)),
- fakeVibrator.getEffectSegments(vibrationId1));
+ fakeVibrator.getEffectSegments(vibration1.id));
// Effect2: repeating, cancelled.
- verify(mControllerCallbacks, atLeast(2)).onComplete(VIBRATOR_ID, vibrationId2);
- verifyCallbacksTriggered(vibrationId2, Status.CANCELLED_BY_USER);
+ verify(mControllerCallbacks, atLeast(2)).onComplete(VIBRATOR_ID, vibration2.id);
+ verifyCallbacksTriggered(vibration2, Status.CANCELLED_BY_USER);
// The exact count of segments might vary, so just check that there's more than 2 and
// all elements are the same segment.
- List<VibrationEffectSegment> actualSegments2 = fakeVibrator.getEffectSegments(vibrationId2);
+ List<VibrationEffectSegment> actualSegments2 =
+ fakeVibrator.getEffectSegments(vibration2.id);
assertTrue(actualSegments2.size() + " > 2", actualSegments2.size() > 2);
for (VibrationEffectSegment segment : actualSegments2) {
assertEquals(expectedPrebaked(VibrationEffect.EFFECT_TICK), segment);
}
// Effect3
- verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibrationId3));
- verifyCallbacksTriggered(vibrationId3, Status.FINISHED);
+ verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibration3.id));
+ verifyCallbacksTriggered(vibration3, Status.FINISHED);
assertEquals(Arrays.asList(
expectedPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK, 1, 0)),
- fakeVibrator.getEffectSegments(vibrationId3));
+ fakeVibrator.getEffectSegments(vibration3.id));
// Effect4: cancelled quickly.
- verifyCallbacksTriggered(vibrationId4, Status.CANCELLED_BY_SCREEN_OFF);
+ verifyCallbacksTriggered(vibration4, Status.CANCELLED_BY_SCREEN_OFF);
assertTrue("Tested duration=" + duration4, duration4 < 2000);
// Effect5: played normally after effect4, which may or may not have played.
assertEquals(Arrays.asList(expectedPrebaked(VibrationEffect.EFFECT_CLICK)),
- fakeVibrator.getEffectSegments(vibrationId5));
+ fakeVibrator.getEffectSegments(vibration5.id));
}
private void mockVibrators(int... vibratorIds) {
@@ -1875,19 +1848,19 @@
mVibrationSettings.mSettingObserver.onChange(false);
}
- private long startThreadAndDispatcher(VibrationEffect effect) {
+ private HalVibration startThreadAndDispatcher(VibrationEffect effect) {
return startThreadAndDispatcher(CombinedVibration.createParallel(effect));
}
- private long startThreadAndDispatcher(CombinedVibration effect) {
+ private HalVibration startThreadAndDispatcher(CombinedVibration effect) {
return startThreadAndDispatcher(createVibration(effect));
}
- private long startThreadAndDispatcher(HalVibration vib) {
+ private HalVibration startThreadAndDispatcher(HalVibration vib) {
return startThreadAndDispatcher(vib, /* requestVibrationParamsFuture= */ null);
}
- private long startThreadAndDispatcher(VibrationEffect effect,
+ private HalVibration startThreadAndDispatcher(VibrationEffect effect,
CompletableFuture<Void> requestVibrationParamsFuture, int usage) {
VibrationAttributes attrs = new VibrationAttributes.Builder()
.setUsage(usage)
@@ -1898,14 +1871,14 @@
return startThreadAndDispatcher(vib, requestVibrationParamsFuture);
}
- private long startThreadAndDispatcher(HalVibration vib,
+ private HalVibration startThreadAndDispatcher(HalVibration vib,
CompletableFuture<Void> requestVibrationParamsFuture) {
mControllers = createVibratorControllers();
DeviceAdapter deviceAdapter = new DeviceAdapter(mVibrationSettings, mControllers);
mVibrationConductor = new VibrationStepConductor(vib, mVibrationSettings, deviceAdapter,
mVibrationScaler, mStatsLoggerMock, requestVibrationParamsFuture, mManagerHooks);
assertTrue(mThread.runVibrationOnVibrationThread(mVibrationConductor));
- return mVibrationConductor.getVibration().id;
+ return mVibrationConductor.getVibration();
}
private boolean waitUntil(BooleanSupplier predicate, long timeout)
@@ -1994,13 +1967,9 @@
.collect(Collectors.toList());
}
- private void verifyCallbacksTriggered(long vibrationId, Status expectedStatus) {
- verifyCallbacksTriggered(vibrationId, new Vibration.EndInfo(expectedStatus));
- }
-
- private void verifyCallbacksTriggered(long vibrationId, Vibration.EndInfo expectedEndInfo) {
- verify(mManagerHooks).onVibrationCompleted(eq(vibrationId), eq(expectedEndInfo));
- verify(mManagerHooks).onVibrationThreadReleased(vibrationId);
+ private void verifyCallbacksTriggered(HalVibration vibration, Status expectedStatus) {
+ assertThat(vibration.getStatus()).isEqualTo(expectedStatus);
+ verify(mManagerHooks).onVibrationThreadReleased(vibration.id);
}
private static final class TestLooperAutoDispatcher extends Thread {
diff --git a/services/tests/vibrator/src/com/android/server/vibrator/VibratorManagerServiceTest.java b/services/tests/vibrator/src/com/android/server/vibrator/VibratorManagerServiceTest.java
index 4012575..d99b20c6 100644
--- a/services/tests/vibrator/src/com/android/server/vibrator/VibratorManagerServiceTest.java
+++ b/services/tests/vibrator/src/com/android/server/vibrator/VibratorManagerServiceTest.java
@@ -1538,7 +1538,6 @@
PrebakedSegment segment = (PrebakedSegment) playedSegments.get(0);
assertEquals(VibrationEffect.EFFECT_CLICK, segment.getEffectId());
VibrationAttributes attrs = vibration.callerInfo.attrs;
- assertEquals(VibrationAttributes.USAGE_HARDWARE_FEEDBACK, attrs.getUsage());
assertTrue(attrs.isFlagSet(VibrationAttributes.FLAG_BYPASS_USER_VIBRATION_INTENSITY_OFF));
assertTrue(attrs.isFlagSet(VibrationAttributes.FLAG_BYPASS_INTERRUPTION_POLICY));
}
@@ -1560,11 +1559,11 @@
HapticFeedbackConstants.SCROLL_TICK,
VibrationEffect.createPredefined(VibrationEffect.EFFECT_CLICK));
mHapticFeedbackVibrationMapSourceTouchScreen.put(
- HapticFeedbackConstants.DRAG_START,
- VibrationEffect.createPredefined(VibrationEffect.EFFECT_TICK));
+ HapticFeedbackConstants.SCROLL_ITEM_FOCUS,
+ VibrationEffect.createPredefined(VibrationEffect.EFFECT_THUD));
mockVibrators(1);
FakeVibratorControllerProvider fakeVibrator = mVibratorProviders.get(1);
- fakeVibrator.setSupportedEffects(VibrationEffect.EFFECT_CLICK, VibrationEffect.EFFECT_TICK);
+ fakeVibrator.setSupportedEffects(VibrationEffect.EFFECT_CLICK, VibrationEffect.EFFECT_THUD);
VibratorManagerService service = createSystemReadyService();
HalVibration vibrationByRotary =
@@ -1573,7 +1572,7 @@
InputDevice.SOURCE_ROTARY_ENCODER, /* always= */ true);
HalVibration vibrationByTouchScreen =
performHapticFeedbackForInputDeviceAndWaitUntilFinished(
- service, HapticFeedbackConstants.DRAG_START, /* inputDeviceId= */ 0,
+ service, HapticFeedbackConstants.SCROLL_ITEM_FOCUS, /* inputDeviceId= */ 0,
InputDevice.SOURCE_TOUCHSCREEN, /* always= */ true);
List<VibrationEffectSegment> playedSegments = fakeVibrator.getAllEffectSegments();
@@ -1583,18 +1582,17 @@
PrebakedSegment segmentByRotary = (PrebakedSegment) playedSegments.get(0);
assertEquals(VibrationEffect.EFFECT_CLICK, segmentByRotary.getEffectId());
VibrationAttributes attrsByRotary = vibrationByRotary.callerInfo.attrs;
- assertEquals(VibrationAttributes.USAGE_HARDWARE_FEEDBACK, attrsByRotary.getUsage());
assertTrue(attrsByRotary.isFlagSet(
VibrationAttributes.FLAG_BYPASS_USER_VIBRATION_INTENSITY_OFF));
assertTrue(attrsByRotary.isFlagSet(VibrationAttributes.FLAG_BYPASS_INTERRUPTION_POLICY));
// Verify feedback by touch screen input
PrebakedSegment segmentByTouchScreen = (PrebakedSegment) playedSegments.get(1);
- assertEquals(VibrationEffect.EFFECT_TICK, segmentByTouchScreen.getEffectId());
+ assertEquals(VibrationEffect.EFFECT_THUD, segmentByTouchScreen.getEffectId());
VibrationAttributes attrsByTouchScreen = vibrationByTouchScreen.callerInfo.attrs;
- assertEquals(VibrationAttributes.USAGE_TOUCH, attrsByTouchScreen.getUsage());
- assertTrue(attrsByRotary.isFlagSet(
+ assertTrue(attrsByTouchScreen.isFlagSet(
VibrationAttributes.FLAG_BYPASS_USER_VIBRATION_INTENSITY_OFF));
- assertTrue(attrsByRotary.isFlagSet(VibrationAttributes.FLAG_BYPASS_INTERRUPTION_POLICY));
+ assertTrue(
+ attrsByTouchScreen.isFlagSet(VibrationAttributes.FLAG_BYPASS_INTERRUPTION_POLICY));
}
@Test
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java
index f32a234..6a89178 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java
@@ -413,15 +413,25 @@
@Test
public void testUpdateDisplayConfigurationByDecor() {
- if (Flags.insetsDecoupledConfiguration()) {
- // No configuration update when flag enables.
- return;
- }
doReturn(NO_CUTOUT).when(mDisplayContent).calculateDisplayCutoutForRotation(anyInt());
final WindowState navbar = createNavBarWithProvidedInsets(mDisplayContent);
final DisplayPolicy displayPolicy = mDisplayContent.getDisplayPolicy();
final DisplayInfo di = mDisplayContent.getDisplayInfo();
final int prevScreenHeightDp = mDisplayContent.getConfiguration().screenHeightDp;
+ if (Flags.insetsDecoupledConfiguration()) {
+ // No configuration update when flag enables.
+ assertFalse(displayPolicy.updateDecorInsetsInfo());
+ assertEquals(NAV_BAR_HEIGHT, displayPolicy.getDecorInsetsInfo(di.rotation,
+ di.logicalHeight, di.logicalWidth).mOverrideConfigInsets.bottom);
+
+ final int barHeight = 2 * NAV_BAR_HEIGHT;
+ navbar.mAttrs.providedInsets[0].setInsetsSize(Insets.of(0, 0, 0, barHeight));
+ assertFalse(displayPolicy.updateDecorInsetsInfo());
+ assertEquals(barHeight, displayPolicy.getDecorInsetsInfo(di.rotation,
+ di.logicalHeight, di.logicalWidth).mOverrideConfigInsets.bottom);
+ return;
+ }
+
assertTrue(navbar.providesDisplayDecorInsets() && displayPolicy.updateDecorInsetsInfo());
assertEquals(NAV_BAR_HEIGHT, displayPolicy.getDecorInsetsInfo(di.rotation,
di.logicalWidth, di.logicalHeight).mConfigInsets.bottom);
diff --git a/services/tests/wmtests/src/com/android/server/wm/InsetsSourceProviderTest.java b/services/tests/wmtests/src/com/android/server/wm/InsetsSourceProviderTest.java
index e8d089c..4570588 100644
--- a/services/tests/wmtests/src/com/android/server/wm/InsetsSourceProviderTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/InsetsSourceProviderTest.java
@@ -188,7 +188,7 @@
assertNull(mProvider.getLeash(target));
// Set the leash to be ready for dispatching.
- mProvider.mIsLeashReadyForDispatching = true;
+ mProvider.mIsLeashInitialized = true;
assertNotNull(mProvider.getLeash(target));
// We do have fake control for the fake control target, but that has no leash.
diff --git a/services/tests/wmtests/src/com/android/server/wm/LaunchParamsPersisterTests.java b/services/tests/wmtests/src/com/android/server/wm/LaunchParamsPersisterTests.java
index 1be61c3..66d7963 100644
--- a/services/tests/wmtests/src/com/android/server/wm/LaunchParamsPersisterTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/LaunchParamsPersisterTests.java
@@ -494,6 +494,21 @@
assertTrue("Result should be empty.", mResult.isEmpty());
}
+ @Test
+ public void testAbortsLoadingWhenUserCleansUpBeforeLoadingFinishes() {
+ mTarget.saveTask(mTestTask);
+ mPersisterQueue.flush();
+
+ final LaunchParamsPersister target = new LaunchParamsPersister(mPersisterQueue, mSupervisor,
+ mUserFolderGetter);
+ target.onSystemReady();
+ target.onUnlockUser(TEST_USER_ID);
+ target.onCleanupUser(TEST_USER_ID);
+
+ target.getLaunchParams(mTestTask, null, mResult);
+ assertTrue("Result should be empty.", mResult.isEmpty());
+ }
+
private static boolean deleteRecursively(File file) {
boolean result = true;
if (file.isDirectory()) {
diff --git a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
index ae0c6e5..cf1dcd0 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
@@ -331,6 +331,8 @@
final WindowProcessController proc = mSystemServicesTestRule.addProcess(
activity.packageName, activity.processName,
6789 /* pid */, activity.info.applicationInfo.uid);
+ mAtm.mInternal.preBindApplication(proc, proc.mInfo);
+ assertTrue(proc.registeredForActivityConfigChanges());
assertFalse(proc.mHasEverAttached);
try {
mRootWindowContainer.attachApplication(proc);
diff --git a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
index 7bce828..8fa4667 100644
--- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
@@ -4063,8 +4063,9 @@
.setInsetsSize(Insets.of(0, 0, 0, 150))
};
display.getDisplayPolicy().addWindowLw(navbar, navbar.mAttrs);
- assertTrue(display.getDisplayPolicy().updateDecorInsetsInfo());
- display.sendNewConfiguration();
+ if (display.getDisplayPolicy().updateDecorInsetsInfo()) {
+ display.sendNewConfiguration();
+ }
final ActivityRecord activity = getActivityBuilderOnSameTask()
.setScreenOrientation(SCREEN_ORIENTATION_PORTRAIT)
@@ -4097,8 +4098,9 @@
.setInsetsSize(Insets.of(0, 0, 0, 150))
};
display.getDisplayPolicy().addWindowLw(navbar, navbar.mAttrs);
- assertTrue(display.getDisplayPolicy().updateDecorInsetsInfo());
- display.sendNewConfiguration();
+ if (display.getDisplayPolicy().updateDecorInsetsInfo()) {
+ display.sendNewConfiguration();
+ }
final ActivityRecord activity = getActivityBuilderOnSameTask()
.setScreenOrientation(SCREEN_ORIENTATION_PORTRAIT)
@@ -4126,8 +4128,9 @@
.setInsetsSize(Insets.of(0, 0, 0, 150))
};
dc.getDisplayPolicy().addWindowLw(navbar, navbar.mAttrs);
- assertTrue(dc.getDisplayPolicy().updateDecorInsetsInfo());
- dc.sendNewConfiguration();
+ if (dc.getDisplayPolicy().updateDecorInsetsInfo()) {
+ dc.sendNewConfiguration();
+ }
final ActivityRecord activity = getActivityBuilderOnSameTask()
.setResizeMode(RESIZE_MODE_UNRESIZEABLE)
diff --git a/tests/Internal/Android.bp b/tests/Internal/Android.bp
index 3e58517..9f35c7b 100644
--- a/tests/Internal/Android.bp
+++ b/tests/Internal/Android.bp
@@ -32,6 +32,27 @@
test_suites: ["device-tests"],
}
+// Run just ApplicationSharedMemoryTest with ABI override for 32 bits.
+// This is to test that on systems that support multi-ABI,
+// ApplicationSharedMemory works in app processes launched with a different ABI
+// than that of the system processes.
+android_test {
+ name: "ApplicationSharedMemoryTest32",
+ team: "trendy_team_system_performance",
+ srcs: ["src/com/android/internal/os/ApplicationSharedMemoryTest.java"],
+ libs: ["android.test.runner.stubs.system"],
+ static_libs: [
+ "junit",
+ "androidx.test.rules",
+ "platform-test-annotations",
+ ],
+ manifest: "ApplicationSharedMemoryTest32/AndroidManifest.xml",
+ test_config: "ApplicationSharedMemoryTest32/AndroidTest.xml",
+ certificate: "platform",
+ platform_apis: true,
+ test_suites: ["device-tests"],
+}
+
android_ravenwood_test {
name: "InternalTestsRavenwood",
static_libs: [
@@ -45,3 +66,9 @@
],
auto_gen_config: true,
}
+
+java_test_helper_library {
+ name: "ApplicationSharedMemoryTestRule",
+ srcs: ["src/com/android/internal/os/ApplicationSharedMemoryTestRule.java"],
+ static_libs: ["junit"],
+}
diff --git a/tests/Internal/ApplicationSharedMemoryTest32/AndroidManifest.xml b/tests/Internal/ApplicationSharedMemoryTest32/AndroidManifest.xml
new file mode 100644
index 0000000..4e1058e
--- /dev/null
+++ b/tests/Internal/ApplicationSharedMemoryTest32/AndroidManifest.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2017 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.internal.tests">
+ <application
+ android:use32bitAbi="true"
+ android:multiArch="true">
+ <uses-library android:name="android.test.runner"/>
+ </application>
+
+ <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
+ android:targetPackage="com.android.internal.tests"
+ android:label="Internal Tests"/>
+</manifest>
diff --git a/tests/Internal/ApplicationSharedMemoryTest32/AndroidTest.xml b/tests/Internal/ApplicationSharedMemoryTest32/AndroidTest.xml
new file mode 100644
index 0000000..9bde8b7
--- /dev/null
+++ b/tests/Internal/ApplicationSharedMemoryTest32/AndroidTest.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2017 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<configuration description="Runs tests for internal classes/utilities.">
+ <target_preparer class="com.android.tradefed.targetprep.TestAppInstallSetup">
+ <option name="test-file-name" value="ApplicationSharedMemoryTest32.apk" />
+ </target_preparer>
+
+ <option name="test-suite-tag" value="apct" />
+ <option name="test-suite-tag" value="framework-base-presubmit" />
+ <option name="test-tag" value="InternalTests" />
+ <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
+ <option name="package" value="com.android.internal.tests" />
+ <option name="runner" value="androidx.test.runner.AndroidJUnitRunner" />
+ </test>
+
+ <metrics_collector class="com.android.tradefed.device.metric.FilePullerLogCollector">
+ <option name="pull-pattern-keys" value="perfetto_file_path"/>
+ <option name="directory-keys"
+ value="/data/user/0/com.android.internal.tests/files"/>
+ <option name="collect-on-run-ended-only" value="true"/>
+ <option name="clean-up" value="true"/>
+ </metrics_collector>
+</configuration>
\ No newline at end of file
diff --git a/tests/Internal/ApplicationSharedMemoryTest32/OWNERS b/tests/Internal/ApplicationSharedMemoryTest32/OWNERS
new file mode 100644
index 0000000..1ff3fac
--- /dev/null
+++ b/tests/Internal/ApplicationSharedMemoryTest32/OWNERS
@@ -0,0 +1 @@
+include platform/frameworks/base:/PERFORMANCE_OWNERS
\ No newline at end of file
diff --git a/tests/Internal/src/com/android/internal/os/ApplicationSharedMemoryTest.java b/tests/Internal/src/com/android/internal/os/ApplicationSharedMemoryTest.java
new file mode 100644
index 0000000..e3a129f
--- /dev/null
+++ b/tests/Internal/src/com/android/internal/os/ApplicationSharedMemoryTest.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.os;
+
+import java.io.IOException;
+
+import static org.junit.Assert.fail;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assume.assumeTrue;
+
+import android.platform.test.annotations.Presubmit;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+import org.junit.Before;
+
+import java.io.FileDescriptor;
+
+/** Tests for {@link TimeoutRecord}. */
+@SmallTest
+@Presubmit
+@RunWith(JUnit4.class)
+public class ApplicationSharedMemoryTest {
+
+ @Before
+ public void setUp() {
+ // Skip tests if the feature under test is disabled.
+ assumeTrue(Flags.applicationSharedMemoryEnabled());
+ }
+
+ /**
+ * Every application process, including ours, should have had an instance installed at this
+ * point.
+ */
+ @Test
+ public void hasInstance() {
+ // This shouldn't throw and shouldn't return null.
+ assertNotNull(ApplicationSharedMemory.getInstance());
+ }
+
+ /** Any app process should be able to read shared memory values. */
+ @Test
+ public void canRead() {
+ ApplicationSharedMemory instance = ApplicationSharedMemory.getInstance();
+ instance.getLatestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis();
+ // Don't actually care about the value of the above.
+ }
+
+ /** Application processes should not have mutable access. */
+ @Test
+ public void appInstanceNotMutable() {
+ ApplicationSharedMemory instance = ApplicationSharedMemory.getInstance();
+ try {
+ instance.setLatestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis(17);
+ fail("Attempted mutation in an app process should throw");
+ } catch (Exception expected) {
+ }
+ }
+
+ /** Instances share memory if they share the underlying memory region. */
+ @Test
+ public void instancesShareMemory() throws IOException {
+ ApplicationSharedMemory instance1 = ApplicationSharedMemory.create();
+ ApplicationSharedMemory instance2 =
+ ApplicationSharedMemory.fromFileDescriptor(
+ instance1.getFileDescriptor(), /* mutable= */ true);
+ ApplicationSharedMemory instance3 =
+ ApplicationSharedMemory.fromFileDescriptor(
+ instance2.getReadOnlyFileDescriptor(), /* mutable= */ false);
+
+ instance1.setLatestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis(17);
+ assertEquals(
+ 17, instance1.getLatestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis());
+ assertEquals(
+ 17, instance2.getLatestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis());
+ assertEquals(
+ 17, instance3.getLatestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis());
+
+ instance2.setLatestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis(24);
+ assertEquals(
+ 24, instance1.getLatestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis());
+ assertEquals(
+ 24, instance2.getLatestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis());
+ assertEquals(
+ 24, instance3.getLatestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis());
+ }
+
+ /** Can't map read-only memory as mutable. */
+ @Test
+ public void readOnlyCantBeMutable() throws IOException {
+ ApplicationSharedMemory readWriteInstance = ApplicationSharedMemory.create();
+ FileDescriptor readOnlyFileDescriptor = readWriteInstance.getReadOnlyFileDescriptor();
+
+ try {
+ ApplicationSharedMemory.fromFileDescriptor(readOnlyFileDescriptor, /* mutable= */ true);
+ fail("Shouldn't be able to map read-only memory as mutable");
+ } catch (Exception expected) {
+ }
+ }
+}
diff --git a/tests/Internal/src/com/android/internal/os/ApplicationSharedMemoryTestRule.java b/tests/Internal/src/com/android/internal/os/ApplicationSharedMemoryTestRule.java
new file mode 100644
index 0000000..ff2a461
--- /dev/null
+++ b/tests/Internal/src/com/android/internal/os/ApplicationSharedMemoryTestRule.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.os;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TestRule;
+import org.junit.runner.Description;
+import org.junit.runners.model.Statement;
+import com.android.internal.os.ApplicationSharedMemory;
+
+/** Test rule that sets up and tears down ApplicationSharedMemory for test. */
+public class ApplicationSharedMemoryTestRule implements TestRule {
+
+ private ApplicationSharedMemory mSavedInstance;
+
+ @Override
+ public Statement apply(final Statement base, final Description description) {
+ return new Statement() {
+ @Override
+ public void evaluate() throws Throwable {
+ setup();
+ try {
+ base.evaluate(); // Run the test
+ } finally {
+ teardown();
+ }
+ }
+ };
+ }
+
+ private void setup() {
+ mSavedInstance = ApplicationSharedMemory.sInstance;
+ ApplicationSharedMemory.sInstance = ApplicationSharedMemory.create();
+ }
+
+ private void teardown() {
+ ApplicationSharedMemory.sInstance.close();
+ ApplicationSharedMemory.sInstance = mSavedInstance;
+ mSavedInstance = null;
+ }
+}
diff --git a/tests/PackageWatchdog/src/com/android/server/CrashRecoveryTest.java b/tests/PackageWatchdog/src/com/android/server/CrashRecoveryTest.java
index c0e90f9..8d143b6 100644
--- a/tests/PackageWatchdog/src/com/android/server/CrashRecoveryTest.java
+++ b/tests/PackageWatchdog/src/com/android/server/CrashRecoveryTest.java
@@ -727,7 +727,17 @@
when(mRollbackManager.getAvailableRollbacks()).thenReturn(List.of(ROLLBACK_INFO_LOW,
ROLLBACK_INFO_HIGH, ROLLBACK_INFO_MANUAL));
when(mSpyContext.getPackageManager()).thenReturn(mMockPackageManager);
-
+ try {
+ when(mMockPackageManager.getPackageInfo(anyString(), anyInt())).then(inv -> {
+ final PackageInfo res = new PackageInfo();
+ res.packageName = inv.getArgument(0);
+ res.setApexPackageName(res.packageName);
+ res.setLongVersionCode(VERSION_CODE);
+ return res;
+ });
+ } catch (PackageManager.NameNotFoundException e) {
+ throw new RuntimeException(e);
+ }
watchdog.registerHealthObserver(rollbackObserver);
return rollbackObserver;
}
@@ -787,8 +797,10 @@
// Verify controller by default is started when packages are ready
assertThat(controller.mIsEnabled).isTrue();
- verify(mConnectivityModuleConnector).registerHealthListener(
- mConnectivityModuleCallbackCaptor.capture());
+ if (!Flags.refactorCrashrecovery()) {
+ verify(mConnectivityModuleConnector).registerHealthListener(
+ mConnectivityModuleCallbackCaptor.capture());
+ }
}
mAllocatedWatchdogs.add(watchdog);
return watchdog;
diff --git a/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java b/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java
index 5b17825..0364781a 100644
--- a/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java
+++ b/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java
@@ -46,6 +46,9 @@
import android.os.Handler;
import android.os.SystemProperties;
import android.os.test.TestLooper;
+import android.platform.test.annotations.RequiresFlagsDisabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
import android.platform.test.flag.junit.SetFlagsRule;
import android.provider.DeviceConfig;
import android.util.AtomicFile;
@@ -111,6 +114,9 @@
@Rule
public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+ @Rule
+ public CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+
private final TestClock mTestClock = new TestClock();
private TestLooper mTestLooper;
private Context mSpyContext;
@@ -966,6 +972,7 @@
}
@Test
+ @RequiresFlagsDisabled(Flags.FLAG_REFACTOR_CRASHRECOVERY)
public void testNetworkStackFailure() {
mSetFlagsRule.disableFlags(Flags.FLAG_RECOVERABILITY_DETECTION);
final PackageWatchdog wd = createWatchdog();
@@ -986,6 +993,7 @@
}
@Test
+ @RequiresFlagsDisabled(Flags.FLAG_REFACTOR_CRASHRECOVERY)
public void testNetworkStackFailureRecoverabilityDetection() {
final PackageWatchdog wd = createWatchdog();
@@ -1758,8 +1766,10 @@
// Verify controller by default is started when packages are ready
assertThat(controller.mIsEnabled).isTrue();
- verify(mConnectivityModuleConnector).registerHealthListener(
- mConnectivityModuleCallbackCaptor.capture());
+ if (!Flags.refactorCrashrecovery()) {
+ verify(mConnectivityModuleConnector).registerHealthListener(
+ mConnectivityModuleCallbackCaptor.capture());
+ }
}
mAllocatedWatchdogs.add(watchdog);
return watchdog;
diff --git a/wifi/java/src/android/net/wifi/sharedconnectivity/app/SharedConnectivityManager.java b/wifi/java/src/android/net/wifi/sharedconnectivity/app/SharedConnectivityManager.java
index fc4a909..f68ae2c 100644
--- a/wifi/java/src/android/net/wifi/sharedconnectivity/app/SharedConnectivityManager.java
+++ b/wifi/java/src/android/net/wifi/sharedconnectivity/app/SharedConnectivityManager.java
@@ -173,10 +173,6 @@
}
}
}
-
- Executor getExecutor() {
- return mExecutor;
- }
}
private ISharedConnectivityService mService;
@@ -192,7 +188,7 @@
private final String mServicePackageName;
private final String mIntentAction;
private ServiceConnection mServiceConnection;
- private final UserManager mUserManager;
+ private UserManager mUserManager;
/**
* Creates a new instance of {@link SharedConnectivityManager}.
@@ -320,19 +316,15 @@
private void registerCallbackInternal(SharedConnectivityClientCallback callback,
SharedConnectivityCallbackProxy proxy) {
- proxy.getExecutor().execute(
- () -> {
- try {
- mService.registerCallback(proxy);
- synchronized (mProxyDataLock) {
- mProxyMap.put(callback, proxy);
- }
- } catch (RemoteException e) {
- Log.e(TAG, "Exception in registerCallback", e);
- callback.onRegisterCallbackFailed(e);
- }
- }
- );
+ try {
+ mService.registerCallback(proxy);
+ synchronized (mProxyDataLock) {
+ mProxyMap.put(callback, proxy);
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG, "Exception in registerCallback", e);
+ callback.onRegisterCallbackFailed(e);
+ }
}
/**