Merge "Allow shell to revoke notification permission without kill"
diff --git a/core/api/current.txt b/core/api/current.txt
index 8b113e1..7f0ff7f 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -1312,6 +1312,7 @@
field public static final int shouldDisableView = 16843246; // 0x10101ee
field public static final int shouldUseDefaultUnfoldTransition = 16844364; // 0x101064c
field public static final int showAsAction = 16843481; // 0x10102d9
+ field public static final int showClockAndComplications;
field public static final int showDefault = 16843258; // 0x10101fa
field public static final int showDividers = 16843561; // 0x1010329
field public static final int showForAllUsers = 16844015; // 0x10104ef
@@ -52181,6 +52182,7 @@
field public static final int TYPE_ACCESSIBILITY_OVERLAY = 4; // 0x4
field public static final int TYPE_APPLICATION = 1; // 0x1
field public static final int TYPE_INPUT_METHOD = 2; // 0x2
+ field public static final int TYPE_MAGNIFICATION_OVERLAY = 6; // 0x6
field public static final int TYPE_SPLIT_SCREEN_DIVIDER = 5; // 0x5
field public static final int TYPE_SYSTEM = 3; // 0x3
}
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index 9185340..f48d956 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -403,6 +403,7 @@
field public static final int config_systemAmbientAudioIntelligence = 17039411; // 0x1040033
field public static final int config_systemAppProtectionService;
field public static final int config_systemAudioIntelligence = 17039412; // 0x1040034
+ field public static final int config_systemAutomotiveCalendarSyncManager;
field public static final int config_systemAutomotiveCluster = 17039400; // 0x1040028
field public static final int config_systemAutomotiveProjection = 17039401; // 0x1040029
field public static final int config_systemCompanionDeviceProvider = 17039417; // 0x1040039
@@ -6713,8 +6714,8 @@
method @Nullable public String acquireSharedFilterToken();
method public void close();
method public int configure(@NonNull android.media.tv.tuner.filter.FilterConfiguration);
- method public int delayCallbackUntilBufferFilled(int);
- method public int delayCallbackUntilTimeMillis(long);
+ method public int delayCallbackUntilBytesAccumulated(int);
+ method public int delayCallbackUntilMillisElapsed(long);
method public int flush();
method public void freeSharedFilterToken(@NonNull String);
method @Deprecated public int getId();
@@ -6933,12 +6934,14 @@
}
public abstract class SectionSettings extends android.media.tv.tuner.filter.Settings {
+ method public int getBitWidthOfLengthField();
method public boolean isCrcEnabled();
method public boolean isRaw();
method public boolean isRepeat();
}
public abstract static class SectionSettings.Builder<T extends android.media.tv.tuner.filter.SectionSettings.Builder<T>> {
+ method @NonNull public T setBitWidthOfLengthField(@IntRange(from=0) int);
method @NonNull public T setCrcEnabled(boolean);
method @NonNull public T setRaw(boolean);
method @NonNull public T setRepeat(boolean);
@@ -9339,6 +9342,7 @@
method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public boolean isUserOfType(@NonNull String);
method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.INTERACT_ACROSS_USERS}, conditional=true) public boolean isUserUnlockingOrUnlocked(@NonNull android.os.UserHandle);
method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS}) public boolean removeUser(@NonNull android.os.UserHandle);
+ method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS}) public int removeUserWhenPossible(@NonNull android.os.UserHandle, boolean);
method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public void setUserIcon(@NonNull android.graphics.Bitmap) throws android.os.UserManager.UserOperationException;
method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public void setUserName(@Nullable String);
method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS}) public boolean someUserHasAccount(@NonNull String, @NonNull String);
@@ -9346,6 +9350,10 @@
field public static final String ACTION_USER_RESTRICTIONS_CHANGED = "android.os.action.USER_RESTRICTIONS_CHANGED";
field @Deprecated public static final String DISALLOW_OEM_UNLOCK = "no_oem_unlock";
field public static final String DISALLOW_RUN_IN_BACKGROUND = "no_run_in_background";
+ field public static final int REMOVE_RESULT_ALREADY_BEING_REMOVED = 2; // 0x2
+ field public static final int REMOVE_RESULT_DEFERRED = 1; // 0x1
+ field public static final int REMOVE_RESULT_ERROR = 3; // 0x3
+ field public static final int REMOVE_RESULT_REMOVED = 0; // 0x0
field public static final int RESTRICTION_NOT_SET = 0; // 0x0
field public static final int RESTRICTION_SOURCE_DEVICE_OWNER = 2; // 0x2
field public static final int RESTRICTION_SOURCE_PROFILE_OWNER = 4; // 0x4
diff --git a/core/api/test-current.txt b/core/api/test-current.txt
index 44efd26..cb90f6c 100644
--- a/core/api/test-current.txt
+++ b/core/api/test-current.txt
@@ -67,6 +67,7 @@
public static final class R.string {
field public static final int config_defaultAssistant = 17039393; // 0x1040021
field public static final int config_defaultDialer = 17039395; // 0x1040023
+ field public static final int config_systemAutomotiveCalendarSyncManager;
field public static final int config_systemAutomotiveCluster = 17039400; // 0x1040028
field public static final int config_systemAutomotiveProjection = 17039401; // 0x1040029
field public static final int config_systemGallery = 17039399; // 0x1040027
@@ -1830,6 +1831,14 @@
method @NonNull public android.os.VibrationEffect build(int);
}
+ public abstract class Vibrator {
+ method public int getDefaultVibrationIntensity(int);
+ field public static final int VIBRATION_INTENSITY_HIGH = 3; // 0x3
+ field public static final int VIBRATION_INTENSITY_LOW = 1; // 0x1
+ field public static final int VIBRATION_INTENSITY_MEDIUM = 2; // 0x2
+ field public static final int VIBRATION_INTENSITY_OFF = 0; // 0x0
+ }
+
public class VintfObject {
method public static String[] getHalNamesAndVersions();
method @NonNull public static String getPlatformSepolicyVersion();
diff --git a/core/java/android/companion/CompanionDeviceService.java b/core/java/android/companion/CompanionDeviceService.java
index 3237f7c..12ced96 100644
--- a/core/java/android/companion/CompanionDeviceService.java
+++ b/core/java/android/companion/CompanionDeviceService.java
@@ -28,9 +28,6 @@
import android.os.IBinder;
import android.util.Log;
-
-import com.android.internal.util.function.pooled.PooledLambda;
-
import java.util.Objects;
/**
@@ -185,31 +182,24 @@
public void onBindCompanionDeviceService(@NonNull Intent intent) {
}
- class Stub extends ICompanionDeviceService.Stub {
+ private class Stub extends ICompanionDeviceService.Stub {
+ final Handler mMainHandler = Handler.getMain();
+ final CompanionDeviceService mService = CompanionDeviceService.this;
@Override
public void onDeviceAppeared(AssociationInfo associationInfo) {
- Handler.getMain().post(
- () -> CompanionDeviceService.this.onDeviceAppeared(associationInfo));
+ mMainHandler.postAtFrontOfQueue(() -> mService.onDeviceAppeared(associationInfo));
}
@Override
public void onDeviceDisappeared(AssociationInfo associationInfo) {
- Handler.getMain().post(
- () -> CompanionDeviceService.this.onDeviceDisappeared(associationInfo));
+ mMainHandler.postAtFrontOfQueue(() -> mService.onDeviceDisappeared(associationInfo));
}
+ @Override
public void onDispatchMessage(int messageId, int associationId, @NonNull byte[] message) {
- Handler.getMain().sendMessage(PooledLambda.obtainMessage(
- CompanionDeviceService::onDispatchMessage,
- CompanionDeviceService.this, messageId, associationId, message));
- }
-
- public final void dispatchMessage(int messageId, int associationId,
- @NonNull byte[] message) {
- Handler.getMain().sendMessage(PooledLambda.obtainMessage(
- CompanionDeviceService::dispatchMessage,
- CompanionDeviceService.this, messageId, associationId, message));
+ mMainHandler.postAtFrontOfQueue(
+ () -> mService.onDispatchMessage(messageId, associationId, message));
}
}
}
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index 3a41f3d..a6d846b 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -4064,6 +4064,15 @@
@TestApi
public static final String FEATURE_COMMUNAL_MODE = "android.software.communal_mode";
+ /**
+ * Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}: The device
+ * supports dream overlay feature, which is an informational layer shown on top of dreams.
+ *
+ * @hide
+ */
+ @SdkConstant(SdkConstantType.FEATURE)
+ public static final String FEATURE_DREAM_OVERLAY = "android.software.dream_overlay";
+
/** @hide */
public static final boolean APP_ENUMERATION_ENABLED_BY_DEFAULT = true;
diff --git a/core/java/android/content/res/TEST_MAPPING b/core/java/android/content/res/TEST_MAPPING
index 535afd36..3703f2e 100644
--- a/core/java/android/content/res/TEST_MAPPING
+++ b/core/java/android/content/res/TEST_MAPPING
@@ -1,4 +1,12 @@
{
+ "imports": [
+ {
+ "path": "frameworks/base/core/tests/coretests/src/android/content/res"
+ },
+ {
+ "path": "frameworks/base/core/tests/coretests/src/com/android/internal/content/res"
+ }
+ ],
"presubmit": [
{
"name": "CtsResourcesLoaderTests"
diff --git a/core/java/android/debug/AdbManager.java b/core/java/android/debug/AdbManager.java
index 7714dd8..243f801 100644
--- a/core/java/android/debug/AdbManager.java
+++ b/core/java/android/debug/AdbManager.java
@@ -38,6 +38,7 @@
*
* @hide
*/
+ @RequiresPermission(android.Manifest.permission.MANAGE_DEBUGGING)
public static final String WIRELESS_DEBUG_STATE_CHANGED_ACTION =
"com.android.server.adb.WIRELESS_DEBUG_STATUS";
@@ -46,6 +47,7 @@
*
* @hide
*/
+ @RequiresPermission(android.Manifest.permission.MANAGE_DEBUGGING)
public static final String WIRELESS_DEBUG_PAIRED_DEVICES_ACTION =
"com.android.server.adb.WIRELESS_DEBUG_PAIRED_DEVICES";
@@ -59,6 +61,7 @@
*
* @hide
*/
+ @RequiresPermission(android.Manifest.permission.MANAGE_DEBUGGING)
public static final String WIRELESS_DEBUG_PAIRING_RESULT_ACTION =
"com.android.server.adb.WIRELESS_DEBUG_PAIRING_RESULT";
diff --git a/core/java/android/net/Ikev2VpnProfile.java b/core/java/android/net/Ikev2VpnProfile.java
index fab692c..1b5ab05 100644
--- a/core/java/android/net/Ikev2VpnProfile.java
+++ b/core/java/android/net/Ikev2VpnProfile.java
@@ -35,6 +35,7 @@
import android.annotation.RequiresFeature;
import android.content.pm.PackageManager;
import android.security.Credentials;
+import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.net.VpnProfile;
@@ -70,6 +71,7 @@
* Exchange, Version 2 (IKEv2)</a>
*/
public final class Ikev2VpnProfile extends PlatformVpnProfile {
+ private static final String TAG = Ikev2VpnProfile.class.getSimpleName();
/** Prefix for when a Private Key is an alias to look for in KeyStore @hide */
public static final String PREFIX_KEYSTORE_ALIAS = "KEYSTORE_ALIAS:";
/** Prefix for when a Private Key is stored directly in the profile @hide */
@@ -163,6 +165,10 @@
// UnmodifiableList doesn't make a defensive copy by default.
mAllowedAlgorithms = Collections.unmodifiableList(new ArrayList<>(allowedAlgorithms));
+ if (excludeLocalRoutes && !isBypassable) {
+ throw new IllegalArgumentException(
+ "Vpn should be byassable if excludeLocalRoutes is set");
+ }
mIsBypassable = isBypassable;
mIsMetered = isMetered;
@@ -520,7 +526,10 @@
throw new IllegalArgumentException("Invalid auth method set");
}
- builder.setExcludeLocalRoutes(profile.excludeLocalRoutes);
+ if (profile.excludeLocalRoutes && !profile.isBypassable) {
+ Log.w(TAG, "ExcludeLocalRoutes should only be set in the bypassable VPN");
+ }
+ builder.setExcludeLocalRoutes(profile.excludeLocalRoutes && profile.isBypassable);
return builder.build();
}
diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java
index 92d652d..d4a338b 100644
--- a/core/java/android/os/PowerManager.java
+++ b/core/java/android/os/PowerManager.java
@@ -335,6 +335,12 @@
public static final int USER_ACTIVITY_EVENT_FACE_DOWN = 5;
/**
+ * User activity event type: There is a change in the device state.
+ * @hide
+ */
+ public static final int USER_ACTIVITY_EVENT_DEVICE_STATE = 6;
+
+ /**
* User activity flag: If already dimmed, extend the dim timeout
* but do not brighten. This flag is useful for keeping the screen on
* a little longer without causing a visible change such as when
diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java
index b4f3fa0..edf6280 100644
--- a/core/java/android/os/UserManager.java
+++ b/core/java/android/os/UserManager.java
@@ -1657,41 +1657,49 @@
public @interface UserSwitchabilityResult {}
/**
- * A response code from {@link #removeUserOrSetEphemeral(int)} indicating that the specified
- * user has been successfully removed.
+ * A response code from {@link #removeUserWhenPossible(UserHandle, boolean)} indicating that
+ * the specified user has been successfully removed.
+ *
* @hide
*/
+ @SystemApi
public static final int REMOVE_RESULT_REMOVED = 0;
/**
- * A response code from {@link #removeUserOrSetEphemeral(int)} indicating that the specified
- * user has had its {@link UserInfo#FLAG_EPHEMERAL} flag set to {@code true}, so that it will be
- * removed when the user is stopped or on boot.
+ * A response code from {@link #removeUserWhenPossible(UserHandle, boolean)} indicating that
+ * the specified user is marked so that it will be removed when the user is stopped or on boot.
+ *
* @hide
*/
- public static final int REMOVE_RESULT_SET_EPHEMERAL = 1;
+ @SystemApi
+ public static final int REMOVE_RESULT_DEFERRED = 1;
/**
- * A response code from {@link #removeUserOrSetEphemeral(int)} indicating that the specified
- * user is already in the process of being removed.
+ * A response code from {@link #removeUserWhenPossible(UserHandle, boolean)} indicating that
+ * the specified user is already in the process of being removed.
+ *
* @hide
*/
+ @SystemApi
public static final int REMOVE_RESULT_ALREADY_BEING_REMOVED = 2;
/**
- * A response code from {@link #removeUserOrSetEphemeral(int)} indicating that an error occurred
- * that prevented the user from being removed or set as ephemeral.
+ * A response code from {@link #removeUserWhenPossible(UserHandle, boolean)} indicating that
+ * an error occurred that prevented the user from being removed or set as ephemeral.
+ *
* @hide
*/
+ @SystemApi
public static final int REMOVE_RESULT_ERROR = 3;
/**
- * Possible response codes from {@link #removeUserOrSetEphemeral(int)}.
+ * Possible response codes from {@link #removeUserWhenPossible(UserHandle, boolean)}.
+ *
* @hide
*/
@IntDef(prefix = { "REMOVE_RESULT_" }, value = {
REMOVE_RESULT_REMOVED,
- REMOVE_RESULT_SET_EPHEMERAL,
+ REMOVE_RESULT_DEFERRED,
REMOVE_RESULT_ALREADY_BEING_REMOVED,
REMOVE_RESULT_ERROR,
})
@@ -4728,12 +4736,42 @@
* the current user, then set the user as ephemeral so that it will be removed when it is
* stopped.
*
- * @param evenWhenDisallowed when {@code true}, user is removed even if the caller user has the
+ * @param overrideDevicePolicy when {@code true}, user is removed even if the caller has
+ * the {@link #DISALLOW_REMOVE_USER} or {@link #DISALLOW_REMOVE_MANAGED_PROFILE} restriction
+ *
+ * @return the result code {@link #REMOVE_RESULT_REMOVED}, {@link #REMOVE_RESULT_DEFERRED},
+ * {@link #REMOVE_RESULT_ALREADY_BEING_REMOVED}, or {@link #REMOVE_RESULT_ERROR}.
+ *
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(anyOf = {Manifest.permission.MANAGE_USERS,
+ Manifest.permission.CREATE_USERS})
+ public int removeUserWhenPossible(@NonNull UserHandle user,
+ boolean overrideDevicePolicy) {
+ try {
+ return mService.removeUserOrSetEphemeral(user.getIdentifier(), overrideDevicePolicy);
+ } catch (RemoteException re) {
+ throw re.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Immediately removes the user or, if the user cannot be removed, such as when the user is
+ * the current user, then set the user as ephemeral so that it will be removed when it is
+ * stopped.
+ *
+ * @param evenWhenDisallowed when {@code true}, user is removed even if the caller has the
* {@link #DISALLOW_REMOVE_USER} or {@link #DISALLOW_REMOVE_MANAGED_PROFILE} restriction
*
* @return the {@link RemoveResult} code
+ *
+ * @deprecated TODO(b/199446770): remove this call after converting all calls to
+ * removeUserWhenPossible(UserHandle, boolean)
+ *
* @hide
*/
+ @Deprecated
@RequiresPermission(anyOf = {Manifest.permission.MANAGE_USERS,
Manifest.permission.CREATE_USERS})
public @RemoveResult int removeUserOrSetEphemeral(@UserIdInt int userId,
diff --git a/core/java/android/os/VibrationAttributes.java b/core/java/android/os/VibrationAttributes.java
index 5831573..8834725 100644
--- a/core/java/android/os/VibrationAttributes.java
+++ b/core/java/android/os/VibrationAttributes.java
@@ -32,32 +32,30 @@
public final class VibrationAttributes implements Parcelable {
private static final String TAG = "VibrationAttributes";
- /**
- * @hide
- */
+ /** @hide */
@IntDef(prefix = { "USAGE_CLASS_" }, value = {
USAGE_CLASS_UNKNOWN,
USAGE_CLASS_ALARM,
USAGE_CLASS_FEEDBACK,
})
@Retention(RetentionPolicy.SOURCE)
- public @interface UsageClass{}
+ public @interface UsageClass {}
- /**
- * @hide
- */
+ /** @hide */
@IntDef(prefix = { "USAGE_" }, value = {
USAGE_UNKNOWN,
+ USAGE_ACCESSIBILITY,
USAGE_ALARM,
- USAGE_RINGTONE,
- USAGE_NOTIFICATION,
USAGE_COMMUNICATION_REQUEST,
- USAGE_TOUCH,
- USAGE_PHYSICAL_EMULATION,
USAGE_HARDWARE_FEEDBACK,
+ USAGE_MEDIA,
+ USAGE_NOTIFICATION,
+ USAGE_PHYSICAL_EMULATION,
+ USAGE_RINGTONE,
+ USAGE_TOUCH,
})
@Retention(RetentionPolicy.SOURCE)
- public @interface Usage{}
+ public @interface Usage {}
/**
* Vibration usage filter value to match all usages.
diff --git a/core/java/android/os/Vibrator.java b/core/java/android/os/Vibrator.java
index d71ead7..eba9ff1 100644
--- a/core/java/android/os/Vibrator.java
+++ b/core/java/android/os/Vibrator.java
@@ -23,11 +23,14 @@
import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.annotation.SystemService;
+import android.annotation.TestApi;
import android.app.ActivityThread;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.Context;
+import android.content.res.Resources;
import android.hardware.vibrator.IVibrator;
import android.media.AudioAttributes;
+import android.os.vibrator.VibrationConfig;
import android.util.Log;
import java.lang.annotation.Retention;
@@ -49,6 +52,7 @@
*
* @hide
*/
+ @TestApi
public static final int VIBRATION_INTENSITY_OFF = 0;
/**
@@ -56,6 +60,7 @@
*
* @hide
*/
+ @TestApi
public static final int VIBRATION_INTENSITY_LOW = 1;
/**
@@ -63,6 +68,7 @@
*
* @hide
*/
+ @TestApi
public static final int VIBRATION_INTENSITY_MEDIUM = 2;
/**
@@ -70,6 +76,7 @@
*
* @hide
*/
+ @TestApi
public static final int VIBRATION_INTENSITY_HIGH = 3;
/**
@@ -115,16 +122,12 @@
}
private final String mPackageName;
- // The default vibration intensity level for haptic feedback.
- @VibrationIntensity
- private int mDefaultHapticFeedbackIntensity;
- // The default vibration intensity level for notifications.
- @VibrationIntensity
- private int mDefaultNotificationVibrationIntensity;
- // The default vibration intensity level for ringtones.
- @VibrationIntensity
- private int mDefaultRingVibrationIntensity;
- private float mHapticChannelMaxVibrationAmplitude;
+ @Nullable
+ private final Resources mResources;
+
+ // This is lazily loaded only for the few clients that need this (e. Settings app).
+ @Nullable
+ private volatile VibrationConfig mVibrationConfig;
/**
* @hide to prevent subclassing from outside of the framework
@@ -132,8 +135,7 @@
@UnsupportedAppUsage
public Vibrator() {
mPackageName = ActivityThread.currentPackageName();
- final Context ctx = ActivityThread.currentActivityThread().getSystemContext();
- loadVibrationConfig(ctx);
+ mResources = null;
}
/**
@@ -141,26 +143,7 @@
*/
protected Vibrator(Context context) {
mPackageName = context.getOpPackageName();
- loadVibrationConfig(context);
- }
-
- private void loadVibrationConfig(Context context) {
- mDefaultHapticFeedbackIntensity = loadDefaultIntensity(context,
- com.android.internal.R.integer.config_defaultHapticFeedbackIntensity);
- mDefaultNotificationVibrationIntensity = loadDefaultIntensity(context,
- com.android.internal.R.integer.config_defaultNotificationVibrationIntensity);
- mDefaultRingVibrationIntensity = loadDefaultIntensity(context,
- com.android.internal.R.integer.config_defaultRingVibrationIntensity);
- mHapticChannelMaxVibrationAmplitude = loadFloat(context,
- com.android.internal.R.dimen.config_hapticChannelMaxVibrationAmplitude, 0);
- }
-
- private int loadDefaultIntensity(Context ctx, int resId) {
- return ctx != null ? ctx.getResources().getInteger(resId) : VIBRATION_INTENSITY_MEDIUM;
- }
-
- private float loadFloat(Context ctx, int resId, float defaultValue) {
- return ctx != null ? ctx.getResources().getFloat(resId) : defaultValue;
+ mResources = context.getResources();
}
/**
@@ -172,31 +155,30 @@
return VibratorInfo.EMPTY_VIBRATOR_INFO;
}
- /**
- * Get the default vibration intensity for haptic feedback.
- *
- * @hide
- */
- public int getDefaultHapticFeedbackIntensity() {
- return mDefaultHapticFeedbackIntensity;
+ /** Get the static vibrator configuration from config.xml. */
+ private VibrationConfig getConfig() {
+ if (mVibrationConfig == null) {
+ Resources resources = mResources;
+ if (resources == null) {
+ final Context ctx = ActivityThread.currentActivityThread().getSystemContext();
+ resources = ctx != null ? ctx.getResources() : null;
+ }
+ // This might be constructed more than once, but it only loads static config data from a
+ // xml file, so it would be ok.
+ mVibrationConfig = new VibrationConfig(resources);
+ }
+ return mVibrationConfig;
}
/**
- * Get the default vibration intensity for notifications.
+ * Get the default vibration intensity for given usage.
*
* @hide
*/
- public int getDefaultNotificationVibrationIntensity() {
- return mDefaultNotificationVibrationIntensity;
- }
-
- /**
- * Get the default vibration intensity for ringtones.
- *
- * @hide
- */
- public int getDefaultRingVibrationIntensity() {
- return mDefaultRingVibrationIntensity;
+ @TestApi
+ @VibrationIntensity
+ public int getDefaultVibrationIntensity(@VibrationAttributes.Usage int usage) {
+ return getConfig().getDefaultVibrationIntensity(usage);
}
/**
@@ -280,10 +262,7 @@
* @hide
*/
public float getHapticChannelMaximumAmplitude() {
- if (mHapticChannelMaxVibrationAmplitude <= 0) {
- return Float.NaN;
- }
- return mHapticChannelMaxVibrationAmplitude;
+ return getConfig().getHapticChannelMaximumAmplitude();
}
/**
diff --git a/core/java/android/os/vibrator/VibrationConfig.java b/core/java/android/os/vibrator/VibrationConfig.java
new file mode 100644
index 0000000..4a61472
--- /dev/null
+++ b/core/java/android/os/vibrator/VibrationConfig.java
@@ -0,0 +1,175 @@
+/*
+ * 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 android.os.vibrator;
+
+import static android.os.VibrationAttributes.USAGE_ACCESSIBILITY;
+import static android.os.VibrationAttributes.USAGE_ALARM;
+import static android.os.VibrationAttributes.USAGE_COMMUNICATION_REQUEST;
+import static android.os.VibrationAttributes.USAGE_HARDWARE_FEEDBACK;
+import static android.os.VibrationAttributes.USAGE_MEDIA;
+import static android.os.VibrationAttributes.USAGE_NOTIFICATION;
+import static android.os.VibrationAttributes.USAGE_PHYSICAL_EMULATION;
+import static android.os.VibrationAttributes.USAGE_RINGTONE;
+import static android.os.VibrationAttributes.USAGE_TOUCH;
+import static android.os.VibrationAttributes.USAGE_UNKNOWN;
+
+import android.annotation.Nullable;
+import android.content.res.Resources;
+import android.os.VibrationAttributes;
+import android.os.Vibrator;
+import android.os.Vibrator.VibrationIntensity;
+
+/**
+ * List of device-specific internal vibration configuration loaded from platform config.xml.
+ *
+ * <p>This should not be public, but some individual values are exposed by {@link Vibrator} by
+ * hidden methods, made available to Settings, SysUI and other platform client code. They can also
+ * be individually exposed with the necessary permissions by the {@link Vibrator} service.
+ *
+ * @hide
+ */
+public class VibrationConfig {
+
+ // TODO(b/191150049): move these to vibrator static config file
+ private final float mHapticChannelMaxVibrationAmplitude;
+ private final int mRampStepDurationMs;
+ private final int mRampDownDurationMs;
+
+ @VibrationIntensity
+ private final int mDefaultAlarmVibrationIntensity;
+ @VibrationIntensity
+ private final int mDefaultHapticFeedbackIntensity;
+ @VibrationIntensity
+ private final int mDefaultMediaVibrationIntensity;
+ @VibrationIntensity
+ private final int mDefaultNotificationVibrationIntensity;
+ @VibrationIntensity
+ private final int mDefaultRingVibrationIntensity;
+
+ /** @hide */
+ public VibrationConfig(@Nullable Resources resources) {
+ mHapticChannelMaxVibrationAmplitude = loadFloat(resources,
+ com.android.internal.R.dimen.config_hapticChannelMaxVibrationAmplitude, 0);
+ mRampDownDurationMs = loadInteger(resources,
+ com.android.internal.R.integer.config_vibrationWaveformRampDownDuration, 0);
+ mRampStepDurationMs = loadInteger(resources,
+ com.android.internal.R.integer.config_vibrationWaveformRampStepDuration, 0);
+
+ mDefaultAlarmVibrationIntensity = loadDefaultIntensity(resources,
+ com.android.internal.R.integer.config_defaultAlarmVibrationIntensity);
+ mDefaultHapticFeedbackIntensity = loadDefaultIntensity(resources,
+ com.android.internal.R.integer.config_defaultHapticFeedbackIntensity);
+ mDefaultMediaVibrationIntensity = loadDefaultIntensity(resources,
+ com.android.internal.R.integer.config_defaultMediaVibrationIntensity);
+ mDefaultNotificationVibrationIntensity = loadDefaultIntensity(resources,
+ com.android.internal.R.integer.config_defaultNotificationVibrationIntensity);
+ mDefaultRingVibrationIntensity = loadDefaultIntensity(resources,
+ com.android.internal.R.integer.config_defaultRingVibrationIntensity);
+ }
+
+ @VibrationIntensity
+ private static int loadDefaultIntensity(@Nullable Resources res, int resId) {
+ int defaultIntensity = Vibrator.VIBRATION_INTENSITY_MEDIUM;
+ int value = loadInteger(res, resId, defaultIntensity);
+ if (value < Vibrator.VIBRATION_INTENSITY_OFF || value > Vibrator.VIBRATION_INTENSITY_HIGH) {
+ return defaultIntensity;
+ }
+ return value;
+ }
+
+ private static float loadFloat(@Nullable Resources res, int resId, float defaultValue) {
+ return res != null ? res.getFloat(resId) : defaultValue;
+ }
+
+ private static int loadInteger(@Nullable Resources res, int resId, int defaultValue) {
+ return res != null ? res.getInteger(resId) : defaultValue;
+ }
+
+ /**
+ * Return the maximum amplitude the vibrator can play using the audio haptic channels.
+ *
+ * @return a positive value representing the maximum absolute value the device can play signals
+ * from audio haptic channels, or {@link Float#NaN NaN} if it's unknown.
+ */
+ public float getHapticChannelMaximumAmplitude() {
+ if (mHapticChannelMaxVibrationAmplitude <= 0) {
+ return Float.NaN;
+ }
+ return mHapticChannelMaxVibrationAmplitude;
+ }
+
+ /**
+ * The duration, in milliseconds, that should be applied to the ramp to turn off the vibrator
+ * when a vibration is cancelled or finished at non-zero amplitude.
+ */
+ public int getRampDownDurationMs() {
+ if (mRampDownDurationMs < 0) {
+ return 0;
+ }
+ return mRampDownDurationMs;
+ }
+
+ /**
+ * The duration, in milliseconds, that should be applied to convert vibration effect's
+ * {@link android.os.vibrator.RampSegment} to a {@link android.os.vibrator.StepSegment} on
+ * devices without PWLE support.
+ */
+ public int getRampStepDurationMs() {
+ if (mRampStepDurationMs < 0) {
+ return 0;
+ }
+ return mRampStepDurationMs;
+ }
+
+ /** Get the default vibration intensity for given usage. */
+ @VibrationIntensity
+ public int getDefaultVibrationIntensity(@VibrationAttributes.Usage int usage) {
+ switch (usage) {
+ case USAGE_ALARM:
+ return mDefaultAlarmVibrationIntensity;
+ case USAGE_NOTIFICATION:
+ case USAGE_COMMUNICATION_REQUEST:
+ return mDefaultNotificationVibrationIntensity;
+ case USAGE_RINGTONE:
+ return mDefaultRingVibrationIntensity;
+ case USAGE_TOUCH:
+ case USAGE_HARDWARE_FEEDBACK:
+ case USAGE_PHYSICAL_EMULATION:
+ case USAGE_ACCESSIBILITY:
+ return mDefaultHapticFeedbackIntensity;
+ case USAGE_MEDIA:
+ case USAGE_UNKNOWN:
+ // fall through
+ default:
+ return mDefaultMediaVibrationIntensity;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return "VibrationConfig{"
+ + "mHapticChannelMaxVibrationAmplitude=" + mHapticChannelMaxVibrationAmplitude
+ + ", mRampStepDurationMs=" + mRampStepDurationMs
+ + ", mRampDownDurationMs=" + mRampDownDurationMs
+ + ", mDefaultAlarmIntensity=" + mDefaultAlarmVibrationIntensity
+ + ", mDefaultHapticFeedbackIntensity=" + mDefaultHapticFeedbackIntensity
+ + ", mDefaultMediaIntensity=" + mDefaultMediaVibrationIntensity
+ + ", mDefaultNotificationIntensity=" + mDefaultNotificationVibrationIntensity
+ + ", mDefaultRingIntensity=" + mDefaultRingVibrationIntensity
+ + "}";
+ }
+}
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 0c8afa3..72e2863 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -4603,6 +4603,43 @@
public static final String VIBRATE_INPUT_DEVICES = "vibrate_input_devices";
/**
+ * The intensity of alarm vibrations, if configurable.
+ *
+ * Not all devices are capable of changing their vibration intensity; on these devices
+ * there will likely be no difference between the various vibration intensities except for
+ * intensity 0 (off) and the rest.
+ *
+ * <b>Values:</b><br/>
+ * 0 - Vibration is disabled<br/>
+ * 1 - Weak vibrations<br/>
+ * 2 - Medium vibrations<br/>
+ * 3 - Strong vibrations
+ * @hide
+ */
+ public static final String ALARM_VIBRATION_INTENSITY =
+ "alarm_vibration_intensity";
+
+ /**
+ * The intensity of media vibrations, if configurable.
+ *
+ * This includes any vibration that is part of media, such as music, movie, soundtrack,
+ * game or animations.
+ *
+ * Not all devices are capable of changing their vibration intensity; on these devices
+ * there will likely be no difference between the various vibration intensities except for
+ * intensity 0 (off) and the rest.
+ *
+ * <b>Values:</b><br/>
+ * 0 - Vibration is disabled<br/>
+ * 1 - Weak vibrations<br/>
+ * 2 - Medium vibrations<br/>
+ * 3 - Strong vibrations
+ * @hide
+ */
+ public static final String MEDIA_VIBRATION_INTENSITY =
+ "media_vibration_intensity";
+
+ /**
* The intensity of notification vibrations, if configurable.
*
* Not all devices are capable of changing their vibration intensity; on these devices
@@ -4619,6 +4656,7 @@
@Readable
public static final String NOTIFICATION_VIBRATION_INTENSITY =
"notification_vibration_intensity";
+
/**
* The intensity of ringtone vibrations, if configurable.
*
@@ -4670,7 +4708,6 @@
* 3 - Strong vibrations
* @hide
*/
- @Readable
public static final String HARDWARE_HAPTIC_FEEDBACK_INTENSITY =
"hardware_haptic_feedback_intensity";
diff --git a/core/java/android/view/accessibility/AccessibilityWindowInfo.java b/core/java/android/view/accessibility/AccessibilityWindowInfo.java
index 36e779a..540f5dc 100644
--- a/core/java/android/view/accessibility/AccessibilityWindowInfo.java
+++ b/core/java/android/view/accessibility/AccessibilityWindowInfo.java
@@ -84,6 +84,12 @@
*/
public static final int TYPE_SPLIT_SCREEN_DIVIDER = 5;
+ /**
+ * Window type: A system window used to show the UI for the interaction with
+ * window-based magnification, which includes the magnified content and the option menu.
+ */
+ public static final int TYPE_MAGNIFICATION_OVERLAY = 6;
+
/* Special values for window IDs */
/** @hide */
public static final int ACTIVE_WINDOW_ID = Integer.MAX_VALUE;
@@ -801,6 +807,9 @@
case TYPE_SPLIT_SCREEN_DIVIDER: {
return "TYPE_SPLIT_SCREEN_DIVIDER";
}
+ case TYPE_MAGNIFICATION_OVERLAY: {
+ return "TYPE_MAGNIFICATION_OVERLAY";
+ }
default:
return "<UNKNOWN:" + type + ">";
}
diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java
index 6d58ee2..b21d08c 100644
--- a/core/java/android/widget/RemoteViews.java
+++ b/core/java/android/widget/RemoteViews.java
@@ -6628,6 +6628,7 @@
opts = ActivityOptions.makeBasic();
opts.setPendingIntentLaunchFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
+ opts.setLaunchDisplayId(view.getDisplay().getDisplayId());
return Pair.create(intent, opts);
}
}
diff --git a/core/proto/android/providers/settings/system.proto b/core/proto/android/providers/settings/system.proto
index 73d6a17..e56d55e 100644
--- a/core/proto/android/providers/settings/system.proto
+++ b/core/proto/android/providers/settings/system.proto
@@ -212,6 +212,12 @@
// DatabaseHelper.
optional SettingProto in_silent = 3 [ (android.privacy).dest = DEST_AUTOMATIC ];
optional SettingProto when_ringing = 4 [ (android.privacy).dest = DEST_AUTOMATIC ];
+
+ optional SettingProto alarm_intensity = 5 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto media_intensity = 6 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto ring_intensity = 7 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ // notification_intensity is already logged at Notification.vibration_intensity
+ // haptic_feedback_intensity is already logged at HapticFeedback.intensity
}
optional Vibrate vibrate = 32;
diff --git a/core/proto/android/server/vibrator/vibratormanagerservice.proto b/core/proto/android/server/vibrator/vibratormanagerservice.proto
index 7b97524d..fbe2170 100644
--- a/core/proto/android/server/vibrator/vibratormanagerservice.proto
+++ b/core/proto/android/server/vibrator/vibratormanagerservice.proto
@@ -97,7 +97,7 @@
optional int32 status = 6;
}
-// Next id: 18
+// Next id: 24
message VibratorManagerServiceDumpProto {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
repeated int32 vibrator_ids = 1;
@@ -106,8 +106,14 @@
optional VibrationProto current_external_vibration = 4;
optional bool vibrator_under_external_control = 5;
optional bool low_power_mode = 6;
+ optional int32 alarm_intensity = 18;
+ optional int32 alarm_default_intensity = 19;
optional int32 haptic_feedback_intensity = 7;
optional int32 haptic_feedback_default_intensity = 8;
+ optional int32 hardware_feedback_intensity = 22;
+ optional int32 hardware_feedback_default_intensity = 23;
+ optional int32 media_intensity = 20;
+ optional int32 media_default_intensity = 21;
optional int32 notification_intensity = 9;
optional int32 notification_default_intensity = 10;
optional int32 ring_intensity = 11;
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 1705371..86c83c5 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -8442,6 +8442,9 @@
<attr name="settingsActivity" />
<!-- A preview, in a drawable resource id, of what the Dream will look like. -->
<attr name="previewImage" format="reference" />
+ <!-- Whether to show clock and other complications such as weather in the overlay. Default
+ to true. Note that the overlay on dreams is currently only supported on tablets. -->
+ <attr name="showClockAndComplications" format="boolean" />
</declare-styleable>
<!-- Use <code>trust-agent</code> as the root tag of the XML resource that
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 7d8bcea..2836c98 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -1179,10 +1179,18 @@
<string-array translatable="false" name="config_ringtoneEffectUris">
</string-array>
+ <!-- The default intensity level for alarm vibrations. See
+ Settings.System.ALARM_VIBRATION_INTENSITY more details on the constant values and
+ meanings. -->
+ <integer name="config_defaultAlarmVibrationIntensity">2</integer>
<!-- The default intensity level for haptic feedback. See
Settings.System.HAPTIC_FEEDBACK_INTENSITY more details on the constant values and
meanings. -->
<integer name="config_defaultHapticFeedbackIntensity">2</integer>
+ <!-- The default intensity level for media vibrations. See
+ Settings.System.MEDIA_VIBRATION_INTENSITY more details on the constant values and
+ meanings. -->
+ <integer name="config_defaultMediaVibrationIntensity">2</integer>
<!-- The default intensity level for notification vibrations. See
Settings.System.NOTIFICATION_VIBRATION_INTENSITY more details on the constant values and
meanings. -->
@@ -2125,6 +2133,8 @@
<string name="config_deviceManager" translatable="false"></string>
<!-- The name of the package that will hold the app protection service role. -->
<string name="config_systemAppProtectionService" translatable="false"></string>
+ <!-- The name of the package that will hold the system calendar sync manager role. -->
+ <string name="config_systemAutomotiveCalendarSyncManager" translatable="false"></string>
<!-- The name of the package that will be allowed to change its components' label/icon. -->
<string name="config_overrideComponentUiPackage" translatable="false">com.android.stk</string>
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index 9449f60..5fa7409 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -3250,6 +3250,7 @@
<public name="supportedTypes" />
<public name="resetEnabledSettingsOnAppDataCleared" />
<public name="supportsStylusHandwriting" />
+ <public name="showClockAndComplications" />
<!-- @hide @SystemApi -->
<public name="gameSessionService" />
</staging-public-group>
@@ -3273,6 +3274,8 @@
<public name="config_deviceManager" />
<!-- @hide @SystemApi -->
<public name="config_systemAppProtectionService" />
+ <!-- @hide @SystemApi @TestApi -->
+ <public name="config_systemAutomotiveCalendarSyncManager" />
</staging-public-group>
<staging-public-group type="dimen" first-id="0x01db0000">
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index ba4aa81..a4b5d3c 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -3867,7 +3867,9 @@
<java-symbol type="drawable" name="ic_arrow_forward" />
<java-symbol type="drawable" name="ic_permission" />
+ <java-symbol type="integer" name="config_defaultAlarmVibrationIntensity" />
<java-symbol type="integer" name="config_defaultHapticFeedbackIntensity" />
+ <java-symbol type="integer" name="config_defaultMediaVibrationIntensity" />
<java-symbol type="integer" name="config_defaultNotificationVibrationIntensity" />
<java-symbol type="integer" name="config_defaultRingVibrationIntensity" />
diff --git a/core/tests/coretests/src/android/content/res/ConfigurationBoundResourceCacheTest.java b/core/tests/coretests/src/android/content/res/ConfigurationBoundResourceCacheTest.java
index 47b14bb..4f8b855 100644
--- a/core/tests/coretests/src/android/content/res/ConfigurationBoundResourceCacheTest.java
+++ b/core/tests/coretests/src/android/content/res/ConfigurationBoundResourceCacheTest.java
@@ -16,6 +16,7 @@
package android.content.res;
+import android.platform.test.annotations.Presubmit;
import android.test.ActivityInstrumentationTestCase2;
import android.util.TypedValue;
@@ -25,6 +26,7 @@
import java.lang.reflect.InvocationTargetException;
+@Presubmit
public class ConfigurationBoundResourceCacheTest
extends ActivityInstrumentationTestCase2<ResourceCacheActivity> {
diff --git a/core/tests/coretests/src/android/content/res/FontResourcesParserTest.java b/core/tests/coretests/src/android/content/res/FontResourcesParserTest.java
index 57f01e9..9aef2ca 100644
--- a/core/tests/coretests/src/android/content/res/FontResourcesParserTest.java
+++ b/core/tests/coretests/src/android/content/res/FontResourcesParserTest.java
@@ -27,6 +27,7 @@
import static org.junit.Assert.assertNotNull;
import android.app.Instrumentation;
+import android.platform.test.annotations.Presubmit;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
@@ -45,6 +46,7 @@
/**
* Tests for {@link FontResourcesParser}.
*/
+@Presubmit
@SmallTest
@RunWith(AndroidJUnit4.class)
public class FontResourcesParserTest {
diff --git a/core/tests/coretests/src/android/content/res/ResourcesDrawableTest.java b/core/tests/coretests/src/android/content/res/ResourcesDrawableTest.java
index c4df88b..f7f9569 100644
--- a/core/tests/coretests/src/android/content/res/ResourcesDrawableTest.java
+++ b/core/tests/coretests/src/android/content/res/ResourcesDrawableTest.java
@@ -24,6 +24,7 @@
import android.graphics.drawable.ColorStateListDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
+import android.platform.test.annotations.Presubmit;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
@@ -34,6 +35,7 @@
import org.junit.Test;
import org.junit.runner.RunWith;
+@Presubmit
@SmallTest
@RunWith(AndroidJUnit4.class)
public class ResourcesDrawableTest {
diff --git a/core/tests/coretests/src/android/content/res/ResourcesLocaleTest.java b/core/tests/coretests/src/android/content/res/ResourcesLocaleTest.java
index aa1a534..25c3db5 100644
--- a/core/tests/coretests/src/android/content/res/ResourcesLocaleTest.java
+++ b/core/tests/coretests/src/android/content/res/ResourcesLocaleTest.java
@@ -18,6 +18,7 @@
import android.os.FileUtils;
import android.os.LocaleList;
+import android.platform.test.annotations.Presubmit;
import android.test.AndroidTestCase;
import android.util.DisplayMetrics;
@@ -30,6 +31,7 @@
import java.util.Arrays;
import java.util.Locale;
+@Presubmit
public class ResourcesLocaleTest extends AndroidTestCase {
private String extractApkAndGetPath(int id) throws Exception {
diff --git a/core/tests/coretests/src/android/content/res/ResourcesManagerTest.java b/core/tests/coretests/src/android/content/res/ResourcesManagerTest.java
index e7ee9dc..34a8bde 100644
--- a/core/tests/coretests/src/android/content/res/ResourcesManagerTest.java
+++ b/core/tests/coretests/src/android/content/res/ResourcesManagerTest.java
@@ -20,6 +20,7 @@
import android.app.ResourcesManager;
import android.os.Binder;
import android.os.LocaleList;
+import android.platform.test.annotations.Postsubmit;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.Display;
@@ -32,6 +33,7 @@
import java.util.HashMap;
import java.util.Map;
+@Postsubmit
public class ResourcesManagerTest extends TestCase {
private static final int SECONDARY_DISPLAY_ID = 1;
private static final String APP_ONE_RES_DIR = "app_one.apk";
diff --git a/core/tests/coretests/src/android/content/res/TEST_MAPPING b/core/tests/coretests/src/android/content/res/TEST_MAPPING
new file mode 100644
index 0000000..4ea6e40
--- /dev/null
+++ b/core/tests/coretests/src/android/content/res/TEST_MAPPING
@@ -0,0 +1,43 @@
+{
+ "presubmit": [
+ {
+ "name": "FrameworksCoreTests",
+ "options": [
+ {
+ "include-filter": "android.content.res."
+ },
+ {
+ "include-annotation": "android.platform.test.annotations.Presubmit"
+ },
+ {
+ "exclude-annotation": "android.platform.test.annotations.Postsubmit"
+ },
+ {
+ "exclude-annotation": "androidx.test.filters.FlakyTest"
+ },
+ {
+ "exclude-annotation": "org.junit.Ignore"
+ }
+ ]
+ }
+ ],
+ "postsubmit": [
+ {
+ "name": "FrameworksCoreTests",
+ "options": [
+ {
+ "include-filter": "android.content.res."
+ },
+ {
+ "include-annotation": "android.platform.test.annotations.Postsubmit"
+ },
+ {
+ "exclude-annotation": "androidx.test.filters.FlakyTest"
+ },
+ {
+ "exclude-annotation": "org.junit.Ignore"
+ }
+ ]
+ }
+ ]
+}
diff --git a/core/tests/coretests/src/android/os/VibratorTest.java b/core/tests/coretests/src/android/os/VibratorTest.java
index bdd76a5..981086d 100644
--- a/core/tests/coretests/src/android/os/VibratorTest.java
+++ b/core/tests/coretests/src/android/os/VibratorTest.java
@@ -27,14 +27,22 @@
import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.ContextWrapper;
import android.hardware.vibrator.IVibrator;
import android.media.AudioAttributes;
import android.platform.test.annotations.Presubmit;
import androidx.test.InstrumentationRegistry;
+import com.android.internal.util.test.FakeSettingsProvider;
+import com.android.internal.util.test.FakeSettingsProviderRule;
+
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
@@ -50,11 +58,19 @@
@RunWith(MockitoJUnitRunner.class)
public class VibratorTest {
+ @Rule
+ public FakeSettingsProviderRule mSettingsProviderRule = FakeSettingsProvider.rule();
+
+ private Context mContextSpy;
private Vibrator mVibratorSpy;
@Before
public void setUp() {
- mVibratorSpy = spy(InstrumentationRegistry.getContext().getSystemService(Vibrator.class));
+ mContextSpy = spy(new ContextWrapper(InstrumentationRegistry.getContext()));
+
+ ContentResolver contentResolver = mSettingsProviderRule.mockContentResolver(mContextSpy);
+ when(mContextSpy.getContentResolver()).thenReturn(contentResolver);
+ mVibratorSpy = spy(new SystemVibrator(mContextSpy));
}
@Test
diff --git a/core/tests/coretests/src/com/android/internal/content/res/TEST_MAPPING b/core/tests/coretests/src/com/android/internal/content/res/TEST_MAPPING
new file mode 100644
index 0000000..9aed8be
--- /dev/null
+++ b/core/tests/coretests/src/com/android/internal/content/res/TEST_MAPPING
@@ -0,0 +1,21 @@
+{
+ "presubmit": [
+ {
+ "name": "FrameworksCoreTests",
+ "options": [
+ {
+ "include-filter": "com.android.internal.content."
+ },
+ {
+ "include-annotation": "android.platform.test.annotations.Presubmit"
+ },
+ {
+ "exclude-annotation": "androidx.test.filters.FlakyTest"
+ },
+ {
+ "exclude-annotation": "org.junit.Ignore"
+ }
+ ]
+ }
+ ]
+}
diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml
index 13303a3..3b4b9e5 100644
--- a/data/etc/privapp-permissions-platform.xml
+++ b/data/etc/privapp-permissions-platform.xml
@@ -293,6 +293,7 @@
<privapp-permissions package="com.android.shell">
<!-- Needed for test only -->
+ <permission name="android.permission.LAUNCH_DEVICE_MANAGER_SETUP"/>
<permission name="android.permission.MODIFY_DAY_NIGHT_MODE"/>
<permission name="android.permission.ACCESS_LOWPAN_STATE"/>
<permission name="android.permission.BACKUP"/>
diff --git a/graphics/java/android/graphics/Outline.java b/graphics/java/android/graphics/Outline.java
index fc7f84c..618e6dc 100644
--- a/graphics/java/android/graphics/Outline.java
+++ b/graphics/java/android/graphics/Outline.java
@@ -169,8 +169,7 @@
}
/**
- * Sets the Outline to the rounded rect defined by the input rect, and
- * corner radius.
+ * Sets the Outline to the rect defined by the input coordinates.
*/
public void setRect(int left, int top, int right, int bottom) {
setRoundRect(left, top, right, bottom, 0.0f);
@@ -184,7 +183,7 @@
}
/**
- * Sets the Outline to the rounded rect defined by the input rect, and corner radius.
+ * Sets the Outline to the rounded rect defined by the input coordinates and corner radius.
* <p>
* Passing a zero radius is equivalent to calling {@link #setRect(int, int, int, int)}
*/
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java
index eaeade8..cf4647a 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java
@@ -364,13 +364,15 @@
* @param context the context for the bubble.
* @param controller the bubble controller.
* @param stackView the stackView the bubble is eventually added to.
- * @param iconFactory the iconfactory use to create badged images for the bubble.
+ * @param iconFactory the icon factory use to create images for the bubble.
+ * @param badgeIconFactory the icon factory to create app badges for the bubble.
*/
void inflate(BubbleViewInfoTask.Callback callback,
Context context,
BubbleController controller,
BubbleStackView stackView,
BubbleIconFactory iconFactory,
+ BubbleBadgeIconFactory badgeIconFactory,
boolean skipInflation) {
if (isBubbleLoading()) {
mInflationTask.cancel(true /* mayInterruptIfRunning */);
@@ -380,6 +382,7 @@
controller,
stackView,
iconFactory,
+ badgeIconFactory,
skipInflation,
callback,
mMainExecutor);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleBadgeIconFactory.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleBadgeIconFactory.java
new file mode 100644
index 0000000..4eeb207
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleBadgeIconFactory.java
@@ -0,0 +1,121 @@
+/*
+ * 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.wm.shell.bubbles;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Path;
+import android.graphics.drawable.AdaptiveIconDrawable;
+import android.graphics.drawable.Drawable;
+
+import com.android.launcher3.icons.BaseIconFactory;
+import com.android.launcher3.icons.BitmapInfo;
+import com.android.launcher3.icons.ShadowGenerator;
+import com.android.wm.shell.R;
+
+/**
+ * Factory for creating app badge icons that are shown on bubbles.
+ */
+public class BubbleBadgeIconFactory extends BaseIconFactory {
+
+ public BubbleBadgeIconFactory(Context context) {
+ super(context, context.getResources().getConfiguration().densityDpi,
+ context.getResources().getDimensionPixelSize(R.dimen.bubble_badge_size));
+ }
+
+ /**
+ * Returns a {@link BitmapInfo} for the app-badge that is shown on top of each bubble. This
+ * will include the workprofile indicator on the badge if appropriate.
+ */
+ BitmapInfo getBadgeBitmap(Drawable userBadgedAppIcon, boolean isImportantConversation) {
+ ShadowGenerator shadowGenerator = new ShadowGenerator(mIconBitmapSize);
+ Bitmap userBadgedBitmap = createIconBitmap(userBadgedAppIcon, 1f, mIconBitmapSize);
+
+ if (userBadgedAppIcon instanceof AdaptiveIconDrawable) {
+ userBadgedBitmap = Bitmap.createScaledBitmap(
+ getCircleBitmap((AdaptiveIconDrawable) userBadgedAppIcon, /* size */
+ userBadgedAppIcon.getIntrinsicWidth()),
+ mIconBitmapSize, mIconBitmapSize, /* filter */ true);
+ }
+
+ if (isImportantConversation) {
+ final float ringStrokeWidth = mContext.getResources().getDimensionPixelSize(
+ com.android.internal.R.dimen.importance_ring_stroke_width);
+ final int importantConversationColor = mContext.getResources().getColor(
+ R.color.important_conversation, null);
+ Bitmap badgeAndRing = Bitmap.createBitmap(userBadgedBitmap.getWidth(),
+ userBadgedBitmap.getHeight(), userBadgedBitmap.getConfig());
+ Canvas c = new Canvas(badgeAndRing);
+
+ Paint ringPaint = new Paint();
+ ringPaint.setStyle(Paint.Style.FILL);
+ ringPaint.setColor(importantConversationColor);
+ ringPaint.setAntiAlias(true);
+ c.drawCircle(c.getWidth() / 2, c.getHeight() / 2, c.getWidth() / 2, ringPaint);
+
+ final int bitmapTop = (int) ringStrokeWidth;
+ final int bitmapLeft = (int) ringStrokeWidth;
+ final int bitmapWidth = c.getWidth() - 2 * (int) ringStrokeWidth;
+ final int bitmapHeight = c.getHeight() - 2 * (int) ringStrokeWidth;
+
+ Bitmap scaledBitmap = Bitmap.createScaledBitmap(userBadgedBitmap, bitmapWidth,
+ bitmapHeight, /* filter */ true);
+ c.drawBitmap(scaledBitmap, bitmapTop, bitmapLeft, /* paint */null);
+
+ shadowGenerator.recreateIcon(Bitmap.createBitmap(badgeAndRing), c);
+ return createIconBitmap(badgeAndRing);
+ } else {
+ Canvas c = new Canvas();
+ c.setBitmap(userBadgedBitmap);
+ shadowGenerator.recreateIcon(Bitmap.createBitmap(userBadgedBitmap), c);
+ return createIconBitmap(userBadgedBitmap);
+ }
+ }
+
+ private Bitmap getCircleBitmap(AdaptiveIconDrawable icon, int size) {
+ Drawable foreground = icon.getForeground();
+ Drawable background = icon.getBackground();
+ Bitmap bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
+ Canvas canvas = new Canvas();
+ canvas.setBitmap(bitmap);
+
+ // Clip canvas to circle.
+ Path circlePath = new Path();
+ circlePath.addCircle(/* x */ size / 2f,
+ /* y */ size / 2f,
+ /* radius */ size / 2f,
+ Path.Direction.CW);
+ canvas.clipPath(circlePath);
+
+ // Draw background.
+ background.setBounds(0, 0, size, size);
+ background.draw(canvas);
+
+ // Draw foreground. The foreground and background drawables are derived from adaptive icons
+ // Some icon shapes fill more space than others, so adaptive icons are normalized to about
+ // the same size. This size is smaller than the original bounds, so we estimate
+ // the difference in this offset.
+ int offset = size / 5;
+ foreground.setBounds(-offset, -offset, size + offset, size + offset);
+ foreground.draw(canvas);
+
+ canvas.setBitmap(null);
+ return bitmap;
+ }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java
index 7903a51..22bec3d 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java
@@ -151,6 +151,7 @@
private BubbleData mBubbleData;
@Nullable private BubbleStackView mStackView;
private BubbleIconFactory mBubbleIconFactory;
+ private BubbleBadgeIconFactory mBubbleBadgeIconFactory;
private BubblePositioner mBubblePositioner;
private Bubbles.SysuiProxy mSysuiProxy;
@@ -278,6 +279,7 @@
mBubbleData = data;
mSavedBubbleKeysPerUser = new SparseSetArray<>();
mBubbleIconFactory = new BubbleIconFactory(context);
+ mBubbleBadgeIconFactory = new BubbleBadgeIconFactory(context);
mDisplayController = displayController;
mTaskViewTransitions = taskViewTransitions;
mOneHandedOptional = oneHandedOptional;
@@ -500,6 +502,7 @@
}
mStackView.updateStackPosition();
mBubbleIconFactory = new BubbleIconFactory(mContext);
+ mBubbleBadgeIconFactory = new BubbleBadgeIconFactory(mContext);
mStackView.onDisplaySizeChanged();
}
if (b.getBoolean(EXTRA_BUBBLE_OVERFLOW_OPENED, false)) {
@@ -778,13 +781,17 @@
mStackView.onThemeChanged();
}
mBubbleIconFactory = new BubbleIconFactory(mContext);
+ mBubbleBadgeIconFactory = new BubbleBadgeIconFactory(mContext);
+
// Reload each bubble
- for (Bubble b: mBubbleData.getBubbles()) {
+ for (Bubble b : mBubbleData.getBubbles()) {
b.inflate(null /* callback */, mContext, this, mStackView, mBubbleIconFactory,
+ mBubbleBadgeIconFactory,
false /* skipInflation */);
}
- for (Bubble b: mBubbleData.getOverflowBubbles()) {
+ for (Bubble b : mBubbleData.getOverflowBubbles()) {
b.inflate(null /* callback */, mContext, this, mStackView, mBubbleIconFactory,
+ mBubbleBadgeIconFactory,
false /* skipInflation */);
}
}
@@ -800,6 +807,7 @@
mScreenBounds.set(newConfig.windowConfiguration.getBounds());
mBubbleData.onMaxBubblesChanged();
mBubbleIconFactory = new BubbleIconFactory(mContext);
+ mBubbleBadgeIconFactory = new BubbleBadgeIconFactory(mContext);
mStackView.onDisplaySizeChanged();
}
if (newConfig.fontScale != mFontScale) {
@@ -961,7 +969,8 @@
}
bubble.inflate(
(b) -> mBubbleData.overflowBubble(Bubbles.DISMISS_RELOAD_FROM_DISK, bubble),
- mContext, this, mStackView, mBubbleIconFactory, true /* skipInflation */);
+ mContext, this, mStackView, mBubbleIconFactory, mBubbleBadgeIconFactory,
+ true /* skipInflation */);
});
return null;
});
@@ -996,7 +1005,8 @@
ensureStackViewCreated();
bubble.setInflateSynchronously(mInflateSynchronously);
bubble.inflate(b -> mBubbleData.notificationEntryUpdated(b, suppressFlyout, showInShade),
- mContext, this, mStackView, mBubbleIconFactory, false /* skipInflation */);
+ mContext, this, mStackView, mBubbleIconFactory, mBubbleBadgeIconFactory,
+ false /* skipInflation */);
}
/**
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleIconFactory.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleIconFactory.java
index b0e029f..9d3bf34 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleIconFactory.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleIconFactory.java
@@ -21,19 +21,12 @@
import android.content.Intent;
import android.content.pm.LauncherApps;
import android.content.pm.ShortcutInfo;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.Path;
-import android.graphics.drawable.AdaptiveIconDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon;
import androidx.annotation.VisibleForTesting;
import com.android.launcher3.icons.BaseIconFactory;
-import com.android.launcher3.icons.BitmapInfo;
-import com.android.launcher3.icons.ShadowGenerator;
import com.android.wm.shell.R;
/**
@@ -44,12 +37,9 @@
@VisibleForTesting
public class BubbleIconFactory extends BaseIconFactory {
- private int mBadgeSize;
-
public BubbleIconFactory(Context context) {
super(context, context.getResources().getConfiguration().densityDpi,
context.getResources().getDimensionPixelSize(R.dimen.bubble_size));
- mBadgeSize = mContext.getResources().getDimensionPixelSize(R.dimen.bubble_badge_size);
}
/**
@@ -75,84 +65,4 @@
return null;
}
}
-
- /**
- * Returns a {@link BitmapInfo} for the app-badge that is shown on top of each bubble. This
- * will include the workprofile indicator on the badge if appropriate.
- */
- BitmapInfo getBadgeBitmap(Drawable userBadgedAppIcon, boolean isImportantConversation) {
- ShadowGenerator shadowGenerator = new ShadowGenerator(mBadgeSize);
- Bitmap userBadgedBitmap = createIconBitmap(userBadgedAppIcon, 1f, mBadgeSize);
-
- if (userBadgedAppIcon instanceof AdaptiveIconDrawable) {
- userBadgedBitmap = Bitmap.createScaledBitmap(
- getCircleBitmap((AdaptiveIconDrawable) userBadgedAppIcon, /* size */
- userBadgedAppIcon.getIntrinsicWidth()),
- mBadgeSize, mBadgeSize, /* filter */ true);
- }
-
- if (isImportantConversation) {
- final float ringStrokeWidth = mContext.getResources().getDimensionPixelSize(
- com.android.internal.R.dimen.importance_ring_stroke_width);
- final int importantConversationColor = mContext.getResources().getColor(
- R.color.important_conversation, null);
- Bitmap badgeAndRing = Bitmap.createBitmap(userBadgedBitmap.getWidth(),
- userBadgedBitmap.getHeight(), userBadgedBitmap.getConfig());
- Canvas c = new Canvas(badgeAndRing);
-
- Paint ringPaint = new Paint();
- ringPaint.setStyle(Paint.Style.FILL);
- ringPaint.setColor(importantConversationColor);
- ringPaint.setAntiAlias(true);
- c.drawCircle(c.getWidth() / 2, c.getHeight() / 2, c.getWidth() / 2, ringPaint);
-
- final int bitmapTop = (int) ringStrokeWidth;
- final int bitmapLeft = (int) ringStrokeWidth;
- final int bitmapWidth = c.getWidth() - 2 * (int) ringStrokeWidth;
- final int bitmapHeight = c.getHeight() - 2 * (int) ringStrokeWidth;
-
- Bitmap scaledBitmap = Bitmap.createScaledBitmap(userBadgedBitmap, bitmapWidth,
- bitmapHeight, /* filter */ true);
- c.drawBitmap(scaledBitmap, bitmapTop, bitmapLeft, /* paint */null);
-
- shadowGenerator.recreateIcon(Bitmap.createBitmap(badgeAndRing), c);
- return createIconBitmap(badgeAndRing);
- } else {
- Canvas c = new Canvas();
- c.setBitmap(userBadgedBitmap);
- shadowGenerator.recreateIcon(Bitmap.createBitmap(userBadgedBitmap), c);
- return createIconBitmap(userBadgedBitmap);
- }
- }
-
- public Bitmap getCircleBitmap(AdaptiveIconDrawable icon, int size) {
- Drawable foreground = icon.getForeground();
- Drawable background = icon.getBackground();
- Bitmap bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
- Canvas canvas = new Canvas();
- canvas.setBitmap(bitmap);
-
- // Clip canvas to circle.
- Path circlePath = new Path();
- circlePath.addCircle(/* x */ size / 2f,
- /* y */ size / 2f,
- /* radius */ size / 2f,
- Path.Direction.CW);
- canvas.clipPath(circlePath);
-
- // Draw background.
- background.setBounds(0, 0, size, size);
- background.draw(canvas);
-
- // Draw foreground. The foreground and background drawables are derived from adaptive icons
- // Some icon shapes fill more space than others, so adaptive icons are normalized to about
- // the same size. This size is smaller than the original bounds, so we estimate
- // the difference in this offset.
- int offset = size / 5;
- foreground.setBounds(-offset, -offset, size + offset, size + offset);
- foreground.draw(canvas);
-
- canvas.setBitmap(null);
- return bitmap;
- }
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java
index b01c756..69762c9 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java
@@ -71,6 +71,7 @@
private WeakReference<BubbleController> mController;
private WeakReference<BubbleStackView> mStackView;
private BubbleIconFactory mIconFactory;
+ private BubbleBadgeIconFactory mBadgeIconFactory;
private boolean mSkipInflation;
private Callback mCallback;
private Executor mMainExecutor;
@@ -84,6 +85,7 @@
BubbleController controller,
BubbleStackView stackView,
BubbleIconFactory factory,
+ BubbleBadgeIconFactory badgeFactory,
boolean skipInflation,
Callback c,
Executor mainExecutor) {
@@ -92,6 +94,7 @@
mController = new WeakReference<>(controller);
mStackView = new WeakReference<>(stackView);
mIconFactory = factory;
+ mBadgeIconFactory = badgeFactory;
mSkipInflation = skipInflation;
mCallback = c;
mMainExecutor = mainExecutor;
@@ -100,7 +103,7 @@
@Override
protected BubbleViewInfo doInBackground(Void... voids) {
return BubbleViewInfo.populate(mContext.get(), mController.get(), mStackView.get(),
- mIconFactory, mBubble, mSkipInflation);
+ mIconFactory, mBadgeIconFactory, mBubble, mSkipInflation);
}
@Override
@@ -135,7 +138,8 @@
@VisibleForTesting
@Nullable
public static BubbleViewInfo populate(Context c, BubbleController controller,
- BubbleStackView stackView, BubbleIconFactory iconFactory, Bubble b,
+ BubbleStackView stackView, BubbleIconFactory iconFactory,
+ BubbleBadgeIconFactory badgeIconFactory, Bubble b,
boolean skipInflation) {
BubbleViewInfo info = new BubbleViewInfo();
@@ -187,11 +191,11 @@
bubbleDrawable = appIcon;
}
- BitmapInfo badgeBitmapInfo = iconFactory.getBadgeBitmap(badgedIcon,
+ BitmapInfo badgeBitmapInfo = badgeIconFactory.getBadgeBitmap(badgedIcon,
b.isImportantConversation());
info.badgeBitmap = badgeBitmapInfo.icon;
// Raw badge bitmap never includes the important conversation ring
- info.mRawBadgeBitmap = iconFactory.getBadgeBitmap(badgedIcon, false).icon;
+ info.mRawBadgeBitmap = badgeIconFactory.getBadgeBitmap(badgedIcon, false).icon;
info.bubbleBitmap = iconFactory.createBadgedIconBitmap(bubbleDrawable).icon;
// Dot color & placement
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipDismissTargetHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipDismissTargetHandler.java
index 92a3598..915c593 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipDismissTargetHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipDismissTargetHandler.java
@@ -140,6 +140,7 @@
});
mMagnetizedPip = mMotionHelper.getMagnetizedPip();
+ mMagnetizedPip.clearAllTargets();
mMagneticTarget = mMagnetizedPip.addTarget(mTargetView, 0);
updateMagneticTargetSize();
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipTransition.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipTransition.kt
index 6c9fed9..9a22007 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipTransition.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipTransition.kt
@@ -22,6 +22,7 @@
import com.android.server.wm.flicker.FlickerTestParameter
import com.android.server.wm.flicker.LAUNCHER_COMPONENT
import com.android.server.wm.flicker.dsl.FlickerBuilder
+import com.android.server.wm.flicker.helpers.isShellTransitionsEnabled
import com.android.server.wm.flicker.helpers.setRotation
import org.junit.Test
@@ -51,11 +52,28 @@
@Presubmit
@Test
open fun pipWindowBecomesInvisible() {
- testSpec.assertWm {
- this.invoke("hasPipWindow") {
- it.isPinned(pipApp.component).isAppWindowVisible(pipApp.component)
- }.then().invoke("!hasPipWindow") {
- it.isNotPinned(pipApp.component).isAppWindowInvisible(pipApp.component)
+ if (isShellTransitionsEnabled) {
+ // When Shell transition is enabled, we change the windowing mode at start, but
+ // update the visibility after the transition is finished, so we can't check isNotPinned
+ // and isAppWindowInvisible in the same assertion block.
+ testSpec.assertWm {
+ this.invoke("hasPipWindow") {
+ it.isPinned(pipApp.component)
+ .isAppWindowVisible(pipApp.component)
+ .isAppWindowOnTop(pipApp.component)
+ }.then().invoke("!hasPipWindow") {
+ it.isNotPinned(pipApp.component)
+ .isAppWindowNotOnTop(pipApp.component)
+ }
+ }
+ testSpec.assertWmEnd { isAppWindowInvisible(pipApp.component) }
+ } else {
+ testSpec.assertWm {
+ this.invoke("hasPipWindow") {
+ it.isPinned(pipApp.component).isAppWindowVisible(pipApp.component)
+ }.then().invoke("!hasPipWindow") {
+ it.isNotPinned(pipApp.component).isAppWindowInvisible(pipApp.component)
+ }
}
}
}
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipWithDismissButtonTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipWithDismissButtonTest.kt
index c75076d..8adebb8 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipWithDismissButtonTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipWithDismissButtonTest.kt
@@ -24,10 +24,7 @@
import com.android.server.wm.flicker.FlickerTestParameterFactory
import com.android.server.wm.flicker.annotation.Group3
import com.android.server.wm.flicker.dsl.FlickerBuilder
-import com.android.server.wm.flicker.helpers.isShellTransitionsEnabled
import com.android.server.wm.flicker.rules.WMFlickerServiceRuleForTestSpec
-import org.junit.Assume.assumeFalse
-import org.junit.Before
import org.junit.FixMethodOrder
import org.junit.Rule
import org.junit.Test
@@ -88,20 +85,10 @@
flickerRule.checkFlakyAssertions()
}
- @Before
- fun onBefore() {
- // This CUJ don't work in shell transitions because of b/204570898 b/204562589
- assumeFalse(isShellTransitionsEnabled)
- }
-
/** {@inheritDoc} */
@FlakyTest(bugId = 206753786)
@Test
- override fun statusBarLayerRotatesScales() {
- // This test doesn't work in shell transitions because of b/206753786
- assumeFalse(isShellTransitionsEnabled)
- super.statusBarLayerRotatesScales()
- }
+ override fun statusBarLayerRotatesScales() = super.statusBarLayerRotatesScales()
companion object {
/**
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExpandPipOnDoubleClickTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExpandPipOnDoubleClickTest.kt
index 52177c2..ef9ff4f 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExpandPipOnDoubleClickTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExpandPipOnDoubleClickTest.kt
@@ -26,9 +26,6 @@
import com.android.server.wm.flicker.LAUNCHER_COMPONENT
import com.android.server.wm.flicker.annotation.Group3
import com.android.server.wm.flicker.dsl.FlickerBuilder
-import com.android.server.wm.flicker.helpers.isShellTransitionsEnabled
-import org.junit.Assume.assumeFalse
-import org.junit.Before
import org.junit.FixMethodOrder
import org.junit.Test
import org.junit.runner.RunWith
@@ -65,12 +62,6 @@
}
}
- @Before
- fun onBefore() {
- // This CUJ don't work in shell transitions because of b/204570898 b/204562589
- assumeFalse(isShellTransitionsEnabled)
- }
-
/**
* Checks that the pip app window remains inside the display bounds throughout the whole
* animation
diff --git a/location/java/android/location/provider/LocationProviderBase.java b/location/java/android/location/provider/LocationProviderBase.java
index 88a2479..529eddd 100644
--- a/location/java/android/location/provider/LocationProviderBase.java
+++ b/location/java/android/location/provider/LocationProviderBase.java
@@ -26,7 +26,9 @@
import android.content.Intent;
import android.location.Location;
import android.os.Bundle;
+import android.os.Handler;
import android.os.IBinder;
+import android.os.Looper;
import android.os.RemoteException;
import android.util.Log;
@@ -308,9 +310,7 @@
synchronized (mBinder) {
try {
manager.onInitialize(mAllowed, mProperties, mAttributionTag);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- } catch (RuntimeException e) {
+ } catch (RemoteException | RuntimeException e) {
Log.w(mTag, e);
}
@@ -320,12 +320,28 @@
@Override
public void setRequest(ProviderRequest request) {
- onSetRequest(request);
+ try {
+ onSetRequest(request);
+ } catch (RuntimeException e) {
+ // exceptions on one-way binder threads are dropped - move to a different thread
+ Log.w(mTag, e);
+ new Handler(Looper.getMainLooper()).post(() -> {
+ throw new AssertionError(e);
+ });
+ }
}
@Override
public void flush() {
- onFlush(this::onFlushComplete);
+ try {
+ onFlush(this::onFlushComplete);
+ } catch (RuntimeException e) {
+ // exceptions on one-way binder threads are dropped - move to a different thread
+ Log.w(mTag, e);
+ new Handler(Looper.getMainLooper()).post(() -> {
+ throw new AssertionError(e);
+ });
+ }
}
private void onFlushComplete() {
@@ -333,9 +349,7 @@
if (manager != null) {
try {
manager.onFlushComplete();
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- } catch (RuntimeException e) {
+ } catch (RemoteException | RuntimeException e) {
Log.w(mTag, e);
}
}
@@ -343,7 +357,15 @@
@Override
public void sendExtraCommand(String command, Bundle extras) {
- onSendExtraCommand(command, extras);
+ try {
+ onSendExtraCommand(command, extras);
+ } catch (RuntimeException e) {
+ // exceptions on one-way binder threads are dropped - move to a different thread
+ Log.w(mTag, e);
+ new Handler(Looper.getMainLooper()).post(() -> {
+ throw new AssertionError(e);
+ });
+ }
}
}
}
diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java
index d2c49e0..af5a3da 100644
--- a/media/java/android/media/AudioSystem.java
+++ b/media/java/android/media/AudioSystem.java
@@ -1357,7 +1357,7 @@
return DEVICE_OUT_BLE_SPEAKER_NAME;
case DEVICE_OUT_DEFAULT:
default:
- return Integer.toString(device);
+ return "0x" + Integer.toHexString(device);
}
}
diff --git a/media/java/android/media/tv/interactive/TvIAppView.java b/media/java/android/media/tv/interactive/TvIAppView.java
index 1ce14ae..b295055 100644
--- a/media/java/android/media/tv/interactive/TvIAppView.java
+++ b/media/java/android/media/tv/interactive/TvIAppView.java
@@ -27,6 +27,7 @@
import android.media.tv.TvTrackInfo;
import android.media.tv.TvView;
import android.media.tv.interactive.TvIAppManager.Session;
+import android.media.tv.interactive.TvIAppManager.Session.FinishedInputEventCallback;
import android.media.tv.interactive.TvIAppManager.SessionCallback;
import android.net.Uri;
import android.os.Bundle;
@@ -34,11 +35,14 @@
import android.util.AttributeSet;
import android.util.Log;
import android.util.Xml;
+import android.view.InputEvent;
+import android.view.KeyEvent;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
+import android.view.ViewRootImpl;
import java.util.List;
@@ -80,6 +84,7 @@
private final AttributeSet mAttrs;
private final int mDefStyleAttr;
private final XmlResourceParser mParser;
+ private OnUnhandledInputEventListener mOnUnhandledInputEventListener;
private final SurfaceHolder.Callback mSurfaceHolderCallback = new SurfaceHolder.Callback() {
@Override
@@ -272,6 +277,77 @@
mSession.dispatchSurfaceChanged(format, width, height);
}
+ private final FinishedInputEventCallback mFinishedInputEventCallback =
+ new FinishedInputEventCallback() {
+ @Override
+ public void onFinishedInputEvent(Object token, boolean handled) {
+ if (DEBUG) {
+ Log.d(TAG, "onFinishedInputEvent(token=" + token + ", handled="
+ + handled + ")");
+ }
+ if (handled) {
+ return;
+ }
+ // TODO: Re-order unhandled events.
+ InputEvent event = (InputEvent) token;
+ if (dispatchUnhandledInputEvent(event)) {
+ return;
+ }
+ ViewRootImpl viewRootImpl = getViewRootImpl();
+ if (viewRootImpl != null) {
+ viewRootImpl.dispatchUnhandledInputEvent(event);
+ }
+ }
+ };
+
+ /**
+ * Dispatches an unhandled input event to the next receiver.
+ */
+ public boolean dispatchUnhandledInputEvent(@NonNull InputEvent event) {
+ if (mOnUnhandledInputEventListener != null) {
+ if (mOnUnhandledInputEventListener.onUnhandledInputEvent(event)) {
+ return true;
+ }
+ }
+ return onUnhandledInputEvent(event);
+ }
+
+ /**
+ * Called when an unhandled input event also has not been handled by the user provided
+ * callback. This is the last chance to handle the unhandled input event in the TvIAppView.
+ *
+ * @param event The input event.
+ * @return If you handled the event, return {@code true}. If you want to allow the event to be
+ * handled by the next receiver, return {@code false}.
+ */
+ public boolean onUnhandledInputEvent(@NonNull InputEvent event) {
+ return false;
+ }
+
+ /**
+ * Registers a callback to be invoked when an input event is not handled
+ * by the TV Interactive App.
+ *
+ * @param listener The callback to be invoked when the unhandled input event is received.
+ */
+ public void setOnUnhandledInputEventListener(@NonNull OnUnhandledInputEventListener listener) {
+ mOnUnhandledInputEventListener = listener;
+ }
+
+ @Override
+ public boolean dispatchKeyEvent(@NonNull KeyEvent event) {
+ if (super.dispatchKeyEvent(event)) {
+ return true;
+ }
+ if (mSession == null) {
+ return false;
+ }
+ InputEvent copiedEvent = event.copy();
+ int ret = mSession.dispatchInputEvent(copiedEvent, copiedEvent, mFinishedInputEventCallback,
+ mHandler);
+ return ret != Session.DISPATCH_NOT_HANDLED;
+ }
+
/**
* Prepares the interactive application.
*/
@@ -514,6 +590,24 @@
*/
public void onRequestTrackInfoList(@NonNull String iAppServiceId) {
}
+
+ }
+
+ /**
+ * Interface definition for a callback to be invoked when the unhandled input event is received.
+ */
+ public interface OnUnhandledInputEventListener {
+ /**
+ * Called when an input event was not handled by the TV Interactive App.
+ *
+ * <p>This is called asynchronously from where the event is dispatched. It gives the host
+ * application a chance to handle the unhandled input events.
+ *
+ * @param event The input event.
+ * @return If you handled the event, return {@code true}. If you want to allow the event to
+ * be handled by the next receiver, return {@code false}.
+ */
+ boolean onUnhandledInputEvent(@NonNull InputEvent event);
}
private class MySessionCallback extends SessionCallback {
diff --git a/media/java/android/media/tv/tuner/filter/Filter.java b/media/java/android/media/tv/tuner/filter/Filter.java
index 45c2a5a..9f44236 100644
--- a/media/java/android/media/tv/tuner/filter/Filter.java
+++ b/media/java/android/media/tv/tuner/filter/Filter.java
@@ -626,8 +626,12 @@
* be a no-op. Use {@link TunerVersionChecker#getTunerVersion()} to get the version information.
*
* @param delayInMs specifies the duration of the delay in milliseconds.
+ * @return one of the following results: {@link Tuner#RESULT_SUCCESS},
+ * {@link Tuner#RESULT_UNAVAILABLE}, {@link Tuner#RESULT_NOT_INITIALIZED},
+ * {@link Tuner#RESULT_INVALID_STATE}, {@link Tuner#RESULT_INVALID_ARGUMENT},
+ * {@link Tuner#RESULT_OUT_OF_MEMORY}, or {@link Tuner#RESULT_UNKNOWN_ERROR}.
*/
- public int delayCallbackUntilTimeMillis(long delayInMs) {
+ public int delayCallbackUntilMillisElapsed(long delayInMs) {
if (!TunerVersionChecker.checkHigherOrEqualVersionTo(
TunerVersionChecker.TUNER_VERSION_2_0, "setTimeDelayHint")) {
return Tuner.RESULT_UNAVAILABLE;
@@ -652,8 +656,12 @@
* be a no-op. Use {@link TunerVersionChecker#getTunerVersion()} to get the version information.
*
* @param delayInBytes specifies the duration of the delay in bytes.
+ * @return one of the following results: {@link Tuner#RESULT_SUCCESS},
+ * {@link Tuner#RESULT_UNAVAILABLE}, {@link Tuner#RESULT_NOT_INITIALIZED},
+ * {@link Tuner#RESULT_INVALID_STATE}, {@link Tuner#RESULT_INVALID_ARGUMENT},
+ * {@link Tuner#RESULT_OUT_OF_MEMORY}, or {@link Tuner#RESULT_UNKNOWN_ERROR}.
*/
- public int delayCallbackUntilBufferFilled(int delayInBytes) {
+ public int delayCallbackUntilBytesAccumulated(int delayInBytes) {
if (!TunerVersionChecker.checkHigherOrEqualVersionTo(
TunerVersionChecker.TUNER_VERSION_2_0, "setTimeDelayHint")) {
return Tuner.RESULT_UNAVAILABLE;
diff --git a/media/java/android/media/tv/tuner/filter/SectionSettings.java b/media/java/android/media/tv/tuner/filter/SectionSettings.java
index 94fda30..f123675 100644
--- a/media/java/android/media/tv/tuner/filter/SectionSettings.java
+++ b/media/java/android/media/tv/tuner/filter/SectionSettings.java
@@ -16,12 +16,13 @@
package android.media.tv.tuner.filter;
+import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.SystemApi;
import android.media.tv.tuner.TunerUtils;
/**
- * Filter Settings for Section data according to ISO/IEC 13818-1.
+ * Filter Settings for Section data according to ISO/IEC 13818-1 and ISO/IEC 23008-1.
*
* @hide
*/
@@ -30,12 +31,15 @@
final boolean mCrcEnabled;
final boolean mIsRepeat;
final boolean mIsRaw;
+ final int mBitWidthOfLengthField;
- SectionSettings(int mainType, boolean crcEnabled, boolean isRepeat, boolean isRaw) {
+ SectionSettings(int mainType, boolean crcEnabled, boolean isRepeat, boolean isRaw,
+ int bitWidthOfLengthField) {
super(TunerUtils.getFilterSubtype(mainType, Filter.SUBTYPE_SECTION));
mCrcEnabled = crcEnabled;
mIsRepeat = isRepeat;
mIsRaw = isRaw;
+ mBitWidthOfLengthField = bitWidthOfLengthField;
}
/**
@@ -62,6 +66,7 @@
public boolean isRepeat() {
return mIsRepeat;
}
+
/**
* Returns whether the filter sends {@link FilterCallback#onFilterStatusChanged} instead of
* {@link FilterCallback#onFilterEvent}.
@@ -71,6 +76,17 @@
}
/**
+ * Returns the bit width of the MMTP (MPEG Media Transport Protocol) section message's length
+ * field according to ISO/IEC 23008-1.
+ *
+ * The section filter uses this for CRC (Cyclic redundancy check) checking when
+ * {@link #isCrcEnabled()} is {@code true}.
+ */
+ public int getBitWidthOfLengthField() {
+ return mBitWidthOfLengthField;
+ }
+
+ /**
* Builder for {@link SectionSettings}.
*
* @param <T> The subclass to be built.
@@ -80,6 +96,7 @@
boolean mCrcEnabled;
boolean mIsRepeat;
boolean mIsRaw;
+ int mBitWidthOfLengthField;
Builder(int mainType) {
mMainType = mainType;
@@ -114,6 +131,7 @@
mIsRepeat = isRepeat;
return self();
}
+
/**
* Sets whether the filter send onFilterStatus instead of
* {@link FilterCallback#onFilterEvent}.
@@ -124,6 +142,23 @@
return self();
}
+ /**
+ * Sets the bit width for the MMTP(MPEG Media Transport Protocol) section message's length
+ * field according to ISO/IEC 23008-1.
+ *
+ * The section filter uses this for CRC (Cyclic redundancy check) checking when
+ * {@link #isCrcEnabled()} is {@code true}.
+ *
+ * <p>This field is only supported in Tuner 2.0 or higher version. Unsupported version will
+ * cause no-op. Use {@link android.media.tv.tuner.TunerVersionChecker#getTunerVersion()}
+ * to get the version information.
+ */
+ @NonNull
+ public T setBitWidthOfLengthField(@IntRange(from = 0) int bitWidthOfLengthField) {
+ mBitWidthOfLengthField = bitWidthOfLengthField;
+ return self();
+ }
+
/* package */ abstract T self();
}
}
diff --git a/media/java/android/media/tv/tuner/filter/SectionSettingsWithSectionBits.java b/media/java/android/media/tv/tuner/filter/SectionSettingsWithSectionBits.java
index edfe85e..766a5c9 100644
--- a/media/java/android/media/tv/tuner/filter/SectionSettingsWithSectionBits.java
+++ b/media/java/android/media/tv/tuner/filter/SectionSettingsWithSectionBits.java
@@ -30,10 +30,9 @@
private final byte[] mMask;
private final byte[] mMode;
-
private SectionSettingsWithSectionBits(int mainType, boolean isCheckCrc, boolean isRepeat,
- boolean isRaw, byte[] filter, byte[] mask, byte[] mode) {
- super(mainType, isCheckCrc, isRepeat, isRaw);
+ boolean isRaw, int bitWidthOfLengthField, byte[] filter, byte[] mask, byte[] mode) {
+ super(mainType, isCheckCrc, isRepeat, isRaw, bitWidthOfLengthField);
mFilter = filter;
mMask = mask;
mMode = mode;
@@ -126,8 +125,8 @@
*/
@NonNull
public SectionSettingsWithSectionBits build() {
- return new SectionSettingsWithSectionBits(
- mMainType, mCrcEnabled, mIsRepeat, mIsRaw, mFilter, mMask, mMode);
+ return new SectionSettingsWithSectionBits(mMainType, mCrcEnabled, mIsRepeat, mIsRaw,
+ mBitWidthOfLengthField, mFilter, mMask, mMode);
}
@Override
diff --git a/media/java/android/media/tv/tuner/filter/SectionSettingsWithTableInfo.java b/media/java/android/media/tv/tuner/filter/SectionSettingsWithTableInfo.java
index ff8f796..eddef40 100644
--- a/media/java/android/media/tv/tuner/filter/SectionSettingsWithTableInfo.java
+++ b/media/java/android/media/tv/tuner/filter/SectionSettingsWithTableInfo.java
@@ -37,8 +37,8 @@
private final int mVersion;
private SectionSettingsWithTableInfo(int mainType, boolean isCheckCrc, boolean isRepeat,
- boolean isRaw, int tableId, int version) {
- super(mainType, isCheckCrc, isRepeat, isRaw);
+ boolean isRaw, int bitWidthOfLengthField, int tableId, int version) {
+ super(mainType, isCheckCrc, isRepeat, isRaw, bitWidthOfLengthField);
mTableId = tableId;
mVersion = version;
}
@@ -99,8 +99,8 @@
*/
@NonNull
public SectionSettingsWithTableInfo build() {
- return new SectionSettingsWithTableInfo(
- mMainType, mCrcEnabled, mIsRepeat, mIsRaw, mTableId, mVersion);
+ return new SectionSettingsWithTableInfo(mMainType, mCrcEnabled, mIsRepeat, mIsRaw,
+ mBitWidthOfLengthField, mTableId, mVersion);
}
@Override
diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp
index c601649..9572e180 100644
--- a/media/jni/android_media_tv_Tuner.cpp
+++ b/media/jni/android_media_tv_Tuner.cpp
@@ -3515,11 +3515,14 @@
bool isCheckCrc = env->GetBooleanField(settings, env->GetFieldID(clazz, "mCrcEnabled", "Z"));
bool isRepeat = env->GetBooleanField(settings, env->GetFieldID(clazz, "mIsRepeat", "Z"));
bool isRaw = env->GetBooleanField(settings, env->GetFieldID(clazz, "mIsRaw", "Z"));
+ int32_t bitWidthOfLengthField =
+ env->GetIntField(settings, env->GetFieldID(clazz, "mBitWidthOfLengthField", "I"));
DemuxFilterSectionSettings filterSectionSettings {
.isCheckCrc = isCheckCrc,
.isRepeat = isRepeat,
.isRaw = isRaw,
+ .bitWidthOfLengthField = bitWidthOfLengthField,
};
if (env->IsInstanceOf(
settings,
diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml
index f3fb48f..13a5caf 100644
--- a/packages/SettingsLib/res/values-af/strings.xml
+++ b/packages/SettingsLib/res/values-af/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Vra elke keer"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Totdat jy dit afskakel"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Sopas"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Foonluidspreker"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Hierdie foon"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Hierdie foon"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Kan nie koppel nie. Skakel toestel af en weer aan"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Bedrade oudiotoestel"</string>
diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml
index 647d052..7ad455a 100644
--- a/packages/SettingsLib/res/values-am/strings.xml
+++ b/packages/SettingsLib/res/values-am/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"ሁልጊዜ ጠይቅ"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"እስኪያጠፉት ድረስ"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"ልክ አሁን"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"የስልክ ድምጽ ማጉያ"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"ይህ ስልክ"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"ይህ ስልክ"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"መገናኘት ላይ ችግር። መሳሪያውን ያጥፉት እና እንደገና ያብሩት"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ባለገመድ የኦዲዮ መሣሪያ"</string>
diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml
index 6357f3c..a4646f1 100644
--- a/packages/SettingsLib/res/values-ar/strings.xml
+++ b/packages/SettingsLib/res/values-ar/strings.xml
@@ -556,7 +556,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"السؤال في كل مرة"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"إلى أن يتم إيقاف الوضع"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"للتو"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"مكبر صوت الهاتف"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"هذا الهاتف"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"هذا الهاتف"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"حدثت مشكلة أثناء الاتصال. يُرجى إيقاف الجهاز ثم إعادة تشغيله."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"جهاز سماعي سلكي"</string>
diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml
index cb74e1f..c304921 100644
--- a/packages/SettingsLib/res/values-as/strings.xml
+++ b/packages/SettingsLib/res/values-as/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"প্ৰতিবাৰতে সোধক"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"আপুনি অফ নকৰা পর্যন্ত"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"এই মাত্ৰ"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"ফ’নৰ স্পীকাৰ"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"এই ফ’নটো"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"এই ফ’নটো"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"সংযোগ হোৱাত সমস্যা হৈছে। ডিভাইচটো অফ কৰি পুনৰ অন কৰক"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"তাঁৰযুক্ত অডিঅ’ ডিভাইচ"</string>
diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml
index 979c957..6e3947e 100644
--- a/packages/SettingsLib/res/values-az/strings.xml
+++ b/packages/SettingsLib/res/values-az/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Həmişə soruşulsun"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Deaktiv edilənə qədər"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"İndicə"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Telefon dinamiki"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Bu telefon"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Bu telefon"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Qoşulmaqla bağlı problem. Cihazı deaktiv edin, sonra yenidən aktiv edin"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Simli audio cihaz"</string>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
index 5af3006..a05dae9 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
@@ -553,7 +553,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Pitaj svaki put"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Dok ne isključite"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Upravo"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Zvučnik telefona"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Ovaj telefon"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Ovaj telefon"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem pri povezivanju. Isključite uređaj, pa ga ponovo uključite"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Žičani audio uređaj"</string>
diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml
index d1b6226..e3b0567 100644
--- a/packages/SettingsLib/res/values-be/strings.xml
+++ b/packages/SettingsLib/res/values-be/strings.xml
@@ -554,7 +554,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Заўсёды пытацца"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Пакуль не выключыце"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Толькі што"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Дынамік тэлефона"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Гэты тэлефон"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Гэты тэлефон"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Праблема з падключэннем. Выключыце і зноў уключыце прыладу"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Правадная аўдыяпрылада"</string>
diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml
index 375879a..a8eaaf0 100644
--- a/packages/SettingsLib/res/values-bg/strings.xml
+++ b/packages/SettingsLib/res/values-bg/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Да се пита винаги"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"До изключване"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Току-що"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Високоговорител"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Този телефон"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Този телефон"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"При свързването възникна проблем. Изключете устройството и го включете отново"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Аудиоустройство с кабел"</string>
diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml
index 89fcbd3..c28e927 100644
--- a/packages/SettingsLib/res/values-bn/strings.xml
+++ b/packages/SettingsLib/res/values-bn/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"প্রতিবার জিজ্ঞেস করা হবে"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"যতক্ষণ না আপনি বন্ধ করছেন"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"এখনই"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"ফোনের স্পিকার"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"এই ফোন"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"এই ফোনটি"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"কানেক্ট করতে সমস্যা হচ্ছে। ডিভাইস বন্ধ করে আবার চালু করুন"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ওয়্যার অডিও ডিভাইস"</string>
diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml
index e33978f..232c22f 100644
--- a/packages/SettingsLib/res/values-bs/strings.xml
+++ b/packages/SettingsLib/res/values-bs/strings.xml
@@ -553,7 +553,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Pitaj svaki put"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Dok ne isključite"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Upravo"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Zvučnik telefona"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Ovaj telefon"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Ovaj telefon"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Došlo je do problema prilikom povezivanja. Isključite, pa ponovo uključite uređaj"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Žičani audio uređaj"</string>
diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml
index 2b10a30..bc393c3 100644
--- a/packages/SettingsLib/res/values-ca/strings.xml
+++ b/packages/SettingsLib/res/values-ca/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Pregunta sempre"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Fins que no el desactivis"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Ara mateix"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Altaveu del telèfon"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Aquest telèfon"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Aquest telèfon"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Hi ha hagut un problema amb la connexió. Apaga el dispositiu i torna\'l a encendre."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositiu d\'àudio amb cable"</string>
diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml
index 7a94bb4..f758365 100644
--- a/packages/SettingsLib/res/values-cs/strings.xml
+++ b/packages/SettingsLib/res/values-cs/strings.xml
@@ -554,7 +554,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Pokaždé se zeptat"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Dokud funkci nevypnete"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Právě teď"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Reproduktor telefonu"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Tento telefon"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Tento telefon"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problém s připojením. Vypněte zařízení a znovu jej zapněte"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Kabelové audiozařízení"</string>
diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml
index ff5c6ae..0fd2569 100644
--- a/packages/SettingsLib/res/values-da/strings.xml
+++ b/packages/SettingsLib/res/values-da/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Spørg hver gang"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Indtil du deaktiverer"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Lige nu"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Telefonens højttaler"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Denne telefon"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Denne telefon"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Der kunne ikke oprettes forbindelse. Sluk og tænd enheden"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Lydenhed med ledning"</string>
diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml
index defc223..f75685b 100644
--- a/packages/SettingsLib/res/values-de/strings.xml
+++ b/packages/SettingsLib/res/values-de/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Jedes Mal fragen"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Bis zur Deaktivierung"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Gerade eben"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Smartphone-Lautsprecher"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Dieses Smartphone"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Dieses Smartphone"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Verbindung kann nicht hergestellt werden. Schalte das Gerät aus & und wieder ein."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Netzbetriebenes Audiogerät"</string>
diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml
index 402e489..5115728 100644
--- a/packages/SettingsLib/res/values-el/strings.xml
+++ b/packages/SettingsLib/res/values-el/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Να ερωτώμαι κάθε φορά"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Μέχρι την απενεργοποίηση"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Μόλις τώρα"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Ηχείο τηλεφώνου"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Αυτό το τηλέφωνο"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Αυτό το τηλέφωνο"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Πρόβλημα κατά τη σύνδεση. Απενεργοποιήστε τη συσκευή και ενεργοποιήστε την ξανά"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Ενσύρματη συσκευή ήχου"</string>
diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml
index fb3bc7a..1481cee 100644
--- a/packages/SettingsLib/res/values-en-rAU/strings.xml
+++ b/packages/SettingsLib/res/values-en-rAU/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Ask every time"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Until you turn off"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Just now"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Phone speaker"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"This phone"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"This phone"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem connecting. Turn device off and back on"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Wired audio device"</string>
diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml
index e33af37..b3dd58a 100644
--- a/packages/SettingsLib/res/values-en-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-en-rCA/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Ask every time"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Until you turn off"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Just now"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Phone speaker"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"This phone"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"This phone"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem connecting. Turn device off and back on"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Wired audio device"</string>
diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml
index fb3bc7a..1481cee 100644
--- a/packages/SettingsLib/res/values-en-rGB/strings.xml
+++ b/packages/SettingsLib/res/values-en-rGB/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Ask every time"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Until you turn off"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Just now"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Phone speaker"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"This phone"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"This phone"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem connecting. Turn device off and back on"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Wired audio device"</string>
diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml
index fb3bc7a..1481cee 100644
--- a/packages/SettingsLib/res/values-en-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-en-rIN/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Ask every time"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Until you turn off"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Just now"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Phone speaker"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"This phone"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"This phone"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem connecting. Turn device off and back on"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Wired audio device"</string>
diff --git a/packages/SettingsLib/res/values-en-rXC/strings.xml b/packages/SettingsLib/res/values-en-rXC/strings.xml
index 2c58236..2a6c82c 100644
--- a/packages/SettingsLib/res/values-en-rXC/strings.xml
+++ b/packages/SettingsLib/res/values-en-rXC/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Ask every time"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Until you turn off"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Just now"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Phone speaker"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"This phone"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"This phone"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem connecting. Turn device off & back on"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Wired audio device"</string>
diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml
index 471e715..ee0e0bc 100644
--- a/packages/SettingsLib/res/values-es-rUS/strings.xml
+++ b/packages/SettingsLib/res/values-es-rUS/strings.xml
@@ -219,7 +219,7 @@
<item msgid="3075292553049300105">"Normal"</item>
<item msgid="1158955023692670059">"Ligera"</item>
<item msgid="5664310435707146591">"Muy ligera"</item>
- <item msgid="5491266922147715962">"A velocidad muy alta"</item>
+ <item msgid="5491266922147715962">"Muy rápida"</item>
<item msgid="7659240015901486196">"Rápida"</item>
<item msgid="7147051179282410945">"Muy rápida"</item>
<item msgid="581904787661470707">"A velocidad máxima"</item>
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Preguntar siempre"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Hasta que lo desactives"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Recién"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Altavoz del teléfono"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Este teléfono"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Este teléfono"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Error al establecer la conexión. Apaga el dispositivo y vuelve a encenderlo."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo de audio con cable"</string>
diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml
index bd687e4..1f64bad 100644
--- a/packages/SettingsLib/res/values-es/strings.xml
+++ b/packages/SettingsLib/res/values-es/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Preguntar siempre"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Hasta que lo desactives"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"justo ahora"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Altavoz del teléfono"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Este teléfono"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Este teléfono"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"No se ha podido conectar; reinicia el dispositivo"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo de audio con cable"</string>
diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml
index aaf3201..ed7b9dc 100644
--- a/packages/SettingsLib/res/values-et/strings.xml
+++ b/packages/SettingsLib/res/values-et/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Küsi iga kord"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Kuni välja lülitate"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Äsja"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Telefoni kõlar"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"See telefon"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"See telefon"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Probleem ühendamisel. Lülitage seade välja ja uuesti sisse"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Juhtmega heliseade"</string>
diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml
index 0f929de..4cdcca7 100644
--- a/packages/SettingsLib/res/values-eu/strings.xml
+++ b/packages/SettingsLib/res/values-eu/strings.xml
@@ -552,9 +552,9 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Galdetu beti"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Zuk desaktibatu arte"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Oraintxe"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Telefonoaren bozgorailua"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Telefono hau"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Telefono hau"</string>
- <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Arazoren bat izan da konektatzean. Itzali gailua eta pitz ezazu berriro."</string>
+ <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Arazo bat izan da konektatzean. Itzali gailua eta pitz ezazu berriro."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Audio-gailu kableduna"</string>
<string name="help_label" msgid="3528360748637781274">"Laguntza eta iritziak"</string>
<string name="storage_category" msgid="2287342585424631813">"Biltegiratzea"</string>
diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml
index 3dce25d..1b5f979 100644
--- a/packages/SettingsLib/res/values-fa/strings.xml
+++ b/packages/SettingsLib/res/values-fa/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"هربار پرسیده شود"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"تا زمانیکه آن را خاموش کنید"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"هماکنون"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"بلندگوی تلفن"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"این تلفن"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"این تلفن"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"مشکل در اتصال. دستگاه را خاموش و دوباره روشن کنید"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"دستگاه صوتی سیمی"</string>
diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml
index 373f6a4..9490ede 100644
--- a/packages/SettingsLib/res/values-fi/strings.xml
+++ b/packages/SettingsLib/res/values-fi/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Kysy aina"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Kunnes laitat pois päältä"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Äsken"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Puhelimen kaiutin"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Tämä puhelin"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Tämä puhelin"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Yhteysvirhe. Sammuta laite ja käynnistä se uudelleen."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Langallinen äänilaite"</string>
diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml
index ebaf4b1..ab36e11 100644
--- a/packages/SettingsLib/res/values-fr-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Toujours demander"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Jusqu\'à la désactivation"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"À l\'instant"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Haut-parleur du téléphone"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Ce téléphone"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Ce téléphone"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problème de connexion. Éteingez et rallumez l\'appareil"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Appareil audio à câble"</string>
diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml
index 5f635b0..35f2fce 100644
--- a/packages/SettingsLib/res/values-fr/strings.xml
+++ b/packages/SettingsLib/res/values-fr/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Toujours demander"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Jusqu\'à la désactivation"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"À l\'instant"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Haut-parleur du téléphone"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Ce téléphone"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Ce téléphone"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problème de connexion. Éteignez l\'appareil, puis rallumez-le"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Appareil audio filaire"</string>
diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml
index cb33a51..8d23864 100644
--- a/packages/SettingsLib/res/values-gl/strings.xml
+++ b/packages/SettingsLib/res/values-gl/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Preguntar sempre"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Ata a desactivación"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Agora mesmo"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Altofalante do teléfono"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Este teléfono"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Este teléfono"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Produciuse un problema coa conexión. Apaga e acende o dispositivo."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo de audio con cable"</string>
diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml
index 79ca4ab..ac38a64 100644
--- a/packages/SettingsLib/res/values-gu/strings.xml
+++ b/packages/SettingsLib/res/values-gu/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"દર વખતે પૂછો"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"તમે બંધ ન કરો ત્યાં સુધી"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"હમણાં જ"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"ફોન સ્પીકર"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"આ ફોન"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"આ ફોન"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"કનેક્ટ કરવામાં સમસ્યા આવી રહી છે. ડિવાઇસને બંધ કરીને ફરી ચાલુ કરો"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"વાયરવાળો ઑડિયો ડિવાઇસ"</string>
diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml
index fcf04bc..5c008f0 100644
--- a/packages/SettingsLib/res/values-hi/strings.xml
+++ b/packages/SettingsLib/res/values-hi/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"हर बार पूछें"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"जब तक आप इसे बंद नहीं करते"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"अभी-अभी"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"फ़ोन का स्पीकर"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"यह फ़ोन"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"यह फ़ोन"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"कनेक्ट करने में समस्या हो रही है. डिवाइस को बंद करके चालू करें"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"वायर वाला ऑडियो डिवाइस"</string>
diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml
index 1ef94fb..d681a1e 100644
--- a/packages/SettingsLib/res/values-hr/strings.xml
+++ b/packages/SettingsLib/res/values-hr/strings.xml
@@ -553,7 +553,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Pitaj svaki put"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Dok ne isključite"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Upravo sad"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Zvučnik telefona"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Ovaj telefon"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Ovaj telefon"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem s povezivanjem. Isključite i ponovo uključite uređaj"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Žičani audiouređaj"</string>
diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml
index deb0f81..57894a0 100644
--- a/packages/SettingsLib/res/values-hu/strings.xml
+++ b/packages/SettingsLib/res/values-hu/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Mindig kérdezzen rá"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Kikapcsolásig"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Az imént"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Telefon hangszórója"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Ez a telefon"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Ez a telefon"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Sikertelen csatlakozás. Kapcsolja ki az eszközt, majd kapcsolja be újra."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Vezetékes audioeszköz"</string>
diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml
index 485af54..e6ed2b0 100644
--- a/packages/SettingsLib/res/values-hy/strings.xml
+++ b/packages/SettingsLib/res/values-hy/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Ամեն անգամ հարցնել"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Մինչև անջատեք"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Հենց նոր"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Հեռախոսի բարձրախոս"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Այս հեռախոսը"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Այս հեռախոսը"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Կապի խնդիր կա: Սարքն անջատեք և նորից միացրեք:"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Լարով աուդիո սարք"</string>
diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml
index f82798a4..6fbab2b 100644
--- a/packages/SettingsLib/res/values-in/strings.xml
+++ b/packages/SettingsLib/res/values-in/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Selalu tanya"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Sampai Anda menonaktifkannya"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Baru saja"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Speaker ponsel"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Ponsel ini"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Ponsel ini"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Ada masalah saat menghubungkan. Nonaktifkan perangkat & aktifkan kembali"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Perangkat audio berkabel"</string>
diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml
index a43eb14..fa11dfb 100644
--- a/packages/SettingsLib/res/values-is/strings.xml
+++ b/packages/SettingsLib/res/values-is/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Spyrja í hvert skipti"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Þar til þú slekkur"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Rétt í þessu"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Símahátalari"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Þessi sími"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Þessi sími"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Vandamál í tengingu. Slökktu og kveiktu á tækinu"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Snúrutengt hljómtæki"</string>
diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml
index 0a96f59..0db0448 100644
--- a/packages/SettingsLib/res/values-it/strings.xml
+++ b/packages/SettingsLib/res/values-it/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Chiedi ogni volta"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Fino alla disattivazione"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Adesso"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Altoparlante telefono"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Questo telefono"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Questo telefono"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problema di connessione. Spegni e riaccendi il dispositivo"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo audio cablato"</string>
diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml
index 6f3cfb9..7ac5919 100644
--- a/packages/SettingsLib/res/values-iw/strings.xml
+++ b/packages/SettingsLib/res/values-iw/strings.xml
@@ -554,7 +554,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"יש לשאול בכל פעם"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"עד הכיבוי"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"הרגע"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"הרמקול של הטלפון"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"הטלפון הזה"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"הטלפון הזה"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"יש בעיה בחיבור. עליך לכבות את המכשיר ולהפעיל אותו מחדש"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"התקן אודיו חוטי"</string>
diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml
index 620aca6..d82ca5d 100644
--- a/packages/SettingsLib/res/values-ja/strings.xml
+++ b/packages/SettingsLib/res/values-ja/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"毎回確認"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"OFF にするまで"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"たった今"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"スマートフォンのスピーカー"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"このスマートフォン"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"このスマートフォン"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"接続エラーです。デバイスを OFF にしてから ON に戻してください"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"有線オーディオ デバイス"</string>
diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml
index daa0fae..02c1084 100644
--- a/packages/SettingsLib/res/values-ka/strings.xml
+++ b/packages/SettingsLib/res/values-ka/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"ყოველთვის მკითხეთ"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"გამორთვამდე"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"ახლახან"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"ტელეფონის დინამიკი"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"ეს ტელეფონი"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"ეს ტელეფონი"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"დაკავშირებისას წარმოიქმნა პრობლემა. გამორთეთ და კვლავ ჩართეთ მოწყობილობა"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"სადენიანი აუდიო მოწყობილობა"</string>
diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml
index 6305891..6c55b62 100644
--- a/packages/SettingsLib/res/values-kk/strings.xml
+++ b/packages/SettingsLib/res/values-kk/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Әрдайым сұрау"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Өшірілгенге дейін"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Дәл қазір"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Телефон динамигі"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Осы телефон"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Осы телефон"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Байланыс орнату қатесі шығуып жатыр. Құрылғыны өшіріп, қайта қосыңыз."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Сымды аудио құрылғысы"</string>
diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml
index fb00aa0..58a2c7c 100644
--- a/packages/SettingsLib/res/values-km/strings.xml
+++ b/packages/SettingsLib/res/values-km/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"សួរគ្រប់ពេល"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"រហូតទាល់តែអ្នកបិទ"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"អម្បាញ់មិញ"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"ឧបករណ៍បំពងសំឡេងទូរសព្ទ"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"ទូរសព្ទនេះ"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"ទូរសព្ទនេះ"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"មានបញ្ហាក្នុងការភ្ជាប់។ បិទ រួចបើកឧបករណ៍វិញ"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ឧបករណ៍សំឡេងប្រើខ្សែ"</string>
diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml
index a1f0825..91e76e2 100644
--- a/packages/SettingsLib/res/values-kn/strings.xml
+++ b/packages/SettingsLib/res/values-kn/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"ಪ್ರತಿ ಬಾರಿ ಕೇಳಿ"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"ನೀವು ಆಫ್ ಮಾಡುವವರೆಗೆ"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"ಇದೀಗ"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"ಫೋನ್ ಸ್ಪೀಕರ್"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"ಈ ಫೋನ್"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"ಈ ಫೋನ್"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"ಕನೆಕ್ಟ್ ಮಾಡುವಾಗ ಸಮಸ್ಯೆ ಎದುರಾಗಿದೆ ಸಾಧನವನ್ನು ಆಫ್ ಮಾಡಿ ಹಾಗೂ ನಂತರ ಪುನಃ ಆನ್ ಮಾಡಿ"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ವೈರ್ ಹೊಂದಿರುವ ಆಡಿಯೋ ಸಾಧನ"</string>
diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml
index 1ff18c6..d470560 100644
--- a/packages/SettingsLib/res/values-ko/strings.xml
+++ b/packages/SettingsLib/res/values-ko/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"항상 확인"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"사용 중지할 때까지"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"조금 전"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"휴대전화 스피커"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"이 휴대전화"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"이 휴대전화"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"연결 중에 문제가 발생했습니다. 기기를 껐다가 다시 켜 보세요."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"유선 오디오 기기"</string>
diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml
index 58e3107..e38bb51a 100644
--- a/packages/SettingsLib/res/values-ky/strings.xml
+++ b/packages/SettingsLib/res/values-ky/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Ар дайым суралсын"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Бул функция өчүрүлгөнгө чейин"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Жаңы эле"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Телефондун динамиги"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Ушул телефон"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Ушул телефон"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Туташууда маселе келип чыкты. Түзмөктү өчүрүп, кайра күйгүзүп көрүңүз"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Зымдуу аудио түзмөк"</string>
diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml
index a2b8c6b..cc02292 100644
--- a/packages/SettingsLib/res/values-lo/strings.xml
+++ b/packages/SettingsLib/res/values-lo/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"ຖາມທຸກເທື່ອ"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"ຈົນກວ່າທ່ານຈະປິດ"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"ຕອນນີ້"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"ລຳໂພງໂທລະສັບ"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"ໂທລະສັບນີ້"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"ໂທລະສັບນີ້"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"ເກີດບັນຫາໃນການເຊື່ອມຕໍ່. ປິດອຸປະກອນແລ້ວເປີດກັບຄືນມາໃໝ່"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ອຸປະກອນສຽງແບບມີສາຍ"</string>
diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml
index d8c1a45..fb645a0 100644
--- a/packages/SettingsLib/res/values-lt/strings.xml
+++ b/packages/SettingsLib/res/values-lt/strings.xml
@@ -554,7 +554,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Klausti kaskart"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Kol išjungsite"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Ką tik"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Telefono garsiakalbis"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Šis telefonas"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Šis telefonas"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Prisijungiant kilo problema. Išjunkite įrenginį ir vėl jį įjunkite"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Laidinis garso įrenginys"</string>
diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml
index 9ac8c65..694ff0a 100644
--- a/packages/SettingsLib/res/values-lv/strings.xml
+++ b/packages/SettingsLib/res/values-lv/strings.xml
@@ -553,7 +553,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Vaicāt katru reizi"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Līdz brīdim, kad izslēgsiet"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Tikko"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Tālruņa skaļrunis"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Šis tālrunis"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Šis tālrunis"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Radās problēma ar savienojuma izveidi. Izslēdziet un atkal ieslēdziet ierīci."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Vadu audioierīce"</string>
diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml
index c08fd24..9d412fc 100644
--- a/packages/SettingsLib/res/values-mk/strings.xml
+++ b/packages/SettingsLib/res/values-mk/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Прашувај секогаш"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Додека не го исклучите"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Пред малку"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Телефонски звучник"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Овој телефон"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Овој телефон"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Проблем со поврзување. Исклучете го уредот и повторно вклучете го"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Жичен аудиоуред"</string>
diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml
index 27693e6..82df16c0 100644
--- a/packages/SettingsLib/res/values-ml/strings.xml
+++ b/packages/SettingsLib/res/values-ml/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"എപ്പോഴും ചോദിക്കുക"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"നിങ്ങൾ ഓഫാക്കുന്നത് വരെ"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"ഇപ്പോൾ"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"ഫോൺ സ്പീക്കർ"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"ഈ ഫോൺ"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"ഈ ഫോൺ"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"കണക്റ്റ് ചെയ്യുന്നതിൽ പ്രശ്നമുണ്ടായി. ഉപകരണം ഓഫാക്കി വീണ്ടും ഓണാക്കുക"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"വയർ മുഖേന ബന്ധിപ്പിച്ച ഓഡിയോ ഉപകരണം"</string>
diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml
index b62d103..027b722 100644
--- a/packages/SettingsLib/res/values-mn/strings.xml
+++ b/packages/SettingsLib/res/values-mn/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Тухай бүрд асуух"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Таныг унтраах хүртэл"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Дөнгөж сая"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Утасны чанга яригч"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Энэ утас"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Энэ утас"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Холбогдоход асуудал гарлаа. Төхөөрөмжийг унтраагаад дахин асаана уу"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Утастай аудио төхөөрөмж"</string>
diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml
index d90c08a..176d764 100644
--- a/packages/SettingsLib/res/values-mr/strings.xml
+++ b/packages/SettingsLib/res/values-mr/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"प्रत्येक वेळी विचारा"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"तुम्ही बंद करेपर्यंत"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"आत्ताच"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"फोनचा स्पीकर"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"हा फोन"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"हा फोन"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"कनेक्ट करण्यात समस्या आली. डिव्हाइस बंद करा आणि नंतर सुरू करा"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"वायर असलेले ऑडिओ डिव्हाइस"</string>
diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml
index 7011aec..6bf15fe 100644
--- a/packages/SettingsLib/res/values-ms/strings.xml
+++ b/packages/SettingsLib/res/values-ms/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Tanya setiap kali"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Sehingga anda matikan"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Sebentar tadi"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Pembesar suara telefon"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Telefon ini"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Telefon ini"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Masalah penyambungan. Matikan & hidupkan kembali peranti"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Peranti audio berwayar"</string>
diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml
index 3de8cf9..13fc6ad 100644
--- a/packages/SettingsLib/res/values-my/strings.xml
+++ b/packages/SettingsLib/res/values-my/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"အမြဲမေးရန်"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"သင်ပိတ်လိုက်သည် အထိ"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"ယခုလေးတင်"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"ဖုန်းစပီကာ"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"ဤဖုန်း"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"ဤဖုန်း"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"ချိတ်ဆက်ရာတွင် ပြဿနာရှိပါသည်။ စက်ကိုပိတ်ပြီး ပြန်ဖွင့်ပါ"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ကြိုးတပ် အသံစက်ပစ္စည်း"</string>
diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml
index e7f70d1..c2e449b 100644
--- a/packages/SettingsLib/res/values-nb/strings.xml
+++ b/packages/SettingsLib/res/values-nb/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Spør hver gang"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Til du slår av"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Nå nettopp"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Telefonhøyttaler"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Denne telefonen"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Denne telefonen"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Tilkoblingsproblemer. Slå enheten av og på igjen"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Lydenhet med kabel"</string>
diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml
index 8fc329f8..85860f0 100644
--- a/packages/SettingsLib/res/values-ne/strings.xml
+++ b/packages/SettingsLib/res/values-ne/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"प्रत्येक पटक सोधियोस्"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"तपाईंले अफ नगरेसम्म"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"अहिले भर्खरै"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"फोनको स्पिकर"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"यो फोन"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"यो फोन"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"जोड्ने क्रममा समस्या भयो। यन्त्रलाई निष्क्रिय पारेर फेरि सक्रिय गर्नुहोस्"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"तारयुक्त अडियो यन्त्र"</string>
diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml
index 35e651b..2ffa559 100644
--- a/packages/SettingsLib/res/values-nl/strings.xml
+++ b/packages/SettingsLib/res/values-nl/strings.xml
@@ -222,7 +222,7 @@
<item msgid="5491266922147715962">"Nog sneller"</item>
<item msgid="7659240015901486196">"Heel erg snel"</item>
<item msgid="7147051179282410945">"Snelst"</item>
- <item msgid="581904787661470707">"Allerallersnelst"</item>
+ <item msgid="581904787661470707">"Allersnelst"</item>
</string-array>
<string name="choose_profile" msgid="343803890897657450">"Profiel kiezen"</string>
<string name="category_personal" msgid="6236798763159385225">"Persoonlijk"</string>
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Vraag altijd"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Totdat je uitzet"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Zojuist"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Telefoonspeaker"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Deze telefoon"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Deze telefoon"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Probleem bij verbinding maken. Zet het apparaat uit en weer aan."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Bedraad audioapparaat"</string>
diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml
index 49018be..e2fee13 100644
--- a/packages/SettingsLib/res/values-or/strings.xml
+++ b/packages/SettingsLib/res/values-or/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"ପ୍ରତ୍ୟେକ ଥର ପଚାରନ୍ତୁ"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"ଆପଣ ବନ୍ଦ ନକରିବା ପର୍ଯ୍ୟନ୍ତ"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"ଏହିକ୍ଷଣି"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"ଫୋନ୍ ସ୍ପିକର୍"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"ଏହି ଫୋନ"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"ଏହି ଫୋନ୍"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"ସଂଯୋଗ କରିବାରେ ସମସ୍ୟା ହେଉଛି। ଡିଭାଇସ୍ ବନ୍ଦ କରି ପୁଣି ଚାଲୁ କରନ୍ତୁ"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ତାରଯୁକ୍ତ ଅଡିଓ ଡିଭାଇସ୍"</string>
diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml
index 9efc4c4..11cd481 100644
--- a/packages/SettingsLib/res/values-pa/strings.xml
+++ b/packages/SettingsLib/res/values-pa/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"ਹਰ ਵਾਰ ਪੁੱਛੋ"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਬੰਦ ਨਹੀਂ ਕਰਦੇ"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"ਹੁਣੇ ਹੀ"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"ਫ਼ੋਨ ਦਾ ਸਪੀਕਰ"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"ਇਹ ਫ਼ੋਨ"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"ਇਹ ਫ਼ੋਨ"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"ਕਨੈਕਟ ਕਰਨ ਵਿੱਚ ਸਮੱਸਿਆ ਆਈ। ਡੀਵਾਈਸ ਨੂੰ ਬੰਦ ਕਰਕੇ ਵਾਪਸ ਚਾਲੂ ਕਰੋ"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ਤਾਰ ਵਾਲਾ ਆਡੀਓ ਡੀਵਾਈਸ"</string>
diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml
index 1eb2dd9..0c670bc 100644
--- a/packages/SettingsLib/res/values-pl/strings.xml
+++ b/packages/SettingsLib/res/values-pl/strings.xml
@@ -554,7 +554,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Zawsze pytaj"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Dopóki nie wyłączysz"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Przed chwilą"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Głośnik telefonu"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Ten telefon"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Ten telefon"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem z połączeniem. Wyłącz i ponownie włącz urządzenie"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Przewodowe urządzenie audio"</string>
diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml
index 38d637f..10568a1 100644
--- a/packages/SettingsLib/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Perguntar sempre"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Até você desativar"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Agora"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Alto-falante do smartphone"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Este smartphone"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Este smartphone"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Ocorreu um problema na conexão. Desligue o dispositivo e ligue-o novamente"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo de áudio com fio"</string>
diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml
index 5a0ec2e..5458279 100644
--- a/packages/SettingsLib/res/values-pt-rPT/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Perguntar sempre"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Até desativar"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Agora mesmo"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Altifalante do telemóvel"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Este telemóvel"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Este telemóvel"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problema ao ligar. Desligue e volte a ligar o dispositivo."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo de áudio com fios"</string>
diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml
index 38d637f..10568a1 100644
--- a/packages/SettingsLib/res/values-pt/strings.xml
+++ b/packages/SettingsLib/res/values-pt/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Perguntar sempre"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Até você desativar"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Agora"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Alto-falante do smartphone"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Este smartphone"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Este smartphone"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Ocorreu um problema na conexão. Desligue o dispositivo e ligue-o novamente"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo de áudio com fio"</string>
diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml
index ce58f1c..00fc8ff 100644
--- a/packages/SettingsLib/res/values-ro/strings.xml
+++ b/packages/SettingsLib/res/values-ro/strings.xml
@@ -553,7 +553,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Întreabă de fiecare dată"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Până când dezactivați"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Chiar acum"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Difuzorul telefonului"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Acest telefon"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Acest telefon"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problemă la conectare. Opriți și reporniți dispozitivul."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispozitiv audio cu fir"</string>
diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml
index 14db225..15e3456 100644
--- a/packages/SettingsLib/res/values-ru/strings.xml
+++ b/packages/SettingsLib/res/values-ru/strings.xml
@@ -554,7 +554,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Всегда спрашивать"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Пока вы не отключите"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Только что"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Встроен. динамик"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Этот смартфон"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Этот смартфон"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Ошибка подключения. Выключите и снова включите устройство."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Проводное аудиоустройство"</string>
diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml
index 41f10c9..d56dd34 100644
--- a/packages/SettingsLib/res/values-si/strings.xml
+++ b/packages/SettingsLib/res/values-si/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"සෑම විටම ඉල්ලන්න"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"ඔබ ක්රියාවිරහිත කරන තුරු"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"මේ දැන්"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"දුරකථන ස්පීකරය"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"මෙම දුරකථනය"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"මෙම දුරකථනය"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"සම්බන්ධ කිරීමේ ගැටලුවකි උපාංගය ක්රියාවිරහිත කර & ආපසු ක්රියාත්මක කරන්න"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"රැහැන්ගත කළ ඕඩියෝ උපාංගය"</string>
diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml
index 801c213..e7ea915 100644
--- a/packages/SettingsLib/res/values-sk/strings.xml
+++ b/packages/SettingsLib/res/values-sk/strings.xml
@@ -554,7 +554,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Vždy sa opýtať"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Dokým funkciu nevypnete"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Teraz"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Reproduktor telefónu"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Tento telefón"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Tento telefón"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Pri pripájaní sa vyskytol problém. Zariadenie vypnite a znova zapnite."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Audio zariadenie s káblom"</string>
diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml
index a331018..95a6fb9 100644
--- a/packages/SettingsLib/res/values-sl/strings.xml
+++ b/packages/SettingsLib/res/values-sl/strings.xml
@@ -554,7 +554,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Vedno vprašaj"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Dokler ne izklopite"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Pravkar"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Zvočnik telefona"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Ta telefon"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Ta telefon"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Težava pri povezovanju. Napravo izklopite in znova vklopite."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Žična zvočna naprava"</string>
diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml
index cb9bea8..8524164 100644
--- a/packages/SettingsLib/res/values-sq/strings.xml
+++ b/packages/SettingsLib/res/values-sq/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Pyet çdo herë"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Derisa ta çaktivizosh"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Pikërisht tani"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Altoparlanti i telefonit"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Ky telefon"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Ky telefon"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem me lidhjen. Fike dhe ndize përsëri pajisjen"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Pajisja audio me tel"</string>
diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml
index 9e90333..b19198a 100644
--- a/packages/SettingsLib/res/values-sr/strings.xml
+++ b/packages/SettingsLib/res/values-sr/strings.xml
@@ -553,7 +553,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Питај сваки пут"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Док не искључите"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Управо"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Звучник телефона"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Овај телефон"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Овај телефон"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Проблем при повезивању. Искључите уређај, па га поново укључите"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Жичани аудио уређај"</string>
diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml
index 215d9ad..59cde86 100644
--- a/packages/SettingsLib/res/values-sv/strings.xml
+++ b/packages/SettingsLib/res/values-sv/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Fråga varje gång"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Tills du inaktiverar funktionen"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Nyss"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Telefonhögtalare"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Den här telefonen"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Den här telefonen"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Det gick inte att ansluta. Stäng av enheten och slå på den igen"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Ljudenhet med kabelanslutning"</string>
diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml
index f51825b..64c2e07 100644
--- a/packages/SettingsLib/res/values-sw/strings.xml
+++ b/packages/SettingsLib/res/values-sw/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Uliza kila wakati"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Hadi utakapoizima"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Sasa hivi"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Spika ya simu"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Simu hii"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Simu hii"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Kuna tatizo la kuunganisha kwenye Intaneti. Zima kisha uwashe kifaa"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Kifaa cha sauti kinachotumia waya"</string>
diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml
index 8128683..ccef6b9 100644
--- a/packages/SettingsLib/res/values-ta/strings.xml
+++ b/packages/SettingsLib/res/values-ta/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"ஒவ்வொரு முறையும் கேள்"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"ஆஃப் செய்யும் வரை"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"சற்றுமுன்"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"மொபைல் ஸ்பீக்கர்"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"இந்த மொபைல்"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"இந்த மொபைல்"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"இணைப்பதில் சிக்கல். சாதனத்தை ஆஃப் செய்து மீண்டும் ஆன் செய்யவும்"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"வயருடன்கூடிய ஆடியோ சாதனம்"</string>
diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml
index 298f850..4013620 100644
--- a/packages/SettingsLib/res/values-te/strings.xml
+++ b/packages/SettingsLib/res/values-te/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"ప్రతిసారి అడుగు"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"మీరు ఆఫ్ చేసే వరకు"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"ఇప్పుడే"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"ఫోన్ స్పీకర్"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"ఈ ఫోన్"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"ఈ ఫోన్"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"కనెక్ట్ చేయడంలో సమస్య ఉంది. పరికరాన్ని ఆఫ్ చేసి, ఆపై తిరిగి ఆన్ చేయండి"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"వైర్ గల ఆడియో పరికరం"</string>
diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml
index e18c649..c42295f 100644
--- a/packages/SettingsLib/res/values-th/strings.xml
+++ b/packages/SettingsLib/res/values-th/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"ถามทุกครั้ง"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"จนกว่าคุณจะปิด"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"เมื่อสักครู่"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"ลำโพงโทรศัพท์"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"โทรศัพท์เครื่องนี้"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"โทรศัพท์เครื่องนี้"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"เกิดปัญหาในการเชื่อมต่อ ปิดอุปกรณ์แล้วเปิดใหม่อีกครั้ง"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"อุปกรณ์เสียงแบบมีสาย"</string>
diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml
index 628bacc..ab36a55 100644
--- a/packages/SettingsLib/res/values-tl/strings.xml
+++ b/packages/SettingsLib/res/values-tl/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Magtanong palagi"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Hanggang sa i-off mo"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Ngayon lang"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Speaker ng telepono"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Ang teleponong ito"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Ang teleponong ito"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Nagkaproblema sa pagkonekta. I-off at pagkatapos ay i-on ang device"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Wired na audio device"</string>
diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml
index 3e30d43..ce71496 100644
--- a/packages/SettingsLib/res/values-tr/strings.xml
+++ b/packages/SettingsLib/res/values-tr/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Her zaman sor"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Siz kapatana kadar"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Az önce"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Telefon hoparlörü"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Bu telefon"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Bu telefon"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Bağlanırken sorun oluştu. Cihazı kapatıp tekrar açın"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Kablolu ses cihazı"</string>
diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml
index 8683953..b7d370d2 100644
--- a/packages/SettingsLib/res/values-uk/strings.xml
+++ b/packages/SettingsLib/res/values-uk/strings.xml
@@ -554,7 +554,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Запитувати щоразу"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Доки не вимкнути"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Щойно"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Динамік"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Цей телефон"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Цей телефон"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Не вдається підключитися. Перезавантажте пристрій."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Дротовий аудіопристрій"</string>
diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml
index 09e50f6..c3f4d56 100644
--- a/packages/SettingsLib/res/values-ur/strings.xml
+++ b/packages/SettingsLib/res/values-ur/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"ہر بار پوچھیں"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"یہاں تک کہ آپ آف کر دیں"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"ابھی ابھی"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"فون اسپیکر"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"یہ فون"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"یہ فون"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"منسلک کرنے میں مسئلہ پیش آ گیا۔ آلہ کو آف اور بیک آن کریں"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"وائرڈ آڈیو آلہ"</string>
diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml
index d0b9506..aa3d8826 100644
--- a/packages/SettingsLib/res/values-uz/strings.xml
+++ b/packages/SettingsLib/res/values-uz/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Har safar so‘ralsin"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Rejimdan chiqilgunicha"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Hozir"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Telefon karnayi"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Shu telefon"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Shu telefon"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Ulanishda muammo yuz berdi. Qurilmani oʻchiring va yoqing"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Simli audio qurilma"</string>
diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml
index bd97cc5..7291d06 100644
--- a/packages/SettingsLib/res/values-vi/strings.xml
+++ b/packages/SettingsLib/res/values-vi/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Luôn hỏi"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Cho đến khi bạn tắt"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Vừa xong"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Loa điện thoại"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Điện thoại này"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Điện thoại này"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Sự cố kết nối. Hãy tắt thiết bị rồi bật lại"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Thiết bị âm thanh có dây"</string>
diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml
index 3ed1860..3f1b9ae 100644
--- a/packages/SettingsLib/res/values-zh-rCN/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"每次都询问"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"直到您将其关闭"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"刚刚"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"手机扬声器"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"这部手机"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"这部手机"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"连接时遇到问题。请关闭并重新开启设备"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"有线音频设备"</string>
diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml
index 965e78f..c91a13f 100644
--- a/packages/SettingsLib/res/values-zh-rHK/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"每次都詢問"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"直至您關閉為止"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"剛剛"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"手機喇叭"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"此手機"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"這部手機"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"無法連接,請關閉裝置然後重新開機"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"有線音響裝置"</string>
diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml
index e3ca344..8b469ea 100644
--- a/packages/SettingsLib/res/values-zh-rTW/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"每次都詢問"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"直到你關閉為止"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"剛剛"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"手機喇叭"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"這支手機"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"這支手機"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"無法連線,請關閉裝置後再重新開啟"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"有線音訊裝置"</string>
diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml
index 1af1fa1..9eac12c 100644
--- a/packages/SettingsLib/res/values-zu/strings.xml
+++ b/packages/SettingsLib/res/values-zu/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Buza njalo"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Uze uvale isikrini"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Khona manje"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Isipikha sefoni"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Le foni"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Le foni"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Inkinga yokuxhumeka. Vala idivayisi futhi uphinde uyivule"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Idivayisi yomsindo enentambo"</string>
diff --git a/packages/SettingsLib/src/com/android/settingslib/deviceinfo/AbstractConnectivityPreferenceController.java b/packages/SettingsLib/src/com/android/settingslib/deviceinfo/AbstractConnectivityPreferenceController.java
index c6552f7..d3934bf 100644
--- a/packages/SettingsLib/src/com/android/settingslib/deviceinfo/AbstractConnectivityPreferenceController.java
+++ b/packages/SettingsLib/src/com/android/settingslib/deviceinfo/AbstractConnectivityPreferenceController.java
@@ -73,7 +73,8 @@
}
mContext.registerReceiver(mConnectivityReceiver, connectivityIntentFilter,
- android.Manifest.permission.CHANGE_NETWORK_STATE, null);
+ android.Manifest.permission.CHANGE_NETWORK_STATE, null,
+ Context.RECEIVER_EXPORTED_UNAUDITED);
}
protected abstract String[] getConnectivityIntents();
diff --git a/packages/SettingsLib/src/com/android/settingslib/net/DataUsageController.java b/packages/SettingsLib/src/com/android/settingslib/net/DataUsageController.java
index 011ca0b..cff45c6 100644
--- a/packages/SettingsLib/src/com/android/settingslib/net/DataUsageController.java
+++ b/packages/SettingsLib/src/com/android/settingslib/net/DataUsageController.java
@@ -16,8 +16,6 @@
package com.android.settingslib.net;
-import static android.net.NetworkStatsHistory.FIELD_RX_BYTES;
-import static android.net.NetworkStatsHistory.FIELD_TX_BYTES;
import static android.net.TrafficStats.MB_IN_BYTES;
import static android.telephony.TelephonyManager.SIM_STATE_READY;
import static android.text.format.DateUtils.FORMAT_ABBREV_MONTH;
@@ -27,12 +25,9 @@
import android.app.usage.NetworkStatsManager;
import android.content.Context;
import android.net.ConnectivityManager;
-import android.net.INetworkStatsService;
-import android.net.INetworkStatsSession;
import android.net.NetworkPolicy;
import android.net.NetworkPolicyManager;
import android.net.NetworkTemplate;
-import android.os.ServiceManager;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.text.format.DateUtils;
@@ -51,25 +46,20 @@
private static final String TAG = "DataUsageController";
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
- private static final int FIELDS = FIELD_RX_BYTES | FIELD_TX_BYTES;
private static final StringBuilder PERIOD_BUILDER = new StringBuilder(50);
private static final java.util.Formatter PERIOD_FORMATTER = new java.util.Formatter(
PERIOD_BUILDER, Locale.getDefault());
private final Context mContext;
- private final INetworkStatsService mStatsService;
private final NetworkPolicyManager mPolicyManager;
private final NetworkStatsManager mNetworkStatsManager;
- private INetworkStatsSession mSession;
private Callback mCallback;
private NetworkNameProvider mNetworkController;
private int mSubscriptionId;
public DataUsageController(Context context) {
mContext = context;
- mStatsService = INetworkStatsService.Stub.asInterface(
- ServiceManager.getService(Context.NETWORK_STATS_SERVICE));
mPolicyManager = NetworkPolicyManager.from(mContext);
mNetworkStatsManager = context.getSystemService(NetworkStatsManager.class);
mSubscriptionId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
@@ -112,8 +102,7 @@
}
public DataUsageInfo getWifiDataUsageInfo() {
- NetworkTemplate template = NetworkTemplate.buildTemplateWifi(
- NetworkTemplate.WIFI_NETWORKID_ALL, null);
+ NetworkTemplate template = new NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI).build();
return getDataUsageInfo(template);
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/net/DataUsageUtils.java b/packages/SettingsLib/src/com/android/settingslib/net/DataUsageUtils.java
index 3f95a07..afd44d5 100644
--- a/packages/SettingsLib/src/com/android/settingslib/net/DataUsageUtils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/net/DataUsageUtils.java
@@ -17,6 +17,7 @@
package com.android.settingslib.net;
import android.content.Context;
+import android.net.NetworkStats;
import android.net.NetworkTemplate;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
@@ -26,6 +27,7 @@
import com.android.internal.util.ArrayUtils;
import java.util.List;
+import java.util.Set;
/**
* Utils class for data usage
@@ -73,10 +75,15 @@
private static NetworkTemplate getMobileTemplateForSubId(
TelephonyManager telephonyManager, int subId) {
- // The null subscriberId means that no any mobile/carrier network will be matched.
- // Using old API: buildTemplateMobileAll for the null subscriberId to avoid NPE.
+ // Create template that matches any mobile network when the subscriberId is null.
String subscriberId = telephonyManager.getSubscriberId(subId);
- return subscriberId != null ? NetworkTemplate.buildTemplateCarrierMetered(subscriberId)
- : NetworkTemplate.buildTemplateMobileAll(subscriberId);
+ return subscriberId != null
+ ? new NetworkTemplate.Builder(NetworkTemplate.MATCH_CARRIER)
+ .setSubscriberIds(Set.of(subscriberId))
+ .setMeteredness(NetworkStats.METERED_YES)
+ .build()
+ : new NetworkTemplate.Builder(NetworkTemplate.MATCH_MOBILE)
+ .setMeteredness(NetworkStats.METERED_YES)
+ .build();
}
}
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/utils/NetworkPolicyEditorTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/utils/NetworkPolicyEditorTest.java
index 7e389a1..919f602 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/utils/NetworkPolicyEditorTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/utils/NetworkPolicyEditorTest.java
@@ -20,6 +20,7 @@
import android.net.NetworkPolicy;
import android.net.NetworkPolicyManager;
+import android.net.NetworkStats;
import android.net.NetworkTemplate;
import androidx.test.InstrumentationRegistry;
@@ -32,6 +33,8 @@
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.util.Set;
+
@RunWith(AndroidJUnit4.class)
@SmallTest
public class NetworkPolicyEditorTest {
@@ -44,7 +47,9 @@
@Before
public void setUp() {
- mNetworkTemplate = NetworkTemplate.buildTemplateCarrierMetered("123456789123456");
+ mNetworkTemplate = new NetworkTemplate.Builder(NetworkTemplate.MATCH_CARRIER)
+ .setMeteredness(NetworkStats.METERED_YES)
+ .setSubscriberIds(Set.of("123456789123456")).build();
NetworkPolicyManager policyManager = NetworkPolicyManager.from(InstrumentationRegistry
.getContext());
mNetworkPolicyEditor = new NetworkPolicyEditor(policyManager);
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/DataUsageControllerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/DataUsageControllerTest.java
index 9be783d..f0456b3 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/DataUsageControllerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/DataUsageControllerTest.java
@@ -18,26 +18,21 @@
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.anyLong;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.eq;
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.app.usage.NetworkStats;
import android.app.usage.NetworkStatsManager;
import android.content.Context;
-import android.net.INetworkStatsSession;
-import android.net.NetworkStatsHistory;
import android.net.NetworkTemplate;
import android.os.RemoteException;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
-import android.text.format.DateUtils;
import org.junit.Before;
import org.junit.Test;
@@ -47,6 +42,8 @@
import org.robolectric.RobolectricTestRunner;
import org.robolectric.shadows.ShadowSubscriptionManager;
+import java.util.Set;
+
@RunWith(RobolectricTestRunner.class)
public class DataUsageControllerTest {
@@ -54,8 +51,6 @@
private static final String SUB_ID_2 = "Test Subscriber 2";
@Mock
- private INetworkStatsSession mSession;
- @Mock
private TelephonyManager mTelephonyManager;
@Mock
private SubscriptionManager mSubscriptionManager;
@@ -68,7 +63,6 @@
private NetworkTemplate mWifiNetworkTemplate;
private DataUsageController mController;
- private NetworkStatsHistory mNetworkStatsHistory;
private final int mDefaultSubscriptionId = 1234;
@Before
@@ -80,17 +74,16 @@
.thenReturn(mSubscriptionManager);
when(mContext.getSystemService(NetworkStatsManager.class)).thenReturn(mNetworkStatsManager);
mController = new DataUsageController(mContext);
- mNetworkStatsHistory = spy(
- new NetworkStatsHistory(DateUtils.DAY_IN_MILLIS /* bucketDuration */));
- doReturn(mNetworkStatsHistory)
- .when(mSession).getHistoryForNetwork(any(NetworkTemplate.class), anyInt());
ShadowSubscriptionManager.setDefaultDataSubscriptionId(mDefaultSubscriptionId);
doReturn(SUB_ID).when(mTelephonyManager).getSubscriberId();
- mNetworkTemplate = NetworkTemplate.buildTemplateCarrierMetered(SUB_ID);
- mNetworkTemplate2 = NetworkTemplate.buildTemplateCarrierMetered(SUB_ID_2);
- mWifiNetworkTemplate = NetworkTemplate.buildTemplateWifi(
- NetworkTemplate.WIFI_NETWORKID_ALL, null);
+ mNetworkTemplate = new NetworkTemplate.Builder(NetworkTemplate.MATCH_CARRIER)
+ .setMeteredness(android.net.NetworkStats.METERED_YES)
+ .setSubscriberIds(Set.of(SUB_ID)).build();
+ mNetworkTemplate2 = new NetworkTemplate.Builder(NetworkTemplate.MATCH_CARRIER)
+ .setMeteredness(android.net.NetworkStats.METERED_YES)
+ .setSubscriberIds(Set.of(SUB_ID_2)).build();
+ mWifiNetworkTemplate = new NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI).build();
}
@Test
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/NetworkCycleDataForUidLoaderTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/NetworkCycleDataForUidLoaderTest.java
index e8d5844..5b0f659 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/NetworkCycleDataForUidLoaderTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/NetworkCycleDataForUidLoaderTest.java
@@ -30,6 +30,7 @@
import android.content.Context;
import android.net.NetworkPolicy;
import android.net.NetworkPolicyManager;
+import android.net.NetworkStats;
import android.net.NetworkTemplate;
import android.text.format.DateUtils;
@@ -40,6 +41,8 @@
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
+import java.util.Set;
+
@RunWith(RobolectricTestRunner.class)
public class NetworkCycleDataForUidLoaderTest {
private static final String SUB_ID = "Test Subscriber";
@@ -62,7 +65,9 @@
when(mContext.getSystemService(Context.NETWORK_POLICY_SERVICE))
.thenReturn(mNetworkPolicyManager);
when(mNetworkPolicyManager.getNetworkPolicies()).thenReturn(new NetworkPolicy[0]);
- mNetworkTemplate = NetworkTemplate.buildTemplateCarrierMetered(SUB_ID);
+ mNetworkTemplate = new NetworkTemplate.Builder(NetworkTemplate.MATCH_CARRIER)
+ .setMeteredness(NetworkStats.METERED_YES)
+ .setSubscriberIds(Set.of(SUB_ID)).build();
}
@Test
diff --git a/packages/SettingsProvider/src/android/provider/settings/backup/SystemSettings.java b/packages/SettingsProvider/src/android/provider/settings/backup/SystemSettings.java
index 71accc4..00b5f50 100644
--- a/packages/SettingsProvider/src/android/provider/settings/backup/SystemSettings.java
+++ b/packages/SettingsProvider/src/android/provider/settings/backup/SystemSettings.java
@@ -78,6 +78,8 @@
Settings.System.NOTIFICATION_SOUND,
Settings.System.ACCELEROMETER_ROTATION,
Settings.System.SHOW_BATTERY_PERCENT,
+ Settings.System.ALARM_VIBRATION_INTENSITY,
+ Settings.System.MEDIA_VIBRATION_INTENSITY,
Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
Settings.System.RING_VIBRATION_INTENSITY,
Settings.System.HAPTIC_FEEDBACK_INTENSITY,
diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java b/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java
index 84e9d28..6bcb769 100644
--- a/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java
+++ b/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java
@@ -118,6 +118,8 @@
VALIDATORS.put(System.MUTE_STREAMS_AFFECTED, NON_NEGATIVE_INTEGER_VALIDATOR);
VALIDATORS.put(System.VIBRATE_ON, BOOLEAN_VALIDATOR);
VALIDATORS.put(System.APPLY_RAMPING_RINGER, BOOLEAN_VALIDATOR);
+ VALIDATORS.put(System.ALARM_VIBRATION_INTENSITY, VIBRATION_INTENSITY_VALIDATOR);
+ VALIDATORS.put(System.MEDIA_VIBRATION_INTENSITY, VIBRATION_INTENSITY_VALIDATOR);
VALIDATORS.put(System.NOTIFICATION_VIBRATION_INTENSITY, VIBRATION_INTENSITY_VALIDATOR);
VALIDATORS.put(System.RING_VIBRATION_INTENSITY, VIBRATION_INTENSITY_VALIDATOR);
VALIDATORS.put(System.HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_VALIDATOR);
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
index 00cdc9b..c5f027b 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
@@ -2916,6 +2916,18 @@
dumpSetting(s, p,
Settings.System.VIBRATE_WHEN_RINGING,
SystemSettingsProto.Vibrate.WHEN_RINGING);
+
+ // NOTIFICATION_VIBRATION_INTENSITY is already logged at Notification.vibration_intensity
+ // HAPTIC_FEEDBACK_INTENSITY is already logged at HapticFeedback.intensity
+ dumpSetting(s, p,
+ Settings.System.ALARM_VIBRATION_INTENSITY,
+ SystemSettingsProto.Vibrate.ALARM_INTENSITY);
+ dumpSetting(s, p,
+ Settings.System.MEDIA_VIBRATION_INTENSITY,
+ SystemSettingsProto.Vibrate.MEDIA_INTENSITY);
+ dumpSetting(s, p,
+ Settings.System.RING_VIBRATION_INTENSITY,
+ SystemSettingsProto.Vibrate.RING_INTENSITY);
p.end(vibrateToken);
final long volumeToken = p.start(SystemSettingsProto.VOLUME);
diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml
index 134fcb9..74b38b5 100644
--- a/packages/Shell/AndroidManifest.xml
+++ b/packages/Shell/AndroidManifest.xml
@@ -23,6 +23,7 @@
>
<!-- Standard permissions granted to the shell. -->
+ <uses-permission android:name="android.permission.LAUNCH_DEVICE_MANAGER_SETUP" />
<uses-permission android:name="android.permission.GET_RUNTIME_PERMISSIONS" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
diff --git a/packages/SystemUI/Android.bp b/packages/SystemUI/Android.bp
index c805e2d..137a1fd 100644
--- a/packages/SystemUI/Android.bp
+++ b/packages/SystemUI/Android.bp
@@ -129,8 +129,15 @@
}
filegroup {
+ name: "AAA-src",
+ srcs: ["tests/src/com/android/AAAPlusPlusVerifySysuiRequiredTestPropertiesTest.java"],
+ path: "tests/src",
+}
+
+filegroup {
name: "SystemUI-tests-utils",
srcs: [
+ "tests/src/com/android/systemui/SysuiBaseFragmentTest.java",
"tests/src/com/android/systemui/SysuiTestCase.java",
"tests/src/com/android/systemui/TestableDependency.java",
"tests/src/com/android/systemui/classifier/FalsingManagerFake.java",
diff --git a/packages/SystemUI/res-product/values-zu/strings.xml b/packages/SystemUI/res-product/values-zu/strings.xml
index e6c140a..8b79a22 100644
--- a/packages/SystemUI/res-product/values-zu/strings.xml
+++ b/packages/SystemUI/res-product/values-zu/strings.xml
@@ -40,7 +40,7 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Uzame ngokungalungile ukuvula ifoni izikhathi ezingu-<xliff:g id="NUMBER">%d</xliff:g>. Iphrofayela yomsebenzi izosuswa, okuzosusa yonke idatha yephrofayela."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Udwebe ngokungalungile iphethini yakho yokuvula ngezikhathi ezingu-<xliff:g id="NUMBER_0">%1$d</xliff:g>. Ngemuva kwemizamo engaphumelelanga kaningi engu-<xliff:g id="NUMBER_1">%2$d</xliff:g>, uzocelwa ukuthi uvule ithebulethi yakho usebenzisa i-akhawunti ye-imeyili.\n\nZama futhi kumasekhondi angu-<xliff:g id="NUMBER_2">%3$d</xliff:g>."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Ukulayisha ungenisa iphathini yakho yokuvula ngendlela engalungile izikhathi ezi-<xliff:g id="NUMBER_0">%1$d</xliff:g> Emva kweminye imizamo engu-<xliff:g id="NUMBER_1">%2$d</xliff:g>, uzocelwa ukuvula ifoni yakho usebenzisa ukungena ngemvume ku-Google\n\n Zame futhi emumva kwengu- <xliff:g id="NUMBER_2">%3$d</xliff:g> imizuzwana."</string>
- <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Vula ifoni yakho ukuthola izinketho ezengeziwe"</string>
- <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Vula ithebulethi yakho ukuthola izinketho ezengeziwe"</string>
- <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Vula idivayisi yakho ukuthola izinketho ezengeziwe"</string>
+ <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Vula ifoni yakho ukuthola okunye okungakhethwa"</string>
+ <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Vula ithebulethi yakho ukuthola okunye okungakhethwa"</string>
+ <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Vula idivayisi yakho ukuthola okunye okungakhethwa"</string>
</resources>
diff --git a/packages/SystemUI/res/values-af/tiles_states_strings.xml b/packages/SystemUI/res/values-af/tiles_states_strings.xml
index 2059490..4b1a5b8 100644
--- a/packages/SystemUI/res/values-af/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-af/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Af"</item>
<item msgid="2075645297847971154">"Aan"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Onbeskikbaar"</item>
<item msgid="9103697205127645916">"Af"</item>
diff --git a/packages/SystemUI/res/values-am/tiles_states_strings.xml b/packages/SystemUI/res/values-am/tiles_states_strings.xml
index 7fdfd11..0f7ee3e 100644
--- a/packages/SystemUI/res/values-am/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-am/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"ጠፍቷል"</item>
<item msgid="2075645297847971154">"በርቷል"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"አይገኝም"</item>
<item msgid="9103697205127645916">"ጠፍቷል"</item>
diff --git a/packages/SystemUI/res/values-ar/tiles_states_strings.xml b/packages/SystemUI/res/values-ar/tiles_states_strings.xml
index d7026c7..2da87c4 100644
--- a/packages/SystemUI/res/values-ar/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ar/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"الميزة غير مفعّلة"</item>
<item msgid="2075645297847971154">"الميزة مفعّلة"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"الميزة غير متاحة"</item>
<item msgid="9103697205127645916">"الميزة غير مفعّلة"</item>
diff --git a/packages/SystemUI/res/values-as/tiles_states_strings.xml b/packages/SystemUI/res/values-as/tiles_states_strings.xml
index efb2351..2ede374 100644
--- a/packages/SystemUI/res/values-as/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-as/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"অফ আছে"</item>
<item msgid="2075645297847971154">"অন কৰা আছে"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"উপলব্ধ নহয়"</item>
<item msgid="9103697205127645916">"অফ আছে"</item>
diff --git a/packages/SystemUI/res/values-az/tiles_states_strings.xml b/packages/SystemUI/res/values-az/tiles_states_strings.xml
index 7c47203..f52a9e1 100644
--- a/packages/SystemUI/res/values-az/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-az/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Deaktiv"</item>
<item msgid="2075645297847971154">"Aktiv"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Əlçatan deyil"</item>
<item msgid="9103697205127645916">"Deaktiv"</item>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/tiles_states_strings.xml b/packages/SystemUI/res/values-b+sr+Latn/tiles_states_strings.xml
index 88caf97..d9e0bfca36 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Isključeno"</item>
<item msgid="2075645297847971154">"Uključeno"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Nedostupno"</item>
<item msgid="9103697205127645916">"Isključeno"</item>
diff --git a/packages/SystemUI/res/values-be/tiles_states_strings.xml b/packages/SystemUI/res/values-be/tiles_states_strings.xml
index ecfde0b..5c7c40f 100644
--- a/packages/SystemUI/res/values-be/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-be/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Выключана"</item>
<item msgid="2075645297847971154">"Уключана"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Недаступна"</item>
<item msgid="9103697205127645916">"Выключана"</item>
diff --git a/packages/SystemUI/res/values-bg/tiles_states_strings.xml b/packages/SystemUI/res/values-bg/tiles_states_strings.xml
index 7424f81..6839b83 100644
--- a/packages/SystemUI/res/values-bg/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-bg/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Изкл."</item>
<item msgid="2075645297847971154">"Вкл."</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Не е налице"</item>
<item msgid="9103697205127645916">"Изкл."</item>
diff --git a/packages/SystemUI/res/values-bn/tiles_states_strings.xml b/packages/SystemUI/res/values-bn/tiles_states_strings.xml
index eddf851..7a6b3ac 100644
--- a/packages/SystemUI/res/values-bn/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-bn/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"বন্ধ আছে"</item>
<item msgid="2075645297847971154">"চালু আছে"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"উপলভ্য নেই"</item>
<item msgid="9103697205127645916">"বন্ধ আছে"</item>
diff --git a/packages/SystemUI/res/values-bs/tiles_states_strings.xml b/packages/SystemUI/res/values-bs/tiles_states_strings.xml
index 88caf97..d9e0bfca36 100644
--- a/packages/SystemUI/res/values-bs/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-bs/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Isključeno"</item>
<item msgid="2075645297847971154">"Uključeno"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Nedostupno"</item>
<item msgid="9103697205127645916">"Isključeno"</item>
diff --git a/packages/SystemUI/res/values-ca/tiles_states_strings.xml b/packages/SystemUI/res/values-ca/tiles_states_strings.xml
index e3538fa..28f3da4 100644
--- a/packages/SystemUI/res/values-ca/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ca/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Desactivat"</item>
<item msgid="2075645297847971154">"Activat"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"No disponible"</item>
<item msgid="9103697205127645916">"Desactivat"</item>
diff --git a/packages/SystemUI/res/values-cs/tiles_states_strings.xml b/packages/SystemUI/res/values-cs/tiles_states_strings.xml
index 3f40ab6..ce64e27 100644
--- a/packages/SystemUI/res/values-cs/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-cs/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Vyp"</item>
<item msgid="2075645297847971154">"Zap"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Nedostupné"</item>
<item msgid="9103697205127645916">"Vyp"</item>
diff --git a/packages/SystemUI/res/values-da/tiles_states_strings.xml b/packages/SystemUI/res/values-da/tiles_states_strings.xml
index b479a44..9e4c6f4 100644
--- a/packages/SystemUI/res/values-da/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-da/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Fra"</item>
<item msgid="2075645297847971154">"Til"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Ikke tilgængelig"</item>
<item msgid="9103697205127645916">"Fra"</item>
diff --git a/packages/SystemUI/res/values-de/tiles_states_strings.xml b/packages/SystemUI/res/values-de/tiles_states_strings.xml
index 81f030c..e958670 100644
--- a/packages/SystemUI/res/values-de/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-de/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Aus"</item>
<item msgid="2075645297847971154">"An"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Nicht verfügbar"</item>
<item msgid="9103697205127645916">"Aus"</item>
diff --git a/packages/SystemUI/res/values-el/tiles_states_strings.xml b/packages/SystemUI/res/values-el/tiles_states_strings.xml
index 422f2aa..1c95835 100644
--- a/packages/SystemUI/res/values-el/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-el/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Ανενεργό"</item>
<item msgid="2075645297847971154">"Ενεργό"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Μη διαθέσιμο"</item>
<item msgid="9103697205127645916">"Ανενεργό"</item>
diff --git a/packages/SystemUI/res/values-en-rAU/tiles_states_strings.xml b/packages/SystemUI/res/values-en-rAU/tiles_states_strings.xml
index 9b00c8b..13f236b 100644
--- a/packages/SystemUI/res/values-en-rAU/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/tiles_states_strings.xml
@@ -86,6 +86,11 @@
<item msgid="5715725170633593906">"Off"</item>
<item msgid="2075645297847971154">"On"</item>
</string-array>
+ <string-array name="tile_states_color_correction">
+ <item msgid="2840507878437297682">"Unavailable"</item>
+ <item msgid="1909756493418256167">"Off"</item>
+ <item msgid="4531508423703413340">"On"</item>
+ </string-array>
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Unavailable"</item>
<item msgid="9103697205127645916">"Off"</item>
diff --git a/packages/SystemUI/res/values-en-rCA/tiles_states_strings.xml b/packages/SystemUI/res/values-en-rCA/tiles_states_strings.xml
index 9b00c8b..13f236b 100644
--- a/packages/SystemUI/res/values-en-rCA/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/tiles_states_strings.xml
@@ -86,6 +86,11 @@
<item msgid="5715725170633593906">"Off"</item>
<item msgid="2075645297847971154">"On"</item>
</string-array>
+ <string-array name="tile_states_color_correction">
+ <item msgid="2840507878437297682">"Unavailable"</item>
+ <item msgid="1909756493418256167">"Off"</item>
+ <item msgid="4531508423703413340">"On"</item>
+ </string-array>
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Unavailable"</item>
<item msgid="9103697205127645916">"Off"</item>
diff --git a/packages/SystemUI/res/values-en-rGB/tiles_states_strings.xml b/packages/SystemUI/res/values-en-rGB/tiles_states_strings.xml
index 9b00c8b..13f236b 100644
--- a/packages/SystemUI/res/values-en-rGB/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/tiles_states_strings.xml
@@ -86,6 +86,11 @@
<item msgid="5715725170633593906">"Off"</item>
<item msgid="2075645297847971154">"On"</item>
</string-array>
+ <string-array name="tile_states_color_correction">
+ <item msgid="2840507878437297682">"Unavailable"</item>
+ <item msgid="1909756493418256167">"Off"</item>
+ <item msgid="4531508423703413340">"On"</item>
+ </string-array>
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Unavailable"</item>
<item msgid="9103697205127645916">"Off"</item>
diff --git a/packages/SystemUI/res/values-en-rIN/tiles_states_strings.xml b/packages/SystemUI/res/values-en-rIN/tiles_states_strings.xml
index 9b00c8b..13f236b 100644
--- a/packages/SystemUI/res/values-en-rIN/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/tiles_states_strings.xml
@@ -86,6 +86,11 @@
<item msgid="5715725170633593906">"Off"</item>
<item msgid="2075645297847971154">"On"</item>
</string-array>
+ <string-array name="tile_states_color_correction">
+ <item msgid="2840507878437297682">"Unavailable"</item>
+ <item msgid="1909756493418256167">"Off"</item>
+ <item msgid="4531508423703413340">"On"</item>
+ </string-array>
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Unavailable"</item>
<item msgid="9103697205127645916">"Off"</item>
diff --git a/packages/SystemUI/res/values-en-rXC/tiles_states_strings.xml b/packages/SystemUI/res/values-en-rXC/tiles_states_strings.xml
index 0012b57..e6baa31 100644
--- a/packages/SystemUI/res/values-en-rXC/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-en-rXC/tiles_states_strings.xml
@@ -86,6 +86,11 @@
<item msgid="5715725170633593906">"Off"</item>
<item msgid="2075645297847971154">"On"</item>
</string-array>
+ <string-array name="tile_states_color_correction">
+ <item msgid="2840507878437297682">"Unavailable"</item>
+ <item msgid="1909756493418256167">"Off"</item>
+ <item msgid="4531508423703413340">"On"</item>
+ </string-array>
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Unavailable"</item>
<item msgid="9103697205127645916">"Off"</item>
diff --git a/packages/SystemUI/res/values-es-rUS/tiles_states_strings.xml b/packages/SystemUI/res/values-es-rUS/tiles_states_strings.xml
index afb0e72..0d77977 100644
--- a/packages/SystemUI/res/values-es-rUS/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Desactivado"</item>
<item msgid="2075645297847971154">"Activado"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"No disponible"</item>
<item msgid="9103697205127645916">"Desactivado"</item>
diff --git a/packages/SystemUI/res/values-es/tiles_states_strings.xml b/packages/SystemUI/res/values-es/tiles_states_strings.xml
index dd1ed43..080731a 100644
--- a/packages/SystemUI/res/values-es/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-es/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Desactivado"</item>
<item msgid="2075645297847971154">"Activado"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"No disponible"</item>
<item msgid="9103697205127645916">"Desactivado"</item>
diff --git a/packages/SystemUI/res/values-et/tiles_states_strings.xml b/packages/SystemUI/res/values-et/tiles_states_strings.xml
index 26fbe80..26d71fe 100644
--- a/packages/SystemUI/res/values-et/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-et/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Väljas"</item>
<item msgid="2075645297847971154">"Sees"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Pole saadaval"</item>
<item msgid="9103697205127645916">"Väljas"</item>
diff --git a/packages/SystemUI/res/values-eu/tiles_states_strings.xml b/packages/SystemUI/res/values-eu/tiles_states_strings.xml
index a2a08db..1109045 100644
--- a/packages/SystemUI/res/values-eu/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-eu/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Desaktibatuta"</item>
<item msgid="2075645297847971154">"Aktibatuta"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Ez dago erabilgarri"</item>
<item msgid="9103697205127645916">"Desaktibatuta"</item>
diff --git a/packages/SystemUI/res/values-fa/tiles_states_strings.xml b/packages/SystemUI/res/values-fa/tiles_states_strings.xml
index 8c40e71..ab75519 100644
--- a/packages/SystemUI/res/values-fa/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-fa/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"خاموش"</item>
<item msgid="2075645297847971154">"روشن"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"دردسترس نیست"</item>
<item msgid="9103697205127645916">"خاموش"</item>
diff --git a/packages/SystemUI/res/values-fi/tiles_states_strings.xml b/packages/SystemUI/res/values-fi/tiles_states_strings.xml
index cb9e07c..6fa9466 100644
--- a/packages/SystemUI/res/values-fi/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-fi/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Poissa päältä"</item>
<item msgid="2075645297847971154">"Päällä"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Ei saatavilla"</item>
<item msgid="9103697205127645916">"Poissa päältä"</item>
diff --git a/packages/SystemUI/res/values-fr-rCA/tiles_states_strings.xml b/packages/SystemUI/res/values-fr-rCA/tiles_states_strings.xml
index eb38d94..aec8ab8 100644
--- a/packages/SystemUI/res/values-fr-rCA/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Désactivé"</item>
<item msgid="2075645297847971154">"Activé"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Non disponible"</item>
<item msgid="9103697205127645916">"Désactivée"</item>
diff --git a/packages/SystemUI/res/values-fr/tiles_states_strings.xml b/packages/SystemUI/res/values-fr/tiles_states_strings.xml
index 3aefb1d..01d9c1d 100644
--- a/packages/SystemUI/res/values-fr/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-fr/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Désactivé"</item>
<item msgid="2075645297847971154">"Activé"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Indisponible"</item>
<item msgid="9103697205127645916">"Désactivée"</item>
diff --git a/packages/SystemUI/res/values-gl/tiles_states_strings.xml b/packages/SystemUI/res/values-gl/tiles_states_strings.xml
index 90dcf7d..9045983 100644
--- a/packages/SystemUI/res/values-gl/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-gl/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Non"</item>
<item msgid="2075645297847971154">"Si"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Non dispoñible"</item>
<item msgid="9103697205127645916">"Non"</item>
diff --git a/packages/SystemUI/res/values-gu/tiles_states_strings.xml b/packages/SystemUI/res/values-gu/tiles_states_strings.xml
index e50f3cf..15b0f9f 100644
--- a/packages/SystemUI/res/values-gu/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-gu/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"બંધ છે"</item>
<item msgid="2075645297847971154">"ચાલુ છે"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"ઉપલબ્ધ નથી"</item>
<item msgid="9103697205127645916">"બંધ છે"</item>
diff --git a/packages/SystemUI/res/values-hi/tiles_states_strings.xml b/packages/SystemUI/res/values-hi/tiles_states_strings.xml
index 7698912..00fa699 100644
--- a/packages/SystemUI/res/values-hi/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-hi/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"बंद है"</item>
<item msgid="2075645297847971154">"चालू है"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"उपलब्ध नहीं है"</item>
<item msgid="9103697205127645916">"बंद है"</item>
diff --git a/packages/SystemUI/res/values-hr/tiles_states_strings.xml b/packages/SystemUI/res/values-hr/tiles_states_strings.xml
index ae9ffb3..7300816 100644
--- a/packages/SystemUI/res/values-hr/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-hr/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Isključeno"</item>
<item msgid="2075645297847971154">"Uključeno"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Nedostupno"</item>
<item msgid="9103697205127645916">"Isključeno"</item>
diff --git a/packages/SystemUI/res/values-hu/tiles_states_strings.xml b/packages/SystemUI/res/values-hu/tiles_states_strings.xml
index 140f2db..52450e4 100644
--- a/packages/SystemUI/res/values-hu/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-hu/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Ki"</item>
<item msgid="2075645297847971154">"Be"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Nem áll rendelkezésre"</item>
<item msgid="9103697205127645916">"Ki"</item>
diff --git a/packages/SystemUI/res/values-hy/tiles_states_strings.xml b/packages/SystemUI/res/values-hy/tiles_states_strings.xml
index df69ce7..23a096b 100644
--- a/packages/SystemUI/res/values-hy/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-hy/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Անջատված է"</item>
<item msgid="2075645297847971154">"Միացված է"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Հասանելի չէ"</item>
<item msgid="9103697205127645916">"Անջատված է"</item>
diff --git a/packages/SystemUI/res/values-in/tiles_states_strings.xml b/packages/SystemUI/res/values-in/tiles_states_strings.xml
index 811294f..c296e54 100644
--- a/packages/SystemUI/res/values-in/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-in/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Nonaktif"</item>
<item msgid="2075645297847971154">"Aktif"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Tidak tersedia"</item>
<item msgid="9103697205127645916">"Nonaktif"</item>
diff --git a/packages/SystemUI/res/values-is/tiles_states_strings.xml b/packages/SystemUI/res/values-is/tiles_states_strings.xml
index dd704a7..25b3dcc 100644
--- a/packages/SystemUI/res/values-is/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-is/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Slökkt"</item>
<item msgid="2075645297847971154">"Kveikt"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Ekki í boði"</item>
<item msgid="9103697205127645916">"Slökkt"</item>
diff --git a/packages/SystemUI/res/values-it/tiles_states_strings.xml b/packages/SystemUI/res/values-it/tiles_states_strings.xml
index 1596998..7e6827a 100644
--- a/packages/SystemUI/res/values-it/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-it/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Off"</item>
<item msgid="2075645297847971154">"On"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Non disponibile"</item>
<item msgid="9103697205127645916">"Off"</item>
diff --git a/packages/SystemUI/res/values-iw/tiles_states_strings.xml b/packages/SystemUI/res/values-iw/tiles_states_strings.xml
index 28548bc..bf3c2b6 100644
--- a/packages/SystemUI/res/values-iw/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-iw/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"כבוי"</item>
<item msgid="2075645297847971154">"פועל"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"לא זמין"</item>
<item msgid="9103697205127645916">"כבוי"</item>
diff --git a/packages/SystemUI/res/values-ja/tiles_states_strings.xml b/packages/SystemUI/res/values-ja/tiles_states_strings.xml
index 7fc9c08c..9197aab 100644
--- a/packages/SystemUI/res/values-ja/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ja/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"OFF"</item>
<item msgid="2075645297847971154">"ON"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"使用不可"</item>
<item msgid="9103697205127645916">"OFF"</item>
diff --git a/packages/SystemUI/res/values-ka/tiles_states_strings.xml b/packages/SystemUI/res/values-ka/tiles_states_strings.xml
index 40dfd39..485c3de 100644
--- a/packages/SystemUI/res/values-ka/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ka/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"გამორთულია"</item>
<item msgid="2075645297847971154">"ჩართულია"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"მიუწვდომელია"</item>
<item msgid="9103697205127645916">"გამორთულია"</item>
diff --git a/packages/SystemUI/res/values-kk/tiles_states_strings.xml b/packages/SystemUI/res/values-kk/tiles_states_strings.xml
index 3e9aefa..b143632 100644
--- a/packages/SystemUI/res/values-kk/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-kk/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Өшірулі"</item>
<item msgid="2075645297847971154">"Қосулы"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Қолжетімсіз"</item>
<item msgid="9103697205127645916">"Өшірулі"</item>
diff --git a/packages/SystemUI/res/values-km/tiles_states_strings.xml b/packages/SystemUI/res/values-km/tiles_states_strings.xml
index 32a6e22..38d3894 100644
--- a/packages/SystemUI/res/values-km/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-km/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"បិទ"</item>
<item msgid="2075645297847971154">"បើក"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"មិនមានទេ"</item>
<item msgid="9103697205127645916">"បិទ"</item>
diff --git a/packages/SystemUI/res/values-kn/tiles_states_strings.xml b/packages/SystemUI/res/values-kn/tiles_states_strings.xml
index c13e198..022c5cf 100644
--- a/packages/SystemUI/res/values-kn/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-kn/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"ಆಫ್ ಮಾಡಿ"</item>
<item msgid="2075645297847971154">"ಆನ್ ಮಾಡಿ"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"ಲಭ್ಯವಿಲ್ಲ"</item>
<item msgid="9103697205127645916">"ಆಫ್ ಮಾಡಿ"</item>
diff --git a/packages/SystemUI/res/values-ko/tiles_states_strings.xml b/packages/SystemUI/res/values-ko/tiles_states_strings.xml
index 28d45cf..ae6f148 100644
--- a/packages/SystemUI/res/values-ko/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ko/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"꺼짐"</item>
<item msgid="2075645297847971154">"켜짐"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"이용 불가"</item>
<item msgid="9103697205127645916">"꺼짐"</item>
diff --git a/packages/SystemUI/res/values-ky/tiles_states_strings.xml b/packages/SystemUI/res/values-ky/tiles_states_strings.xml
index 139d784..0eadc34 100644
--- a/packages/SystemUI/res/values-ky/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ky/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Өчүк"</item>
<item msgid="2075645297847971154">"Күйүк"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Жеткиликсиз"</item>
<item msgid="9103697205127645916">"Өчүк"</item>
diff --git a/packages/SystemUI/res/values-lo/tiles_states_strings.xml b/packages/SystemUI/res/values-lo/tiles_states_strings.xml
index 74c0f24..5fe5cff 100644
--- a/packages/SystemUI/res/values-lo/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-lo/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"ປິດ"</item>
<item msgid="2075645297847971154">"ເປີດ"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"ບໍ່ສາມາດໃຊ້ໄດ້"</item>
<item msgid="9103697205127645916">"ປິດ"</item>
diff --git a/packages/SystemUI/res/values-lt/tiles_states_strings.xml b/packages/SystemUI/res/values-lt/tiles_states_strings.xml
index 08e0e6d..7a0caa9 100644
--- a/packages/SystemUI/res/values-lt/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-lt/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Išjungta"</item>
<item msgid="2075645297847971154">"Įjungta"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Nepasiekiama"</item>
<item msgid="9103697205127645916">"Išjungta"</item>
diff --git a/packages/SystemUI/res/values-lv/tiles_states_strings.xml b/packages/SystemUI/res/values-lv/tiles_states_strings.xml
index c5718f8..872dba6 100644
--- a/packages/SystemUI/res/values-lv/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-lv/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Izslēgts"</item>
<item msgid="2075645297847971154">"Ieslēgts"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Nav pieejama"</item>
<item msgid="9103697205127645916">"Izslēgta"</item>
diff --git a/packages/SystemUI/res/values-mk/tiles_states_strings.xml b/packages/SystemUI/res/values-mk/tiles_states_strings.xml
index fa484ae..65e94f3 100644
--- a/packages/SystemUI/res/values-mk/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-mk/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Исклучено"</item>
<item msgid="2075645297847971154">"Вклучено"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Недостапно"</item>
<item msgid="9103697205127645916">"Исклучено"</item>
diff --git a/packages/SystemUI/res/values-ml/tiles_states_strings.xml b/packages/SystemUI/res/values-ml/tiles_states_strings.xml
index 0cca763..8746c74 100644
--- a/packages/SystemUI/res/values-ml/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ml/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"ഓഫാണ്"</item>
<item msgid="2075645297847971154">"ഓണാണ്"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"ലഭ്യമല്ല"</item>
<item msgid="9103697205127645916">"ഓഫാണ്"</item>
diff --git a/packages/SystemUI/res/values-mn/tiles_states_strings.xml b/packages/SystemUI/res/values-mn/tiles_states_strings.xml
index 41049d8..07dde9f 100644
--- a/packages/SystemUI/res/values-mn/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-mn/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Унтраалттай"</item>
<item msgid="2075645297847971154">"Асаалттай"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Боломжгүй"</item>
<item msgid="9103697205127645916">"Унтраалттай"</item>
diff --git a/packages/SystemUI/res/values-mr/tiles_states_strings.xml b/packages/SystemUI/res/values-mr/tiles_states_strings.xml
index 588c5ad..f0ca333 100644
--- a/packages/SystemUI/res/values-mr/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-mr/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"बंद आहे"</item>
<item msgid="2075645297847971154">"सुरू आहे"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"उपलब्ध नाही"</item>
<item msgid="9103697205127645916">"बंद आहे"</item>
diff --git a/packages/SystemUI/res/values-ms/tiles_states_strings.xml b/packages/SystemUI/res/values-ms/tiles_states_strings.xml
index 60ce1f0..b682df1 100644
--- a/packages/SystemUI/res/values-ms/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ms/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Mati"</item>
<item msgid="2075645297847971154">"Hidup"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Tidak tersedia"</item>
<item msgid="9103697205127645916">"Mati"</item>
diff --git a/packages/SystemUI/res/values-my/tiles_states_strings.xml b/packages/SystemUI/res/values-my/tiles_states_strings.xml
index 7d2f20b..af8d55c 100644
--- a/packages/SystemUI/res/values-my/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-my/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"ပိတ်"</item>
<item msgid="2075645297847971154">"ဖွင့်"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"မရနိုင်ပါ"</item>
<item msgid="9103697205127645916">"ပိတ်"</item>
diff --git a/packages/SystemUI/res/values-nb/tiles_states_strings.xml b/packages/SystemUI/res/values-nb/tiles_states_strings.xml
index e512a84..619f613 100644
--- a/packages/SystemUI/res/values-nb/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-nb/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Av"</item>
<item msgid="2075645297847971154">"På"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Utilgjengelig"</item>
<item msgid="9103697205127645916">"Av"</item>
diff --git a/packages/SystemUI/res/values-ne/tiles_states_strings.xml b/packages/SystemUI/res/values-ne/tiles_states_strings.xml
index 355df40..808b58d 100644
--- a/packages/SystemUI/res/values-ne/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ne/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"अफ छ"</item>
<item msgid="2075645297847971154">"अन छ"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"उपलब्ध छैन"</item>
<item msgid="9103697205127645916">"अफ छ"</item>
diff --git a/packages/SystemUI/res/values-nl/tiles_states_strings.xml b/packages/SystemUI/res/values-nl/tiles_states_strings.xml
index fa85b88..92332ca 100644
--- a/packages/SystemUI/res/values-nl/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-nl/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Uit"</item>
<item msgid="2075645297847971154">"Aan"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Niet beschikbaar"</item>
<item msgid="9103697205127645916">"Uit"</item>
diff --git a/packages/SystemUI/res/values-or/tiles_states_strings.xml b/packages/SystemUI/res/values-or/tiles_states_strings.xml
index bb94e0d..94b0122 100644
--- a/packages/SystemUI/res/values-or/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-or/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"ବନ୍ଦ ଅଛି"</item>
<item msgid="2075645297847971154">"ଚାଲୁ ଅଛି"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"ଉପଲବ୍ଧ ନାହିଁ"</item>
<item msgid="9103697205127645916">"ବନ୍ଦ ଅଛି"</item>
diff --git a/packages/SystemUI/res/values-pa/tiles_states_strings.xml b/packages/SystemUI/res/values-pa/tiles_states_strings.xml
index 2403141c..a7fc066 100644
--- a/packages/SystemUI/res/values-pa/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-pa/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"ਬੰਦ ਹੈ"</item>
<item msgid="2075645297847971154">"ਚਾਲੂ ਹੈ"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"ਅਣਉਪਲਬਧ ਹੈ"</item>
<item msgid="9103697205127645916">"ਬੰਦ ਹੈ"</item>
diff --git a/packages/SystemUI/res/values-pl/tiles_states_strings.xml b/packages/SystemUI/res/values-pl/tiles_states_strings.xml
index 30026e8..94fa858 100644
--- a/packages/SystemUI/res/values-pl/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-pl/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Wyłączony"</item>
<item msgid="2075645297847971154">"Włączony"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Niedostępny"</item>
<item msgid="9103697205127645916">"Wyłączony"</item>
diff --git a/packages/SystemUI/res/values-pt-rBR/tiles_states_strings.xml b/packages/SystemUI/res/values-pt-rBR/tiles_states_strings.xml
index f874dd4..932ddc0 100644
--- a/packages/SystemUI/res/values-pt-rBR/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/tiles_states_strings.xml
@@ -86,6 +86,11 @@
<item msgid="5715725170633593906">"Desativado"</item>
<item msgid="2075645297847971154">"Ativado"</item>
</string-array>
+ <string-array name="tile_states_color_correction">
+ <item msgid="2840507878437297682">"Indisponível"</item>
+ <item msgid="1909756493418256167">"Desativada"</item>
+ <item msgid="4531508423703413340">"Ativada"</item>
+ </string-array>
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Indisponível"</item>
<item msgid="9103697205127645916">"Desativada"</item>
diff --git a/packages/SystemUI/res/values-pt-rPT/tiles_states_strings.xml b/packages/SystemUI/res/values-pt-rPT/tiles_states_strings.xml
index 1e426e1..e6ebea8 100644
--- a/packages/SystemUI/res/values-pt-rPT/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/tiles_states_strings.xml
@@ -86,6 +86,11 @@
<item msgid="5715725170633593906">"Desligado"</item>
<item msgid="2075645297847971154">"Ligado"</item>
</string-array>
+ <string-array name="tile_states_color_correction">
+ <item msgid="2840507878437297682">"Indisponível"</item>
+ <item msgid="1909756493418256167">"Desativada"</item>
+ <item msgid="4531508423703413340">"Ativada"</item>
+ </string-array>
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Indisponível"</item>
<item msgid="9103697205127645916">"Desligado"</item>
diff --git a/packages/SystemUI/res/values-pt/tiles_states_strings.xml b/packages/SystemUI/res/values-pt/tiles_states_strings.xml
index f874dd4..932ddc0 100644
--- a/packages/SystemUI/res/values-pt/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-pt/tiles_states_strings.xml
@@ -86,6 +86,11 @@
<item msgid="5715725170633593906">"Desativado"</item>
<item msgid="2075645297847971154">"Ativado"</item>
</string-array>
+ <string-array name="tile_states_color_correction">
+ <item msgid="2840507878437297682">"Indisponível"</item>
+ <item msgid="1909756493418256167">"Desativada"</item>
+ <item msgid="4531508423703413340">"Ativada"</item>
+ </string-array>
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Indisponível"</item>
<item msgid="9103697205127645916">"Desativada"</item>
diff --git a/packages/SystemUI/res/values-ro/tiles_states_strings.xml b/packages/SystemUI/res/values-ro/tiles_states_strings.xml
index c63e7fe..708c6f0 100644
--- a/packages/SystemUI/res/values-ro/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ro/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Dezactivat"</item>
<item msgid="2075645297847971154">"Activat"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Indisponibilă"</item>
<item msgid="9103697205127645916">"Dezactivată"</item>
diff --git a/packages/SystemUI/res/values-ru/tiles_states_strings.xml b/packages/SystemUI/res/values-ru/tiles_states_strings.xml
index ae31f32..3a51c2e 100644
--- a/packages/SystemUI/res/values-ru/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ru/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Откл."</item>
<item msgid="2075645297847971154">"Вкл."</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Функция недоступна"</item>
<item msgid="9103697205127645916">"Откл."</item>
diff --git a/packages/SystemUI/res/values-si/tiles_states_strings.xml b/packages/SystemUI/res/values-si/tiles_states_strings.xml
index fa78ccc..909d119 100644
--- a/packages/SystemUI/res/values-si/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-si/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"අක්රියයි"</item>
<item msgid="2075645297847971154">"සක්රියයි"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"නොමැත"</item>
<item msgid="9103697205127645916">"අක්රියයි"</item>
diff --git a/packages/SystemUI/res/values-sk/tiles_states_strings.xml b/packages/SystemUI/res/values-sk/tiles_states_strings.xml
index 1920f04..a8c3545 100644
--- a/packages/SystemUI/res/values-sk/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-sk/tiles_states_strings.xml
@@ -86,6 +86,11 @@
<item msgid="5715725170633593906">"Vypnuté"</item>
<item msgid="2075645297847971154">"Zapnuté"</item>
</string-array>
+ <string-array name="tile_states_color_correction">
+ <item msgid="2840507878437297682">"Nedostupné"</item>
+ <item msgid="1909756493418256167">"Vypnuté"</item>
+ <item msgid="4531508423703413340">"Zapnuté"</item>
+ </string-array>
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Nie je k dispozícii"</item>
<item msgid="9103697205127645916">"Vypnuté"</item>
diff --git a/packages/SystemUI/res/values-sl/tiles_states_strings.xml b/packages/SystemUI/res/values-sl/tiles_states_strings.xml
index 924ec58..c09d911 100644
--- a/packages/SystemUI/res/values-sl/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-sl/tiles_states_strings.xml
@@ -86,6 +86,11 @@
<item msgid="5715725170633593906">"Izklopljeno"</item>
<item msgid="2075645297847971154">"Vklopljeno"</item>
</string-array>
+ <string-array name="tile_states_color_correction">
+ <item msgid="2840507878437297682">"Ni na voljo"</item>
+ <item msgid="1909756493418256167">"Izklopljeno"</item>
+ <item msgid="4531508423703413340">"Vklopljeno"</item>
+ </string-array>
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Ni na voljo"</item>
<item msgid="9103697205127645916">"Izklopljeno"</item>
diff --git a/packages/SystemUI/res/values-sq/tiles_states_strings.xml b/packages/SystemUI/res/values-sq/tiles_states_strings.xml
index 34879ce..461cd93 100644
--- a/packages/SystemUI/res/values-sq/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-sq/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Joaktive"</item>
<item msgid="2075645297847971154">"Aktive"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Nuk ofrohet"</item>
<item msgid="9103697205127645916">"Joaktiv"</item>
diff --git a/packages/SystemUI/res/values-sr/tiles_states_strings.xml b/packages/SystemUI/res/values-sr/tiles_states_strings.xml
index 855b84b..ab10ca1 100644
--- a/packages/SystemUI/res/values-sr/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-sr/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Искључено"</item>
<item msgid="2075645297847971154">"Укључено"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Недоступно"</item>
<item msgid="9103697205127645916">"Искључено"</item>
diff --git a/packages/SystemUI/res/values-sv/tiles_states_strings.xml b/packages/SystemUI/res/values-sv/tiles_states_strings.xml
index b071b91..cdcf6e6 100644
--- a/packages/SystemUI/res/values-sv/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-sv/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Av"</item>
<item msgid="2075645297847971154">"På"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Inte tillgängligt"</item>
<item msgid="9103697205127645916">"Av"</item>
diff --git a/packages/SystemUI/res/values-sw/tiles_states_strings.xml b/packages/SystemUI/res/values-sw/tiles_states_strings.xml
index a92c7f9..563c078 100644
--- a/packages/SystemUI/res/values-sw/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-sw/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Kimezimwa"</item>
<item msgid="2075645297847971154">"Kimewashwa"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Hakipatikani"</item>
<item msgid="9103697205127645916">"Kimezimwa"</item>
diff --git a/packages/SystemUI/res/values-ta/tiles_states_strings.xml b/packages/SystemUI/res/values-ta/tiles_states_strings.xml
index f3ba1a1..a9e0eab 100644
--- a/packages/SystemUI/res/values-ta/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ta/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"முடக்கப்பட்டுள்ளது"</item>
<item msgid="2075645297847971154">"இயக்கப்பட்டுள்ளது"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"கிடைக்கவில்லை"</item>
<item msgid="9103697205127645916">"முடக்கப்பட்டுள்ளது"</item>
diff --git a/packages/SystemUI/res/values-te/tiles_states_strings.xml b/packages/SystemUI/res/values-te/tiles_states_strings.xml
index bed919f..4cb7291 100644
--- a/packages/SystemUI/res/values-te/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-te/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"ఆఫ్లో ఉంది"</item>
<item msgid="2075645297847971154">"ఆన్లో ఉంది"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"అందుబాటులో లేదు"</item>
<item msgid="9103697205127645916">"ఆఫ్లో ఉంది"</item>
diff --git a/packages/SystemUI/res/values-th/tiles_states_strings.xml b/packages/SystemUI/res/values-th/tiles_states_strings.xml
index d5591b2..6776873 100644
--- a/packages/SystemUI/res/values-th/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-th/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"ปิด"</item>
<item msgid="2075645297847971154">"เปิด"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"ไม่พร้อมใช้งาน"</item>
<item msgid="9103697205127645916">"ปิด"</item>
diff --git a/packages/SystemUI/res/values-tl/tiles_states_strings.xml b/packages/SystemUI/res/values-tl/tiles_states_strings.xml
index c601d2f..62172a4 100644
--- a/packages/SystemUI/res/values-tl/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-tl/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Naka-off"</item>
<item msgid="2075645297847971154">"Naka-on"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Hindi available"</item>
<item msgid="9103697205127645916">"Naka-off"</item>
diff --git a/packages/SystemUI/res/values-tr/tiles_states_strings.xml b/packages/SystemUI/res/values-tr/tiles_states_strings.xml
index 17ce6b3..9f836fc 100644
--- a/packages/SystemUI/res/values-tr/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-tr/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Kapalı"</item>
<item msgid="2075645297847971154">"Açık"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Kullanılamıyor"</item>
<item msgid="9103697205127645916">"Kapalı"</item>
diff --git a/packages/SystemUI/res/values-uk/tiles_states_strings.xml b/packages/SystemUI/res/values-uk/tiles_states_strings.xml
index 6f9ef21..34c40d3 100644
--- a/packages/SystemUI/res/values-uk/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-uk/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Вимкнено"</item>
<item msgid="2075645297847971154">"Увімкнено"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Недоступно"</item>
<item msgid="9103697205127645916">"Вимкнено"</item>
diff --git a/packages/SystemUI/res/values-ur/tiles_states_strings.xml b/packages/SystemUI/res/values-ur/tiles_states_strings.xml
index 3284fc5..02943fa 100644
--- a/packages/SystemUI/res/values-ur/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ur/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"آف ہے"</item>
<item msgid="2075645297847971154">"آن ہے"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"دستیاب نہیں ہے"</item>
<item msgid="9103697205127645916">"آف ہے"</item>
diff --git a/packages/SystemUI/res/values-uz/tiles_states_strings.xml b/packages/SystemUI/res/values-uz/tiles_states_strings.xml
index 47bcf4d..52a8b0a 100644
--- a/packages/SystemUI/res/values-uz/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-uz/tiles_states_strings.xml
@@ -86,6 +86,11 @@
<item msgid="5715725170633593906">"Oʻchiq"</item>
<item msgid="2075645297847971154">"Yoniq"</item>
</string-array>
+ <string-array name="tile_states_color_correction">
+ <item msgid="2840507878437297682">"Ishlamaydi"</item>
+ <item msgid="1909756493418256167">"Yoqilmagan"</item>
+ <item msgid="4531508423703413340">"Yoniq"</item>
+ </string-array>
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Ishlamaydi"</item>
<item msgid="9103697205127645916">"Oʻchiq"</item>
diff --git a/packages/SystemUI/res/values-vi/tiles_states_strings.xml b/packages/SystemUI/res/values-vi/tiles_states_strings.xml
index ecc3223..bff64ab 100644
--- a/packages/SystemUI/res/values-vi/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-vi/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Đang tắt"</item>
<item msgid="2075645297847971154">"Đang bật"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Không hoạt động"</item>
<item msgid="9103697205127645916">"Đang tắt"</item>
diff --git a/packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml b/packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml
index 43de98e..0d72f61 100644
--- a/packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"已关闭"</item>
<item msgid="2075645297847971154">"已开启"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"不可用"</item>
<item msgid="9103697205127645916">"已关闭"</item>
diff --git a/packages/SystemUI/res/values-zh-rHK/tiles_states_strings.xml b/packages/SystemUI/res/values-zh-rHK/tiles_states_strings.xml
index 637fb4c..571cfba 100644
--- a/packages/SystemUI/res/values-zh-rHK/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"已關閉"</item>
<item msgid="2075645297847971154">"已開啟"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"無法使用"</item>
<item msgid="9103697205127645916">"已關閉"</item>
diff --git a/packages/SystemUI/res/values-zh-rTW/tiles_states_strings.xml b/packages/SystemUI/res/values-zh-rTW/tiles_states_strings.xml
index 266cf5d..4889657 100644
--- a/packages/SystemUI/res/values-zh-rTW/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"已關閉"</item>
<item msgid="2075645297847971154">"已開啟"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"無法使用"</item>
<item msgid="9103697205127645916">"已關閉"</item>
diff --git a/packages/SystemUI/res/values-zu/tiles_states_strings.xml b/packages/SystemUI/res/values-zu/tiles_states_strings.xml
index 9cac4ae..ea40faf 100644
--- a/packages/SystemUI/res/values-zu/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-zu/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Valiwe"</item>
<item msgid="2075645297847971154">"Vuliwe"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Akutholakali"</item>
<item msgid="9103697205127645916">"Valiwe"</item>
diff --git a/packages/SystemUI/shared/src/com/android/systemui/unfold/util/ScopedUnfoldTransitionProgressProvider.kt b/packages/SystemUI/shared/src/com/android/systemui/unfold/util/ScopedUnfoldTransitionProgressProvider.kt
index 22698a8..a274b74 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/unfold/util/ScopedUnfoldTransitionProgressProvider.kt
+++ b/packages/SystemUI/shared/src/com/android/systemui/unfold/util/ScopedUnfoldTransitionProgressProvider.kt
@@ -89,6 +89,7 @@
override fun destroy() {
source?.removeCallback(this)
+ source?.destroy()
}
override fun onTransitionStarted() {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index 4658a74..094b192 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -100,6 +100,7 @@
import com.android.keyguard.ViewMediatorCallback;
import com.android.keyguard.mediator.ScreenOnCoordinator;
import com.android.systemui.CoreStartable;
+import com.android.systemui.DejankUtils;
import com.android.systemui.Dumpable;
import com.android.systemui.animation.Interpolators;
import com.android.systemui.broadcast.BroadcastDispatcher;
@@ -2345,16 +2346,20 @@
// Block the panel from expanding, in case we were doing a swipe to dismiss gesture.
mKeyguardViewControllerLazy.get().blockPanelExpansionFromCurrentTouch();
final boolean wasShowing = mShowing;
- onKeyguardExitFinished();
-
- if (mKeyguardStateController.isDismissingFromSwipe() || wasShowing) {
- mKeyguardUnlockAnimationControllerLazy.get().hideKeyguardViewAfterRemoteAnimation();
- }
-
- finishSurfaceBehindRemoteAnimation(cancelled);
- mSurfaceBehindRemoteAnimationRequested = false;
- mKeyguardUnlockAnimationControllerLazy.get().notifyFinishedKeyguardExitAnimation();
InteractionJankMonitor.getInstance().end(CUJ_LOCKSCREEN_UNLOCK_ANIMATION);
+
+ // Post layout changes to the next frame, so we don't hang at the end of the animation.
+ DejankUtils.postAfterTraversal(() -> {
+ onKeyguardExitFinished();
+
+ if (mKeyguardStateController.isDismissingFromSwipe() || wasShowing) {
+ mKeyguardUnlockAnimationControllerLazy.get().hideKeyguardViewAfterRemoteAnimation();
+ }
+
+ finishSurfaceBehindRemoteAnimation(cancelled);
+ mSurfaceBehindRemoteAnimationRequested = false;
+ mKeyguardUnlockAnimationControllerLazy.get().notifyFinishedKeyguardExitAnimation();
+ });
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/AlertingNotificationManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/AlertingNotificationManager.java
index 7cf0583..2a21f42 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/AlertingNotificationManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/AlertingNotificationManager.java
@@ -238,7 +238,7 @@
* @param key the key to check if removable
* @return true if the alert entry can be removed
*/
- protected boolean canRemoveImmediately(String key) {
+ public boolean canRemoveImmediately(String key) {
AlertEntry alertEntry = mAlertEntries.get(key);
return alertEntry == null || alertEntry.wasShownLongEnough()
|| alertEntry.mEntry.isRowDismissed();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinator.java
index ed9663e..f9f0b9d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinator.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinator.java
@@ -179,23 +179,26 @@
@Override
public boolean shouldExtendLifetime(@NonNull NotificationEntry entry, int reason) {
- boolean isShowingHun = isCurrentlyShowingHun(entry);
- if (isShowingHun) {
+ boolean extend = !mHeadsUpManager.canRemoveImmediately(entry.getKey());
+ if (extend) {
if (isSticky(entry)) {
long removeAfterMillis = mHeadsUpManager.getEarliestRemovalTime(entry.getKey());
- if (removeAfterMillis <= 0) return false;
mExecutor.executeDelayed(() -> {
- // make sure that the entry was not updated
- long removeAfterMillis2 =
- mHeadsUpManager.getEarliestRemovalTime(entry.getKey());
- if (mNotifsExtendingLifetime.contains(entry) && removeAfterMillis2 <= 0) {
- mHeadsUpManager.removeNotification(entry.getKey(), true);
+ if (mNotifsExtendingLifetime.contains(entry)
+ && mHeadsUpManager.canRemoveImmediately(entry.getKey())) {
+ mHeadsUpManager.removeNotification(
+ entry.getKey(), /* releaseImmediately */ true);
}
}, removeAfterMillis);
+ } else {
+ // remove as early as possible
+ mExecutor.execute(
+ () -> mHeadsUpManager.removeNotification(
+ entry.getKey(), /* releaseImmediately */ false));
}
mNotifsExtendingLifetime.add(entry);
}
- return isShowingHun;
+ return extend;
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/ShadeViewManager.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/ShadeViewManager.kt
index 43a75a5..ad97392 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/ShadeViewManager.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/ShadeViewManager.kt
@@ -24,16 +24,18 @@
import com.android.systemui.statusbar.notification.collection.NotificationEntry
import com.android.systemui.statusbar.notification.stack.NotificationListContainer
import com.android.systemui.util.traceSection
-import javax.inject.Inject
+import dagger.assisted.Assisted
+import dagger.assisted.AssistedFactory
+import dagger.assisted.AssistedInject
/**
* Responsible for building and applying the "shade node spec": the list (tree) of things that
* currently populate the notification shade.
*/
-class ShadeViewManager constructor(
+class ShadeViewManager @AssistedInject constructor(
context: Context,
- listContainer: NotificationListContainer,
- private val stackController: NotifStackController,
+ @Assisted listContainer: NotificationListContainer,
+ @Assisted private val stackController: NotifStackController,
mediaContainerController: MediaContainerController,
featureManager: NotificationSectionsFeatureManager,
logger: ShadeViewDifferLogger,
@@ -68,20 +70,10 @@
}
}
-class ShadeViewManagerFactory @Inject constructor(
- private val context: Context,
- private val logger: ShadeViewDifferLogger,
- private val mediaContainerController: MediaContainerController,
- private val sectionsFeatureManager: NotificationSectionsFeatureManager,
- private val viewBarn: NotifViewBarn
-) {
- fun create(listContainer: NotificationListContainer, stackController: NotifStackController) =
- ShadeViewManager(
- context,
- listContainer,
- stackController,
- mediaContainerController,
- sectionsFeatureManager,
- logger,
- viewBarn)
+@AssistedFactory
+interface ShadeViewManagerFactory {
+ fun create(
+ listContainer: NotificationListContainer,
+ stackController: NotifStackController
+ ): ShadeViewManager
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java
index 01acce3..2824ab8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java
@@ -412,7 +412,7 @@
}
@Override
- protected boolean canRemoveImmediately(@NonNull String key) {
+ public boolean canRemoveImmediately(@NonNull String key) {
if (mSwipedOutKeys.contains(key)) {
// We always instantly dismiss views being manually swiped out.
mSwipedOutKeys.remove(key);
diff --git a/packages/SystemUI/tests/src/com/android/AAAPlusPlusVerifySysuiRequiredTestPropertiesTest.java b/packages/SystemUI/tests/src/com/android/AAAPlusPlusVerifySysuiRequiredTestPropertiesTest.java
index cbd6e86..0369d5b 100644
--- a/packages/SystemUI/tests/src/com/android/AAAPlusPlusVerifySysuiRequiredTestPropertiesTest.java
+++ b/packages/SystemUI/tests/src/com/android/AAAPlusPlusVerifySysuiRequiredTestPropertiesTest.java
@@ -110,6 +110,17 @@
private Collection<String> getClassNamesFromClassPath() {
ClassPathScanner scanner = new ClassPathScanner(mContext.getPackageCodePath());
+ ChainedClassNameFilter filter = makeClassNameFilter();
+
+ try {
+ return scanner.getClassPathEntries(filter);
+ } catch (IOException e) {
+ Log.e(getTag(), "Failed to scan classes", e);
+ }
+ return Collections.emptyList();
+ }
+
+ protected ChainedClassNameFilter makeClassNameFilter() {
ChainedClassNameFilter filter = new ChainedClassNameFilter();
filter.add(new ExternalClassNameFilter());
@@ -122,13 +133,7 @@
// the main SystemUI process. Therefore, exclude this package
// from the base class whitelist.
filter.add(s -> !s.startsWith("com.android.systemui.screenshot"));
-
- try {
- return scanner.getClassPathEntries(filter);
- } catch (IOException e) {
- Log.e(TAG, "Failed to scan classes", e);
- }
- return Collections.emptyList();
+ return filter;
}
private String getClsStr() {
@@ -212,8 +217,12 @@
* as loggable to limit log spam during normal use.
*/
private void logDebug(String msg) {
- if (Log.isLoggable(TAG, Log.DEBUG)) {
- Log.d(TAG, msg);
+ if (Log.isLoggable(getTag(), Log.DEBUG)) {
+ Log.d(getTag(), msg);
}
}
+
+ protected String getTag() {
+ return TAG;
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/SysuiBaseFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/SysuiBaseFragmentTest.java
index 40549d69..8c20b24 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/SysuiBaseFragmentTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/SysuiBaseFragmentTest.java
@@ -29,8 +29,10 @@
import com.android.systemui.utils.leaks.LeakCheckedTest.SysuiLeakCheck;
import org.junit.After;
+import org.junit.AfterClass;
import org.junit.Before;
import org.junit.Rule;
+import org.mockito.Mockito;
public abstract class SysuiBaseFragmentTest extends BaseFragmentTest {
@@ -78,6 +80,11 @@
SystemUIFactory.cleanup();
}
+ @AfterClass
+ public static void mockitoTeardown() {
+ Mockito.framework().clearInlineMocks();
+ }
+
@Override
protected SysuiTestableContext getContext() {
return new SysuiTestableContext(InstrumentationRegistry.getContext(), mLeakCheck);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorTest.java
index a11b46d..b3ee5f8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorTest.java
@@ -140,10 +140,13 @@
public void testCancelStickyNotification() {
when(mHeadsUpManager.isSticky(anyString())).thenReturn(true);
addHUN(mEntry);
+ when(mHeadsUpManager.canRemoveImmediately(anyString())).thenReturn(false, true);
when(mHeadsUpManager.getEarliestRemovalTime(anyString())).thenReturn(1000L, 0L);
assertTrue(mNotifLifetimeExtender.shouldExtendLifetime(mEntry, 0));
mClock.advanceTime(1000L);
mExecutor.runAllReady();
+ verify(mHeadsUpManager, times(0))
+ .removeNotification(anyString(), eq(false));
verify(mHeadsUpManager, times(1))
.removeNotification(anyString(), eq(true));
}
@@ -157,6 +160,22 @@
mClock.advanceTime(1000L);
mExecutor.runAllReady();
verify(mHeadsUpManager, times(0))
+ .removeNotification(anyString(), eq(false));
+ verify(mHeadsUpManager, times(0))
+ .removeNotification(anyString(), eq(true));
+ }
+
+ @Test
+ public void testCancelNotification() {
+ when(mHeadsUpManager.isSticky(anyString())).thenReturn(false);
+ addHUN(mEntry);
+ when(mHeadsUpManager.getEarliestRemovalTime(anyString())).thenReturn(1000L, 500L);
+ assertTrue(mNotifLifetimeExtender.shouldExtendLifetime(mEntry, 0));
+ mClock.advanceTime(1000L);
+ mExecutor.runAllReady();
+ verify(mHeadsUpManager, times(1))
+ .removeNotification(anyString(), eq(false));
+ verify(mHeadsUpManager, times(0))
.removeNotification(anyString(), eq(true));
}
@@ -189,6 +208,13 @@
// GIVEN there is a HUN, mEntry
addHUN(mEntry);
+ given(mHeadsUpManager.canRemoveImmediately(anyString())).willAnswer(i -> {
+ String key = i.getArgument(0);
+ for (NotificationEntry entry : mHuns) {
+ if (entry.getKey().equals(key)) return false;
+ }
+ return true;
+ });
// THEN only the current HUN, mEntry, should be lifetimeExtended
assertTrue(mNotifLifetimeExtender.shouldExtendLifetime(mEntry, /* cancellationReason */ 0));
assertFalse(mNotifLifetimeExtender.shouldExtendLifetime(
diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
index a32de74..07351cf 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
@@ -112,6 +112,7 @@
import com.android.wm.shell.TaskViewTransitions;
import com.android.wm.shell.WindowManagerShellWrapper;
import com.android.wm.shell.bubbles.Bubble;
+import com.android.wm.shell.bubbles.BubbleBadgeIconFactory;
import com.android.wm.shell.bubbles.BubbleData;
import com.android.wm.shell.bubbles.BubbleDataRepository;
import com.android.wm.shell.bubbles.BubbleEntry;
@@ -1217,6 +1218,7 @@
mBubbleController,
mBubbleController.getStackView(),
new BubbleIconFactory(mContext),
+ new BubbleBadgeIconFactory(mContext),
bubble,
true /* skipInflation */);
verify(userContext, times(1)).getPackageManager();
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityWindowManager.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityWindowManager.java
index 09485d1..aba32ec 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityWindowManager.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityWindowManager.java
@@ -667,6 +667,10 @@
return null;
}
+ // Don't need to add the embedded hierarchy windows into the accessibility windows list.
+ if (mHostEmbeddedMap.size() > 0 && isEmbeddedHierarchyWindowsLocked(windowId)) {
+ return null;
+ }
final AccessibilityWindowInfo reportedWindow = AccessibilityWindowInfo.obtain();
reportedWindow.setId(windowId);
@@ -699,6 +703,21 @@
return reportedWindow;
}
+ private boolean isEmbeddedHierarchyWindowsLocked(int windowId) {
+ final IBinder leashToken = mWindowIdMap.get(windowId);
+ if (leashToken == null) {
+ return false;
+ }
+
+ for (int i = 0; i < mHostEmbeddedMap.size(); i++) {
+ if (mHostEmbeddedMap.keyAt(i).equals(leashToken)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
private int getTypeForWindowManagerWindowType(int windowType) {
switch (windowType) {
case WindowManager.LayoutParams.TYPE_APPLICATION:
@@ -735,8 +754,7 @@
case WindowManager.LayoutParams.TYPE_SYSTEM_ERROR:
case WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY:
case WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY:
- case WindowManager.LayoutParams.TYPE_SCREENSHOT:
- case WindowManager.LayoutParams.TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY: {
+ case WindowManager.LayoutParams.TYPE_SCREENSHOT: {
return AccessibilityWindowInfo.TYPE_SYSTEM;
}
@@ -748,6 +766,10 @@
return AccessibilityWindowInfo.TYPE_ACCESSIBILITY_OVERLAY;
}
+ case WindowManager.LayoutParams.TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY: {
+ return AccessibilityWindowInfo.TYPE_MAGNIFICATION_OVERLAY;
+ }
+
default: {
return -1;
}
diff --git a/services/core/java/com/android/server/SystemServiceManager.java b/services/core/java/com/android/server/SystemServiceManager.java
index 1208cb7..5f295ac 100644
--- a/services/core/java/com/android/server/SystemServiceManager.java
+++ b/services/core/java/com/android/server/SystemServiceManager.java
@@ -45,6 +45,8 @@
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
@@ -91,7 +93,7 @@
private long mRuntimeStartUptime;
// Services that should receive lifecycle events.
- private final ArrayList<SystemService> mServices = new ArrayList<SystemService>();
+ private List<SystemService> mServices;
private int mCurrentPhase = -1;
@@ -113,11 +115,12 @@
SystemServiceManager(Context context) {
mContext = context;
+ mServices = new ArrayList<>();
// Disable using the thread pool for low ram devices
sUseLifecycleThreadPool = sUseLifecycleThreadPool
- && !ActivityManager.isLowRamDeviceStatic();
+ && !ActivityManager.isLowRamDeviceStatic();
mNumUserPoolThreads = Math.min(Runtime.getRuntime().availableProcessors(),
- DEFAULT_MAX_USER_POOL_THREADS);
+ DEFAULT_MAX_USER_POOL_THREADS);
}
/**
@@ -220,11 +223,16 @@
warnIfTooLong(SystemClock.elapsedRealtime() - time, service, "onStart");
}
+ /** Disallow starting new services after this call. */
+ void sealStartedServices() {
+ mServices = Collections.unmodifiableList(mServices);
+ }
+
/**
* Starts the specified boot phase for all system services that have been started up to
* this point.
*
- * @param t trace logger
+ * @param t trace logger
* @param phase The boot phase to start.
*/
public void startBootPhase(@NonNull TimingsTraceAndSlog t, int phase) {
@@ -398,8 +406,8 @@
// Limit the lifecycle parallelization to all users other than the system user
// and only for the user start lifecycle phase for now.
final boolean useThreadPool = sUseLifecycleThreadPool
- && curUserId != UserHandle.USER_SYSTEM
- && onWhat.equals(USER_STARTING);
+ && curUserId != UserHandle.USER_SYSTEM
+ && onWhat.equals(USER_STARTING);
final ExecutorService threadPool =
useThreadPool ? Executors.newFixedThreadPool(mNumUserPoolThreads) : null;
for (int i = 0; i < serviceLen; i++) {
@@ -419,7 +427,7 @@
+ serviceName + " because it's not supported (curUser: "
+ curUser + ", prevUser:" + prevUser + ")");
} else {
- Slog.i(TAG, "Skipping " + onWhat + "User-" + curUserId + " on "
+ Slog.i(TAG, "Skipping " + onWhat + "User-" + curUserId + " on "
+ serviceName);
}
continue;
@@ -516,6 +524,7 @@
/**
* Returns whether we are booting into safe mode.
+ *
* @return safe mode flag
*/
public boolean isSafeMode() {
@@ -559,9 +568,10 @@
/**
* Ensures that the system directory exist creating one if needed.
+ *
+ * @return The system directory.
* @deprecated Use {@link Environment#getDataSystemCeDirectory()}
* or {@link Environment#getDataSystemDeDirectory()} instead.
- * @return The system directory.
*/
@Deprecated
public static File ensureSystemDir() {
@@ -578,7 +588,9 @@
pw.printf("Current phase: %d\n", mCurrentPhase);
synchronized (mTargetUsers) {
if (mCurrentUser != null) {
- pw.print("Current user: "); mCurrentUser.dump(pw); pw.println();
+ pw.print("Current user: ");
+ mCurrentUser.dump(pw);
+ pw.println();
} else {
pw.println("Current user not set!");
}
diff --git a/services/core/java/com/android/server/adb/AdbDebuggingManager.java b/services/core/java/com/android/server/adb/AdbDebuggingManager.java
index f591b26..297d28d 100644
--- a/services/core/java/com/android/server/adb/AdbDebuggingManager.java
+++ b/services/core/java/com/android/server/adb/AdbDebuggingManager.java
@@ -18,6 +18,7 @@
import static com.android.internal.util.dump.DumpUtils.writeStringIfNotNull;
+import android.annotation.NonNull;
import android.annotation.TestApi;
import android.app.ActivityManager;
import android.app.Notification;
@@ -170,6 +171,12 @@
mAdbConnectionInfo = new AdbConnectionInfo();
}
+ static void sendBroadcastWithDebugPermission(@NonNull Context context, @NonNull Intent intent,
+ @NonNull UserHandle userHandle) {
+ context.sendBroadcastAsUser(intent, userHandle,
+ android.Manifest.permission.MANAGE_DEBUGGING);
+ }
+
class PairingThread extends Thread implements NsdManager.RegistrationListener {
private NsdManager mNsdManager;
private String mPublicKey;
@@ -1278,7 +1285,7 @@
? AdbManager.WIRELESS_STATUS_CONNECTED
: AdbManager.WIRELESS_STATUS_DISCONNECTED);
intent.putExtra(AdbManager.WIRELESS_DEBUG_PORT_EXTRA, port);
- mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
+ AdbDebuggingManager.sendBroadcastWithDebugPermission(mContext, intent, UserHandle.ALL);
}
private void onAdbdWifiServerConnected(int port) {
@@ -1350,7 +1357,8 @@
if (publicKey == null) {
Intent intent = new Intent(AdbManager.WIRELESS_DEBUG_PAIRING_RESULT_ACTION);
intent.putExtra(AdbManager.WIRELESS_STATUS_EXTRA, AdbManager.WIRELESS_STATUS_FAIL);
- mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
+ AdbDebuggingManager.sendBroadcastWithDebugPermission(mContext, intent,
+ UserHandle.ALL);
} else {
Intent intent = new Intent(AdbManager.WIRELESS_DEBUG_PAIRING_RESULT_ACTION);
intent.putExtra(AdbManager.WIRELESS_STATUS_EXTRA,
@@ -1366,7 +1374,8 @@
device.guid = hostname;
device.connected = false;
intent.putExtra(AdbManager.WIRELESS_PAIR_DEVICE_EXTRA, device);
- mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
+ AdbDebuggingManager.sendBroadcastWithDebugPermission(mContext, intent,
+ UserHandle.ALL);
// Add the key into the keystore
mAdbKeyStore.setLastConnectionTime(publicKey,
System.currentTimeMillis());
@@ -1380,14 +1389,14 @@
intent.putExtra(AdbManager.WIRELESS_STATUS_EXTRA,
AdbManager.WIRELESS_STATUS_CONNECTED);
intent.putExtra(AdbManager.WIRELESS_DEBUG_PORT_EXTRA, port);
- mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
+ AdbDebuggingManager.sendBroadcastWithDebugPermission(mContext, intent, UserHandle.ALL);
}
private void sendPairedDevicesToUI(Map<String, PairDevice> devices) {
Intent intent = new Intent(AdbManager.WIRELESS_DEBUG_PAIRED_DEVICES_ACTION);
// Map is not serializable, so need to downcast
intent.putExtra(AdbManager.WIRELESS_DEVICES_EXTRA, (HashMap) devices);
- mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
+ AdbDebuggingManager.sendBroadcastWithDebugPermission(mContext, intent, UserHandle.ALL);
}
private void updateUIPairCode(String code) {
@@ -1397,7 +1406,7 @@
intent.putExtra(AdbManager.WIRELESS_PAIRING_CODE_EXTRA, code);
intent.putExtra(AdbManager.WIRELESS_STATUS_EXTRA,
AdbManager.WIRELESS_STATUS_PAIRING_CODE);
- mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
+ AdbDebuggingManager.sendBroadcastWithDebugPermission(mContext, intent, UserHandle.ALL);
}
}
diff --git a/services/core/java/com/android/server/adb/AdbService.java b/services/core/java/com/android/server/adb/AdbService.java
index 7a4d2ce..2845fbf 100644
--- a/services/core/java/com/android/server/adb/AdbService.java
+++ b/services/core/java/com/android/server/adb/AdbService.java
@@ -459,7 +459,7 @@
? AdbManager.WIRELESS_STATUS_CONNECTED
: AdbManager.WIRELESS_STATUS_DISCONNECTED);
intent.putExtra(AdbManager.WIRELESS_DEBUG_PORT_EXTRA, port);
- mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
+ AdbDebuggingManager.sendBroadcastWithDebugPermission(mContext, intent, UserHandle.ALL);
Slog.i(TAG, "sent port broadcast port=" + port);
}
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index 0879bec..69765d2 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -9319,8 +9319,6 @@
protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return;
- mAudioSystem.dump(pw);
-
sLifecycleLogger.dump(pw);
if (mAudioHandler != null) {
pw.println("\nMessage handler (watch for unhandled messages):");
@@ -9400,6 +9398,8 @@
pw.println("mHasSpatializerEffect:" + mHasSpatializerEffect);
pw.println("isSpatializerEnabled:" + isSpatializerEnabled());
pw.println("isSpatialAudioEnabled:" + isSpatialAudioEnabled());
+
+ mAudioSystem.dump(pw);
}
private void dumpSupportedSystemUsage(PrintWriter pw) {
diff --git a/services/core/java/com/android/server/audio/AudioSystemAdapter.java b/services/core/java/com/android/server/audio/AudioSystemAdapter.java
index ac212ee..a2ba76b 100644
--- a/services/core/java/com/android/server/audio/AudioSystemAdapter.java
+++ b/services/core/java/com/android/server/audio/AudioSystemAdapter.java
@@ -524,11 +524,28 @@
* @param pw
*/
public void dump(PrintWriter pw) {
+ pw.println("\nAudioSystemAdapter:");
+ pw.println(" mDevicesForStreamCache:");
+ if (mDevicesForStreamCache != null) {
+ for (Integer stream : mDevicesForStreamCache.keySet()) {
+ pw.println("\t stream:" + stream + " device:"
+ + AudioSystem.getOutputDeviceName(mDevicesForStreamCache.get(stream)));
+ }
+ }
+ pw.println(" mDevicesForAttrCache:");
+ if (mDevicesForAttrCache != null) {
+ for (AudioAttributes attr : mDevicesForAttrCache.keySet()) {
+ pw.println("\t" + attr);
+ for (AudioDeviceAttributes devAttr : mDevicesForAttrCache.get(attr)) {
+ pw.println("\t\t" + devAttr);
+ }
+ }
+ }
+
if (!ENABLE_GETDEVICES_STATS) {
- // only stats in this dump
+ // only stats in the rest of this dump
return;
}
- pw.println("\nAudioSystemAdapter:");
for (int i = 0; i < NB_MEASUREMENTS; i++) {
pw.println(mMethodNames[i]
+ ": counter=" + mMethodCallCounter[i]
diff --git a/services/core/java/com/android/server/notification/CountdownConditionProvider.java b/services/core/java/com/android/server/notification/CountdownConditionProvider.java
index 471c9b9..4b70e2e 100644
--- a/services/core/java/com/android/server/notification/CountdownConditionProvider.java
+++ b/services/core/java/com/android/server/notification/CountdownConditionProvider.java
@@ -94,7 +94,8 @@
@Override
public void onConnected() {
if (DEBUG) Slog.d(TAG, "onConnected");
- mContext.registerReceiver(mReceiver, new IntentFilter(ACTION));
+ mContext.registerReceiver(mReceiver, new IntentFilter(ACTION),
+ Context.RECEIVER_EXPORTED_UNAUDITED);
mConnected = true;
}
diff --git a/services/core/java/com/android/server/notification/EventConditionProvider.java b/services/core/java/com/android/server/notification/EventConditionProvider.java
index 4be4f0a..4fe7a27 100644
--- a/services/core/java/com/android/server/notification/EventConditionProvider.java
+++ b/services/core/java/com/android/server/notification/EventConditionProvider.java
@@ -306,7 +306,8 @@
filter.addAction(Intent.ACTION_TIME_CHANGED);
filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
filter.addAction(ACTION_EVALUATE);
- registerReceiver(mReceiver, filter);
+ registerReceiver(mReceiver, filter,
+ Context.RECEIVER_EXPORTED_UNAUDITED);
} else {
unregisterReceiver(mReceiver);
}
diff --git a/services/core/java/com/android/server/notification/NotificationHistoryDatabase.java b/services/core/java/com/android/server/notification/NotificationHistoryDatabase.java
index 8a33299..a9b2570 100644
--- a/services/core/java/com/android/server/notification/NotificationHistoryDatabase.java
+++ b/services/core/java/com/android/server/notification/NotificationHistoryDatabase.java
@@ -100,7 +100,8 @@
IntentFilter deletionFilter = new IntentFilter(ACTION_HISTORY_DELETION);
deletionFilter.addDataScheme(SCHEME_DELETION);
- mContext.registerReceiver(mFileCleanupReceiver, deletionFilter);
+ mContext.registerReceiver(mFileCleanupReceiver, deletionFilter,
+ Context.RECEIVER_EXPORTED_UNAUDITED);
}
public void init() {
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 2554796..a0eeb65 100755
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -2334,7 +2334,8 @@
IntentFilter timeoutFilter = new IntentFilter(ACTION_NOTIFICATION_TIMEOUT);
timeoutFilter.addDataScheme(SCHEME_TIMEOUT);
- getContext().registerReceiver(mNotificationTimeoutReceiver, timeoutFilter);
+ getContext().registerReceiver(mNotificationTimeoutReceiver, timeoutFilter,
+ Context.RECEIVER_EXPORTED_UNAUDITED);
IntentFilter settingsRestoredFilter = new IntentFilter(Intent.ACTION_SETTING_RESTORED);
getContext().registerReceiver(mRestoreReceiver, settingsRestoredFilter);
diff --git a/services/core/java/com/android/server/notification/ScheduleConditionProvider.java b/services/core/java/com/android/server/notification/ScheduleConditionProvider.java
index 92cdce7..737353d 100644
--- a/services/core/java/com/android/server/notification/ScheduleConditionProvider.java
+++ b/services/core/java/com/android/server/notification/ScheduleConditionProvider.java
@@ -261,7 +261,8 @@
filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
filter.addAction(ACTION_EVALUATE);
filter.addAction(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED);
- registerReceiver(mReceiver, filter);
+ registerReceiver(mReceiver, filter,
+ Context.RECEIVER_EXPORTED_UNAUDITED);
} else {
unregisterReceiver(mReceiver);
}
diff --git a/services/core/java/com/android/server/notification/SnoozeHelper.java b/services/core/java/com/android/server/notification/SnoozeHelper.java
index 4500bbc..7f265df 100644
--- a/services/core/java/com/android/server/notification/SnoozeHelper.java
+++ b/services/core/java/com/android/server/notification/SnoozeHelper.java
@@ -116,7 +116,8 @@
mContext = context;
IntentFilter filter = new IntentFilter(REPOST_ACTION);
filter.addDataScheme(REPOST_SCHEME);
- mContext.registerReceiver(mBroadcastReceiver, filter);
+ mContext.registerReceiver(mBroadcastReceiver, filter,
+ Context.RECEIVER_EXPORTED_UNAUDITED);
mAm = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
mCallback = callback;
mUserProfiles = userProfiles;
diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
index 0564e85..be2bdaa 100644
--- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
+++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
@@ -2816,7 +2816,7 @@
case UserManager.REMOVE_RESULT_REMOVED:
getOutPrintWriter().printf("Success: user %d removed\n", userId);
return 0;
- case UserManager.REMOVE_RESULT_SET_EPHEMERAL:
+ case UserManager.REMOVE_RESULT_DEFERRED:
getOutPrintWriter().printf("Success: user %d set as ephemeral\n", userId);
return 0;
case UserManager.REMOVE_RESULT_ALREADY_BEING_REMOVED:
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index 167ad3b..fb3ca91 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -3537,8 +3537,11 @@
Slog.wtf(LOG_TAG, "Seeing both legacy and current local restrictions in xml");
}
} else if (legacyLocalRestrictions != null) {
- mDevicePolicyLocalUserRestrictions.put(id,
- new RestrictionsSet(id, legacyLocalRestrictions));
+ RestrictionsSet legacyLocalRestrictionsSet =
+ legacyLocalRestrictions.isEmpty()
+ ? new RestrictionsSet()
+ : new RestrictionsSet(id, legacyLocalRestrictions);
+ mDevicePolicyLocalUserRestrictions.put(id, legacyLocalRestrictionsSet);
}
if (globalRestrictions != null) {
mDevicePolicyGlobalUserRestrictions.updateRestrictions(id,
@@ -4478,7 +4481,7 @@
userData.info.flags |= UserInfo.FLAG_EPHEMERAL;
writeUserLP(userData);
- return UserManager.REMOVE_RESULT_SET_EPHEMERAL;
+ return UserManager.REMOVE_RESULT_DEFERRED;
}
} finally {
Binder.restoreCallingIdentity(ident);
diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
index f435b1f..85e54f3 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
@@ -66,9 +66,11 @@
import android.util.SparseArray;
import com.android.internal.annotations.GuardedBy;
+import com.android.internal.util.Preconditions;
import com.android.internal.util.function.TriFunction;
import com.android.server.LocalServices;
import com.android.server.pm.UserManagerInternal;
+import com.android.server.pm.UserManagerService;
import com.android.server.pm.parsing.pkg.AndroidPackage;
import com.android.server.pm.permission.PermissionManagerServiceInternal.HotwordDetectionServiceProvider;
@@ -684,8 +686,23 @@
@Override
public void onPackageInstalled(@NonNull AndroidPackage pkg, int previousAppId,
- @NonNull PackageInstalledParams params, @UserIdInt int userId) {
- mPermissionManagerServiceImpl.onPackageInstalled(pkg, previousAppId, params, userId);
+ @NonNull PackageInstalledParams params, @UserIdInt int rawUserId) {
+ Objects.requireNonNull(pkg, "pkg");
+ Objects.requireNonNull(params, "params");
+ Preconditions.checkArgument(rawUserId >= UserHandle.USER_SYSTEM
+ || rawUserId == UserHandle.USER_ALL, "userId");
+
+ mPermissionManagerServiceImpl.onPackageInstalled(pkg, previousAppId, params, rawUserId);
+ final int[] userIds = rawUserId == UserHandle.USER_ALL ? getAllUserIds()
+ : new int[] { rawUserId };
+ for (final int userId : userIds) {
+ final int autoRevokePermissionsMode = params.getAutoRevokePermissionsMode();
+ if (autoRevokePermissionsMode == AppOpsManager.MODE_ALLOWED
+ || autoRevokePermissionsMode == AppOpsManager.MODE_IGNORED) {
+ setAutoRevokeExemptedInternal(pkg,
+ autoRevokePermissionsMode == AppOpsManager.MODE_IGNORED, userId);
+ }
+ }
}
@Override
@@ -786,6 +803,15 @@
}
/**
+ * Returns all relevant user ids. This list include the current set of created user ids as well
+ * as pre-created user ids.
+ * @return user ids for created users and pre-created users
+ */
+ private int[] getAllUserIds() {
+ return UserManagerService.getInstance().getUserIdsIncludingPreCreated();
+ }
+
+ /**
* Interface to intercept permission checks and optionally pass through to the original
* implementation.
*/
diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java
index 7e59acc..21cb2c9 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java
@@ -19,8 +19,6 @@
import static android.Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY;
import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;
-import static android.app.AppOpsManager.MODE_ALLOWED;
-import static android.app.AppOpsManager.MODE_IGNORED;
import static android.content.pm.PackageManager.FLAGS_PERMISSION_RESTRICTION_ANY_EXEMPT;
import static android.content.pm.PackageManager.FLAG_PERMISSION_APPLY_RESTRICTION;
import static android.content.pm.PackageManager.FLAG_PERMISSION_AUTO_REVOKED;
@@ -63,7 +61,6 @@
import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.app.ActivityManager;
-import android.app.AppOpsManager;
import android.app.IActivityManager;
import android.app.admin.DevicePolicyManagerInternal;
import android.compat.annotation.ChangeId;
@@ -253,9 +250,6 @@
/** Permission controller: User space permission management */
private PermissionControllerManager mPermissionControllerManager;
- /** App ops manager */
- private final AppOpsManager mAppOpsManager;
-
/**
* Built-in permissions. Read from system configuration files. Mapping is from
* UID to permission name.
@@ -387,7 +381,6 @@
mContext = context;
mPackageManagerInt = LocalServices.getService(PackageManagerInternal.class);
mUserManagerInt = LocalServices.getService(UserManagerInternal.class);
- mAppOpsManager = context.getSystemService(AppOpsManager.class);
mPrivilegedPermissionAllowlistSourcePackageNames.add(PLATFORM_PACKAGE_NAME);
// PackageManager.hasSystemFeature() is not used here because PackageManagerService
@@ -4952,15 +4945,6 @@
addAllowlistedRestrictedPermissionsInternal(pkg,
params.getAllowlistedRestrictedPermissions(),
FLAG_PERMISSION_WHITELIST_INSTALLER, userId);
- final int autoRevokePermissionsMode = params.getAutoRevokePermissionsMode();
- if (autoRevokePermissionsMode == AppOpsManager.MODE_ALLOWED
- || autoRevokePermissionsMode == AppOpsManager.MODE_IGNORED) {
- // TODO: theianchen Bug: 182523293
- // We should move this portion of code that's calling
- // setAutoRevokeExemptedInternal() into the old PMS
- setAutoRevokeExemptedInternal(pkg,
- autoRevokePermissionsMode == AppOpsManager.MODE_IGNORED, userId);
- }
grantRequestedRuntimePermissionsInternal(pkg, params.getGrantedPermissions(), userId);
}
}
@@ -5229,25 +5213,6 @@
onPackageUninstalledInternal(packageName, appId, pkg, sharedUserPkgs, userIds);
}
- private boolean setAutoRevokeExemptedInternal(@NonNull AndroidPackage pkg, boolean exempted,
- @UserIdInt int userId) {
- final int packageUid = UserHandle.getUid(userId, pkg.getUid());
- if (mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_AUTO_REVOKE_MANAGED_BY_INSTALLER,
- packageUid, pkg.getPackageName()) != MODE_ALLOWED) {
- // Allowlist user set - don't override
- return false;
- }
-
- final long identity = Binder.clearCallingIdentity();
- try {
- mAppOpsManager.setMode(AppOpsManager.OP_AUTO_REVOKE_PERMISSIONS_IF_UNUSED, packageUid,
- pkg.getPackageName(), exempted ? MODE_IGNORED : MODE_ALLOWED);
- } finally {
- Binder.restoreCallingIdentity(identity);
- }
- return true;
- }
-
/**
* Callbacks invoked when interesting actions have been taken on a permission.
* <p>
diff --git a/services/core/java/com/android/server/power/Notifier.java b/services/core/java/com/android/server/power/Notifier.java
index 70a804b..73ec2cd 100644
--- a/services/core/java/com/android/server/power/Notifier.java
+++ b/services/core/java/com/android/server/power/Notifier.java
@@ -545,7 +545,7 @@
/**
* Called when there has been user activity.
*/
- public void onUserActivity(int event, int uid) {
+ public void onUserActivity(int displayGroupId, int event, int uid) {
if (DEBUG) {
Slog.d(TAG, "onUserActivity: event=" + event + ", uid=" + uid);
}
@@ -560,7 +560,8 @@
if (!mUserActivityPending) {
mUserActivityPending = true;
Message msg = mHandler.obtainMessage(MSG_USER_ACTIVITY);
- msg.arg1 = event;
+ msg.arg1 = displayGroupId;
+ msg.arg2 = event;
msg.setAsynchronous(true);
mHandler.sendMessage(msg);
}
@@ -633,14 +634,15 @@
/**
* Called when the screen policy changes.
*/
- public void onScreenPolicyUpdate(int newPolicy) {
+ public void onScreenPolicyUpdate(int displayGroupId, int newPolicy) {
if (DEBUG) {
Slog.d(TAG, "onScreenPolicyUpdate: newPolicy=" + newPolicy);
}
synchronized (mLock) {
Message msg = mHandler.obtainMessage(MSG_SCREEN_POLICY);
- msg.arg1 = newPolicy;
+ msg.arg1 = displayGroupId;
+ msg.arg2 = newPolicy;
msg.setAsynchronous(true);
mHandler.sendMessage(msg);
}
@@ -675,7 +677,7 @@
mSuspendBlocker.release();
}
- private void sendUserActivity(int event) {
+ private void sendUserActivity(int displayGroupId, int event) {
synchronized (mLock) {
if (!mUserActivityPending) {
return;
@@ -686,7 +688,7 @@
tm.notifyUserActivity();
mPolicy.userActivity();
mFaceDownDetector.userActivity(event);
- mScreenUndimDetector.userActivity();
+ mScreenUndimDetector.userActivity(displayGroupId);
}
void postEnhancedDischargePredictionBroadcast(long delayMs) {
@@ -840,8 +842,8 @@
mSuspendBlocker.release();
}
- private void screenPolicyChanging(int screenPolicy) {
- mScreenUndimDetector.recordScreenPolicy(screenPolicy);
+ private void screenPolicyChanging(int displayGroupId, int screenPolicy) {
+ mScreenUndimDetector.recordScreenPolicy(displayGroupId, screenPolicy);
}
private void lockProfile(@UserIdInt int userId) {
@@ -866,7 +868,7 @@
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_USER_ACTIVITY:
- sendUserActivity(msg.arg1);
+ sendUserActivity(msg.arg1, msg.arg2);
break;
case MSG_BROADCAST:
sendNextBroadcast();
@@ -885,7 +887,7 @@
showWiredChargingStarted(msg.arg1);
break;
case MSG_SCREEN_POLICY:
- screenPolicyChanging(msg.arg1);
+ screenPolicyChanging(msg.arg1, msg.arg2);
break;
}
}
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index 1455326..4b2770c 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -49,6 +49,7 @@
import android.database.ContentObserver;
import android.hardware.SensorManager;
import android.hardware.SystemSensorManager;
+import android.hardware.devicestate.DeviceStateManager;
import android.hardware.display.AmbientDisplayConfiguration;
import android.hardware.display.DisplayManagerInternal;
import android.hardware.display.DisplayManagerInternal.DisplayPowerRequest;
@@ -60,6 +61,7 @@
import android.os.BatterySaverPolicyConfig;
import android.os.Binder;
import android.os.Handler;
+import android.os.HandlerExecutor;
import android.os.IBinder;
import android.os.IPowerManager;
import android.os.Looper;
@@ -1151,6 +1153,9 @@
PowerManager.GO_TO_SLEEP_REASON_QUIESCENT,
PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE, Process.SYSTEM_UID);
}
+
+ mContext.getSystemService(DeviceStateManager.class).registerCallback(
+ new HandlerExecutor(mHandler), new DeviceStateListener());
}
}
}
@@ -1792,7 +1797,7 @@
mLastInteractivePowerHintTime = eventTime;
}
- mNotifier.onUserActivity(event, uid);
+ mNotifier.onUserActivity(powerGroup.getGroupId(), event, uid);
mAttentionDetector.onUserActivity(eventTime, event);
if (mUserInactiveOverrideFromWindowManager) {
@@ -3372,7 +3377,7 @@
final boolean ready = mDisplayManagerInternal.requestPowerState(groupId,
displayPowerRequest, mRequestWaitForNegativeProximity);
- mNotifier.onScreenPolicyUpdate(displayPowerRequest.policy);
+ mNotifier.onScreenPolicyUpdate(groupId, displayPowerRequest.policy);
if (DEBUG_SPEW) {
Slog.d(TAG, "updateDisplayPowerStateLocked: displayReady=" + ready
@@ -6349,4 +6354,25 @@
return interceptPowerKeyDownInternal(event);
}
}
+
+ /**
+ * Listens to changes in device state and updates the interactivity time.
+ * Any changes to the device state are treated as user interactions.
+ */
+ class DeviceStateListener implements DeviceStateManager.DeviceStateCallback {
+ private int mDeviceState = DeviceStateManager.INVALID_DEVICE_STATE;
+
+ @Override
+ public void onStateChanged(int deviceState) {
+ if (mDeviceState != deviceState) {
+ mDeviceState = deviceState;
+ // Device-state interactions are applied to the default display so that they
+ // are reflected only with the default power group.
+ userActivityInternal(Display.DEFAULT_DISPLAY, mClock.uptimeMillis(),
+ PowerManager.USER_ACTIVITY_EVENT_DEVICE_STATE, /* flags= */0,
+ Process.SYSTEM_UID);
+ }
+ }
+ };
+
}
diff --git a/services/core/java/com/android/server/power/ScreenUndimDetector.java b/services/core/java/com/android/server/power/ScreenUndimDetector.java
index 951bc1f..c4929c2 100644
--- a/services/core/java/com/android/server/power/ScreenUndimDetector.java
+++ b/services/core/java/com/android/server/power/ScreenUndimDetector.java
@@ -28,6 +28,7 @@
import android.os.SystemClock;
import android.provider.DeviceConfig;
import android.util.Slog;
+import android.view.Display;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.FrameworkStatsLog;
@@ -123,8 +124,8 @@
* Launches a message that figures out the screen transitions and detects user undims. Must be
* called by the parent that is trying to update the screen policy.
*/
- public void recordScreenPolicy(int newPolicy) {
- if (newPolicy == mCurrentScreenPolicy) {
+ public void recordScreenPolicy(int displayGroupId, int newPolicy) {
+ if (displayGroupId != Display.DEFAULT_DISPLAY_GROUP || newPolicy == mCurrentScreenPolicy) {
return;
}
@@ -268,7 +269,10 @@
* The user interacted with the screen after an undim, indicating the phone is in use.
* We use this event for logging.
*/
- public void userActivity() {
+ public void userActivity(int displayGroupId) {
+ if (displayGroupId != Display.DEFAULT_DISPLAY) {
+ return;
+ }
if (mUndimOccurredTime != 1 && mInteractionAfterUndimTime == -1) {
mInteractionAfterUndimTime = mClock.getCurrentTime();
}
diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
index b1cc517..7f50cd6 100644
--- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
+++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
@@ -28,18 +28,11 @@
import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
import static android.net.NetworkIdentity.OEM_PAID;
import static android.net.NetworkIdentity.OEM_PRIVATE;
-import static android.net.NetworkStats.DEFAULT_NETWORK_ALL;
-import static android.net.NetworkStats.METERED_ALL;
import static android.net.NetworkStats.METERED_YES;
-import static android.net.NetworkStats.ROAMING_ALL;
import static android.net.NetworkTemplate.MATCH_ETHERNET;
-import static android.net.NetworkTemplate.MATCH_MOBILE_WILDCARD;
-import static android.net.NetworkTemplate.MATCH_WIFI_WILDCARD;
-import static android.net.NetworkTemplate.NETWORK_TYPE_ALL;
+import static android.net.NetworkTemplate.MATCH_MOBILE;
+import static android.net.NetworkTemplate.MATCH_WIFI;
import static android.net.NetworkTemplate.OEM_MANAGED_ALL;
-import static android.net.NetworkTemplate.buildTemplateMobileWildcard;
-import static android.net.NetworkTemplate.buildTemplateMobileWithRatType;
-import static android.net.NetworkTemplate.buildTemplateWifiWildcard;
import static android.net.NetworkTemplate.getAllCollapsedRatTypes;
import static android.os.Debug.getIonHeapsSizeKb;
import static android.os.Process.LAST_SHARED_APPLICATION_GID;
@@ -1179,9 +1172,10 @@
}
case FrameworkStatsLog.BYTES_TRANSFER_BY_TAG_AND_METERED: {
final NetworkStats wifiStats = getUidNetworkStatsSnapshotForTemplate(
- buildTemplateWifiWildcard(), /*includeTags=*/true);
+ new NetworkTemplate.Builder(MATCH_WIFI).build(), /*includeTags=*/true);
final NetworkStats cellularStats = getUidNetworkStatsSnapshotForTemplate(
- buildTemplateMobileWildcard(), /*includeTags=*/true);
+ new NetworkTemplate.Builder(MATCH_MOBILE)
+ .setMeteredness(METERED_YES).build(), /*includeTags=*/true);
if (wifiStats != null && cellularStats != null) {
final NetworkStats stats = wifiStats.add(cellularStats);
ret.add(new NetworkStatsExt(sliceNetworkStatsByUidTagAndMetered(stats),
@@ -1333,8 +1327,8 @@
@NonNull private List<NetworkStatsExt> getDataUsageBytesTransferSnapshotForOemManaged() {
final List<Pair<Integer, Integer>> matchRulesAndTransports = List.of(
new Pair(MATCH_ETHERNET, TRANSPORT_ETHERNET),
- new Pair(MATCH_MOBILE_WILDCARD, TRANSPORT_CELLULAR),
- new Pair(MATCH_WIFI_WILDCARD, TRANSPORT_WIFI)
+ new Pair(MATCH_MOBILE, TRANSPORT_CELLULAR),
+ new Pair(MATCH_WIFI, TRANSPORT_WIFI)
);
final int[] oemManagedTypes = new int[] {OEM_PAID | OEM_PRIVATE, OEM_PAID, OEM_PRIVATE};
@@ -1343,12 +1337,11 @@
for (Pair<Integer, Integer> ruleAndTransport : matchRulesAndTransports) {
final Integer matchRule = ruleAndTransport.first;
for (final int oemManaged : oemManagedTypes) {
- /* A null subscriberId will set wildcard=true, since we aren't trying to select a
- specific ssid or subscriber. */
- final NetworkTemplate template = new NetworkTemplate(matchRule,
- /*subscriberId=*/null, /*matchSubscriberIds=*/null, /*networkId=*/null,
- METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL,
- oemManaged);
+ // Subscriber Ids and Wifi Network Keys will not be set since the purpose is to
+ // slice statistics of different OEM managed networks among all network types.
+ // Thus, specifying networks through their identifiers are not needed.
+ final NetworkTemplate template = new NetworkTemplate.Builder(matchRule)
+ .setOemManaged(oemManaged).build();
final NetworkStats stats = getUidNetworkStatsSnapshotForTemplate(template, false);
final Integer transport = ruleAndTransport.second;
if (stats != null) {
@@ -1367,10 +1360,18 @@
* Create a snapshot of NetworkStats for a given transport.
*/
@Nullable private NetworkStats getUidNetworkStatsSnapshotForTransport(int transport) {
- final NetworkTemplate template = (transport == TRANSPORT_CELLULAR)
- ? NetworkTemplate.buildTemplateMobileWithRatType(
- /*subscriptionId=*/null, NETWORK_TYPE_ALL, METERED_YES)
- : NetworkTemplate.buildTemplateWifiWildcard();
+ NetworkTemplate template = null;
+ switch (transport) {
+ case TRANSPORT_CELLULAR:
+ template = new NetworkTemplate.Builder(MATCH_MOBILE)
+ .setMeteredness(METERED_YES).build();
+ break;
+ case TRANSPORT_WIFI:
+ template = new NetworkTemplate.Builder(MATCH_WIFI).build();
+ break;
+ default:
+ Log.wtf(TAG, "Unexpected transport.");
+ }
return getUidNetworkStatsSnapshotForTemplate(template, /*includeTags=*/false);
}
@@ -1409,8 +1410,10 @@
final List<NetworkStatsExt> ret = new ArrayList<>();
for (final int ratType : getAllCollapsedRatTypes()) {
final NetworkTemplate template =
- buildTemplateMobileWithRatType(subInfo.subscriberId, ratType,
- METERED_YES);
+ new NetworkTemplate.Builder(MATCH_MOBILE)
+ .setSubscriberIds(Set.of(subInfo.subscriberId))
+ .setRatType(ratType)
+ .setMeteredness(METERED_YES).build();
final NetworkStats stats =
getUidNetworkStatsSnapshotForTemplate(template, /*includeTags=*/false);
if (stats != null) {
diff --git a/services/core/java/com/android/server/vibrator/VibrationSettings.java b/services/core/java/com/android/server/vibrator/VibrationSettings.java
index 1ee115d..df6ffa2 100644
--- a/services/core/java/com/android/server/vibrator/VibrationSettings.java
+++ b/services/core/java/com/android/server/vibrator/VibrationSettings.java
@@ -16,13 +16,16 @@
package com.android.server.vibrator;
+import static android.os.VibrationAttributes.USAGE_ACCESSIBILITY;
import static android.os.VibrationAttributes.USAGE_ALARM;
import static android.os.VibrationAttributes.USAGE_COMMUNICATION_REQUEST;
import static android.os.VibrationAttributes.USAGE_HARDWARE_FEEDBACK;
+import static android.os.VibrationAttributes.USAGE_MEDIA;
import static android.os.VibrationAttributes.USAGE_NOTIFICATION;
import static android.os.VibrationAttributes.USAGE_PHYSICAL_EMULATION;
import static android.os.VibrationAttributes.USAGE_RINGTONE;
import static android.os.VibrationAttributes.USAGE_TOUCH;
+import static android.os.VibrationAttributes.USAGE_UNKNOWN;
import android.annotation.Nullable;
import android.app.ActivityManager;
@@ -44,8 +47,11 @@
import android.os.VibrationAttributes;
import android.os.VibrationEffect;
import android.os.Vibrator;
+import android.os.Vibrator.VibrationIntensity;
+import android.os.vibrator.VibrationConfig;
import android.provider.Settings;
import android.util.SparseArray;
+import android.util.SparseIntArray;
import android.util.proto.ProtoOutputStream;
import com.android.internal.annotations.GuardedBy;
@@ -109,53 +115,31 @@
private final List<OnVibratorSettingsChanged> mListeners = new ArrayList<>();
private final SparseArray<VibrationEffect> mFallbackEffects;
- private final int mRampStepDuration;
- private final int mRampDownDuration;
+ private final VibrationConfig mVibrationConfig;
@GuardedBy("mLock")
@Nullable
- private Vibrator mVibrator;
- @GuardedBy("mLock")
- @Nullable
private AudioManager mAudioManager;
@GuardedBy("mLock")
private boolean mVibrateInputDevices;
@GuardedBy("mLock")
- private boolean mVibrateWhenRinging;
- @GuardedBy("mLock")
- private boolean mApplyRampingRinger;
- @GuardedBy("mLock")
- private int mHapticFeedbackIntensity;
- @GuardedBy("mLock")
- private int mHardwareFeedbackIntensity;
- @GuardedBy("mLock")
- private int mNotificationIntensity;
- @GuardedBy("mLock")
- private int mRingIntensity;
+ private SparseIntArray mCurrentVibrationIntensities = new SparseIntArray();
@GuardedBy("mLock")
private boolean mBatterySaverMode;
VibrationSettings(Context context, Handler handler) {
- this(context, handler,
- context.getResources().getInteger(
- com.android.internal.R.integer.config_vibrationWaveformRampDownDuration),
- context.getResources().getInteger(
- com.android.internal.R.integer.config_vibrationWaveformRampStepDuration));
+ this(context, handler, new VibrationConfig(context.getResources()));
}
@VisibleForTesting
- VibrationSettings(Context context, Handler handler, int rampDownDuration,
- int rampStepDuration) {
+ VibrationSettings(Context context, Handler handler, VibrationConfig config) {
mContext = context;
+ mVibrationConfig = config;
mSettingObserver = new SettingsObserver(handler);
mUidObserver = new UidObserver();
mUserReceiver = new UserObserver();
- // TODO(b/191150049): move these to vibrator static config file
- mRampDownDuration = rampDownDuration;
- mRampStepDuration = rampStepDuration;
-
VibrationEffect clickEffect = createEffectFromResource(
com.android.internal.R.array.config_virtualKeyVibePattern);
VibrationEffect doubleClickEffect = createEffectFromResource(
@@ -179,7 +163,6 @@
public void onSystemReady() {
synchronized (mLock) {
- mVibrator = mContext.getSystemService(Vibrator.class);
mAudioManager = mContext.getSystemService(AudioManager.class);
}
try {
@@ -214,12 +197,21 @@
IntentFilter filter = new IntentFilter(Intent.ACTION_USER_SWITCHED);
mContext.registerReceiver(mUserReceiver, filter, Context.RECEIVER_NOT_EXPORTED);
+ // Listen to all settings that might affect the result of Vibrator.getVibrationIntensity.
registerSettingsObserver(Settings.System.getUriFor(Settings.System.VIBRATE_INPUT_DEVICES));
registerSettingsObserver(Settings.System.getUriFor(Settings.System.VIBRATE_WHEN_RINGING));
registerSettingsObserver(Settings.System.getUriFor(Settings.System.APPLY_RAMPING_RINGER));
+ registerSettingsObserver(Settings.System.getUriFor(
+ Settings.System.HAPTIC_FEEDBACK_ENABLED));
+ registerSettingsObserver(
+ Settings.System.getUriFor(Settings.System.ALARM_VIBRATION_INTENSITY));
registerSettingsObserver(
Settings.System.getUriFor(Settings.System.HAPTIC_FEEDBACK_INTENSITY));
registerSettingsObserver(
+ Settings.System.getUriFor(Settings.System.HARDWARE_HAPTIC_FEEDBACK_INTENSITY));
+ registerSettingsObserver(
+ Settings.System.getUriFor(Settings.System.MEDIA_VIBRATION_INTENSITY));
+ registerSettingsObserver(
Settings.System.getUriFor(Settings.System.NOTIFICATION_VIBRATION_INTENSITY));
registerSettingsObserver(
Settings.System.getUriFor(Settings.System.RING_VIBRATION_INTENSITY));
@@ -253,7 +245,7 @@
* devices without PWLE support.
*/
public int getRampStepDuration() {
- return mRampStepDuration;
+ return mVibrationConfig.getRampStepDurationMs();
}
/**
@@ -261,7 +253,7 @@
* when a vibration is cancelled or finished at non-zero amplitude.
*/
public int getRampDownDuration() {
- return mRampDownDuration;
+ return mVibrationConfig.getRampDownDurationMs();
}
/**
@@ -270,25 +262,8 @@
* @param usageHint one of VibrationAttributes.USAGE_*
* @return The vibration intensity, one of Vibrator.VIBRATION_INTENSITY_*
*/
- public int getDefaultIntensity(int usageHint) {
- if (usageHint == USAGE_ALARM) {
- return Vibrator.VIBRATION_INTENSITY_HIGH;
- }
- synchronized (mLock) {
- if (mVibrator != null) {
- switch (usageHint) {
- case USAGE_RINGTONE:
- return mVibrator.getDefaultRingVibrationIntensity();
- case USAGE_NOTIFICATION:
- return mVibrator.getDefaultNotificationVibrationIntensity();
- case USAGE_TOUCH:
- case USAGE_HARDWARE_FEEDBACK:
- case USAGE_PHYSICAL_EMULATION:
- return mVibrator.getDefaultHapticFeedbackIntensity();
- }
- }
- }
- return Vibrator.VIBRATION_INTENSITY_MEDIUM;
+ public int getDefaultIntensity(@VibrationAttributes.Usage int usageHint) {
+ return mVibrationConfig.getDefaultVibrationIntensity(usageHint);
}
/**
@@ -297,23 +272,10 @@
* @param usageHint one of VibrationAttributes.USAGE_*
* @return The vibration intensity, one of Vibrator.VIBRATION_INTENSITY_*
*/
- public int getCurrentIntensity(int usageHint) {
+ public int getCurrentIntensity(@VibrationAttributes.Usage int usageHint) {
+ int defaultIntensity = getDefaultIntensity(usageHint);
synchronized (mLock) {
- switch (usageHint) {
- case USAGE_RINGTONE:
- return mRingIntensity;
- case USAGE_NOTIFICATION:
- return mNotificationIntensity;
- case USAGE_TOUCH:
- return mHapticFeedbackIntensity;
- case USAGE_HARDWARE_FEEDBACK:
- case USAGE_PHYSICAL_EMULATION:
- return mHardwareFeedbackIntensity;
- case USAGE_ALARM:
- return Vibrator.VIBRATION_INTENSITY_HIGH;
- default:
- return Vibrator.VIBRATION_INTENSITY_MEDIUM;
- }
+ return mCurrentVibrationIntensities.get(usageHint, defaultIntensity);
}
}
@@ -371,7 +333,7 @@
* for touch and ringtone usages only. All other usages are allowed by this method.
*/
@GuardedBy("mLock")
- private boolean shouldVibrateForRingerModeLocked(int usageHint) {
+ private boolean shouldVibrateForRingerModeLocked(@VibrationAttributes.Usage int usageHint) {
// If audio manager was not loaded yet then assume most restrictive mode.
int ringerMode = (mAudioManager == null)
? AudioManager.RINGER_MODE_SILENT
@@ -379,18 +341,9 @@
switch (usageHint) {
case USAGE_TOUCH:
- // Touch feedback disabled when phone is on silent mode.
- return ringerMode != AudioManager.RINGER_MODE_SILENT;
case USAGE_RINGTONE:
- switch (ringerMode) {
- case AudioManager.RINGER_MODE_SILENT:
- return false;
- case AudioManager.RINGER_MODE_VIBRATE:
- return true;
- default:
- // Ringtone vibrations also depend on 2 other settings:
- return mVibrateWhenRinging || mApplyRampingRinger;
- }
+ // Touch feedback and ringtone disabled when phone is on silent mode.
+ return ringerMode != AudioManager.RINGER_MODE_SILENT;
default:
// All other usages ignore ringer mode settings.
return true;
@@ -401,64 +354,89 @@
@VisibleForTesting
void updateSettings() {
synchronized (mLock) {
- mVibrateWhenRinging = getSystemSetting(Settings.System.VIBRATE_WHEN_RINGING, 0) != 0;
- mApplyRampingRinger = getSystemSetting(Settings.System.APPLY_RAMPING_RINGER, 0) != 0;
- mHapticFeedbackIntensity = getSystemSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY,
- getDefaultIntensity(USAGE_TOUCH));
- mHardwareFeedbackIntensity = getSystemSetting(
- Settings.System.HARDWARE_HAPTIC_FEEDBACK_INTENSITY,
- getHardwareFeedbackIntensityWhenSettingIsMissing(mHapticFeedbackIntensity));
- mNotificationIntensity = getSystemSetting(
- Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
- getDefaultIntensity(USAGE_NOTIFICATION));
- mRingIntensity = getSystemSetting(Settings.System.RING_VIBRATION_INTENSITY,
+ mVibrateInputDevices = loadSystemSetting(Settings.System.VIBRATE_INPUT_DEVICES, 0) > 0;
+
+ int alarmIntensity = toIntensity(
+ loadSystemSetting(Settings.System.ALARM_VIBRATION_INTENSITY, -1),
+ getDefaultIntensity(USAGE_ALARM));
+ int defaultHapticFeedbackIntensity = getDefaultIntensity(USAGE_TOUCH);
+ int hapticFeedbackIntensity = toIntensity(
+ loadSystemSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY, -1),
+ defaultHapticFeedbackIntensity);
+ int positiveHapticFeedbackIntensity = toPositiveIntensity(
+ hapticFeedbackIntensity, defaultHapticFeedbackIntensity);
+ int hardwareFeedbackIntensity = toIntensity(
+ loadSystemSetting(Settings.System.HARDWARE_HAPTIC_FEEDBACK_INTENSITY, -1),
+ positiveHapticFeedbackIntensity);
+ int mediaIntensity = toIntensity(
+ loadSystemSetting(Settings.System.MEDIA_VIBRATION_INTENSITY, -1),
+ getDefaultIntensity(USAGE_MEDIA));
+ int defaultNotificationIntensity = getDefaultIntensity(USAGE_NOTIFICATION);
+ int notificationIntensity = toIntensity(
+ loadSystemSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY, -1),
+ defaultNotificationIntensity);
+ int positiveNotificationIntensity = toPositiveIntensity(
+ notificationIntensity, defaultNotificationIntensity);
+ int ringIntensity = toIntensity(
+ loadSystemSetting(Settings.System.RING_VIBRATION_INTENSITY, -1),
getDefaultIntensity(USAGE_RINGTONE));
- mVibrateInputDevices = getSystemSetting(Settings.System.VIBRATE_INPUT_DEVICES, 0) > 0;
+
+
+ mCurrentVibrationIntensities.clear();
+ mCurrentVibrationIntensities.put(USAGE_ALARM, alarmIntensity);
+ mCurrentVibrationIntensities.put(USAGE_NOTIFICATION, notificationIntensity);
+ mCurrentVibrationIntensities.put(USAGE_MEDIA, mediaIntensity);
+ mCurrentVibrationIntensities.put(USAGE_UNKNOWN, mediaIntensity);
+
+ // Communication request is not disabled by the notification setting.
+ mCurrentVibrationIntensities.put(USAGE_COMMUNICATION_REQUEST,
+ positiveNotificationIntensity);
+
+ if (!loadBooleanSetting(Settings.System.VIBRATE_WHEN_RINGING)
+ && !loadBooleanSetting(Settings.System.APPLY_RAMPING_RINGER)) {
+ // Make sure deprecated boolean setting still disables ringtone vibrations.
+ mCurrentVibrationIntensities.put(USAGE_RINGTONE, Vibrator.VIBRATION_INTENSITY_OFF);
+ } else {
+ mCurrentVibrationIntensities.put(USAGE_RINGTONE, ringIntensity);
+ }
+
+ // This should adapt the behavior preceding the introduction of this new setting
+ // key, which is to apply HAPTIC_FEEDBACK_INTENSITY, unless it's disabled.
+ mCurrentVibrationIntensities.put(USAGE_HARDWARE_FEEDBACK, hardwareFeedbackIntensity);
+ mCurrentVibrationIntensities.put(USAGE_PHYSICAL_EMULATION, hardwareFeedbackIntensity);
+
+ if (!loadBooleanSetting(Settings.System.HAPTIC_FEEDBACK_ENABLED)) {
+ // Make sure deprecated boolean setting still disables touch vibrations.
+ mCurrentVibrationIntensities.put(USAGE_TOUCH, Vibrator.VIBRATION_INTENSITY_OFF);
+ } else {
+ mCurrentVibrationIntensities.put(USAGE_TOUCH, hapticFeedbackIntensity);
+ }
+
+ // A11y is not disabled by any haptic feedback setting.
+ mCurrentVibrationIntensities.put(USAGE_ACCESSIBILITY, positiveHapticFeedbackIntensity);
}
notifyListeners();
}
- /**
- * Return the value to be used for {@link Settings.System#HARDWARE_HAPTIC_FEEDBACK_INTENSITY}
- * when the value was not set by the user.
- *
- * <p>This should adapt the behavior preceding the introduction of this new setting key, which
- * is to apply {@link Settings.System#HAPTIC_FEEDBACK_INTENSITY} unless it's disabled.
- */
- private int getHardwareFeedbackIntensityWhenSettingIsMissing(int hapticFeedbackIntensity) {
- if (hapticFeedbackIntensity == Vibrator.VIBRATION_INTENSITY_OFF) {
- return getDefaultIntensity(USAGE_HARDWARE_FEEDBACK);
- }
- return hapticFeedbackIntensity;
- }
-
@Override
public String toString() {
synchronized (mLock) {
+ StringBuilder vibrationIntensitiesString = new StringBuilder("{");
+ for (int i = 0; i < mCurrentVibrationIntensities.size(); i++) {
+ int usage = mCurrentVibrationIntensities.keyAt(i);
+ int intensity = mCurrentVibrationIntensities.valueAt(i);
+ vibrationIntensitiesString.append(VibrationAttributes.usageToString(usage))
+ .append("=(").append(intensityToString(intensity))
+ .append(",default:").append(intensityToString(getDefaultIntensity(usage)))
+ .append("), ");
+ }
+ vibrationIntensitiesString.append('}');
return "VibrationSettings{"
- + "mVibrateInputDevices=" + mVibrateInputDevices
- + ", mVibrateWhenRinging=" + mVibrateWhenRinging
- + ", mApplyRampingRinger=" + mApplyRampingRinger
+ + "mVibratorConfig=" + mVibrationConfig
+ + ", mVibrateInputDevices=" + mVibrateInputDevices
+ ", mBatterySaverMode=" + mBatterySaverMode
+ ", mProcStatesCache=" + mUidObserver.mProcStatesCache
- + ", mHapticChannelMaxVibrationAmplitude="
- + getHapticChannelMaxVibrationAmplitude()
- + ", mRampStepDuration=" + mRampStepDuration
- + ", mRampDownDuration=" + mRampDownDuration
- + ", mHardwareHapticFeedbackIntensity="
- + intensityToString(getCurrentIntensity(USAGE_HARDWARE_FEEDBACK))
- + ", mHapticFeedbackIntensity="
- + intensityToString(getCurrentIntensity(USAGE_TOUCH))
- + ", mHapticFeedbackDefaultIntensity="
- + intensityToString(getDefaultIntensity(USAGE_TOUCH))
- + ", mNotificationIntensity="
- + intensityToString(getCurrentIntensity(USAGE_NOTIFICATION))
- + ", mNotificationDefaultIntensity="
- + intensityToString(getDefaultIntensity(USAGE_NOTIFICATION))
- + ", mRingIntensity="
- + intensityToString(getCurrentIntensity(USAGE_RINGTONE))
- + ", mRingDefaultIntensity="
- + intensityToString(getDefaultIntensity(USAGE_RINGTONE))
+ + ", mVibrationIntensities=" + vibrationIntensitiesString
+ '}';
}
}
@@ -466,16 +444,28 @@
/** Write current settings into given {@link ProtoOutputStream}. */
public void dumpProto(ProtoOutputStream proto) {
synchronized (mLock) {
+ proto.write(VibratorManagerServiceDumpProto.ALARM_INTENSITY,
+ getCurrentIntensity(USAGE_ALARM));
+ proto.write(VibratorManagerServiceDumpProto.ALARM_DEFAULT_INTENSITY,
+ getDefaultIntensity(USAGE_ALARM));
+ proto.write(VibratorManagerServiceDumpProto.HARDWARE_FEEDBACK_INTENSITY,
+ getCurrentIntensity(USAGE_HARDWARE_FEEDBACK));
+ proto.write(VibratorManagerServiceDumpProto.HARDWARE_FEEDBACK_DEFAULT_INTENSITY,
+ getDefaultIntensity(USAGE_HARDWARE_FEEDBACK));
proto.write(VibratorManagerServiceDumpProto.HAPTIC_FEEDBACK_INTENSITY,
- mHapticFeedbackIntensity);
+ getCurrentIntensity(USAGE_TOUCH));
proto.write(VibratorManagerServiceDumpProto.HAPTIC_FEEDBACK_DEFAULT_INTENSITY,
getDefaultIntensity(USAGE_TOUCH));
+ proto.write(VibratorManagerServiceDumpProto.MEDIA_INTENSITY,
+ getCurrentIntensity(USAGE_MEDIA));
+ proto.write(VibratorManagerServiceDumpProto.MEDIA_DEFAULT_INTENSITY,
+ getDefaultIntensity(USAGE_MEDIA));
proto.write(VibratorManagerServiceDumpProto.NOTIFICATION_INTENSITY,
- mNotificationIntensity);
+ getCurrentIntensity(USAGE_NOTIFICATION));
proto.write(VibratorManagerServiceDumpProto.NOTIFICATION_DEFAULT_INTENSITY,
getDefaultIntensity(USAGE_NOTIFICATION));
proto.write(VibratorManagerServiceDumpProto.RING_INTENSITY,
- mRingIntensity);
+ getCurrentIntensity(USAGE_RINGTONE));
proto.write(VibratorManagerServiceDumpProto.RING_DEFAULT_INTENSITY,
getDefaultIntensity(USAGE_RINGTONE));
}
@@ -506,13 +496,29 @@
}
}
- private float getHapticChannelMaxVibrationAmplitude() {
- synchronized (mLock) {
- return mVibrator == null ? Float.NaN : mVibrator.getHapticChannelMaximumAmplitude();
+ @VibrationIntensity
+ private int toPositiveIntensity(int value, @VibrationIntensity int defaultValue) {
+ if (value == Vibrator.VIBRATION_INTENSITY_OFF) {
+ return defaultValue;
}
+ return toIntensity(value, defaultValue);
}
- private int getSystemSetting(String settingName, int defaultValue) {
+ @VibrationIntensity
+ private int toIntensity(int value, @VibrationIntensity int defaultValue) {
+ if ((value < Vibrator.VIBRATION_INTENSITY_OFF)
+ || (value > Vibrator.VIBRATION_INTENSITY_HIGH)) {
+ return defaultValue;
+ }
+ return value;
+ }
+
+ private boolean loadBooleanSetting(String settingKey) {
+ return Settings.System.getIntForUser(mContext.getContentResolver(),
+ settingKey, 0, UserHandle.USER_CURRENT) != 0;
+ }
+
+ private int loadSystemSetting(String settingName, int defaultValue) {
return Settings.System.getIntForUser(mContext.getContentResolver(),
settingName, defaultValue, UserHandle.USER_CURRENT);
}
diff --git a/services/core/java/com/android/server/wm/AccessibilityController.java b/services/core/java/com/android/server/wm/AccessibilityController.java
index 0396a11..8f703c5 100644
--- a/services/core/java/com/android/server/wm/AccessibilityController.java
+++ b/services/core/java/com/android/server/wm/AccessibilityController.java
@@ -45,7 +45,6 @@
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
import static com.android.server.wm.WindowTracing.WINSCOPE_EXT;
-import static com.android.server.wm.utils.RegionUtils.forEachRect;
import android.accessibilityservice.AccessibilityTrace;
import android.animation.ObjectAnimator;
@@ -101,6 +100,7 @@
import com.android.internal.util.function.pooled.PooledLambda;
import com.android.server.LocalServices;
import com.android.server.policy.WindowManagerPolicy;
+import com.android.server.wm.AccessibilityWindowsPopulator.AccessibilityWindow;
import com.android.server.wm.WindowManagerInternal.AccessibilityControllerInternal;
import com.android.server.wm.WindowManagerInternal.MagnificationCallbacks;
import com.android.server.wm.WindowManagerInternal.WindowsForAccessibilityCallback;
@@ -133,19 +133,22 @@
private static final Rect EMPTY_RECT = new Rect();
private static final float[] sTempFloats = new float[9];
- private SparseArray<DisplayMagnifier> mDisplayMagnifiers = new SparseArray<>();
- private SparseArray<WindowsForAccessibilityObserver> mWindowsForAccessibilityObserver =
+ private final SparseArray<DisplayMagnifier> mDisplayMagnifiers = new SparseArray<>();
+ private final SparseArray<WindowsForAccessibilityObserver> mWindowsForAccessibilityObserver =
new SparseArray<>();
private SparseArray<IBinder> mFocusedWindow = new SparseArray<>();
private int mFocusedDisplay = -1;
private boolean mIsImeVisible = false;
// Set to true if initializing window population complete.
private boolean mAllObserversInitialized = true;
+ private final AccessibilityWindowsPopulator mAccessibilityWindowsPopulator;
AccessibilityController(WindowManagerService service) {
mService = service;
mAccessibilityTracing =
AccessibilityController.getAccessibilityControllerInternal(service);
+
+ mAccessibilityWindowsPopulator = new AccessibilityWindowsPopulator(mService, this);
}
boolean setMagnificationCallbacks(int displayId, MagnificationCallbacks callbacks) {
@@ -209,7 +212,9 @@
}
mWindowsForAccessibilityObserver.remove(displayId);
}
- observer = new WindowsForAccessibilityObserver(mService, displayId, callback);
+ mAccessibilityWindowsPopulator.setWindowsNotification(true);
+ observer = new WindowsForAccessibilityObserver(mService, displayId, callback,
+ mAccessibilityWindowsPopulator);
mWindowsForAccessibilityObserver.put(displayId, observer);
mAllObserversInitialized &= observer.mInitialized;
} else {
@@ -224,6 +229,10 @@
}
}
mWindowsForAccessibilityObserver.remove(displayId);
+
+ if (mWindowsForAccessibilityObserver.size() <= 0) {
+ mAccessibilityWindowsPopulator.setWindowsNotification(false);
+ }
}
}
@@ -309,11 +318,6 @@
if (displayMagnifier != null) {
displayMagnifier.onDisplaySizeChanged(displayContent);
}
- final WindowsForAccessibilityObserver windowsForA11yObserver =
- mWindowsForAccessibilityObserver.get(displayId);
- if (windowsForA11yObserver != null) {
- windowsForA11yObserver.scheduleComputeChangedWindows();
- }
}
void onAppWindowTransition(int displayId, int transition) {
@@ -341,11 +345,6 @@
if (displayMagnifier != null) {
displayMagnifier.onWindowTransition(windowState, transition);
}
- final WindowsForAccessibilityObserver windowsForA11yObserver =
- mWindowsForAccessibilityObserver.get(displayId);
- if (windowsForA11yObserver != null) {
- windowsForA11yObserver.scheduleComputeChangedWindows();
- }
}
void onWindowFocusChangedNot(int displayId) {
@@ -455,6 +454,19 @@
return null;
}
+ boolean getMagnificationSpecForDisplay(int displayId, MagnificationSpec outSpec) {
+ if (mAccessibilityTracing.isTracingEnabled(FLAGS_MAGNIFICATION_CALLBACK)) {
+ mAccessibilityTracing.logTrace(TAG + ".getMagnificationSpecForDisplay",
+ FLAGS_MAGNIFICATION_CALLBACK, "displayId=" + displayId);
+ }
+ final DisplayMagnifier displayMagnifier = mDisplayMagnifiers.get(displayId);
+ if (displayMagnifier == null) {
+ return false;
+ }
+
+ return displayMagnifier.getMagnificationSpec(outSpec);
+ }
+
boolean hasCallbacks() {
if (mAccessibilityTracing.isTracingEnabled(FLAGS_MAGNIFICATION_CALLBACK
| FLAGS_WINDOWS_FOR_ACCESSIBILITY_CALLBACK)) {
@@ -756,6 +768,25 @@
return spec;
}
+ boolean getMagnificationSpec(MagnificationSpec outSpec) {
+ if (mAccessibilityTracing.isTracingEnabled(FLAGS_MAGNIFICATION_CALLBACK)) {
+ mAccessibilityTracing.logTrace(LOG_TAG + ".getMagnificationSpec",
+ FLAGS_MAGNIFICATION_CALLBACK);
+ }
+ MagnificationSpec spec = mMagnifedViewport.getMagnificationSpec();
+ if (spec == null) {
+ return false;
+ }
+
+ outSpec.setTo(spec);
+ if (mAccessibilityTracing.isTracingEnabled(FLAGS_MAGNIFICATION_CALLBACK)) {
+ mAccessibilityTracing.logTrace(LOG_TAG + ".getMagnificationSpec",
+ FLAGS_MAGNIFICATION_CALLBACK, "outSpec={" + outSpec + "}");
+ }
+
+ return true;
+ }
+
void getMagnificationRegion(Region outMagnificationRegion) {
if (mAccessibilityTracing.isTracingEnabled(FLAGS_MAGNIFICATION_CALLBACK)) {
mAccessibilityTracing.logTrace(LOG_TAG + ".getMagnificationRegion",
@@ -1403,20 +1434,18 @@
private static final boolean DEBUG = false;
- private final SparseArray<WindowState> mTempWindowStates = new SparseArray<>();
+ private final List<AccessibilityWindow> mTempA11yWindows = new ArrayList<>();
private final Set<IBinder> mTempBinderSet = new ArraySet<>();
- private final RectF mTempRectF = new RectF();
-
- private final Matrix mTempMatrix = new Matrix();
-
private final Point mTempPoint = new Point();
private final Region mTempRegion = new Region();
private final Region mTempRegion1 = new Region();
+ private final Region mTempRegion2 = new Region();
+
private final WindowManagerService mService;
private final Handler mHandler;
@@ -1431,10 +1460,11 @@
// Set to true if initializing window population complete.
private boolean mInitialized;
+ private final AccessibilityWindowsPopulator mA11yWindowsPopulator;
WindowsForAccessibilityObserver(WindowManagerService windowManagerService,
- int displayId,
- WindowsForAccessibilityCallback callback) {
+ int displayId, WindowsForAccessibilityCallback callback,
+ AccessibilityWindowsPopulator accessibilityWindowsPopulator) {
mService = windowManagerService;
mCallback = callback;
mDisplayId = displayId;
@@ -1443,6 +1473,7 @@
AccessibilityController.getAccessibilityControllerInternal(mService);
mRecurringAccessibilityEventsIntervalMillis = ViewConfiguration
.getSendRecurringAccessibilityEventsInterval();
+ mA11yWindowsPopulator = accessibilityWindowsPopulator;
computeChangedWindows(true);
}
@@ -1466,52 +1497,6 @@
}
}
- boolean shellRootIsAbove(WindowState windowState, ShellRoot shellRoot) {
- int wsLayer = mService.mPolicy.getWindowLayerLw(windowState);
- int shellLayer = mService.mPolicy.getWindowLayerFromTypeLw(shellRoot.getWindowType(),
- true);
- return shellLayer >= wsLayer;
- }
-
- int addShellRootsIfAbove(WindowState windowState, ArrayList<ShellRoot> shellRoots,
- int shellRootIndex, List<WindowInfo> windows, Set<IBinder> addedWindows,
- Region unaccountedSpace, boolean focusedWindowAdded) {
- while (shellRootIndex < shellRoots.size()
- && shellRootIsAbove(windowState, shellRoots.get(shellRootIndex))) {
- ShellRoot shellRoot = shellRoots.get(shellRootIndex);
- shellRootIndex++;
- final WindowInfo info = shellRoot.getWindowInfo();
- if (info == null) {
- continue;
- }
-
- info.layer = addedWindows.size();
- windows.add(info);
- addedWindows.add(info.token);
- unaccountedSpace.op(info.regionInScreen, unaccountedSpace,
- Region.Op.REVERSE_DIFFERENCE);
- if (unaccountedSpace.isEmpty() && focusedWindowAdded) {
- break;
- }
- }
- return shellRootIndex;
- }
-
- private ArrayList<ShellRoot> getSortedShellRoots(
- SparseArray<ShellRoot> originalShellRoots) {
- ArrayList<ShellRoot> sortedShellRoots = new ArrayList<>(originalShellRoots.size());
- for (int i = originalShellRoots.size() - 1; i >= 0; --i) {
- sortedShellRoots.add(originalShellRoots.valueAt(i));
- }
-
- sortedShellRoots.sort((left, right) ->
- mService.mPolicy.getWindowLayerFromTypeLw(right.getWindowType(), true)
- - mService.mPolicy.getWindowLayerFromTypeLw(left.getWindowType(),
- true));
-
- return sortedShellRoots;
- }
-
/**
* Check if windows have changed, and send them to the accessibility subsystem if they have.
*
@@ -1561,44 +1546,29 @@
Region unaccountedSpace = mTempRegion;
unaccountedSpace.set(0, 0, screenWidth, screenHeight);
- final SparseArray<WindowState> visibleWindows = mTempWindowStates;
- populateVisibleWindowsOnScreen(visibleWindows);
+ final List<AccessibilityWindow> visibleWindows = mTempA11yWindows;
+ mA11yWindowsPopulator.populateVisibleWindowsOnScreenLocked(
+ mDisplayId, visibleWindows);
Set<IBinder> addedWindows = mTempBinderSet;
addedWindows.clear();
boolean focusedWindowAdded = false;
final int visibleWindowCount = visibleWindows.size();
- ArrayList<TaskFragment> skipRemainingWindowsForTaskFragments = new ArrayList<>();
-
- ArrayList<ShellRoot> shellRoots = getSortedShellRoots(dc.mShellRoots);
// Iterate until we figure out what is touchable for the entire screen.
- int shellRootIndex = 0;
- for (int i = visibleWindowCount - 1; i >= 0; i--) {
- final WindowState windowState = visibleWindows.valueAt(i);
- int prevShellRootIndex = shellRootIndex;
- shellRootIndex = addShellRootsIfAbove(windowState, shellRoots, shellRootIndex,
- windows, addedWindows, unaccountedSpace, focusedWindowAdded);
-
- // If a Shell Root was added, it could have accounted for all the space already.
- if (shellRootIndex > prevShellRootIndex && unaccountedSpace.isEmpty()
- && focusedWindowAdded) {
- break;
- }
-
- final Region regionInScreen = new Region();
- computeWindowRegionInScreen(windowState, regionInScreen);
- if (windowMattersToAccessibility(windowState,
- regionInScreen, unaccountedSpace,
- skipRemainingWindowsForTaskFragments)) {
- addPopulatedWindowInfo(windowState, regionInScreen, windows, addedWindows);
- if (windowMattersToUnaccountedSpaceComputation(windowState)) {
- updateUnaccountedSpace(windowState, regionInScreen, unaccountedSpace,
- skipRemainingWindowsForTaskFragments);
+ for (int i = 0; i < visibleWindowCount; i++) {
+ final AccessibilityWindow a11yWindow = visibleWindows.get(i);
+ final Region regionInWindow = new Region();
+ a11yWindow.getTouchableRegionInWindow(regionInWindow);
+ if (windowMattersToAccessibility(a11yWindow, regionInWindow,
+ unaccountedSpace)) {
+ addPopulatedWindowInfo(a11yWindow, regionInWindow, windows, addedWindows);
+ if (windowMattersToUnaccountedSpaceComputation(a11yWindow)) {
+ updateUnaccountedSpace(a11yWindow, unaccountedSpace);
}
- focusedWindowAdded |= windowState.isFocused();
- } else if (isUntouchableNavigationBar(windowState, mTempRegion1)) {
+ focusedWindowAdded |= a11yWindow.isFocused();
+ } else if (a11yWindow.isUntouchableNavigationBar()) {
// If this widow is navigation bar without touchable region, accounting the
// region of navigation bar inset because all touch events from this region
// would be received by launcher, i.e. this region is a un-touchable one
@@ -1647,47 +1617,39 @@
// Some windows should be excluded from unaccounted space computation, though they still
// should be reported
- private boolean windowMattersToUnaccountedSpaceComputation(WindowState windowState) {
+ private boolean windowMattersToUnaccountedSpaceComputation(AccessibilityWindow a11yWindow) {
// Do not account space of trusted non-touchable windows, except the split-screen
// divider.
// If it's not trusted, touch events are not sent to the windows behind it.
- if (((windowState.mAttrs.flags & WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE) != 0)
- && (windowState.mAttrs.type != TYPE_DOCK_DIVIDER)
- && windowState.isTrustedOverlay()) {
+ if (((a11yWindow.getFlags() & WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE) != 0)
+ && (a11yWindow.getType() != TYPE_DOCK_DIVIDER)
+ && a11yWindow.isTrustedOverlay()) {
return false;
}
- if (windowState.mAttrs.type
- == WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY) {
+ if (a11yWindow.getType() == WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY) {
return false;
}
return true;
}
- private boolean windowMattersToAccessibility(WindowState windowState,
- Region regionInScreen, Region unaccountedSpace,
- ArrayList<TaskFragment> skipRemainingWindowsForTaskFragments) {
- final RecentsAnimationController controller = mService.getRecentsAnimationController();
- if (controller != null && controller.shouldIgnoreForAccessibility(windowState)) {
+ private boolean windowMattersToAccessibility(AccessibilityWindow a11yWindow,
+ Region regionInScreen, Region unaccountedSpace) {
+ if (a11yWindow.ignoreRecentsAnimationForAccessibility()) {
return false;
}
- if (windowState.isFocused()) {
+ if (a11yWindow.isFocused()) {
return true;
}
- // If the window is part of a task that we're finished with - ignore.
- final TaskFragment taskFragment = windowState.getTaskFragment();
- if (taskFragment != null
- && skipRemainingWindowsForTaskFragments.contains(taskFragment)) {
- return false;
- }
-
// Ignore non-touchable windows, except the split-screen divider, which is
// occasionally non-touchable but still useful for identifying split-screen
- // mode.
- if (((windowState.mAttrs.flags & WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE) != 0)
- && (windowState.mAttrs.type != TYPE_DOCK_DIVIDER)) {
+ // mode and the PIP menu.
+ if (((a11yWindow.getFlags()
+ & WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE) != 0)
+ && (a11yWindow.getType() != TYPE_DOCK_DIVIDER
+ && !a11yWindow.isPIPMenu())) {
return false;
}
@@ -1697,88 +1659,36 @@
}
// Add windows of certain types not covered by modal windows.
- if (isReportedWindowType(windowState.mAttrs.type)) {
+ if (isReportedWindowType(a11yWindow.getType())) {
return true;
}
return false;
}
- private void updateUnaccountedSpace(WindowState windowState, Region regionInScreen,
- Region unaccountedSpace,
- ArrayList<TaskFragment> skipRemainingWindowsForTaskFragments) {
- // Account for the space this window takes if the window
- // is not an accessibility overlay which does not change
- // the reported windows.
- unaccountedSpace.op(regionInScreen, unaccountedSpace,
- Region.Op.REVERSE_DIFFERENCE);
-
- // If a window is modal it prevents other windows from being touched
- if ((windowState.mAttrs.flags & (WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
- | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL)) == 0) {
- if (!windowState.hasTapExcludeRegion()) {
- // Account for all space in the task, whether the windows in it are
- // touchable or not. The modal window blocks all touches from the task's
- // area.
- unaccountedSpace.op(windowState.getDisplayFrame(), unaccountedSpace,
- Region.Op.REVERSE_DIFFERENCE);
- } else {
- // If a window has tap exclude region, we need to account it.
- final Region displayRegion = new Region(windowState.getDisplayFrame());
- final Region tapExcludeRegion = new Region();
- windowState.getTapExcludeRegion(tapExcludeRegion);
- displayRegion.op(tapExcludeRegion, displayRegion,
- Region.Op.REVERSE_DIFFERENCE);
- unaccountedSpace.op(displayRegion, unaccountedSpace,
- Region.Op.REVERSE_DIFFERENCE);
- }
-
- final TaskFragment taskFragment = windowState.getTaskFragment();
- if (taskFragment != null) {
- // If the window is associated with a particular task, we can skip the
- // rest of the windows for that task.
- skipRemainingWindowsForTaskFragments.add(taskFragment);
- } else if (!windowState.hasTapExcludeRegion()) {
- // If the window is not associated with a particular task, then it is
- // globally modal. In this case we can skip all remaining windows when
- // it doesn't has tap exclude region.
- unaccountedSpace.setEmpty();
- }
- }
-
- // Account for the space of letterbox.
- if (windowState.areAppWindowBoundsLetterboxed()) {
- unaccountedSpace.op(getLetterboxBounds(windowState), unaccountedSpace,
+ private void updateUnaccountedSpace(AccessibilityWindow a11yWindow,
+ Region unaccountedSpace) {
+ if (a11yWindow.getType()
+ != WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY) {
+ // Account for the space this window takes if the window
+ // is not an accessibility overlay which does not change
+ // the reported windows.
+ final Region touchableRegion = mTempRegion2;
+ a11yWindow.getTouchableRegionInScreen(touchableRegion);
+ unaccountedSpace.op(touchableRegion, unaccountedSpace,
Region.Op.REVERSE_DIFFERENCE);
+ // Account for the space of letterbox.
+ final Region letterboxBounds = mTempRegion1;
+ if (a11yWindow.setLetterBoxBoundsIfNeeded(letterboxBounds)) {
+ unaccountedSpace.op(letterboxBounds,
+ unaccountedSpace, Region.Op.REVERSE_DIFFERENCE);
+ }
}
}
- private void computeWindowRegionInScreen(WindowState windowState, Region outRegion) {
- // Get the touchable frame.
- Region touchableRegion = mTempRegion1;
- windowState.getTouchableRegion(touchableRegion);
-
- // Map the frame to get what appears on the screen.
- Matrix matrix = mTempMatrix;
- populateTransformationMatrix(windowState, matrix);
-
- forEachRect(touchableRegion, rect -> {
- // Move to origin as all transforms are captured by the matrix.
- RectF windowFrame = mTempRectF;
- windowFrame.set(rect);
- windowFrame.offset(-windowState.getFrame().left, -windowState.getFrame().top);
-
- matrix.mapRect(windowFrame);
-
- // Union all rects.
- outRegion.union(new Rect((int) windowFrame.left, (int) windowFrame.top,
- (int) windowFrame.right, (int) windowFrame.bottom));
- });
- }
-
- private static void addPopulatedWindowInfo(WindowState windowState, Region regionInScreen,
- List<WindowInfo> out, Set<IBinder> tokenOut) {
- final WindowInfo window = windowState.getWindowInfo();
+ private static void addPopulatedWindowInfo(AccessibilityWindow a11yWindow,
+ Region regionInScreen, List<WindowInfo> out, Set<IBinder> tokenOut) {
+ final WindowInfo window = a11yWindow.getWindowInfo();
window.regionInScreen.set(regionInScreen);
window.layer = tokenOut.size();
out.add(window);
@@ -1805,23 +1715,6 @@
&& windowType != WindowManager.LayoutParams.TYPE_PRIVATE_PRESENTATION);
}
- private void populateVisibleWindowsOnScreen(SparseArray<WindowState> outWindows) {
- final List<WindowState> tempWindowStatesList = new ArrayList<>();
- final DisplayContent dc = mService.mRoot.getDisplayContent(mDisplayId);
- if (dc == null) {
- return;
- }
-
- dc.forAllWindows(w -> {
- if (w.isVisible()) {
- tempWindowStatesList.add(w);
- }
- }, false /* traverseTopToBottom */);
- for (int i = 0; i < tempWindowStatesList.size(); i++) {
- outWindows.put(i, tempWindowStatesList.get(i));
- }
- }
-
private WindowState getTopFocusWindow() {
return mService.mRoot.getTopFocusedDisplayContent().mCurrentFocus;
}
diff --git a/services/core/java/com/android/server/wm/AccessibilityWindowsPopulator.java b/services/core/java/com/android/server/wm/AccessibilityWindowsPopulator.java
new file mode 100644
index 0000000..f31ae06
--- /dev/null
+++ b/services/core/java/com/android/server/wm/AccessibilityWindowsPopulator.java
@@ -0,0 +1,625 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.wm;
+
+import static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER;
+
+import static com.android.server.wm.utils.RegionUtils.forEachRect;
+
+import android.annotation.NonNull;
+import android.graphics.Matrix;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.graphics.Region;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.Message;
+import android.util.Slog;
+import android.util.SparseArray;
+import android.view.IWindow;
+import android.view.InputWindowHandle;
+import android.view.MagnificationSpec;
+import android.view.WindowInfo;
+import android.view.WindowManager;
+import android.window.WindowInfosListener;
+
+import com.android.internal.annotations.GuardedBy;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * This class is the accessibility windows population adapter.
+ */
+public final class AccessibilityWindowsPopulator extends WindowInfosListener {
+
+ private static final String TAG = AccessibilityWindowsPopulator.class.getSimpleName();
+ // If the surface flinger callback is not coming within in 2 frames time, i.e. about
+ // 35ms, then assuming the windows become stable.
+ private static final int SURFACE_FLINGER_CALLBACK_WINDOWS_STABLE_TIMES_MS = 35;
+ // To avoid the surface flinger callbacks always comes within in 2 frames, then no windows
+ // are reported to the A11y framework, and the animation duration time is 500ms, so setting
+ // this value as the max timeout value to force computing changed windows.
+ private static final int WINDOWS_CHANGED_NOTIFICATION_MAX_DURATION_TIMES_MS = 500;
+
+ private static final float[] sTempFloats = new float[9];
+
+ private final WindowManagerService mService;
+ private final AccessibilityController mAccessibilityController;
+ @GuardedBy("mLock")
+ private final SparseArray<List<InputWindowHandle>> mInputWindowHandlesOnDisplays =
+ new SparseArray<>();
+ @GuardedBy("mLock")
+ private final SparseArray<Matrix> mMagnificationSpecInverseMatrix = new SparseArray<>();
+ @GuardedBy("mLock")
+ private final SparseArray<DisplayInfo> mDisplayInfos = new SparseArray<>();
+ @GuardedBy("mLock")
+ private final List<InputWindowHandle> mVisibleWindows = new ArrayList<>();
+ @GuardedBy("mLock")
+ private boolean mWindowsNotificationEnabled = false;
+ private final Object mLock = new Object();
+ private final Handler mHandler;
+
+ AccessibilityWindowsPopulator(WindowManagerService service,
+ AccessibilityController accessibilityController) {
+ mService = service;
+ mAccessibilityController = accessibilityController;
+ mHandler = new MyHandler(mService.mH.getLooper());
+
+ register();
+ }
+
+ /**
+ * Gets the visible windows list with the window layer on the specified display.
+ *
+ * @param displayId The display.
+ * @param outWindows The visible windows list. The z-order of each window in the list
+ * is from the top to bottom.
+ */
+ public void populateVisibleWindowsOnScreenLocked(int displayId,
+ List<AccessibilityWindow> outWindows) {
+ List<InputWindowHandle> inputWindowHandles;
+ final Matrix inverseMatrix = new Matrix();
+ final Matrix displayMatrix = new Matrix();
+
+ synchronized (mLock) {
+ inputWindowHandles = mInputWindowHandlesOnDisplays.get(displayId);
+ if (inputWindowHandles == null) {
+ outWindows.clear();
+
+ return;
+ }
+ inverseMatrix.set(mMagnificationSpecInverseMatrix.get(displayId));
+
+ final DisplayInfo displayInfo = mDisplayInfos.get(displayId);
+ if (displayInfo != null) {
+ displayMatrix.set(displayInfo.mTransform);
+ } else {
+ Slog.w(TAG, "The displayInfo of this displayId (" + displayId + ") called "
+ + "back from the surface fligner is null");
+ }
+ }
+
+ final DisplayContent dc = mService.mRoot.getDisplayContent(displayId);
+ final ShellRoot shellroot = dc.mShellRoots.get(WindowManager.SHELL_ROOT_LAYER_PIP);
+ final IBinder pipMenuIBinder =
+ shellroot != null ? shellroot.getAccessibilityWindowToken() : null;
+
+ for (final InputWindowHandle windowHandle : inputWindowHandles) {
+ final AccessibilityWindow accessibilityWindow =
+ AccessibilityWindow.initializeData(mService, windowHandle, inverseMatrix,
+ pipMenuIBinder, displayMatrix);
+
+ outWindows.add(accessibilityWindow);
+ }
+ }
+
+ @Override
+ public void onWindowInfosChanged(InputWindowHandle[] windowHandles,
+ DisplayInfo[] displayInfos) {
+ synchronized (mLock) {
+ mVisibleWindows.clear();
+ for (InputWindowHandle window : windowHandles) {
+ if (window.visible && window.getWindow() != null) {
+ mVisibleWindows.add(window);
+ }
+ }
+
+ mDisplayInfos.clear();
+ for (final DisplayInfo displayInfo : displayInfos) {
+ mDisplayInfos.put(displayInfo.mDisplayId, displayInfo);
+ }
+
+ if (mWindowsNotificationEnabled) {
+ if (!mHandler.hasMessages(
+ MyHandler.MESSAGE_NOTIFY_WINDOWS_CHANGED_BY_TIMEOUT)) {
+ mHandler.sendEmptyMessageDelayed(
+ MyHandler.MESSAGE_NOTIFY_WINDOWS_CHANGED_BY_TIMEOUT,
+ WINDOWS_CHANGED_NOTIFICATION_MAX_DURATION_TIMES_MS);
+ }
+ populateVisibleWindowHandlesAndNotifyWindowsChangeIfNeededLocked();
+ }
+ }
+ }
+
+ /**
+ * Sets to notify the accessibilityController to compute changed windows on
+ * the display after populating the visible windows if the windows reported
+ * from the surface flinger changes.
+ *
+ * @param register {@code true} means starting windows population.
+ */
+ public void setWindowsNotification(boolean register) {
+ synchronized (mLock) {
+ if (mWindowsNotificationEnabled == register) {
+ return;
+ }
+ mWindowsNotificationEnabled = register;
+ if (mWindowsNotificationEnabled) {
+ populateVisibleWindowHandlesAndNotifyWindowsChangeIfNeededLocked();
+ } else {
+ releaseResources();
+ }
+ }
+ }
+
+ private void populateVisibleWindowHandlesAndNotifyWindowsChangeIfNeededLocked() {
+ final SparseArray<List<InputWindowHandle>> tempWindowHandleList = new SparseArray<>();
+
+ for (final InputWindowHandle windowHandle : mVisibleWindows) {
+ List<InputWindowHandle> inputWindowHandles = tempWindowHandleList.get(
+ windowHandle.displayId);
+
+ if (inputWindowHandles == null) {
+ inputWindowHandles = new ArrayList<>();
+ tempWindowHandleList.put(windowHandle.displayId, inputWindowHandles);
+ generateMagnificationSpecInverseMatrixLocked(windowHandle.displayId);
+ }
+ inputWindowHandles.add(windowHandle);
+ }
+
+ final List<Integer> displayIdsForWindowsChanged = new ArrayList<>();
+
+ getDisplaysForWindowsChangedLocked(displayIdsForWindowsChanged, tempWindowHandleList,
+ mInputWindowHandlesOnDisplays);
+ // Clones all windows from the callback of the surface flinger.
+ mInputWindowHandlesOnDisplays.clear();
+ for (int i = 0; i < tempWindowHandleList.size(); i++) {
+ final int displayId = tempWindowHandleList.keyAt(i);
+ mInputWindowHandlesOnDisplays.put(displayId, tempWindowHandleList.get(displayId));
+ }
+
+ if (displayIdsForWindowsChanged.size() > 0) {
+ if (!mHandler.hasMessages(MyHandler.MESSAGE_NOTIFY_WINDOWS_CHANGED)) {
+ mHandler.obtainMessage(MyHandler.MESSAGE_NOTIFY_WINDOWS_CHANGED,
+ displayIdsForWindowsChanged).sendToTarget();
+ }
+
+ return;
+ }
+ mHandler.removeMessages(MyHandler.MESSAGE_NOTIFY_WINDOWS_CHANGED_BY_UI_STABLE);
+ mHandler.sendEmptyMessageDelayed(MyHandler.MESSAGE_NOTIFY_WINDOWS_CHANGED_BY_UI_STABLE,
+ SURFACE_FLINGER_CALLBACK_WINDOWS_STABLE_TIMES_MS);
+ }
+
+ private void getDisplaysForWindowsChangedLocked(List<Integer> outDisplayIdsForWindowsChanged,
+ SparseArray<List<InputWindowHandle>> newWindowsList,
+ SparseArray<List<InputWindowHandle>> oldWindowsList) {
+ for (int i = 0; i < newWindowsList.size(); i++) {
+ final int displayId = newWindowsList.keyAt(i);
+ final List<InputWindowHandle> newWindows = newWindowsList.get(displayId);
+ final List<InputWindowHandle> oldWindows = oldWindowsList.get(displayId);
+
+ if (hasWindowsChangedLocked(newWindows, oldWindows)) {
+ outDisplayIdsForWindowsChanged.add(displayId);
+ }
+ }
+ }
+
+ private boolean hasWindowsChangedLocked(List<InputWindowHandle> newWindows,
+ List<InputWindowHandle> oldWindows) {
+ if (oldWindows == null || oldWindows.size() != newWindows.size()) {
+ return true;
+ }
+
+ final int windowsCount = newWindows.size();
+ // Since we always traverse windows from high to low layer,
+ // the old and new windows at the same index should be the
+ // same, otherwise something changed.
+ for (int i = 0; i < windowsCount; i++) {
+ final InputWindowHandle newWindow = newWindows.get(i);
+ final InputWindowHandle oldWindow = oldWindows.get(i);
+
+ if (!newWindow.getWindow().asBinder().equals(oldWindow.getWindow().asBinder())) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ private void generateMagnificationSpecInverseMatrixLocked(int displayId) {
+ MagnificationSpec spec = new MagnificationSpec();
+ if (!mAccessibilityController.getMagnificationSpecForDisplay(displayId, spec)) {
+ return;
+ }
+ sTempFloats[Matrix.MSCALE_X] = spec.scale;
+ sTempFloats[Matrix.MSKEW_Y] = 0;
+ sTempFloats[Matrix.MSKEW_X] = 0;
+ sTempFloats[Matrix.MSCALE_Y] = spec.scale;
+ sTempFloats[Matrix.MTRANS_X] = spec.offsetX;
+ sTempFloats[Matrix.MTRANS_Y] = spec.offsetY;
+ sTempFloats[Matrix.MPERSP_0] = 0;
+ sTempFloats[Matrix.MPERSP_1] = 0;
+ sTempFloats[Matrix.MPERSP_2] = 1;
+
+ final Matrix tempMatrix = new Matrix();
+ tempMatrix.setValues(sTempFloats);
+
+ final Matrix inverseMatrix = new Matrix();
+ final boolean result = tempMatrix.invert(inverseMatrix);
+
+ if (!result) {
+ Slog.e(TAG, "Can't inverse the magnification spec matrix with the "
+ + "magnification spec = " + spec + " on the displayId = " + displayId);
+ return;
+ }
+ mMagnificationSpecInverseMatrix.set(displayId, inverseMatrix);
+ }
+
+ private void notifyWindowsChanged(@NonNull List<Integer> displayIdsForWindowsChanged) {
+ mHandler.removeMessages(MyHandler.MESSAGE_NOTIFY_WINDOWS_CHANGED_BY_TIMEOUT);
+
+ for (int i = 0; i < displayIdsForWindowsChanged.size(); i++) {
+ mAccessibilityController.performComputeChangedWindowsNot(
+ displayIdsForWindowsChanged.get(i), false);
+ }
+ }
+
+ private void forceUpdateWindows() {
+ final List<Integer> displayIdsForWindowsChanged = new ArrayList<>();
+
+ synchronized (mLock) {
+ for (int i = 0; i < mInputWindowHandlesOnDisplays.size(); i++) {
+ final int displayId = mInputWindowHandlesOnDisplays.keyAt(i);
+ displayIdsForWindowsChanged.add(displayId);
+ }
+ }
+ notifyWindowsChanged(displayIdsForWindowsChanged);
+ }
+
+ @GuardedBy("mLock")
+ private void releaseResources() {
+ mInputWindowHandlesOnDisplays.clear();
+ mMagnificationSpecInverseMatrix.clear();
+ mVisibleWindows.clear();
+ mDisplayInfos.clear();
+ mWindowsNotificationEnabled = false;
+ mHandler.removeCallbacksAndMessages(null);
+ }
+
+ private class MyHandler extends Handler {
+ public static final int MESSAGE_NOTIFY_WINDOWS_CHANGED = 1;
+ public static final int MESSAGE_NOTIFY_WINDOWS_CHANGED_BY_UI_STABLE = 2;
+ public static final int MESSAGE_NOTIFY_WINDOWS_CHANGED_BY_TIMEOUT = 3;
+
+ MyHandler(Looper looper) {
+ super(looper, null, false);
+ }
+
+ @Override
+ public void handleMessage(Message message) {
+ switch (message.what) {
+ case MESSAGE_NOTIFY_WINDOWS_CHANGED: {
+ final List<Integer> displayIdsForWindowsChanged = (List<Integer>) message.obj;
+ notifyWindowsChanged(displayIdsForWindowsChanged);
+ } break;
+
+ case MESSAGE_NOTIFY_WINDOWS_CHANGED_BY_UI_STABLE: {
+ forceUpdateWindows();
+ } break;
+
+ case MESSAGE_NOTIFY_WINDOWS_CHANGED_BY_TIMEOUT: {
+ Slog.w(TAG, "Windows change within in 2 frames continuously over 500 ms "
+ + "and notify windows changed immediately");
+ mHandler.removeMessages(
+ MyHandler.MESSAGE_NOTIFY_WINDOWS_CHANGED_BY_UI_STABLE);
+
+ forceUpdateWindows();
+ } break;
+ }
+ }
+ }
+
+ /**
+ * This class represents information about a window from the
+ * surface flinger to the accessibility framework.
+ */
+ public static class AccessibilityWindow {
+ private static final Region TEMP_REGION = new Region();
+ private static final RectF TEMP_RECTF = new RectF();
+ // Data
+ private IWindow mWindow;
+ private int mDisplayId;
+ private int mFlags;
+ private int mType;
+ private int mPrivateFlags;
+ private boolean mIsPIPMenu;
+ private boolean mIsFocused;
+ private boolean mShouldMagnify;
+ private boolean mIgnoreDuetoRecentsAnimation;
+ private boolean mIsTrustedOverlay;
+ private final Region mTouchableRegionInScreen = new Region();
+ private final Region mTouchableRegionInWindow = new Region();
+ private final Region mLetterBoxBounds = new Region();
+ private WindowInfo mWindowInfo;
+
+ /**
+ * Returns the instance after initializing the internal data.
+ * @param service The window manager service.
+ * @param inputWindowHandle The window from the surface flinger.
+ * @param inverseMatrix The magnification spec inverse matrix.
+ */
+ public static AccessibilityWindow initializeData(WindowManagerService service,
+ InputWindowHandle inputWindowHandle, Matrix inverseMatrix, IBinder pipIBinder,
+ Matrix displayMatrix) {
+ final IWindow window = inputWindowHandle.getWindow();
+ final WindowState windowState = window != null ? service.mWindowMap.get(
+ window.asBinder()) : null;
+
+ final AccessibilityWindow instance = new AccessibilityWindow();
+
+ instance.mWindow = inputWindowHandle.getWindow();
+ instance.mDisplayId = inputWindowHandle.displayId;
+ instance.mFlags = inputWindowHandle.layoutParamsFlags;
+ instance.mType = inputWindowHandle.layoutParamsType;
+ instance.mIsPIPMenu = inputWindowHandle.getWindow().asBinder().equals(pipIBinder);
+
+ // TODO (b/199357848): gets the private flag of the window from other way.
+ instance.mPrivateFlags = windowState != null ? windowState.mAttrs.privateFlags : 0;
+ // TODO (b/199358208) : using new way to implement the focused window.
+ instance.mIsFocused = windowState != null && windowState.isFocused();
+ instance.mShouldMagnify = windowState == null || windowState.shouldMagnify();
+
+ final RecentsAnimationController controller = service.getRecentsAnimationController();
+ instance.mIgnoreDuetoRecentsAnimation = windowState != null && controller != null
+ && controller.shouldIgnoreForAccessibility(windowState);
+ instance.mIsTrustedOverlay = inputWindowHandle.trustedOverlay;
+
+ // TODO (b/199358388) : gets the letterbox bounds of the window from other way.
+ if (windowState != null && windowState.areAppWindowBoundsLetterboxed()) {
+ getLetterBoxBounds(windowState, instance.mLetterBoxBounds);
+ }
+
+ final Rect windowFrame = new Rect(inputWindowHandle.frameLeft,
+ inputWindowHandle.frameTop, inputWindowHandle.frameRight,
+ inputWindowHandle.frameBottom);
+ getTouchableRegionInWindow(instance.mShouldMagnify, inputWindowHandle.touchableRegion,
+ instance.mTouchableRegionInWindow, windowFrame, inverseMatrix, displayMatrix);
+ getUnMagnifiedTouchableRegion(instance.mShouldMagnify,
+ inputWindowHandle.touchableRegion, instance.mTouchableRegionInScreen,
+ inverseMatrix, displayMatrix);
+ instance.mWindowInfo = windowState != null
+ ? windowState.getWindowInfo() : getWindowInfoForWindowlessWindows(instance);
+
+ return instance;
+ }
+
+ /**
+ * Returns the touchable region in the screen.
+ * @param outRegion The touchable region.
+ */
+ public void getTouchableRegionInScreen(Region outRegion) {
+ outRegion.set(mTouchableRegionInScreen);
+ }
+
+ /**
+ * Returns the touchable region in the window.
+ * @param outRegion The touchable region.
+ */
+ public void getTouchableRegionInWindow(Region outRegion) {
+ outRegion.set(mTouchableRegionInWindow);
+ }
+
+ /**
+ * @return the layout parameter flag {@link android.view.WindowManager.LayoutParams#flags}.
+ */
+ public int getFlags() {
+ return mFlags;
+ }
+
+ /**
+ * @return the layout parameter type {@link android.view.WindowManager.LayoutParams#type}.
+ */
+ public int getType() {
+ return mType;
+ }
+
+ /**
+ * @return the layout parameter private flag
+ * {@link android.view.WindowManager.LayoutParams#privateFlags}.
+ */
+ public int getPrivateFlag() {
+ return mPrivateFlags;
+ }
+
+ /**
+ * @return the windowInfo {@link WindowInfo}.
+ */
+ public WindowInfo getWindowInfo() {
+ return mWindowInfo;
+ }
+
+ /**
+ * Gets the letter box bounds if activity bounds are letterboxed
+ * or letterboxed for display cutout.
+ *
+ * @return {@code true} there's a letter box bounds.
+ */
+ public Boolean setLetterBoxBoundsIfNeeded(Region outBounds) {
+ if (mLetterBoxBounds.isEmpty()) {
+ return false;
+ }
+
+ outBounds.set(mLetterBoxBounds);
+ return true;
+ }
+
+ /**
+ * @return true if this window should be magnified.
+ */
+ public boolean shouldMagnify() {
+ return mShouldMagnify;
+ }
+
+ /**
+ * @return true if this window is focused.
+ */
+ public boolean isFocused() {
+ return mIsFocused;
+ }
+
+ /**
+ * @return true if it's running the recent animation but not the target app.
+ */
+ public boolean ignoreRecentsAnimationForAccessibility() {
+ return mIgnoreDuetoRecentsAnimation;
+ }
+
+ /**
+ * @return true if this window is the trusted overlay.
+ */
+ public boolean isTrustedOverlay() {
+ return mIsTrustedOverlay;
+ }
+
+ /**
+ * @return true if this window is the navigation bar with the gesture mode.
+ */
+ public boolean isUntouchableNavigationBar() {
+ if (mType != WindowManager.LayoutParams.TYPE_NAVIGATION_BAR) {
+ return false;
+ }
+
+ return mTouchableRegionInScreen.isEmpty();
+ }
+
+ /**
+ * @return true if this window is PIP menu.
+ */
+ public boolean isPIPMenu() {
+ return mIsPIPMenu;
+ }
+
+ private static void getTouchableRegionInWindow(boolean shouldMagnify, Region inRegion,
+ Region outRegion, Rect frame, Matrix inverseMatrix, Matrix displayMatrix) {
+ // Some modal windows, like the activity with Theme.dialog, has the full screen
+ // as its touchable region, but its window frame is smaller than the touchable
+ // region. The region we report should be the touchable area in the window frame
+ // for the consistency and match developers expectation.
+ // So we need to make the intersection between the frame and touchable region to
+ // obtain the real touch region in the screen.
+ Region touchRegion = TEMP_REGION;
+ touchRegion.set(inRegion);
+ touchRegion.op(frame, Region.Op.INTERSECT);
+
+ getUnMagnifiedTouchableRegion(shouldMagnify, touchRegion, outRegion, inverseMatrix,
+ displayMatrix);
+ }
+
+ /**
+ * Gets the un-magnified touchable region. If this window can be magnified and magnifying,
+ * we will transform the input touchable region by applying the inverse matrix of the
+ * magnification spec to get the un-magnified touchable region.
+ * @param shouldMagnify The window can be magnified.
+ * @param inRegion The touchable region of this window.
+ * @param outRegion The un-magnified touchable region of this window.
+ * @param inverseMatrix The inverse matrix of the magnification spec.
+ * @param displayMatrix The display transform matrix which takes display coordinates to
+ * logical display coordinates.
+ */
+ private static void getUnMagnifiedTouchableRegion(boolean shouldMagnify, Region inRegion,
+ Region outRegion, Matrix inverseMatrix, Matrix displayMatrix) {
+ if ((!shouldMagnify || inverseMatrix.isIdentity()) && displayMatrix.isIdentity()) {
+ outRegion.set(inRegion);
+ return;
+ }
+
+ forEachRect(inRegion, rect -> {
+ // Move to origin as all transforms are captured by the matrix.
+ RectF windowFrame = TEMP_RECTF;
+ windowFrame.set(rect);
+
+ inverseMatrix.mapRect(windowFrame);
+ displayMatrix.mapRect(windowFrame);
+ // Union all rects.
+ outRegion.union(new Rect((int) windowFrame.left, (int) windowFrame.top,
+ (int) windowFrame.right, (int) windowFrame.bottom));
+ });
+ }
+
+ private static WindowInfo getWindowInfoForWindowlessWindows(AccessibilityWindow window) {
+ WindowInfo windowInfo = WindowInfo.obtain();
+ windowInfo.displayId = window.mDisplayId;
+ windowInfo.type = window.mType;
+ windowInfo.token = window.mWindow.asBinder();
+ windowInfo.hasFlagWatchOutsideTouch = (window.mFlags
+ & WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH) != 0;
+ windowInfo.inPictureInPicture = false;
+
+ // There only are two windowless windows now, one is split window, and the other
+ // one is PIP.
+ if (windowInfo.type == TYPE_DOCK_DIVIDER) {
+ windowInfo.title = "Splitscreen Divider";
+ } else if (window.mIsPIPMenu) {
+ windowInfo.title = "Picture-in-Picture menu";
+ }
+ return windowInfo;
+ }
+
+ private static void getLetterBoxBounds(WindowState windowState, Region outRegion) {
+ final Rect letterboxInsets = windowState.mActivityRecord.getLetterboxInsets();
+ final Rect nonLetterboxRect = windowState.getBounds();
+
+ nonLetterboxRect.inset(letterboxInsets);
+ outRegion.set(windowState.getBounds());
+ outRegion.op(nonLetterboxRect, Region.Op.DIFFERENCE);
+ }
+
+ @Override
+ public String toString() {
+ String builder = "A11yWindow=[" + mWindow.asBinder()
+ + ", displayId=" + mDisplayId
+ + ", flag=0x" + Integer.toHexString(mFlags)
+ + ", type=" + mType
+ + ", privateFlag=0x" + Integer.toHexString(mPrivateFlags)
+ + ", focused=" + mIsFocused
+ + ", shouldMagnify=" + mShouldMagnify
+ + ", ignoreDuetoRecentsAnimation=" + mIgnoreDuetoRecentsAnimation
+ + ", isTrustedOverlay=" + mIsTrustedOverlay
+ + ", regionInScreen=" + mTouchableRegionInScreen
+ + ", touchableRegion=" + mTouchableRegionInWindow
+ + ", letterBoxBounds=" + mLetterBoxBounds
+ + ", isPIPMenu=" + mIsPIPMenu
+ + ", windowInfo=" + mWindowInfo
+ + "]";
+
+ return builder;
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index 3f2e975..5a420ca 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -983,29 +983,6 @@
mWmService.checkDrawnWindowsLocked();
}
- final int N = mWmService.mPendingRemove.size();
- if (N > 0) {
- if (mWmService.mPendingRemoveTmp.length < N) {
- mWmService.mPendingRemoveTmp = new WindowState[N + 10];
- }
- mWmService.mPendingRemove.toArray(mWmService.mPendingRemoveTmp);
- mWmService.mPendingRemove.clear();
- ArrayList<DisplayContent> displayList = new ArrayList();
- for (i = 0; i < N; i++) {
- final WindowState w = mWmService.mPendingRemoveTmp[i];
- w.removeImmediately();
- final DisplayContent displayContent = w.getDisplayContent();
- if (displayContent != null && !displayList.contains(displayContent)) {
- displayList.add(displayContent);
- }
- }
-
- for (int j = displayList.size() - 1; j >= 0; --j) {
- final DisplayContent dc = displayList.get(j);
- dc.assignWindowLayers(true /*setLayoutNeeded*/);
- }
- }
-
forAllDisplays(dc -> {
dc.getInputMonitor().updateInputWindowsLw(true /*force*/);
dc.updateSystemGestureExclusion();
@@ -2052,24 +2029,29 @@
try {
final Task task = r.getTask();
- // If the activity in current PIP task needs to be moved back to the parent Task of next
- // PIP activity, we can't use that parent Task as the next PIP Task.
- // Because we need to start the Shell transition from the root Task, we delay to dismiss
- // the current PIP task until root Task is ready.
- boolean origPipWillBeMovedToTask = false;
+ // Create a transition now to collect the current pinned Task dismiss. Only do the
+ // create here as the Task (trigger) to enter PIP is not ready yet.
+ final TransitionController transitionController = task.mTransitionController;
+ Transition newTransition = null;
+ if (transitionController.isCollecting()) {
+ transitionController.setReady(task, false /* ready */);
+ } else if (transitionController.getTransitionPlayer() != null) {
+ newTransition = transitionController.createTransition(TRANSIT_PIP);
+ }
+
+ // This will change the root pinned task's windowing mode to its original mode, ensuring
+ // we only have one root task that is in pinned mode.
final Task rootPinnedTask = taskDisplayArea.getRootPinnedTask();
if (rootPinnedTask != null) {
- final ActivityRecord topPipActivity = rootPinnedTask.getTopMostActivity();
- if (topPipActivity != null && topPipActivity.getLastParentBeforePip() == task) {
- origPipWillBeMovedToTask = true;
- }
+ transitionController.collect(rootPinnedTask);
+ rootPinnedTask.dismissPip();
}
// Set a transition to ensure that we don't immediately try and update the visibility
// of the activity entering PIP
r.getDisplayContent().prepareAppTransition(TRANSIT_NONE);
- final boolean singleActivity = task.getChildCount() == 1 && !origPipWillBeMovedToTask;
+ final boolean singleActivity = task.getChildCount() == 1;
final Task rootTask;
if (singleActivity) {
rootTask = task;
@@ -2123,7 +2105,7 @@
final ActivityRecord oldTopActivity = task.getTopMostActivity();
if (oldTopActivity != null && oldTopActivity.isState(STOPPED)
&& task.getDisplayContent().mAppTransition.containsTransitRequest(
- TRANSIT_TO_BACK) && !origPipWillBeMovedToTask) {
+ TRANSIT_TO_BACK)) {
task.getDisplayContent().mClosingApps.add(oldTopActivity);
oldTopActivity.mRequestForceTransition = true;
}
@@ -2137,14 +2119,13 @@
// display area, so reparent.
rootTask.reparent(taskDisplayArea, true /* onTop */);
}
- rootTask.mTransitionController.requestTransitionIfNeeded(TRANSIT_PIP, rootTask);
- // This will change the root pinned task's windowing mode to its original mode, ensuring
- // we only have one root task that is in pinned mode.
- if (rootPinnedTask != null) {
- rootTask.mTransitionController.collect(rootPinnedTask);
- rootPinnedTask.dismissPip();
+ // The new PIP Task is ready, start the transition before updating the windowing mode.
+ if (newTransition != null) {
+ transitionController.requestStartTransition(newTransition, rootTask,
+ null /* remoteTransition */, null /* displayChange */);
}
+ transitionController.collect(rootTask);
// Defer the windowing mode change until after the transition to prevent the activity
// from doing work and changing the activity visuals while animating
diff --git a/services/core/java/com/android/server/wm/ShellRoot.java b/services/core/java/com/android/server/wm/ShellRoot.java
index 6ed59e9..f9d7b53 100644
--- a/services/core/java/com/android/server/wm/ShellRoot.java
+++ b/services/core/java/com/android/server/wm/ShellRoot.java
@@ -25,15 +25,14 @@
import static com.android.server.wm.WindowManagerService.MAX_ANIMATION_DURATION;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.graphics.Point;
-import android.graphics.Rect;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Slog;
import android.view.DisplayInfo;
import android.view.IWindow;
import android.view.SurfaceControl;
-import android.view.WindowInfo;
import android.view.WindowManager;
import android.view.animation.Animation;
@@ -136,47 +135,12 @@
ANIMATION_TYPE_WINDOW_ANIMATION);
}
- WindowInfo getWindowInfo() {
- if (mShellRootLayer != SHELL_ROOT_LAYER_DIVIDER
- && mShellRootLayer != SHELL_ROOT_LAYER_PIP) {
- return null;
+ @Nullable
+ IBinder getAccessibilityWindowToken() {
+ if (mAccessibilityWindow != null) {
+ return mAccessibilityWindow.asBinder();
}
- if (mShellRootLayer == SHELL_ROOT_LAYER_DIVIDER
- && !mDisplayContent.getDefaultTaskDisplayArea().isSplitScreenModeActivated()) {
- return null;
- }
- if (mShellRootLayer == SHELL_ROOT_LAYER_PIP
- && mDisplayContent.getDefaultTaskDisplayArea().getRootPinnedTask() == null) {
- return null;
- }
- if (mAccessibilityWindow == null) {
- return null;
- }
- WindowInfo windowInfo = WindowInfo.obtain();
- windowInfo.displayId = mToken.getDisplayArea().getDisplayContent().mDisplayId;
- windowInfo.type = mToken.windowType;
- windowInfo.layer = mToken.getWindowLayerFromType();
- windowInfo.token = mAccessibilityWindow.asBinder();
- windowInfo.focused = false;
- windowInfo.hasFlagWatchOutsideTouch = false;
- final Rect regionRect = new Rect();
-
-
- // DividerView
- if (mShellRootLayer == SHELL_ROOT_LAYER_DIVIDER) {
- windowInfo.inPictureInPicture = false;
- mDisplayContent.getDockedDividerController().getTouchRegion(regionRect);
- windowInfo.regionInScreen.set(regionRect);
- windowInfo.title = "Splitscreen Divider";
- }
- // PipMenuView
- if (mShellRootLayer == SHELL_ROOT_LAYER_PIP) {
- windowInfo.inPictureInPicture = true;
- mDisplayContent.getDefaultTaskDisplayArea().getRootPinnedTask().getBounds(regionRect);
- windowInfo.regionInScreen.set(regionRect);
- windowInfo.title = "Picture-in-Picture menu";
- }
- return windowInfo;
+ return null;
}
void setAccessibilityWindow(IWindow window) {
@@ -197,9 +161,5 @@
mAccessibilityWindow = null;
}
}
- if (mDisplayContent.mWmService.mAccessibilityController.hasCallbacks()) {
- mDisplayContent.mWmService.mAccessibilityController.onSomeWindowResizedOrMoved(
- mDisplayContent.getDisplayId());
- }
}
}
diff --git a/services/core/java/com/android/server/wm/WallpaperWindowToken.java b/services/core/java/com/android/server/wm/WallpaperWindowToken.java
index fe405e5..fc154a8 100644
--- a/services/core/java/com/android/server/wm/WallpaperWindowToken.java
+++ b/services/core/java/com/android/server/wm/WallpaperWindowToken.java
@@ -107,7 +107,7 @@
/** Returns {@code true} if visibility is changed. */
boolean updateWallpaperWindows(boolean visible) {
boolean changed = false;
- if (isVisible() != visible) {
+ if (mVisibleRequested != visible) {
ProtoLog.d(WM_DEBUG_WALLPAPER, "Wallpaper token %s visible=%b",
token, visible);
setVisibility(visible);
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 7be128b..b5e6f49 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -222,7 +222,6 @@
import android.util.EventLog;
import android.util.MergedConfiguration;
import android.util.Slog;
-import android.util.SparseArray;
import android.util.SparseBooleanArray;
import android.util.TimeUtils;
import android.util.TypedValue;
@@ -588,20 +587,6 @@
final ArrayList<WindowState> mResizingWindows = new ArrayList<>();
/**
- * Windows whose animations have ended and now must be removed.
- */
- final ArrayList<WindowState> mPendingRemove = new ArrayList<>();
-
- /**
- * Used when processing mPendingRemove to avoid working on the original array.
- */
- WindowState[] mPendingRemoveTmp = new WindowState[20];
-
- // TODO: use WindowProcessController once go/wm-unified is done.
- /** Mapping of process pids to configurations */
- final SparseArray<Configuration> mProcessConfigurations = new SparseArray<>();
-
- /**
* Windows whose surface should be destroyed.
*/
final ArrayList<WindowState> mDestroySurface = new ArrayList<>();
@@ -2038,7 +2023,6 @@
dc.mWinRemovedSinceNullFocus.add(win);
}
mEmbeddedWindowController.onWindowRemoved(win);
- mPendingRemove.remove(win);
mResizingWindows.remove(win);
updateNonSystemOverlayWindowsVisibilityIfNeeded(win, false /* surfaceShown */);
mWindowsChanged = true;
@@ -6342,23 +6326,6 @@
}
}
}
- if (mPendingRemove.size() > 0) {
- pw.println();
- pw.println(" Remove pending for:");
- for (int i=mPendingRemove.size()-1; i>=0; i--) {
- WindowState w = mPendingRemove.get(i);
- if (windows == null || windows.contains(w)) {
- pw.print(" Remove #"); pw.print(i); pw.print(' ');
- pw.print(w);
- if (dumpAll) {
- pw.println(":");
- w.dump(pw, " ", true);
- } else {
- pw.println();
- }
- }
- }
- }
if (mForceRemoves != null && mForceRemoves.size() > 0) {
pw.println();
pw.println(" Windows force removing:");
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 573ff2f..5bbe2cd 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -4809,9 +4809,6 @@
if (isAnimating()) {
return;
}
- if (mWmService.mAccessibilityController.hasCallbacks()) {
- mWmService.mAccessibilityController.onSomeWindowResizedOrMoved(getDisplayId());
- }
if (!isSelfOrAncestorWindowAnimatingExit()) {
return;
@@ -4838,15 +4835,20 @@
if (hasSurface) {
mWmService.mDestroySurface.add(this);
}
- if (mRemoveOnExit) {
- mWmService.mPendingRemove.add(this);
- mRemoveOnExit = false;
- }
}
mAnimatingExit = false;
getDisplayContent().mWallpaperController.hideWallpapers(this);
}
+ @Override
+ boolean handleCompleteDeferredRemoval() {
+ if (mRemoveOnExit) {
+ mRemoveOnExit = false;
+ removeImmediately();
+ }
+ return super.handleCompleteDeferredRemoval();
+ }
+
boolean clearAnimatingFlags() {
boolean didSomething = false;
// We don't want to clear it out for windows that get replaced, because the
diff --git a/services/incremental/TEST_MAPPING b/services/incremental/TEST_MAPPING
index f2ad068..9fe090a 100644
--- a/services/incremental/TEST_MAPPING
+++ b/services/incremental/TEST_MAPPING
@@ -10,6 +10,12 @@
},
{
"name": "CtsIncrementalInstallHostTestCases"
+ },
+ {
+ "name": "libincfs-test"
+ },
+ {
+ "name": "service.incremental_test"
}
],
"presubmit-large": [
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 29797a5..4673a69 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -920,12 +920,6 @@
startBootstrapServices(t);
startCoreServices(t);
startOtherServices(t);
- // Apex services must be the last category of services to start. No other service must
- // be starting after this point. This is to prevent unnessary stability issues when
- // these apexes are updated outside of OTA; and to avoid breaking dependencies from
- // system into apexes.
- // TODO(satayev): lock mSystemServiceManager.startService to stop accepting new services
- // after this step
startApexServices(t);
} catch (Throwable ex) {
Slog.e("System", "******************************************");
@@ -3051,6 +3045,10 @@
/**
* Starts system services defined in apexes.
+ *
+ * <p>Apex services must be the last category of services to start. No other service must be
+ * starting after this point. This is to prevent unnecessary stability issues when these apexes
+ * are updated outside of OTA; and to avoid breaking dependencies from system into apexes.
*/
private void startApexServices(@NonNull TimingsTraceAndSlog t) {
t.traceBegin("startApexServices");
@@ -3067,6 +3065,10 @@
}
t.traceEnd();
}
+
+ // make sure no other services are started after this point
+ mSystemServiceManager.sealStartedServices();
+
t.traceEnd(); // startApexServices
}
diff --git a/services/tests/mockingservicestests/Android.bp b/services/tests/mockingservicestests/Android.bp
index 8538603..635f136 100644
--- a/services/tests/mockingservicestests/Android.bp
+++ b/services/tests/mockingservicestests/Android.bp
@@ -40,26 +40,26 @@
],
static_libs: [
+ "androidx.test.core",
+ "androidx.test.runner",
+ "androidx.test.ext.truth",
"frameworks-base-testutils",
+ "hamcrest-library",
+ "kotlin-test",
+ "mockingservicestests-utils-mockito",
+ "mockito-target-extended-minus-junit4",
+ "platform-test-annotations",
+ "service-blobstore",
+ "service-jobscheduler",
+ "service-permission.impl",
"services.core",
"services.devicepolicy",
"services.net",
"services.usage",
- "service-jobscheduler",
- "service-permission.impl",
- "service-blobstore",
- "androidx.test.core",
- "androidx.test.runner",
- "androidx.test.ext.truth",
- "mockito-target-extended-minus-junit4",
- "platform-test-annotations",
- "truth-prebuilt",
- "hamcrest-library",
- "servicestests-utils-mockito-extended",
- "mockingservicestests-utils-mockito",
"servicestests-core-utils",
+ "servicestests-utils-mockito-extended",
"testables",
- "kotlin-test",
+ "truth-prebuilt",
// TODO: remove once Android migrates to JUnit 4.12, which provides assertThrows
"testng",
],
diff --git a/services/tests/mockingservicestests/src/com/android/server/power/PowerManagerServiceMockingTest.java b/services/tests/mockingservicestests/src/com/android/server/power/PowerManagerServiceMockingTest.java
new file mode 100644
index 0000000..b65c3e9
--- /dev/null
+++ b/services/tests/mockingservicestests/src/com/android/server/power/PowerManagerServiceMockingTest.java
@@ -0,0 +1,303 @@
+/*
+ * 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.server.power;
+
+import static com.google.common.truth.Truth.assertThat;
+
+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.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.ActivityManagerInternal;
+import android.attention.AttentionManagerInternal;
+import android.content.Context;
+import android.content.ContextWrapper;
+import android.content.res.Resources;
+import android.hardware.SensorManager;
+import android.hardware.devicestate.DeviceStateManager;
+import android.hardware.devicestate.DeviceStateManager.DeviceStateCallback;
+import android.hardware.display.AmbientDisplayConfiguration;
+import android.hardware.display.DisplayManagerInternal;
+import android.os.BatteryManagerInternal;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.PowerManager;
+import android.os.PowerSaveState;
+import android.os.test.TestLooper;
+import android.provider.Settings;
+import android.service.dreams.DreamManagerInternal;
+import android.test.mock.MockContentResolver;
+import android.view.Display;
+import android.view.DisplayInfo;
+
+import androidx.test.InstrumentationRegistry;
+
+import com.android.internal.app.IBatteryStats;
+import com.android.internal.util.test.FakeSettingsProvider;
+import com.android.server.LocalServices;
+import com.android.server.SystemService;
+import com.android.server.lights.LightsManager;
+import com.android.server.policy.WindowManagerPolicy;
+import com.android.server.power.PowerManagerService.BatteryReceiver;
+import com.android.server.power.PowerManagerService.Injector;
+import com.android.server.power.PowerManagerService.NativeWrapper;
+import com.android.server.power.PowerManagerService.UserSwitchedReceiver;
+import com.android.server.power.batterysaver.BatterySaverController;
+import com.android.server.power.batterysaver.BatterySaverPolicy;
+import com.android.server.power.batterysaver.BatterySaverStateMachine;
+import com.android.server.power.batterysaver.BatterySavingStats;
+import com.android.server.testutils.OffsettableClock;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+/**
+ * Tests for {@link com.android.server.power.PowerManagerService}.
+ *
+ * Build/Install/Run:
+ * atest FrameworksServicesTests:PowerManagerServiceMockingTest
+ */
+public class PowerManagerServiceMockingTest {
+ private static final String SYSTEM_PROPERTY_QUIESCENT = "ro.boot.quiescent";
+ private static final String SYSTEM_PROPERTY_REBOOT_REASON = "sys.boot.reason";
+
+ private static final float BRIGHTNESS_FACTOR = 0.7f;
+ private static final boolean BATTERY_SAVER_ENABLED = true;
+
+ @Mock private BatterySaverController mBatterySaverControllerMock;
+ @Mock private BatterySaverPolicy mBatterySaverPolicyMock;
+ @Mock private BatterySaverStateMachine mBatterySaverStateMachineMock;
+ @Mock private LightsManager mLightsManagerMock;
+ @Mock private DisplayManagerInternal mDisplayManagerInternalMock;
+ @Mock private BatteryManagerInternal mBatteryManagerInternalMock;
+ @Mock private ActivityManagerInternal mActivityManagerInternalMock;
+ @Mock private AttentionManagerInternal mAttentionManagerInternalMock;
+ @Mock private DreamManagerInternal mDreamManagerInternalMock;
+ @Mock private PowerManagerService.NativeWrapper mNativeWrapperMock;
+ @Mock private Notifier mNotifierMock;
+ @Mock private WirelessChargerDetector mWirelessChargerDetectorMock;
+ @Mock private AmbientDisplayConfiguration mAmbientDisplayConfigurationMock;
+ @Mock private SystemPropertiesWrapper mSystemPropertiesMock;
+ @Mock private DeviceStateManager mDeviceStateManagerMock;
+
+ @Mock
+ private InattentiveSleepWarningController mInattentiveSleepWarningControllerMock;
+
+ private PowerManagerService mService;
+ private PowerSaveState mPowerSaveState;
+ private ContextWrapper mContextSpy;
+ private BatteryReceiver mBatteryReceiver;
+ private UserSwitchedReceiver mUserSwitchedReceiver;
+ private Resources mResourcesSpy;
+ private OffsettableClock mClock;
+ private TestLooper mTestLooper;
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+ FakeSettingsProvider.clearSettingsProvider();
+
+ mPowerSaveState = new PowerSaveState.Builder()
+ .setBatterySaverEnabled(BATTERY_SAVER_ENABLED)
+ .setBrightnessFactor(BRIGHTNESS_FACTOR)
+ .build();
+ when(mBatterySaverPolicyMock.getBatterySaverPolicy(
+ eq(PowerManager.ServiceType.SCREEN_BRIGHTNESS)))
+ .thenReturn(mPowerSaveState);
+ when(mBatteryManagerInternalMock.isPowered(anyInt())).thenReturn(false);
+ when(mInattentiveSleepWarningControllerMock.isShown()).thenReturn(false);
+ when(mDisplayManagerInternalMock.requestPowerState(anyInt(), any(), anyBoolean()))
+ .thenReturn(true);
+ when(mSystemPropertiesMock.get(eq(SYSTEM_PROPERTY_QUIESCENT), anyString())).thenReturn("");
+ when(mAmbientDisplayConfigurationMock.ambientDisplayAvailable()).thenReturn(true);
+
+ addLocalServiceMock(LightsManager.class, mLightsManagerMock);
+ addLocalServiceMock(DisplayManagerInternal.class, mDisplayManagerInternalMock);
+ addLocalServiceMock(BatteryManagerInternal.class, mBatteryManagerInternalMock);
+ addLocalServiceMock(ActivityManagerInternal.class, mActivityManagerInternalMock);
+ addLocalServiceMock(AttentionManagerInternal.class, mAttentionManagerInternalMock);
+ addLocalServiceMock(DreamManagerInternal.class, mDreamManagerInternalMock);
+
+ mContextSpy = spy(new ContextWrapper(InstrumentationRegistry.getContext()));
+ mResourcesSpy = spy(mContextSpy.getResources());
+ when(mContextSpy.getResources()).thenReturn(mResourcesSpy);
+
+ MockContentResolver cr = new MockContentResolver(mContextSpy);
+ cr.addProvider(Settings.AUTHORITY, new FakeSettingsProvider());
+ when(mContextSpy.getContentResolver()).thenReturn(cr);
+
+ when(mContextSpy.getSystemService(DeviceStateManager.class))
+ .thenReturn(mDeviceStateManagerMock);
+
+ Settings.Global.putInt(mContextSpy.getContentResolver(),
+ Settings.Global.STAY_ON_WHILE_PLUGGED_IN, 0);
+
+ mClock = new OffsettableClock.Stopped();
+ mTestLooper = new TestLooper(mClock::now);
+ }
+
+ private PowerManagerService createService() {
+ mService = new PowerManagerService(mContextSpy, new Injector() {
+ @Override
+ Notifier createNotifier(Looper looper, Context context, IBatteryStats batteryStats,
+ SuspendBlocker suspendBlocker, WindowManagerPolicy policy,
+ FaceDownDetector faceDownDetector, ScreenUndimDetector screenUndimDetector) {
+ return mNotifierMock;
+ }
+
+ @Override
+ SuspendBlocker createSuspendBlocker(PowerManagerService service, String name) {
+ return super.createSuspendBlocker(service, name);
+ }
+
+ @Override
+ BatterySaverPolicy createBatterySaverPolicy(
+ Object lock, Context context, BatterySavingStats batterySavingStats) {
+ return mBatterySaverPolicyMock;
+ }
+
+ @Override
+ BatterySaverController createBatterySaverController(
+ Object lock, Context context, BatterySaverPolicy batterySaverPolicy,
+ BatterySavingStats batterySavingStats) {
+ return mBatterySaverControllerMock;
+ }
+
+ @Override
+ BatterySaverStateMachine createBatterySaverStateMachine(Object lock, Context context,
+ BatterySaverController batterySaverController) {
+ return mBatterySaverStateMachineMock;
+ }
+
+ @Override
+ NativeWrapper createNativeWrapper() {
+ return mNativeWrapperMock;
+ }
+
+ @Override
+ WirelessChargerDetector createWirelessChargerDetector(
+ SensorManager sensorManager, SuspendBlocker suspendBlocker, Handler handler) {
+ return mWirelessChargerDetectorMock;
+ }
+
+ @Override
+ AmbientDisplayConfiguration createAmbientDisplayConfiguration(Context context) {
+ return mAmbientDisplayConfigurationMock;
+ }
+
+ @Override
+ InattentiveSleepWarningController createInattentiveSleepWarningController() {
+ return mInattentiveSleepWarningControllerMock;
+ }
+
+ @Override
+ public SystemPropertiesWrapper createSystemPropertiesWrapper() {
+ return mSystemPropertiesMock;
+ }
+
+ @Override
+ PowerManagerService.Clock createClock() {
+ return () -> mClock.now();
+ }
+
+ @Override
+ Handler createHandler(Looper looper, Handler.Callback callback) {
+ return new Handler(mTestLooper.getLooper(), callback);
+ }
+
+ @Override
+ void invalidateIsInteractiveCaches() {
+ // Avoids an SELinux failure.
+ }
+ });
+ return mService;
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ LocalServices.removeServiceForTest(LightsManager.class);
+ LocalServices.removeServiceForTest(DisplayManagerInternal.class);
+ LocalServices.removeServiceForTest(BatteryManagerInternal.class);
+ LocalServices.removeServiceForTest(ActivityManagerInternal.class);
+ LocalServices.removeServiceForTest(AttentionManagerInternal.class);
+ LocalServices.removeServiceForTest(DreamManagerInternal.class);
+ FakeSettingsProvider.clearSettingsProvider();
+ }
+
+ /**
+ * Creates a mock and registers it to {@link LocalServices}.
+ */
+ private static <T> void addLocalServiceMock(Class<T> clazz, T mock) {
+ LocalServices.removeServiceForTest(clazz);
+ LocalServices.addService(clazz, mock);
+ }
+
+ private void advanceTime(long timeMs) {
+ mClock.fastForward(timeMs);
+ mTestLooper.dispatchAll();
+ }
+
+ @Test
+ public void testUserActivityOnDeviceStateChange() {
+ createService();
+ mService.systemReady(null);
+ mService.onBootPhase(SystemService.PHASE_BOOT_COMPLETED);
+
+ final DisplayInfo info = new DisplayInfo();
+ info.displayGroupId = Display.DEFAULT_DISPLAY_GROUP;
+ when(mDisplayManagerInternalMock.getDisplayInfo(Display.DEFAULT_DISPLAY)).thenReturn(info);
+
+ final ArgumentCaptor<DeviceStateCallback> deviceStateCallbackCaptor =
+ ArgumentCaptor.forClass(DeviceStateCallback.class);
+ verify(mDeviceStateManagerMock).registerCallback(any(),
+ deviceStateCallbackCaptor.capture());
+
+ // Advance the time 10001 and verify that the device thinks it has been idle
+ // for just less than that.
+ mService.onUserActivity();
+ advanceTime(10001);
+ assertThat(mService.wasDeviceIdleForInternal(10000)).isTrue();
+
+ // Send a display state change event and advance the clock 10.
+ final DeviceStateCallback deviceStateCallback = deviceStateCallbackCaptor.getValue();
+ deviceStateCallback.onStateChanged(1);
+ final long timeToAdvance = 10;
+ advanceTime(timeToAdvance);
+
+ // Ensure that the device has been idle for only 10 (doesn't include the idle time
+ // before the display state event).
+ assertThat(mService.wasDeviceIdleForInternal(timeToAdvance - 1)).isTrue();
+ assertThat(mService.wasDeviceIdleForInternal(timeToAdvance)).isFalse();
+
+ // Send the same state and ensure that does not trigger an update.
+ deviceStateCallback.onStateChanged(1);
+ advanceTime(timeToAdvance);
+ final long newTime = timeToAdvance * 2;
+
+ assertThat(mService.wasDeviceIdleForInternal(newTime - 1)).isTrue();
+ assertThat(mService.wasDeviceIdleForInternal(newTime)).isFalse();
+ }
+}
diff --git a/services/tests/mockingservicestests/src/com/android/server/power/ScreenUndimDetectorTest.java b/services/tests/mockingservicestests/src/com/android/server/power/ScreenUndimDetectorTest.java
index 6a35481..234d70b 100644
--- a/services/tests/mockingservicestests/src/com/android/server/power/ScreenUndimDetectorTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/power/ScreenUndimDetectorTest.java
@@ -22,6 +22,7 @@
import static android.hardware.display.DisplayManagerInternal.DisplayPowerRequest.POLICY_OFF;
import static android.hardware.display.DisplayManagerInternal.DisplayPowerRequest.POLICY_VR;
import static android.provider.DeviceConfig.NAMESPACE_ATTENTION_MANAGER_SERVICE;
+import static android.view.Display.DEFAULT_DISPLAY_GROUP;
import static com.android.server.power.ScreenUndimDetector.DEFAULT_MAX_DURATION_BETWEEN_UNDIMS_MILLIS;
import static com.android.server.power.ScreenUndimDetector.KEY_KEEP_SCREEN_ON_ENABLED;
@@ -60,6 +61,7 @@
POLICY_DIM,
POLICY_BRIGHT,
POLICY_VR);
+ private static final int OTHER_DISPLAY_GROUP = DEFAULT_DISPLAY_GROUP + 1;
@ClassRule
public static final TestableContext sContext = new TestableContext(
@@ -106,8 +108,8 @@
KEY_KEEP_SCREEN_ON_ENABLED, Boolean.FALSE.toString(), false /*makeDefault*/);
setup();
- mScreenUndimDetector.recordScreenPolicy(POLICY_DIM);
- mScreenUndimDetector.recordScreenPolicy(POLICY_BRIGHT);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_DIM);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_BRIGHT);
assertThat(mScreenUndimDetector.mWakeLock.isHeld()).isFalse();
}
@@ -116,8 +118,8 @@
public void recordScreenPolicy_samePolicy_noop() {
for (int policy : ALL_POLICIES) {
setup();
- mScreenUndimDetector.recordScreenPolicy(policy);
- mScreenUndimDetector.recordScreenPolicy(policy);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, policy);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, policy);
assertThat(mScreenUndimDetector.mWakeLock.isHeld()).isFalse();
}
@@ -125,13 +127,24 @@
@Test
public void recordScreenPolicy_dimToBright_extends() {
- mScreenUndimDetector.recordScreenPolicy(POLICY_DIM);
- mScreenUndimDetector.recordScreenPolicy(POLICY_BRIGHT);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_DIM);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_BRIGHT);
assertThat(mScreenUndimDetector.mWakeLock.isHeld()).isTrue();
}
@Test
+ public void recordScreenPolicy_dimToBright_ignoresOtherDisplayGroup() {
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_DIM);
+
+ mScreenUndimDetector.recordScreenPolicy(OTHER_DISPLAY_GROUP, POLICY_BRIGHT);
+ assertThat(mScreenUndimDetector.mWakeLock.isHeld()).isFalse();
+
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_BRIGHT);
+ assertThat(mScreenUndimDetector.mWakeLock.isHeld()).isTrue();
+ }
+
+ @Test
public void recordScreenPolicy_otherTransitions_doesNotExtend() {
for (int from : ALL_POLICIES) {
for (int to : ALL_POLICIES) {
@@ -139,8 +152,8 @@
continue;
}
setup();
- mScreenUndimDetector.recordScreenPolicy(from);
- mScreenUndimDetector.recordScreenPolicy(to);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, from);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, to);
assertThat(mScreenUndimDetector.mWakeLock.isHeld()).isFalse();
assertThat(mScreenUndimDetector.mUndimCounter).isEqualTo(0);
@@ -155,28 +168,49 @@
Integer.toString(2), false /*makeDefault*/);
mScreenUndimDetector.readValuesFromDeviceConfig();
- mScreenUndimDetector.recordScreenPolicy(POLICY_DIM);
- mScreenUndimDetector.recordScreenPolicy(POLICY_BRIGHT);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_DIM);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_BRIGHT);
assertThat(mScreenUndimDetector.mWakeLock.isHeld()).isFalse();
- mScreenUndimDetector.recordScreenPolicy(POLICY_DIM);
- mScreenUndimDetector.recordScreenPolicy(POLICY_BRIGHT);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_DIM);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_BRIGHT);
assertThat(mScreenUndimDetector.mWakeLock.isHeld()).isTrue();
}
@Test
+ public void recordScreenPolicy_dimToBright_twoUndimsNeeded_otherDisplayDoesNotExtend() {
+ DeviceConfig.setProperty(NAMESPACE_ATTENTION_MANAGER_SERVICE,
+ KEY_UNDIMS_REQUIRED,
+ Integer.toString(2), false /*makeDefault*/);
+ mScreenUndimDetector.readValuesFromDeviceConfig();
+
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_DIM);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_BRIGHT);
+
+ assertThat(mScreenUndimDetector.mWakeLock.isHeld()).isFalse();
+
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_DIM);
+ mScreenUndimDetector.recordScreenPolicy(OTHER_DISPLAY_GROUP, POLICY_BRIGHT);
+
+ assertThat(mScreenUndimDetector.mWakeLock.isHeld()).isFalse();
+
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_BRIGHT);
+ assertThat(mScreenUndimDetector.mWakeLock.isHeld()).isTrue();
+ }
+
+ @Test
public void recordScreenPolicy_dimBrightDimOff_resetsCounter_doesNotExtend() {
DeviceConfig.setProperty(NAMESPACE_ATTENTION_MANAGER_SERVICE,
KEY_UNDIMS_REQUIRED,
Integer.toString(2), false /*makeDefault*/);
mScreenUndimDetector.readValuesFromDeviceConfig();
- mScreenUndimDetector.recordScreenPolicy(POLICY_DIM);
- mScreenUndimDetector.recordScreenPolicy(POLICY_BRIGHT);
- mScreenUndimDetector.recordScreenPolicy(POLICY_DIM);
- mScreenUndimDetector.recordScreenPolicy(POLICY_OFF);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_DIM);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_BRIGHT);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_DIM);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_OFF);
assertThat(mScreenUndimDetector.mWakeLock.isHeld()).isFalse();
assertThat(mScreenUndimDetector.mUndimCounter).isEqualTo(0);
@@ -189,10 +223,27 @@
Integer.toString(2), false /*makeDefault*/);
mScreenUndimDetector.readValuesFromDeviceConfig();
- mScreenUndimDetector.recordScreenPolicy(POLICY_BRIGHT);
- mScreenUndimDetector.recordScreenPolicy(POLICY_DIM);
- mScreenUndimDetector.recordScreenPolicy(POLICY_BRIGHT);
- mScreenUndimDetector.recordScreenPolicy(POLICY_OFF);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_BRIGHT);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_DIM);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_BRIGHT);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_OFF);
+
+ assertThat(mScreenUndimDetector.mWakeLock.isHeld()).isFalse();
+ assertThat(mScreenUndimDetector.mUndimCounter).isEqualTo(0);
+ }
+
+ @Test
+ public void recordScreenPolicy_undimToOff_otherDisplayDoesNotResetCounter() {
+ DeviceConfig.setProperty(NAMESPACE_ATTENTION_MANAGER_SERVICE,
+ KEY_UNDIMS_REQUIRED,
+ Integer.toString(2), false /*makeDefault*/);
+ mScreenUndimDetector.readValuesFromDeviceConfig();
+
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_BRIGHT);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_DIM);
+
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_BRIGHT);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_OFF);
assertThat(mScreenUndimDetector.mWakeLock.isHeld()).isFalse();
assertThat(mScreenUndimDetector.mUndimCounter).isEqualTo(0);
@@ -206,15 +257,15 @@
mScreenUndimDetector.readValuesFromDeviceConfig();
// undim
- mScreenUndimDetector.recordScreenPolicy(POLICY_BRIGHT);
- mScreenUndimDetector.recordScreenPolicy(POLICY_DIM);
- mScreenUndimDetector.recordScreenPolicy(POLICY_BRIGHT);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_BRIGHT);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_DIM);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_BRIGHT);
// off
- mScreenUndimDetector.recordScreenPolicy(POLICY_OFF);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_OFF);
// second undim
- mScreenUndimDetector.recordScreenPolicy(POLICY_BRIGHT);
- mScreenUndimDetector.recordScreenPolicy(POLICY_DIM);
- mScreenUndimDetector.recordScreenPolicy(POLICY_BRIGHT);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_BRIGHT);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_DIM);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_BRIGHT);
assertThat(mScreenUndimDetector.mWakeLock.isHeld()).isFalse();
assertThat(mScreenUndimDetector.mUndimCounter).isEqualTo(1);
@@ -227,12 +278,12 @@
Integer.toString(2), false /*makeDefault*/);
mScreenUndimDetector.readValuesFromDeviceConfig();
- mScreenUndimDetector.recordScreenPolicy(POLICY_DIM);
- mScreenUndimDetector.recordScreenPolicy(POLICY_BRIGHT);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_DIM);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_BRIGHT);
mClock.advanceTime(DEFAULT_MAX_DURATION_BETWEEN_UNDIMS_MILLIS + 5);
- mScreenUndimDetector.recordScreenPolicy(POLICY_DIM);
- mScreenUndimDetector.recordScreenPolicy(POLICY_BRIGHT);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_DIM);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_BRIGHT);
assertThat(mScreenUndimDetector.mWakeLock.isHeld()).isFalse();
assertThat(mScreenUndimDetector.mUndimCounter).isEqualTo(1);
@@ -246,8 +297,8 @@
mScreenUndimDetector.mUndimCounterStartedMillis = 123;
mScreenUndimDetector.mWakeLock.acquire();
- mScreenUndimDetector.recordScreenPolicy(POLICY_DIM);
- mScreenUndimDetector.recordScreenPolicy(to);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_DIM);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, to);
assertThat(mScreenUndimDetector.mUndimCounter).isEqualTo(0);
assertThat(mScreenUndimDetector.mUndimCounterStartedMillis).isEqualTo(0);
@@ -264,8 +315,8 @@
mScreenUndimDetector.mUndimCounterStartedMillis = 123;
mScreenUndimDetector.mWakeLock.acquire();
- mScreenUndimDetector.recordScreenPolicy(POLICY_BRIGHT);
- mScreenUndimDetector.recordScreenPolicy(to);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_BRIGHT);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, to);
assertThat(mScreenUndimDetector.mUndimCounter).isEqualTo(0);
assertThat(mScreenUndimDetector.mUndimCounterStartedMillis).isEqualTo(0);
@@ -294,8 +345,8 @@
mScreenUndimDetector.mUndimCounterStartedMillis =
SystemClock.currentThreadTimeMillis();
- mScreenUndimDetector.recordScreenPolicy(from);
- mScreenUndimDetector.recordScreenPolicy(to);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, from);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, to);
assertThat(mScreenUndimDetector.mUndimCounter).isNotEqualTo(0);
assertThat(mScreenUndimDetector.mUndimCounterStartedMillis).isNotEqualTo(0);
diff --git a/services/tests/servicestests/src/com/android/server/SystemServiceManagerTest.java b/services/tests/servicestests/src/com/android/server/SystemServiceManagerTest.java
new file mode 100644
index 0000000..4413dc8
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/SystemServiceManagerTest.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server;
+
+import static org.junit.Assert.assertThrows;
+
+import android.test.AndroidTestCase;
+
+import org.junit.Test;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+
+
+/**
+ * Tests for {@link SystemServiceManager}.
+ */
+public class SystemServiceManagerTest extends AndroidTestCase {
+
+ private static final String TAG = "SystemServiceManagerTest";
+
+ @Test
+ public void testSealStartedServices() throws Exception {
+ SystemServiceManager manager = new SystemServiceManager(getContext());
+ // must be effectively final, since it's changed from inner class below
+ AtomicBoolean serviceStarted = new AtomicBoolean(false);
+ SystemService service = new SystemService(getContext()) {
+ @Override
+ public void onStart() {
+ serviceStarted.set(true);
+ }
+ };
+
+ // started services have their #onStart methods called
+ manager.startService(service);
+ assertTrue(serviceStarted.get());
+
+ // however, after locking started services, it is not possible to start a new service
+ manager.sealStartedServices();
+ assertThrows(UnsupportedOperationException.class, () -> manager.startService(service));
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/adb/AdbDebuggingManagerTest.java b/services/tests/servicestests/src/com/android/server/adb/AdbDebuggingManagerTest.java
index cffff66..02cf971 100644
--- a/services/tests/servicestests/src/com/android/server/adb/AdbDebuggingManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/adb/AdbDebuggingManagerTest.java
@@ -23,7 +23,14 @@
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
+import android.content.BroadcastReceiver;
import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.PackageManager;
+import android.debug.AdbManager;
+import android.debug.IAdbManager;
+import android.os.ServiceManager;
import android.provider.Settings;
import android.util.Log;
@@ -105,6 +112,7 @@
public void tearDown() throws Exception {
mKeyStore.deleteKeyStore();
setAllowedConnectionTime(mOriginalAllowedConnectionTime);
+ dropShellPermissionIdentity();
}
/**
@@ -813,6 +821,108 @@
return hasAtLeastOneLetter;
}
+ CountDownLatch mAdbActionLatch = new CountDownLatch(1);
+ private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ Log.i(TAG, "Received intent action=" + action);
+ if (AdbManager.WIRELESS_DEBUG_PAIRED_DEVICES_ACTION.equals(action)) {
+ assertEquals("Received broadcast without MANAGE_DEBUGGING permission.",
+ context.checkSelfPermission(android.Manifest.permission.MANAGE_DEBUGGING),
+ PackageManager.PERMISSION_GRANTED);
+ Log.i(TAG, "action=" + action + " paired_device=" + intent.getSerializableExtra(
+ AdbManager.WIRELESS_DEVICES_EXTRA).toString());
+ mAdbActionLatch.countDown();
+ } else if (AdbManager.WIRELESS_DEBUG_STATE_CHANGED_ACTION.equals(action)) {
+ assertEquals("Received broadcast without MANAGE_DEBUGGING permission.",
+ context.checkSelfPermission(android.Manifest.permission.MANAGE_DEBUGGING),
+ PackageManager.PERMISSION_GRANTED);
+ int status = intent.getIntExtra(AdbManager.WIRELESS_STATUS_EXTRA,
+ AdbManager.WIRELESS_STATUS_DISCONNECTED);
+ Log.i(TAG, "action=" + action + " status=" + status);
+ mAdbActionLatch.countDown();
+ } else if (AdbManager.WIRELESS_DEBUG_PAIRING_RESULT_ACTION.equals(action)) {
+ assertEquals("Received broadcast without MANAGE_DEBUGGING permission.",
+ context.checkSelfPermission(android.Manifest.permission.MANAGE_DEBUGGING),
+ PackageManager.PERMISSION_GRANTED);
+ Integer res = intent.getIntExtra(
+ AdbManager.WIRELESS_STATUS_EXTRA,
+ AdbManager.WIRELESS_STATUS_FAIL);
+ Log.i(TAG, "action=" + action + " result=" + res);
+
+ if (res.equals(AdbManager.WIRELESS_STATUS_PAIRING_CODE)) {
+ String pairingCode = intent.getStringExtra(
+ AdbManager.WIRELESS_PAIRING_CODE_EXTRA);
+ Log.i(TAG, "pairingCode=" + pairingCode);
+ } else if (res.equals(AdbManager.WIRELESS_STATUS_CONNECTED)) {
+ int port = intent.getIntExtra(AdbManager.WIRELESS_DEBUG_PORT_EXTRA, 0);
+ Log.i(TAG, "port=" + port);
+ }
+ mAdbActionLatch.countDown();
+ }
+ }
+ };
+
+ private void adoptShellPermissionIdentity() {
+ InstrumentationRegistry.getInstrumentation().getUiAutomation()
+ .adoptShellPermissionIdentity(android.Manifest.permission.MANAGE_DEBUGGING);
+ }
+
+ private void dropShellPermissionIdentity() {
+ InstrumentationRegistry.getInstrumentation().getUiAutomation()
+ .dropShellPermissionIdentity();
+ }
+
+ @Test
+ public void testBroadcastReceiverWithPermissions() throws Exception {
+ adoptShellPermissionIdentity();
+ final IAdbManager mAdbManager = IAdbManager.Stub.asInterface(
+ ServiceManager.getService(Context.ADB_SERVICE));
+ IntentFilter intentFilter =
+ new IntentFilter(AdbManager.WIRELESS_DEBUG_PAIRED_DEVICES_ACTION);
+ intentFilter.addAction(AdbManager.WIRELESS_DEBUG_STATE_CHANGED_ACTION);
+ intentFilter.addAction(AdbManager.WIRELESS_DEBUG_PAIRING_RESULT_ACTION);
+ assertEquals("Context does not have MANAGE_DEBUGGING permission.",
+ mContext.checkSelfPermission(android.Manifest.permission.MANAGE_DEBUGGING),
+ PackageManager.PERMISSION_GRANTED);
+ try {
+ mContext.registerReceiver(mReceiver, intentFilter);
+ mAdbManager.enablePairingByPairingCode();
+ if (!mAdbActionLatch.await(TIMEOUT, TIMEOUT_TIME_UNIT)) {
+ fail("Receiver did not receive adb intent action within the timeout duration");
+ }
+ } finally {
+ mContext.unregisterReceiver(mReceiver);
+ }
+ }
+
+ @Test
+ public void testBroadcastReceiverWithoutPermissions() throws Exception {
+ adoptShellPermissionIdentity();
+ final IAdbManager mAdbManager = IAdbManager.Stub.asInterface(
+ ServiceManager.getService(Context.ADB_SERVICE));
+ IntentFilter intentFilter =
+ new IntentFilter(AdbManager.WIRELESS_DEBUG_PAIRED_DEVICES_ACTION);
+ intentFilter.addAction(AdbManager.WIRELESS_DEBUG_STATE_CHANGED_ACTION);
+ intentFilter.addAction(AdbManager.WIRELESS_DEBUG_PAIRING_RESULT_ACTION);
+ mAdbManager.enablePairingByPairingCode();
+
+ dropShellPermissionIdentity();
+ assertEquals("Context has MANAGE_DEBUGGING permission.",
+ mContext.checkSelfPermission(android.Manifest.permission.MANAGE_DEBUGGING),
+ PackageManager.PERMISSION_DENIED);
+ try {
+ mContext.registerReceiver(mReceiver, intentFilter);
+
+ if (mAdbActionLatch.await(TIMEOUT, TIMEOUT_TIME_UNIT)) {
+ fail("Broadcast receiver received adb action intent without debug permissions");
+ }
+ } finally {
+ mContext.unregisterReceiver(mReceiver);
+ }
+ }
+
/**
* Runs an adb test with the provided configuration.
*
diff --git a/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java
index cf6165f..e4273dc 100644
--- a/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java
@@ -375,7 +375,7 @@
switchUser(user1.id, null, /* ignoreHandle= */ true);
assertThat(mUserManager.removeUserOrSetEphemeral(user1.id, /* evenWhenDisallowed= */ false))
- .isEqualTo(UserManager.REMOVE_RESULT_SET_EPHEMERAL);
+ .isEqualTo(UserManager.REMOVE_RESULT_DEFERRED);
assertThat(hasUser(user1.id)).isTrue();
assertThat(getUser(user1.id).isEphemeral()).isTrue();
diff --git a/services/tests/servicestests/src/com/android/server/vibrator/FakeVibrator.java b/services/tests/servicestests/src/com/android/server/vibrator/FakeVibrator.java
index e2a348e..4556a4a 100644
--- a/services/tests/servicestests/src/com/android/server/vibrator/FakeVibrator.java
+++ b/services/tests/servicestests/src/com/android/server/vibrator/FakeVibrator.java
@@ -17,6 +17,7 @@
package com.android.server.vibrator;
import android.annotation.NonNull;
+import android.content.Context;
import android.os.VibrationAttributes;
import android.os.VibrationEffect;
import android.os.Vibrator;
@@ -24,37 +25,8 @@
/** Fake implementation of {@link Vibrator} for service tests. */
final class FakeVibrator extends Vibrator {
- private int mDefaultHapticFeedbackIntensity = Vibrator.VIBRATION_INTENSITY_MEDIUM;
- private int mDefaultNotificationIntensity = Vibrator.VIBRATION_INTENSITY_MEDIUM;
- private int mDefaultRingIntensity = Vibrator.VIBRATION_INTENSITY_MEDIUM;
-
- @Override
- public int getDefaultHapticFeedbackIntensity() {
- return mDefaultHapticFeedbackIntensity;
- }
-
- @Override
- public int getDefaultNotificationVibrationIntensity() {
- return mDefaultNotificationIntensity;
- }
-
- @Override
- public int getDefaultRingVibrationIntensity() {
- return mDefaultRingIntensity;
- }
-
- public void setDefaultHapticFeedbackIntensity(
- @VibrationIntensity int defaultHapticFeedbackIntensity) {
- mDefaultHapticFeedbackIntensity = defaultHapticFeedbackIntensity;
- }
-
- public void setDefaultNotificationVibrationIntensity(
- @VibrationIntensity int defaultNotificationIntensity) {
- mDefaultNotificationIntensity = defaultNotificationIntensity;
- }
-
- public void setDefaultRingVibrationIntensity(@VibrationIntensity int defaultRingIntensity) {
- mDefaultRingIntensity = defaultRingIntensity;
+ FakeVibrator(Context context) {
+ super(context);
}
@Override
diff --git a/services/tests/servicestests/src/com/android/server/vibrator/VibrationScalerTest.java b/services/tests/servicestests/src/com/android/server/vibrator/VibrationScalerTest.java
index 59c0b0e..6369dbc 100644
--- a/services/tests/servicestests/src/com/android/server/vibrator/VibrationScalerTest.java
+++ b/services/tests/servicestests/src/com/android/server/vibrator/VibrationScalerTest.java
@@ -16,6 +16,14 @@
package com.android.server.vibrator;
+import static android.os.VibrationAttributes.USAGE_NOTIFICATION;
+import static android.os.VibrationAttributes.USAGE_RINGTONE;
+import static android.os.VibrationAttributes.USAGE_TOUCH;
+import static android.os.Vibrator.VIBRATION_INTENSITY_HIGH;
+import static android.os.Vibrator.VIBRATION_INTENSITY_LOW;
+import static android.os.Vibrator.VIBRATION_INTENSITY_MEDIUM;
+import static android.os.Vibrator.VIBRATION_INTENSITY_OFF;
+
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertTrue;
@@ -24,7 +32,6 @@
import static org.mockito.Mockito.when;
import android.content.ContentResolver;
-import android.content.Context;
import android.content.ContextWrapper;
import android.os.Handler;
import android.os.IExternalVibratorService;
@@ -37,6 +44,7 @@
import android.os.vibrator.PrebakedSegment;
import android.os.vibrator.PrimitiveSegment;
import android.os.vibrator.StepSegment;
+import android.os.vibrator.VibrationConfig;
import android.os.vibrator.VibrationEffectSegment;
import android.platform.test.annotations.Presubmit;
import android.provider.Settings;
@@ -68,29 +76,31 @@
@Rule public FakeSettingsProviderRule mSettingsProviderRule = FakeSettingsProvider.rule();
@Mock private PowerManagerInternal mPowerManagerInternalMock;
+ @Mock private VibrationConfig mVibrationConfigMock;
private TestLooper mTestLooper;
private ContextWrapper mContextSpy;
- private FakeVibrator mFakeVibrator;
private VibrationSettings mVibrationSettings;
private VibrationScaler mVibrationScaler;
@Before
public void setUp() throws Exception {
mTestLooper = new TestLooper();
- mFakeVibrator = new FakeVibrator();
mContextSpy = spy(new ContextWrapper(InstrumentationRegistry.getContext()));
ContentResolver contentResolver = mSettingsProviderRule.mockContentResolver(mContextSpy);
when(mContextSpy.getContentResolver()).thenReturn(contentResolver);
- when(mContextSpy.getSystemService(eq(Context.VIBRATOR_SERVICE))).thenReturn(mFakeVibrator);
LocalServices.removeServiceForTest(PowerManagerInternal.class);
LocalServices.addService(PowerManagerInternal.class, mPowerManagerInternalMock);
+ Settings.System.putInt(contentResolver, Settings.System.HAPTIC_FEEDBACK_ENABLED, 1);
+ Settings.System.putInt(contentResolver, Settings.System.VIBRATE_WHEN_RINGING, 1);
+
mVibrationSettings = new VibrationSettings(
- mContextSpy, new Handler(mTestLooper.getLooper()));
+ mContextSpy, new Handler(mTestLooper.getLooper()), mVibrationConfigMock);
mVibrationScaler = new VibrationScaler(mContextSpy, mVibrationSettings);
+
mVibrationSettings.onSystemReady();
}
@@ -101,91 +111,80 @@
@Test
public void testGetExternalVibrationScale() {
- mFakeVibrator.setDefaultHapticFeedbackIntensity(Vibrator.VIBRATION_INTENSITY_LOW);
- setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY,
- Vibrator.VIBRATION_INTENSITY_HIGH);
+ setDefaultIntensity(USAGE_TOUCH, Vibrator.VIBRATION_INTENSITY_LOW);
+ setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_HIGH);
assertEquals(IExternalVibratorService.SCALE_VERY_HIGH,
- mVibrationScaler.getExternalVibrationScale(VibrationAttributes.USAGE_TOUCH));
+ mVibrationScaler.getExternalVibrationScale(USAGE_TOUCH));
- setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY,
- Vibrator.VIBRATION_INTENSITY_MEDIUM);
+ setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_MEDIUM);
assertEquals(IExternalVibratorService.SCALE_HIGH,
- mVibrationScaler.getExternalVibrationScale(VibrationAttributes.USAGE_TOUCH));
+ mVibrationScaler.getExternalVibrationScale(USAGE_TOUCH));
- setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY,
- Vibrator.VIBRATION_INTENSITY_LOW);
+ setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_LOW);
assertEquals(IExternalVibratorService.SCALE_NONE,
- mVibrationScaler.getExternalVibrationScale(VibrationAttributes.USAGE_TOUCH));
+ mVibrationScaler.getExternalVibrationScale(USAGE_TOUCH));
- mFakeVibrator.setDefaultHapticFeedbackIntensity(Vibrator.VIBRATION_INTENSITY_MEDIUM);
+ setDefaultIntensity(USAGE_TOUCH, VIBRATION_INTENSITY_MEDIUM);
assertEquals(IExternalVibratorService.SCALE_LOW,
- mVibrationScaler.getExternalVibrationScale(VibrationAttributes.USAGE_TOUCH));
+ mVibrationScaler.getExternalVibrationScale(USAGE_TOUCH));
- mFakeVibrator.setDefaultHapticFeedbackIntensity(Vibrator.VIBRATION_INTENSITY_HIGH);
+ setDefaultIntensity(USAGE_TOUCH, VIBRATION_INTENSITY_HIGH);
assertEquals(IExternalVibratorService.SCALE_VERY_LOW,
- mVibrationScaler.getExternalVibrationScale(VibrationAttributes.USAGE_TOUCH));
+ mVibrationScaler.getExternalVibrationScale(USAGE_TOUCH));
- setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY,
- Vibrator.VIBRATION_INTENSITY_OFF);
+ setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_OFF);
// Unexpected vibration intensity will be treated as SCALE_NONE.
assertEquals(IExternalVibratorService.SCALE_NONE,
- mVibrationScaler.getExternalVibrationScale(VibrationAttributes.USAGE_TOUCH));
+ mVibrationScaler.getExternalVibrationScale(USAGE_TOUCH));
}
@Test
public void scale_withPrebakedSegment_setsEffectStrengthBasedOnSettings() {
- setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
- Vibrator.VIBRATION_INTENSITY_HIGH);
+ setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY, VIBRATION_INTENSITY_HIGH);
PrebakedSegment effect = new PrebakedSegment(VibrationEffect.EFFECT_CLICK,
/* shouldFallback= */ false, VibrationEffect.EFFECT_STRENGTH_MEDIUM);
- PrebakedSegment scaled = mVibrationScaler.scale(
- effect, VibrationAttributes.USAGE_NOTIFICATION);
+ PrebakedSegment scaled = mVibrationScaler.scale(effect, USAGE_NOTIFICATION);
assertEquals(scaled.getEffectStrength(), VibrationEffect.EFFECT_STRENGTH_STRONG);
setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
- Vibrator.VIBRATION_INTENSITY_MEDIUM);
- scaled = mVibrationScaler.scale(effect, VibrationAttributes.USAGE_NOTIFICATION);
+ VIBRATION_INTENSITY_MEDIUM);
+ scaled = mVibrationScaler.scale(effect, USAGE_NOTIFICATION);
assertEquals(scaled.getEffectStrength(), VibrationEffect.EFFECT_STRENGTH_MEDIUM);
- setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
- Vibrator.VIBRATION_INTENSITY_LOW);
- scaled = mVibrationScaler.scale(effect, VibrationAttributes.USAGE_NOTIFICATION);
+ setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY, VIBRATION_INTENSITY_LOW);
+ scaled = mVibrationScaler.scale(effect, USAGE_NOTIFICATION);
assertEquals(scaled.getEffectStrength(), VibrationEffect.EFFECT_STRENGTH_LIGHT);
- setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
- Vibrator.VIBRATION_INTENSITY_OFF);
- scaled = mVibrationScaler.scale(effect, VibrationAttributes.USAGE_NOTIFICATION);
+ setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY, VIBRATION_INTENSITY_OFF);
+ scaled = mVibrationScaler.scale(effect, USAGE_NOTIFICATION);
// Unexpected intensity setting will be mapped to STRONG.
assertEquals(scaled.getEffectStrength(), VibrationEffect.EFFECT_STRENGTH_STRONG);
}
@Test
public void scale_withPrebakedEffect_setsEffectStrengthBasedOnSettings() {
- setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
- Vibrator.VIBRATION_INTENSITY_HIGH);
+ setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY, VIBRATION_INTENSITY_HIGH);
VibrationEffect effect = VibrationEffect.createPredefined(VibrationEffect.EFFECT_CLICK);
PrebakedSegment scaled = getFirstSegment(mVibrationScaler.scale(
- effect, VibrationAttributes.USAGE_NOTIFICATION));
+ effect, USAGE_NOTIFICATION));
assertEquals(scaled.getEffectStrength(), VibrationEffect.EFFECT_STRENGTH_STRONG);
setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
- Vibrator.VIBRATION_INTENSITY_MEDIUM);
+ VIBRATION_INTENSITY_MEDIUM);
scaled = getFirstSegment(mVibrationScaler.scale(
- effect, VibrationAttributes.USAGE_NOTIFICATION));
+ effect, USAGE_NOTIFICATION));
assertEquals(scaled.getEffectStrength(), VibrationEffect.EFFECT_STRENGTH_MEDIUM);
- setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
- Vibrator.VIBRATION_INTENSITY_LOW);
+ setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY, VIBRATION_INTENSITY_LOW);
scaled = getFirstSegment(mVibrationScaler.scale(
- effect, VibrationAttributes.USAGE_NOTIFICATION));
+ effect, USAGE_NOTIFICATION));
assertEquals(scaled.getEffectStrength(), VibrationEffect.EFFECT_STRENGTH_LIGHT);
- setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
- Vibrator.VIBRATION_INTENSITY_OFF);
+ setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY, VIBRATION_INTENSITY_OFF);
scaled = getFirstSegment(mVibrationScaler.scale(
- effect, VibrationAttributes.USAGE_NOTIFICATION));
+ effect, USAGE_NOTIFICATION));
// Unexpected intensity setting will be mapped to STRONG.
assertEquals(scaled.getEffectStrength(), VibrationEffect.EFFECT_STRENGTH_STRONG);
}
@@ -193,81 +192,77 @@
@Test
public void scale_withOneShotAndWaveform_resolvesAmplitude() {
// No scale, default amplitude still resolved
- mFakeVibrator.setDefaultRingVibrationIntensity(Vibrator.VIBRATION_INTENSITY_LOW);
- setUserSetting(Settings.System.RING_VIBRATION_INTENSITY,
- Vibrator.VIBRATION_INTENSITY_LOW);
+ setDefaultIntensity(USAGE_RINGTONE, VIBRATION_INTENSITY_LOW);
+ setUserSetting(Settings.System.RING_VIBRATION_INTENSITY, VIBRATION_INTENSITY_LOW);
StepSegment resolved = getFirstSegment(mVibrationScaler.scale(
VibrationEffect.createOneShot(10, VibrationEffect.DEFAULT_AMPLITUDE),
- VibrationAttributes.USAGE_RINGTONE));
+ USAGE_RINGTONE));
assertTrue(resolved.getAmplitude() > 0);
resolved = getFirstSegment(mVibrationScaler.scale(
VibrationEffect.createWaveform(new long[]{10},
new int[]{VibrationEffect.DEFAULT_AMPLITUDE}, -1),
- VibrationAttributes.USAGE_RINGTONE));
+ USAGE_RINGTONE));
assertTrue(resolved.getAmplitude() > 0);
}
@Test
public void scale_withOneShotAndWaveform_scalesAmplitude() {
- mFakeVibrator.setDefaultRingVibrationIntensity(Vibrator.VIBRATION_INTENSITY_LOW);
- setUserSetting(Settings.System.RING_VIBRATION_INTENSITY,
- Vibrator.VIBRATION_INTENSITY_HIGH);
- mFakeVibrator.setDefaultNotificationVibrationIntensity(Vibrator.VIBRATION_INTENSITY_HIGH);
- setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
- Vibrator.VIBRATION_INTENSITY_LOW);
- mFakeVibrator.setDefaultHapticFeedbackIntensity(Vibrator.VIBRATION_INTENSITY_MEDIUM);
- setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY,
- Vibrator.VIBRATION_INTENSITY_MEDIUM);
+ setDefaultIntensity(USAGE_RINGTONE, VIBRATION_INTENSITY_LOW);
+ setUserSetting(Settings.System.RING_VIBRATION_INTENSITY, VIBRATION_INTENSITY_HIGH);
+ setDefaultIntensity(USAGE_NOTIFICATION, VIBRATION_INTENSITY_HIGH);
+ setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY, VIBRATION_INTENSITY_LOW);
+ setDefaultIntensity(USAGE_TOUCH, VIBRATION_INTENSITY_MEDIUM);
+ setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_MEDIUM);
StepSegment scaled = getFirstSegment(mVibrationScaler.scale(
- VibrationEffect.createOneShot(128, 128), VibrationAttributes.USAGE_RINGTONE));
+ VibrationEffect.createOneShot(128, 128), USAGE_RINGTONE));
// Ringtone scales up.
assertTrue(scaled.getAmplitude() > 0.5);
scaled = getFirstSegment(mVibrationScaler.scale(
VibrationEffect.createWaveform(new long[]{128}, new int[]{128}, -1),
- VibrationAttributes.USAGE_NOTIFICATION));
+ USAGE_NOTIFICATION));
// Notification scales down.
assertTrue(scaled.getAmplitude() < 0.5);
scaled = getFirstSegment(mVibrationScaler.scale(VibrationEffect.createOneShot(128, 128),
- VibrationAttributes.USAGE_TOUCH));
+ USAGE_TOUCH));
// Haptic feedback does not scale.
assertEquals(128f / 255, scaled.getAmplitude(), 1e-5);
}
@Test
public void scale_withComposed_scalesPrimitives() {
- mFakeVibrator.setDefaultRingVibrationIntensity(Vibrator.VIBRATION_INTENSITY_LOW);
- setUserSetting(Settings.System.RING_VIBRATION_INTENSITY,
- Vibrator.VIBRATION_INTENSITY_HIGH);
- mFakeVibrator.setDefaultNotificationVibrationIntensity(Vibrator.VIBRATION_INTENSITY_HIGH);
- setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
- Vibrator.VIBRATION_INTENSITY_LOW);
- mFakeVibrator.setDefaultHapticFeedbackIntensity(Vibrator.VIBRATION_INTENSITY_MEDIUM);
- setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY,
- Vibrator.VIBRATION_INTENSITY_MEDIUM);
+ setDefaultIntensity(USAGE_RINGTONE, VIBRATION_INTENSITY_LOW);
+ setUserSetting(Settings.System.RING_VIBRATION_INTENSITY, VIBRATION_INTENSITY_HIGH);
+ setDefaultIntensity(USAGE_NOTIFICATION, VIBRATION_INTENSITY_HIGH);
+ setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY, VIBRATION_INTENSITY_LOW);
+ setDefaultIntensity(USAGE_TOUCH, VIBRATION_INTENSITY_MEDIUM);
+ setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_MEDIUM);
VibrationEffect composed = VibrationEffect.startComposition()
.addPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK, 0.5f).compose();
- PrimitiveSegment scaled = getFirstSegment(mVibrationScaler.scale(composed,
- VibrationAttributes.USAGE_RINGTONE));
+ PrimitiveSegment scaled = getFirstSegment(mVibrationScaler.scale(composed, USAGE_RINGTONE));
// Ringtone scales up.
assertTrue(scaled.getScale() > 0.5f);
- scaled = getFirstSegment(mVibrationScaler.scale(composed,
- VibrationAttributes.USAGE_NOTIFICATION));
+ scaled = getFirstSegment(mVibrationScaler.scale(composed, USAGE_NOTIFICATION));
// Notification scales down.
assertTrue(scaled.getScale() < 0.5f);
- scaled = getFirstSegment(mVibrationScaler.scale(composed, VibrationAttributes.USAGE_TOUCH));
+ scaled = getFirstSegment(mVibrationScaler.scale(composed, USAGE_TOUCH));
// Haptic feedback does not scale.
assertEquals(0.5, scaled.getScale(), 1e-5);
}
+ private void setDefaultIntensity(@VibrationAttributes.Usage int usage,
+ @Vibrator.VibrationIntensity int intensity) {
+ when(mVibrationConfigMock.getDefaultVibrationIntensity(eq(usage))).thenReturn(intensity);
+ }
+
private <T extends VibrationEffectSegment> T getFirstSegment(VibrationEffect.Composed effect) {
return (T) effect.getSegments().get(0);
}
diff --git a/services/tests/servicestests/src/com/android/server/vibrator/VibrationSettingsTest.java b/services/tests/servicestests/src/com/android/server/vibrator/VibrationSettingsTest.java
index ab9fbb5..ff59d0f 100644
--- a/services/tests/servicestests/src/com/android/server/vibrator/VibrationSettingsTest.java
+++ b/services/tests/servicestests/src/com/android/server/vibrator/VibrationSettingsTest.java
@@ -16,9 +16,11 @@
package com.android.server.vibrator;
+import static android.os.VibrationAttributes.USAGE_ACCESSIBILITY;
import static android.os.VibrationAttributes.USAGE_ALARM;
import static android.os.VibrationAttributes.USAGE_COMMUNICATION_REQUEST;
import static android.os.VibrationAttributes.USAGE_HARDWARE_FEEDBACK;
+import static android.os.VibrationAttributes.USAGE_MEDIA;
import static android.os.VibrationAttributes.USAGE_NOTIFICATION;
import static android.os.VibrationAttributes.USAGE_PHYSICAL_EMULATION;
import static android.os.VibrationAttributes.USAGE_RINGTONE;
@@ -35,6 +37,7 @@
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.spy;
@@ -45,7 +48,6 @@
import android.app.ActivityManager;
import android.content.ContentResolver;
-import android.content.Context;
import android.content.ContextWrapper;
import android.content.Intent;
import android.media.AudioManager;
@@ -55,7 +57,9 @@
import android.os.UserHandle;
import android.os.VibrationAttributes;
import android.os.VibrationEffect;
+import android.os.Vibrator;
import android.os.test.TestLooper;
+import android.os.vibrator.VibrationConfig;
import android.platform.test.annotations.Presubmit;
import android.provider.Settings;
@@ -87,6 +91,19 @@
private static final PowerSaveState LOW_POWER_STATE = new PowerSaveState.Builder()
.setBatterySaverEnabled(true).build();
+ private static final int[] ALL_USAGES = new int[] {
+ USAGE_UNKNOWN,
+ USAGE_ACCESSIBILITY,
+ USAGE_ALARM,
+ USAGE_COMMUNICATION_REQUEST,
+ USAGE_HARDWARE_FEEDBACK,
+ USAGE_MEDIA,
+ USAGE_NOTIFICATION,
+ USAGE_PHYSICAL_EMULATION,
+ USAGE_RINGTONE,
+ USAGE_TOUCH,
+ };
+
@Rule
public MockitoRule mMockitoRule = MockitoJUnit.rule();
@Rule
@@ -96,23 +113,23 @@
private VibrationSettings.OnVibratorSettingsChanged mListenerMock;
@Mock
private PowerManagerInternal mPowerManagerInternalMock;
+ @Mock
+ private VibrationConfig mVibrationConfigMock;
private TestLooper mTestLooper;
private ContextWrapper mContextSpy;
private AudioManager mAudioManager;
- private FakeVibrator mFakeVibrator;
private VibrationSettings mVibrationSettings;
private PowerManagerInternal.LowPowerModeListener mRegisteredPowerModeListener;
@Before
public void setUp() throws Exception {
mTestLooper = new TestLooper();
- mFakeVibrator = new FakeVibrator();
mContextSpy = spy(new ContextWrapper(InstrumentationRegistry.getContext()));
ContentResolver contentResolver = mSettingsProviderRule.mockContentResolver(mContextSpy);
when(mContextSpy.getContentResolver()).thenReturn(contentResolver);
- when(mContextSpy.getSystemService(eq(Context.VIBRATOR_SERVICE))).thenReturn(mFakeVibrator);
+
doAnswer(invocation -> {
mRegisteredPowerModeListener = invocation.getArgument(0);
return null;
@@ -121,16 +138,18 @@
LocalServices.removeServiceForTest(PowerManagerInternal.class);
LocalServices.addService(PowerManagerInternal.class, mPowerManagerInternalMock);
+ setDefaultIntensity(VIBRATION_INTENSITY_MEDIUM);
mAudioManager = mContextSpy.getSystemService(AudioManager.class);
mVibrationSettings = new VibrationSettings(mContextSpy,
- new Handler(mTestLooper.getLooper()));
- mVibrationSettings.onSystemReady();
+ new Handler(mTestLooper.getLooper()), mVibrationConfigMock);
// Simulate System defaults.
+ setUserSetting(Settings.System.HAPTIC_FEEDBACK_ENABLED, 1);
setUserSetting(Settings.System.VIBRATE_INPUT_DEVICES, 0);
setUserSetting(Settings.System.VIBRATE_WHEN_RINGING, 1);
setUserSetting(Settings.System.APPLY_RAMPING_RINGER, 0);
setRingerMode(AudioManager.RINGER_MODE_NORMAL);
+ mVibrationSettings.onSystemReady();
}
@After
@@ -145,12 +164,15 @@
setUserSetting(Settings.System.VIBRATE_INPUT_DEVICES, 1);
setUserSetting(Settings.System.VIBRATE_WHEN_RINGING, 0);
setUserSetting(Settings.System.APPLY_RAMPING_RINGER, 0);
+ setUserSetting(Settings.System.ALARM_VIBRATION_INTENSITY, VIBRATION_INTENSITY_OFF);
setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY, VIBRATION_INTENSITY_OFF);
+ setUserSetting(Settings.System.MEDIA_VIBRATION_INTENSITY, VIBRATION_INTENSITY_OFF);
setUserSetting(Settings.System.RING_VIBRATION_INTENSITY, VIBRATION_INTENSITY_OFF);
+ setUserSetting(Settings.System.HAPTIC_FEEDBACK_ENABLED, 0);
setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_OFF);
setUserSetting(Settings.System.HARDWARE_HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_OFF);
- verify(mListenerMock, times(7)).onChange();
+ verify(mListenerMock, times(10)).onChange();
}
@Test
@@ -192,9 +214,7 @@
UID, ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND, 0, 0);
for (int usage : expectedAllowedVibrations) {
- assertNull("Error for usage " + VibrationAttributes.usageToString(usage),
- mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(usage)));
+ assertVibrationNotIgnoredForUsage(usage);
}
}
@@ -209,10 +229,7 @@
UID, ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND, 0, 0);
for (int usage : expectedIgnoredVibrations) {
- assertEquals("Error for usage " + VibrationAttributes.usageToString(usage),
- Vibration.Status.IGNORED_BACKGROUND,
- mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(usage)));
+ assertVibrationIgnoredForUsage(usage, Vibration.Status.IGNORED_BACKGROUND);
}
}
@@ -221,10 +238,9 @@
mVibrationSettings.mUidObserver.onUidStateChanged(
UID, ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND, 0, 0);
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_TOUCH)));
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_ALARM)));
+ for (int usage : ALL_USAGES) {
+ assertVibrationNotIgnoredForUsage(usage);
+ }
}
@Test
@@ -238,9 +254,7 @@
mRegisteredPowerModeListener.onLowPowerModeChanged(LOW_POWER_STATE);
for (int usage : expectedAllowedVibrations) {
- assertNull("Error for usage " + VibrationAttributes.usageToString(usage),
- mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(usage)));
+ assertVibrationNotIgnoredForUsage(usage);
}
}
@@ -257,10 +271,7 @@
mRegisteredPowerModeListener.onLowPowerModeChanged(LOW_POWER_STATE);
for (int usage : expectedIgnoredVibrations) {
- assertEquals("Error for usage " + VibrationAttributes.usageToString(usage),
- Vibration.Status.IGNORED_FOR_POWER,
- mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(usage)));
+ assertVibrationIgnoredForUsage(usage, Vibration.Status.IGNORED_FOR_POWER);
}
}
@@ -268,130 +279,130 @@
public void shouldIgnoreVibration_notInBatterySaverMode_allowsAnyUsage() {
mRegisteredPowerModeListener.onLowPowerModeChanged(NORMAL_POWER_STATE);
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_TOUCH)));
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_COMMUNICATION_REQUEST)));
+ for (int usage : ALL_USAGES) {
+ assertVibrationNotIgnoredForUsage(usage);
+ }
}
@Test
public void shouldIgnoreVibration_withRingerModeSilent_ignoresRingtoneAndTouch() {
// Vibrating settings on are overruled by ringer mode.
+ setUserSetting(Settings.System.HAPTIC_FEEDBACK_ENABLED, 1);
setUserSetting(Settings.System.VIBRATE_WHEN_RINGING, 1);
- setUserSetting(Settings.System.APPLY_RAMPING_RINGER, 0);
+ setUserSetting(Settings.System.APPLY_RAMPING_RINGER, 1);
setRingerMode(AudioManager.RINGER_MODE_SILENT);
- assertEquals(Vibration.Status.IGNORED_FOR_RINGER_MODE,
- mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_RINGTONE)));
- assertEquals(Vibration.Status.IGNORED_FOR_RINGER_MODE,
- mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_TOUCH)));
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_COMMUNICATION_REQUEST)));
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_HARDWARE_FEEDBACK)));
+ for (int usage : ALL_USAGES) {
+ if (usage == USAGE_RINGTONE || usage == USAGE_TOUCH) {
+ assertVibrationIgnoredForUsage(usage, Vibration.Status.IGNORED_FOR_RINGER_MODE);
+ } else {
+ assertVibrationNotIgnoredForUsage(usage);
+ }
+ }
}
@Test
public void shouldIgnoreVibration_withRingerModeVibrate_allowsAllVibrations() {
- // Vibrating settings off are overruled by ringer mode.
- setUserSetting(Settings.System.VIBRATE_WHEN_RINGING, 0);
- setUserSetting(Settings.System.APPLY_RAMPING_RINGER, 0);
setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_TOUCH)));
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_PHYSICAL_EMULATION)));
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_RINGTONE)));
+ for (int usage : ALL_USAGES) {
+ assertVibrationNotIgnoredForUsage(usage);
+ }
}
@Test
- public void shouldIgnoreVibration_withRingerModeNormalAndRingSettingsOff_ignoresRingtoneOnly() {
- // Vibrating settings off are respected for normal ringer mode.
- setUserSetting(Settings.System.VIBRATE_WHEN_RINGING, 0);
- setUserSetting(Settings.System.APPLY_RAMPING_RINGER, 0);
+ public void shouldIgnoreVibration_withRingerModeNormal_allowsAllVibrations() {
setRingerMode(AudioManager.RINGER_MODE_NORMAL);
- assertEquals(Vibration.Status.IGNORED_FOR_RINGER_MODE,
- mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_RINGTONE)));
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_TOUCH)));
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_NOTIFICATION)));
+ for (int usage : ALL_USAGES) {
+ assertVibrationNotIgnoredForUsage(usage);
+ }
}
@Test
- public void shouldIgnoreVibration_withRingerModeNormalAndRingSettingsOn_allowsAllVibrations() {
+ public void shouldIgnoreVibration_withRingSettingsOff_disableRingtoneVibrations() {
+ setUserSetting(Settings.System.VIBRATE_WHEN_RINGING, 0);
+ setUserSetting(Settings.System.APPLY_RAMPING_RINGER, 0);
+
+ for (int usage : ALL_USAGES) {
+ if (usage == USAGE_RINGTONE) {
+ assertVibrationIgnoredForUsage(usage, Vibration.Status.IGNORED_FOR_SETTINGS);
+ } else {
+ assertVibrationNotIgnoredForUsage(usage);
+ }
+ }
+ }
+
+ @Test
+ public void shouldIgnoreVibration_withRingSettingsOn_allowsAllVibrations() {
setUserSetting(Settings.System.VIBRATE_WHEN_RINGING, 1);
setUserSetting(Settings.System.APPLY_RAMPING_RINGER, 0);
- setRingerMode(AudioManager.RINGER_MODE_NORMAL);
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_TOUCH)));
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_RINGTONE)));
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_ALARM)));
+ for (int usage : ALL_USAGES) {
+ assertVibrationNotIgnoredForUsage(usage);
+ }
}
@Test
- public void shouldIgnoreVibration_withRingerModeNormalAndRampingRingerOn_allowsAllVibrations() {
+ public void shouldIgnoreVibration_withRampingRingerOn_allowsAllVibrations() {
setUserSetting(Settings.System.VIBRATE_WHEN_RINGING, 0);
setUserSetting(Settings.System.APPLY_RAMPING_RINGER, 1);
- setRingerMode(AudioManager.RINGER_MODE_NORMAL);
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_TOUCH)));
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_RINGTONE)));
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_COMMUNICATION_REQUEST)));
+ for (int usage : ALL_USAGES) {
+ assertVibrationNotIgnoredForUsage(usage);
+ }
+ }
+
+ @Test
+ public void shouldIgnoreVibration_withHapticFeedbackDisabled_ignoresTouchVibration() {
+ setUserSetting(Settings.System.HAPTIC_FEEDBACK_ENABLED, 0);
+
+ for (int usage : ALL_USAGES) {
+ if (usage == USAGE_TOUCH) {
+ assertVibrationIgnoredForUsage(usage, Vibration.Status.IGNORED_FOR_SETTINGS);
+ } else {
+ assertVibrationNotIgnoredForUsage(usage);
+ }
+ }
}
@Test
public void shouldIgnoreVibration_withHapticFeedbackSettingsOff_ignoresTouchVibration() {
setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_OFF);
- assertEquals(Vibration.Status.IGNORED_FOR_SETTINGS,
- mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_TOUCH)));
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_RINGTONE)));
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_HARDWARE_FEEDBACK)));
+ for (int usage : ALL_USAGES) {
+ if (usage == USAGE_TOUCH) {
+ assertVibrationIgnoredForUsage(usage, Vibration.Status.IGNORED_FOR_SETTINGS);
+ } else {
+ assertVibrationNotIgnoredForUsage(usage);
+ }
+ }
}
@Test
public void shouldIgnoreVibration_withHardwareFeedbackSettingsOff_ignoresHardwareVibrations() {
setUserSetting(Settings.System.HARDWARE_HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_OFF);
- assertEquals(Vibration.Status.IGNORED_FOR_SETTINGS,
- mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_HARDWARE_FEEDBACK)));
- assertEquals(Vibration.Status.IGNORED_FOR_SETTINGS,
- mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_PHYSICAL_EMULATION)));
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_TOUCH)));
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_NOTIFICATION)));
+ for (int usage : ALL_USAGES) {
+ if (usage == USAGE_HARDWARE_FEEDBACK || usage == USAGE_PHYSICAL_EMULATION) {
+ assertVibrationIgnoredForUsage(usage, Vibration.Status.IGNORED_FOR_SETTINGS);
+ } else {
+ assertVibrationNotIgnoredForUsage(usage);
+ }
+ }
}
@Test
public void shouldIgnoreVibration_withNotificationSettingsOff_ignoresNotificationVibrations() {
setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY, VIBRATION_INTENSITY_OFF);
- assertEquals(Vibration.Status.IGNORED_FOR_SETTINGS,
- mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_NOTIFICATION)));
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_ALARM)));
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_RINGTONE)));
+ for (int usage : ALL_USAGES) {
+ if (usage == USAGE_NOTIFICATION) {
+ assertVibrationIgnoredForUsage(usage, Vibration.Status.IGNORED_FOR_SETTINGS);
+ } else {
+ assertVibrationNotIgnoredForUsage(usage);
+ }
+ }
}
@Test
@@ -402,15 +413,13 @@
setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
setUserSetting(Settings.System.RING_VIBRATION_INTENSITY, VIBRATION_INTENSITY_OFF);
- assertEquals(Vibration.Status.IGNORED_FOR_SETTINGS,
- mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_RINGTONE)));
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_NOTIFICATION)));
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_ALARM)));
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_TOUCH)));
+ for (int usage : ALL_USAGES) {
+ if (usage == USAGE_RINGTONE) {
+ assertVibrationIgnoredForUsage(usage, Vibration.Status.IGNORED_FOR_SETTINGS);
+ } else {
+ assertVibrationNotIgnoredForUsage(usage);
+ }
+ }
}
@Test
@@ -423,90 +432,40 @@
}
@Test
- public void getDefaultIntensity_beforeSystemReady_returnsMediumToAllExceptAlarm() {
- mFakeVibrator.setDefaultHapticFeedbackIntensity(VIBRATION_INTENSITY_HIGH);
- mFakeVibrator.setDefaultNotificationVibrationIntensity(VIBRATION_INTENSITY_HIGH);
- mFakeVibrator.setDefaultRingVibrationIntensity(VIBRATION_INTENSITY_HIGH);
-
- setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY, VIBRATION_INTENSITY_OFF);
- setUserSetting(Settings.System.RING_VIBRATION_INTENSITY, VIBRATION_INTENSITY_OFF);
+ public void getDefaultIntensity_returnsIntensityFromVibratorConfig() {
+ setDefaultIntensity(VIBRATION_INTENSITY_HIGH);
+ setUserSetting(Settings.System.ALARM_VIBRATION_INTENSITY, VIBRATION_INTENSITY_OFF);
setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_OFF);
setUserSetting(Settings.System.HARDWARE_HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_OFF);
-
- VibrationSettings vibrationSettings = new VibrationSettings(mContextSpy,
- new Handler(mTestLooper.getLooper()));
-
- assertEquals(VIBRATION_INTENSITY_HIGH,
- vibrationSettings.getDefaultIntensity(USAGE_ALARM));
- assertEquals(VIBRATION_INTENSITY_MEDIUM,
- vibrationSettings.getDefaultIntensity(USAGE_TOUCH));
- assertEquals(VIBRATION_INTENSITY_MEDIUM,
- vibrationSettings.getDefaultIntensity(USAGE_HARDWARE_FEEDBACK));
- assertEquals(VIBRATION_INTENSITY_MEDIUM,
- vibrationSettings.getDefaultIntensity(USAGE_PHYSICAL_EMULATION));
- assertEquals(VIBRATION_INTENSITY_MEDIUM,
- vibrationSettings.getDefaultIntensity(USAGE_NOTIFICATION));
- assertEquals(VIBRATION_INTENSITY_MEDIUM,
- vibrationSettings.getDefaultIntensity(USAGE_UNKNOWN));
- assertEquals(VIBRATION_INTENSITY_MEDIUM,
- vibrationSettings.getDefaultIntensity(USAGE_RINGTONE));
- }
-
- @Test
- public void getDefaultIntensity_returnsIntensityFromVibratorService() {
- mFakeVibrator.setDefaultHapticFeedbackIntensity(VIBRATION_INTENSITY_HIGH);
- mFakeVibrator.setDefaultNotificationVibrationIntensity(VIBRATION_INTENSITY_MEDIUM);
- mFakeVibrator.setDefaultRingVibrationIntensity(VIBRATION_INTENSITY_LOW);
-
setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY, VIBRATION_INTENSITY_OFF);
+ setUserSetting(Settings.System.MEDIA_VIBRATION_INTENSITY, VIBRATION_INTENSITY_OFF);
setUserSetting(Settings.System.RING_VIBRATION_INTENSITY, VIBRATION_INTENSITY_OFF);
- setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_OFF);
- assertEquals(VIBRATION_INTENSITY_HIGH,
- mVibrationSettings.getDefaultIntensity(USAGE_ALARM));
- assertEquals(VIBRATION_INTENSITY_HIGH,
- mVibrationSettings.getDefaultIntensity(USAGE_TOUCH));
- assertEquals(VIBRATION_INTENSITY_HIGH,
- mVibrationSettings.getDefaultIntensity(USAGE_HARDWARE_FEEDBACK));
- assertEquals(VIBRATION_INTENSITY_HIGH,
- mVibrationSettings.getDefaultIntensity(USAGE_PHYSICAL_EMULATION));
- assertEquals(VIBRATION_INTENSITY_MEDIUM,
- mVibrationSettings.getDefaultIntensity(USAGE_NOTIFICATION));
- assertEquals(VIBRATION_INTENSITY_MEDIUM,
- mVibrationSettings.getDefaultIntensity(USAGE_UNKNOWN));
- assertEquals(VIBRATION_INTENSITY_LOW,
- mVibrationSettings.getDefaultIntensity(USAGE_RINGTONE));
+ for (int usage : ALL_USAGES) {
+ assertEquals(VIBRATION_INTENSITY_HIGH, mVibrationSettings.getDefaultIntensity(usage));
+ }
}
@Test
public void getCurrentIntensity_returnsIntensityFromSettings() {
- mFakeVibrator.setDefaultHapticFeedbackIntensity(VIBRATION_INTENSITY_OFF);
- mFakeVibrator.setDefaultNotificationVibrationIntensity(VIBRATION_INTENSITY_OFF);
- mFakeVibrator.setDefaultRingVibrationIntensity(VIBRATION_INTENSITY_OFF);
-
- setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_HIGH);
+ setDefaultIntensity(VIBRATION_INTENSITY_OFF);
+ setUserSetting(Settings.System.ALARM_VIBRATION_INTENSITY, VIBRATION_INTENSITY_LOW);
+ setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_LOW);
setUserSetting(Settings.System.HARDWARE_HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_LOW);
- setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
- VIBRATION_INTENSITY_MEDIUM);
+ setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY, VIBRATION_INTENSITY_LOW);
+ setUserSetting(Settings.System.MEDIA_VIBRATION_INTENSITY, VIBRATION_INTENSITY_LOW);
setUserSetting(Settings.System.RING_VIBRATION_INTENSITY, VIBRATION_INTENSITY_LOW);
- assertEquals(VIBRATION_INTENSITY_HIGH, mVibrationSettings.getCurrentIntensity(USAGE_ALARM));
- assertEquals(VIBRATION_INTENSITY_HIGH, mVibrationSettings.getCurrentIntensity(USAGE_TOUCH));
- assertEquals(VIBRATION_INTENSITY_LOW,
- mVibrationSettings.getCurrentIntensity(USAGE_HARDWARE_FEEDBACK));
- assertEquals(VIBRATION_INTENSITY_LOW,
- mVibrationSettings.getCurrentIntensity(USAGE_PHYSICAL_EMULATION));
- assertEquals(VIBRATION_INTENSITY_MEDIUM,
- mVibrationSettings.getCurrentIntensity(USAGE_NOTIFICATION));
- assertEquals(VIBRATION_INTENSITY_MEDIUM,
- mVibrationSettings.getCurrentIntensity(USAGE_UNKNOWN));
- assertEquals(VIBRATION_INTENSITY_LOW,
- mVibrationSettings.getCurrentIntensity(USAGE_RINGTONE));
+ for (int usage : ALL_USAGES) {
+ assertEquals(errorMessageForUsage(usage),
+ VIBRATION_INTENSITY_LOW,
+ mVibrationSettings.getCurrentIntensity(usage));
+ }
}
@Test
public void getCurrentIntensity_updateTriggeredAfterUserSwitched() {
- mFakeVibrator.setDefaultRingVibrationIntensity(VIBRATION_INTENSITY_OFF);
+ setDefaultIntensity(USAGE_RINGTONE, VIBRATION_INTENSITY_OFF);
setUserSetting(Settings.System.RING_VIBRATION_INTENSITY, VIBRATION_INTENSITY_HIGH);
assertEquals(VIBRATION_INTENSITY_HIGH,
mVibrationSettings.getCurrentIntensity(USAGE_RINGTONE));
@@ -524,8 +483,9 @@
@Test
public void getCurrentIntensity_noHardwareFeedbackValueUsesHapticFeedbackValue() {
- mFakeVibrator.setDefaultHapticFeedbackIntensity(VIBRATION_INTENSITY_MEDIUM);
+ setDefaultIntensity(USAGE_HARDWARE_FEEDBACK, VIBRATION_INTENSITY_MEDIUM);
setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_OFF);
+ mVibrationSettings.updateSettings();
assertEquals(VIBRATION_INTENSITY_OFF, mVibrationSettings.getCurrentIntensity(USAGE_TOUCH));
// If haptic feedback is off, fallback to default value.
assertEquals(VIBRATION_INTENSITY_MEDIUM,
@@ -533,15 +493,11 @@
assertEquals(VIBRATION_INTENSITY_MEDIUM,
mVibrationSettings.getCurrentIntensity(USAGE_PHYSICAL_EMULATION));
- // Switching user is not working with FakeSettingsProvider.
- // Testing the broadcast flow manually.
- Settings.System.putIntForUser(mContextSpy.getContentResolver(),
- Settings.System.HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_HIGH,
- UserHandle.USER_CURRENT);
- mVibrationSettings.mUserReceiver.onReceive(mContextSpy,
- new Intent(Intent.ACTION_USER_SWITCHED));
+ setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_HIGH);
+ mVibrationSettings.updateSettings();
assertEquals(VIBRATION_INTENSITY_HIGH,
mVibrationSettings.getCurrentIntensity(USAGE_TOUCH));
+ // If haptic feedback is on, fallback to that value.
assertEquals(VIBRATION_INTENSITY_HIGH,
mVibrationSettings.getCurrentIntensity(USAGE_HARDWARE_FEEDBACK));
assertEquals(VIBRATION_INTENSITY_HIGH,
@@ -557,6 +513,33 @@
assertNotNull(mVibrationSettings.getFallbackEffect(VibrationEffect.EFFECT_DOUBLE_CLICK));
}
+ private void assertVibrationIgnoredForUsage(@VibrationAttributes.Usage int usage,
+ Vibration.Status expectedStatus) {
+ assertEquals(errorMessageForUsage(usage),
+ expectedStatus,
+ mVibrationSettings.shouldIgnoreVibration(UID,
+ VibrationAttributes.createForUsage(usage)));
+ }
+
+ private void assertVibrationNotIgnoredForUsage(@VibrationAttributes.Usage int usage) {
+ assertNull(errorMessageForUsage(usage),
+ mVibrationSettings.shouldIgnoreVibration(UID,
+ VibrationAttributes.createForUsage(usage)));
+ }
+
+ private String errorMessageForUsage(int usage) {
+ return "Error for usage " + VibrationAttributes.usageToString(usage);
+ }
+
+ private void setDefaultIntensity(@Vibrator.VibrationIntensity int intensity) {
+ when(mVibrationConfigMock.getDefaultVibrationIntensity(anyInt())).thenReturn(intensity);
+ }
+
+ private void setDefaultIntensity(@VibrationAttributes.Usage int usage,
+ @Vibrator.VibrationIntensity int intensity) {
+ when(mVibrationConfigMock.getDefaultVibrationIntensity(eq(usage))).thenReturn(intensity);
+ }
+
private void setUserSetting(String settingName, int value) {
Settings.System.putIntForUser(
mContextSpy.getContentResolver(), settingName, value, UserHandle.USER_CURRENT);
diff --git a/services/tests/servicestests/src/com/android/server/vibrator/VibrationThreadTest.java b/services/tests/servicestests/src/com/android/server/vibrator/VibrationThreadTest.java
index bfceb9a..5dd44ff 100644
--- a/services/tests/servicestests/src/com/android/server/vibrator/VibrationThreadTest.java
+++ b/services/tests/servicestests/src/com/android/server/vibrator/VibrationThreadTest.java
@@ -44,11 +44,13 @@
import android.os.SystemClock;
import android.os.VibrationAttributes;
import android.os.VibrationEffect;
+import android.os.Vibrator;
import android.os.test.TestLooper;
import android.os.vibrator.PrebakedSegment;
import android.os.vibrator.PrimitiveSegment;
import android.os.vibrator.RampSegment;
import android.os.vibrator.StepSegment;
+import android.os.vibrator.VibrationConfig;
import android.os.vibrator.VibrationEffectSegment;
import android.platform.test.annotations.LargeTest;
import android.platform.test.annotations.Presubmit;
@@ -101,6 +103,8 @@
private IBinder mVibrationToken;
@Mock
private IBatteryStats mIBatteryStatsMock;
+ @Mock
+ private VibrationConfig mVibrationConfigMock;
private final Map<Integer, FakeVibratorControllerProvider> mVibratorProviders = new HashMap<>();
private VibrationSettings mVibrationSettings;
@@ -113,9 +117,13 @@
public void setUp() throws Exception {
mTestLooper = new TestLooper();
+ when(mVibrationConfigMock.getDefaultVibrationIntensity(anyInt()))
+ .thenReturn(Vibrator.VIBRATION_INTENSITY_MEDIUM);
+ when(mVibrationConfigMock.getRampStepDurationMs()).thenReturn(TEST_RAMP_STEP_DURATION);
+
Context context = InstrumentationRegistry.getContext();
mVibrationSettings = new VibrationSettings(context, new Handler(mTestLooper.getLooper()),
- /* rampDownDuration= */ 0, TEST_RAMP_STEP_DURATION);
+ mVibrationConfigMock);
mEffectAdapter = new DeviceVibrationEffectAdapter(mVibrationSettings);
mWakeLock = context.getSystemService(
PowerManager.class).newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*vibrator*");
@@ -1111,9 +1119,7 @@
@Test
public void vibrate_waveformWithRampDown_addsRampDownAfterVibrationCompleted() {
- int rampDownDuration = 15;
- mVibrationSettings = new VibrationSettings(InstrumentationRegistry.getContext(),
- new Handler(mTestLooper.getLooper()), rampDownDuration, TEST_RAMP_STEP_DURATION);
+ when(mVibrationConfigMock.getRampDownDurationMs()).thenReturn(15);
mEffectAdapter = new DeviceVibrationEffectAdapter(mVibrationSettings);
mVibratorProviders.get(VIBRATOR_ID).setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL);
@@ -1139,9 +1145,7 @@
@Test
public void vibrate_waveformWithRampDown_triggersCallbackWhenOriginalVibrationEnds() {
- int rampDownDuration = 10_000;
- mVibrationSettings = new VibrationSettings(InstrumentationRegistry.getContext(),
- new Handler(mTestLooper.getLooper()), rampDownDuration, TEST_RAMP_STEP_DURATION);
+ when(mVibrationConfigMock.getRampDownDurationMs()).thenReturn(10_000);
mEffectAdapter = new DeviceVibrationEffectAdapter(mVibrationSettings);
mVibratorProviders.get(VIBRATOR_ID).setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL);
@@ -1174,9 +1178,7 @@
@Test
public void vibrate_waveformCancelledWithRampDown_addsRampDownAfterVibrationCancelled()
throws Exception {
- int rampDownDuration = 15;
- mVibrationSettings = new VibrationSettings(InstrumentationRegistry.getContext(),
- new Handler(mTestLooper.getLooper()), rampDownDuration, TEST_RAMP_STEP_DURATION);
+ when(mVibrationConfigMock.getRampDownDurationMs()).thenReturn(15);
mEffectAdapter = new DeviceVibrationEffectAdapter(mVibrationSettings);
mVibratorProviders.get(VIBRATOR_ID).setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL);
@@ -1202,9 +1204,7 @@
@Test
public void vibrate_predefinedWithRampDown_doesNotAddRampDown() {
- int rampDownDuration = 15;
- mVibrationSettings = new VibrationSettings(InstrumentationRegistry.getContext(),
- new Handler(mTestLooper.getLooper()), rampDownDuration, TEST_RAMP_STEP_DURATION);
+ when(mVibrationConfigMock.getRampDownDurationMs()).thenReturn(15);
mEffectAdapter = new DeviceVibrationEffectAdapter(mVibrationSettings);
mVibratorProviders.get(VIBRATOR_ID).setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL);
mVibratorProviders.get(VIBRATOR_ID).setSupportedEffects(VibrationEffect.EFFECT_CLICK);
@@ -1224,9 +1224,7 @@
@Test
public void vibrate_composedWithRampDown_doesNotAddRampDown() {
- int rampDownDuration = 15;
- mVibrationSettings = new VibrationSettings(InstrumentationRegistry.getContext(),
- new Handler(mTestLooper.getLooper()), rampDownDuration, TEST_RAMP_STEP_DURATION);
+ when(mVibrationConfigMock.getRampDownDurationMs()).thenReturn(15);
mEffectAdapter = new DeviceVibrationEffectAdapter(mVibrationSettings);
mVibratorProviders.get(VIBRATOR_ID).setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL,
IVibrator.CAP_COMPOSE_EFFECTS);
@@ -1251,9 +1249,7 @@
@Test
public void vibrate_pwleWithRampDown_doesNotAddRampDown() {
- int rampDownDuration = 15;
- mVibrationSettings = new VibrationSettings(InstrumentationRegistry.getContext(),
- new Handler(mTestLooper.getLooper()), rampDownDuration, TEST_RAMP_STEP_DURATION);
+ when(mVibrationConfigMock.getRampDownDurationMs()).thenReturn(15);
mEffectAdapter = new DeviceVibrationEffectAdapter(mVibrationSettings);
FakeVibratorControllerProvider fakeVibrator = mVibratorProviders.get(VIBRATOR_ID);
fakeVibrator.setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL,
diff --git a/services/tests/servicestests/src/com/android/server/vibrator/VibratorManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/vibrator/VibratorManagerServiceTest.java
index c0f7596..b0bdaf0 100644
--- a/services/tests/servicestests/src/com/android/server/vibrator/VibratorManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/vibrator/VibratorManagerServiceTest.java
@@ -19,6 +19,7 @@
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
@@ -155,12 +156,13 @@
@Before
public void setUp() throws Exception {
mTestLooper = new TestLooper();
- mVibrator = new FakeVibrator();
mContextSpy = spy(new ContextWrapper(InstrumentationRegistry.getContext()));
InputManager inputManager = InputManager.resetInstance(mIInputManagerMock);
ContentResolver contentResolver = mSettingsProviderRule.mockContentResolver(mContextSpy);
when(mContextSpy.getContentResolver()).thenReturn(contentResolver);
+
+ mVibrator = new FakeVibrator(mContextSpy);
when(mContextSpy.getSystemService(eq(Context.VIBRATOR_SERVICE))).thenReturn(mVibrator);
when(mContextSpy.getSystemService(eq(Context.INPUT_SERVICE))).thenReturn(inputManager);
when(mContextSpy.getSystemService(Context.APP_OPS_SERVICE)).thenReturn(mAppOpsManagerMock);
@@ -175,8 +177,13 @@
}).when(mPowerManagerInternalMock).registerLowPowerModeObserver(any());
setUserSetting(Settings.System.VIBRATE_WHEN_RINGING, 1);
+ setUserSetting(Settings.System.HAPTIC_FEEDBACK_ENABLED, 1);
+ setUserSetting(Settings.System.ALARM_VIBRATION_INTENSITY,
+ Vibrator.VIBRATION_INTENSITY_MEDIUM);
setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
Vibrator.VIBRATION_INTENSITY_MEDIUM);
+ setUserSetting(Settings.System.MEDIA_VIBRATION_INTENSITY,
+ Vibrator.VIBRATION_INTENSITY_MEDIUM);
setUserSetting(Settings.System.RING_VIBRATION_INTENSITY,
Vibrator.VIBRATION_INTENSITY_MEDIUM);
setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY,
@@ -437,7 +444,7 @@
UID, PACKAGE_NAME, 1, effect, ALARM_ATTRS));
PrebakedSegment expected = new PrebakedSegment(
- VibrationEffect.EFFECT_CLICK, false, VibrationEffect.EFFECT_STRENGTH_STRONG);
+ VibrationEffect.EFFECT_CLICK, false, VibrationEffect.EFFECT_STRENGTH_MEDIUM);
// Only vibrators 1 and 3 have always-on capabilities.
assertEquals(mVibratorProviders.get(1).getAlwaysOnEffect(1), expected);
@@ -461,10 +468,10 @@
UID, PACKAGE_NAME, 1, effect, ALARM_ATTRS));
PrebakedSegment expectedClick = new PrebakedSegment(
- VibrationEffect.EFFECT_CLICK, false, VibrationEffect.EFFECT_STRENGTH_STRONG);
+ VibrationEffect.EFFECT_CLICK, false, VibrationEffect.EFFECT_STRENGTH_MEDIUM);
PrebakedSegment expectedTick = new PrebakedSegment(
- VibrationEffect.EFFECT_TICK, false, VibrationEffect.EFFECT_STRENGTH_STRONG);
+ VibrationEffect.EFFECT_TICK, false, VibrationEffect.EFFECT_STRENGTH_MEDIUM);
// Enables click on vibrator 1 and tick on vibrator 2 only.
assertEquals(mVibratorProviders.get(1).getAlwaysOnEffect(1), expectedClick);
@@ -539,7 +546,6 @@
public void vibrate_withRingtone_usesRingtoneSettings() throws Exception {
mockVibrators(1);
FakeVibratorControllerProvider fakeVibrator = mVibratorProviders.get(1);
- mVibrator.setDefaultRingVibrationIntensity(Vibrator.VIBRATION_INTENSITY_MEDIUM);
fakeVibrator.setSupportedEffects(VibrationEffect.EFFECT_CLICK,
VibrationEffect.EFFECT_HEAVY_CLICK, VibrationEffect.EFFECT_DOUBLE_CLICK);
@@ -932,55 +938,67 @@
@Test
public void vibrate_withIntensitySettings_appliesSettingsToScaleVibrations() throws Exception {
- mVibrator.setDefaultNotificationVibrationIntensity(Vibrator.VIBRATION_INTENSITY_LOW);
+ int defaultNotificationIntensity =
+ mVibrator.getDefaultVibrationIntensity(VibrationAttributes.USAGE_NOTIFICATION);
setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
- Vibrator.VIBRATION_INTENSITY_HIGH);
+ defaultNotificationIntensity < Vibrator.VIBRATION_INTENSITY_HIGH
+ ? defaultNotificationIntensity + 1
+ : defaultNotificationIntensity);
+
+ int defaultTouchIntensity =
+ mVibrator.getDefaultVibrationIntensity(VibrationAttributes.USAGE_TOUCH);
setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY,
- Vibrator.VIBRATION_INTENSITY_LOW);
- setUserSetting(Settings.System.RING_VIBRATION_INTENSITY,
- Vibrator.VIBRATION_INTENSITY_OFF);
+ defaultTouchIntensity > Vibrator.VIBRATION_INTENSITY_LOW
+ ? defaultTouchIntensity - 1
+ : defaultTouchIntensity);
+
+ setUserSetting(Settings.System.ALARM_VIBRATION_INTENSITY,
+ mVibrator.getDefaultVibrationIntensity(VibrationAttributes.USAGE_ALARM));
+ setUserSetting(Settings.System.MEDIA_VIBRATION_INTENSITY,
+ Vibrator.VIBRATION_INTENSITY_HIGH);
+ setUserSetting(Settings.System.RING_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_OFF);
mockVibrators(1);
FakeVibratorControllerProvider fakeVibrator = mVibratorProviders.get(1);
fakeVibrator.setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL,
IVibrator.CAP_COMPOSE_EFFECTS);
- fakeVibrator.setSupportedEffects(VibrationEffect.EFFECT_CLICK);
VibratorManagerService service = createSystemReadyService();
vibrate(service, CombinedVibration.startSequential()
- .addNext(1, VibrationEffect.createOneShot(20, 100))
+ .addNext(1, VibrationEffect.createOneShot(100, 125))
.combine(), NOTIFICATION_ATTRS);
assertTrue(waitUntil(s -> fakeVibrator.getEffectSegments().size() == 1,
service, TEST_TIMEOUT_MILLIS));
vibrate(service, VibrationEffect.startComposition()
- .addPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK, 1f)
.addPrimitive(VibrationEffect.Composition.PRIMITIVE_TICK, 0.5f)
.compose(), HAPTIC_FEEDBACK_ATTRS);
+ assertTrue(waitUntil(s -> fakeVibrator.getEffectSegments().size() == 2,
+ service, TEST_TIMEOUT_MILLIS));
+
+ vibrate(service, VibrationEffect.startComposition()
+ .addPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK, 1f)
+ .compose(), ALARM_ATTRS);
assertTrue(waitUntil(s -> fakeVibrator.getEffectSegments().size() == 3,
service, TEST_TIMEOUT_MILLIS));
- vibrate(service, CombinedVibration.startParallel()
- .addVibrator(1, VibrationEffect.get(VibrationEffect.EFFECT_CLICK))
- .combine(), ALARM_ATTRS);
- assertTrue(waitUntil(s -> fakeVibrator.getEffectSegments().size() == 4,
+ vibrate(service, VibrationEffect.createOneShot(100, 125), RINGTONE_ATTRS);
+ assertFalse(waitUntil(s -> fakeVibrator.getEffectSegments().size() > 3,
service, TEST_TIMEOUT_MILLIS));
- vibrate(service, VibrationEffect.get(VibrationEffect.EFFECT_CLICK), RINGTONE_ATTRS);
+ assertEquals(3, fakeVibrator.getEffectSegments().size());
- assertEquals(4, fakeVibrator.getEffectSegments().size());
+ // Notification vibrations will be scaled with SCALE_HIGH or none if default is high.
+ assertEquals(defaultNotificationIntensity < Vibrator.VIBRATION_INTENSITY_HIGH,
+ 0.6 < fakeVibrator.getAmplitudes().get(0));
- // Notification vibrations will be scaled with SCALE_VERY_HIGH.
- assertTrue(0.6 < fakeVibrator.getAmplitudes().get(0));
+ // Haptic feedback vibrations will be scaled with SCALE_LOW or none if default is low.
+ assertEquals(defaultTouchIntensity > Vibrator.VIBRATION_INTENSITY_LOW,
+ 0.5 > ((PrimitiveSegment) fakeVibrator.getEffectSegments().get(1)).getScale());
- // Haptic feedback vibrations will be scaled with SCALE_LOW.
- assertTrue(0.5 < ((PrimitiveSegment) fakeVibrator.getEffectSegments().get(1)).getScale());
- assertTrue(0.5 > ((PrimitiveSegment) fakeVibrator.getEffectSegments().get(2)).getScale());
-
- // Alarm vibration is always VIBRATION_INTENSITY_HIGH.
- PrebakedSegment expected = new PrebakedSegment(
- VibrationEffect.EFFECT_CLICK, false, VibrationEffect.EFFECT_STRENGTH_STRONG);
- assertEquals(expected, fakeVibrator.getEffectSegments().get(3));
+ // Alarm vibration will be scaled with SCALE_NONE.
+ assertEquals(1f,
+ ((PrimitiveSegment) fakeVibrator.getEffectSegments().get(2)).getScale(), 1e-5);
// Ring vibrations have intensity OFF and are not played.
}
@@ -1100,7 +1118,7 @@
int scale = mExternalVibratorService.onExternalVibrationStart(externalVibration);
mExternalVibratorService.onExternalVibrationStop(externalVibration);
- assertEquals(IExternalVibratorService.SCALE_NONE, scale);
+ assertNotEquals(IExternalVibratorService.SCALE_MUTE, scale);
assertEquals(Arrays.asList(false, true, false),
mVibratorProviders.get(1).getExternalControlStates());
}
@@ -1127,8 +1145,8 @@
ringtoneAudioAttrs, secondController);
int secondScale = mExternalVibratorService.onExternalVibrationStart(secondVibration);
- assertEquals(IExternalVibratorService.SCALE_NONE, firstScale);
- assertEquals(IExternalVibratorService.SCALE_NONE, secondScale);
+ assertNotEquals(IExternalVibratorService.SCALE_MUTE, firstScale);
+ assertNotEquals(IExternalVibratorService.SCALE_MUTE, secondScale);
verify(firstController).mute();
verify(secondController, never()).mute();
// Set external control called only once.
@@ -1151,7 +1169,7 @@
ExternalVibration externalVibration = new ExternalVibration(UID, PACKAGE_NAME, AUDIO_ATTRS,
mock(IExternalVibrationController.class));
int scale = mExternalVibratorService.onExternalVibrationStart(externalVibration);
- assertEquals(IExternalVibratorService.SCALE_NONE, scale);
+ assertNotEquals(IExternalVibratorService.SCALE_MUTE, scale);
// Vibration is cancelled.
assertTrue(waitUntil(s -> !s.isVibrating(1), service, TEST_TIMEOUT_MILLIS));
@@ -1163,7 +1181,6 @@
public void onExternalVibration_withRingtone_usesRingerModeSettings() {
mockVibrators(1);
mVibratorProviders.get(1).setCapabilities(IVibrator.CAP_EXTERNAL_CONTROL);
- mVibrator.setDefaultRingVibrationIntensity(Vibrator.VIBRATION_INTENSITY_MEDIUM);
AudioAttributes audioAttrs = new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE)
.build();
@@ -1181,13 +1198,13 @@
setUserSetting(Settings.System.APPLY_RAMPING_RINGER, 1);
createSystemReadyService();
scale = mExternalVibratorService.onExternalVibrationStart(externalVibration);
- assertEquals(IExternalVibratorService.SCALE_NONE, scale);
+ assertNotEquals(IExternalVibratorService.SCALE_MUTE, scale);
setUserSetting(Settings.System.VIBRATE_WHEN_RINGING, 1);
setUserSetting(Settings.System.APPLY_RAMPING_RINGER, 0);
createSystemReadyService();
scale = mExternalVibratorService.onExternalVibrationStart(externalVibration);
- assertEquals(IExternalVibratorService.SCALE_NONE, scale);
+ assertNotEquals(IExternalVibratorService.SCALE_MUTE, scale);
}
private VibrationEffectSegment expectedPrebaked(int effectId) {
@@ -1235,10 +1252,6 @@
mContextSpy.getContentResolver(), settingName, value, UserHandle.USER_CURRENT);
}
- private void setGlobalSetting(String settingName, int value) {
- Settings.Global.putInt(mContextSpy.getContentResolver(), settingName, value);
- }
-
private void vibrate(VibratorManagerService service, VibrationEffect effect,
VibrationAttributes attrs) {
vibrate(service, CombinedVibration.createParallel(effect), attrs);
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationHistoryDatabaseTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationHistoryDatabaseTest.java
index 182848b4..bd7186e 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationHistoryDatabaseTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationHistoryDatabaseTest.java
@@ -108,7 +108,7 @@
@Test
public void testDeletionReceiver() {
- verify(mContext, times(1)).registerReceiver(any(), any());
+ verify(mContext, times(1)).registerReceiver(any(), any(), anyInt());
}
@Test