diff options
214 files changed, 3388 insertions, 1796 deletions
diff --git a/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java b/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java index 881453fe237d..0e4887d27b53 100644 --- a/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java +++ b/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java @@ -612,8 +612,7 @@ public class AlarmManagerService extends SystemService { private static final boolean DEFAULT_KILL_ON_SCHEDULE_EXACT_ALARM_REVOKED = true; - // TODO(b/226439802): Flip to true. - private static final boolean DEFAULT_SCHEDULE_EXACT_ALARM_DENIED_BY_DEFAULT = false; + private static final boolean DEFAULT_SCHEDULE_EXACT_ALARM_DENIED_BY_DEFAULT = true; // Minimum futurity of a new alarm public long MIN_FUTURITY = DEFAULT_MIN_FUTURITY; diff --git a/core/java/android/accessibilityservice/InputMethod.java b/core/java/android/accessibilityservice/InputMethod.java index a3936040f2af..647a26637687 100644 --- a/core/java/android/accessibilityservice/InputMethod.java +++ b/core/java/android/accessibilityservice/InputMethod.java @@ -62,7 +62,6 @@ public class InputMethod { private final AccessibilityService mService; private InputBinding mInputBinding; - private InputConnection mInputConnection; private boolean mInputStarted; private InputConnection mStartedInputConnection; private EditorInfo mInputEditorInfo; @@ -81,12 +80,8 @@ public class InputMethod { */ @Nullable public final AccessibilityInputConnection getCurrentInputConnection() { - InputConnection ic = mStartedInputConnection; - if (ic != null) { - return new AccessibilityInputConnection(ic); - } - if (mInputConnection != null) { - return new AccessibilityInputConnection(mInputConnection); + if (mStartedInputConnection != null) { + return new AccessibilityInputConnection(mStartedInputConnection); } return null; } @@ -136,10 +131,8 @@ public class InputMethod { * to perform whatever behavior you would like. */ public void onFinishInput() { - InputConnection ic = mStartedInputConnection != null ? mStartedInputConnection - : mInputConnection; - if (ic != null) { - ic.finishComposingText(); + if (mStartedInputConnection != null) { + mStartedInputConnection.finishComposingText(); } } @@ -176,18 +169,14 @@ public class InputMethod { final void bindInput(@NonNull InputBinding binding) { Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "AccessibilityService.bindInput"); mInputBinding = binding; - mInputConnection = binding.getConnection(); - Log.v(LOG_TAG, "bindInput(): binding=" + binding - + " ic=" + mInputConnection); + Log.v(LOG_TAG, "bindInput(): binding=" + binding); Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER); } final void unbindInput() { - Log.v(LOG_TAG, "unbindInput(): binding=" + mInputBinding - + " ic=" + mInputConnection); + Log.v(LOG_TAG, "unbindInput(): binding=" + mInputBinding); // Unbind input is per process per display. mInputBinding = null; - mInputConnection = null; } final void startInput(@Nullable InputConnection ic, @NonNull EditorInfo attribute) { @@ -206,8 +195,12 @@ public class InputMethod { final void doStartInput(InputConnection ic, EditorInfo attribute, boolean restarting) { - if (!restarting && mInputStarted) { + if ((ic == null || !restarting) && mInputStarted) { doFinishInput(); + if (ic == null) { + // Unlike InputMethodService, A11y IME should not observe fallback InputConnection. + return; + } } mInputStarted = true; mStartedInputConnection = ic; @@ -224,6 +217,7 @@ public class InputMethod { } mInputStarted = false; mStartedInputConnection = null; + mInputEditorInfo = null; } private InputMethodSession onCreateInputMethodSessionInterface() { diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 852dd974ae42..7d68eb92f206 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -4114,8 +4114,8 @@ public final class ActivityThread extends ClientTransactionHandler @NonNull SurfaceControl startingWindowLeash) { final SplashScreenView.Builder builder = new SplashScreenView.Builder(r.activity); final SplashScreenView view = builder.createFromParcel(parcelable).build(); + view.attachHostWindow(r.window); decorView.addView(view); - view.attachHostActivityAndSetSystemUIColors(r.activity, r.window); view.requestLayout(); view.getViewTreeObserver().addOnDrawListener(new ViewTreeObserver.OnDrawListener() { diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index bfb11682e89c..56d655c9cc6f 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -2813,8 +2813,8 @@ public class Notification implements Parcelable } if (extras != null) { - visitIconUri(visitor, extras.getParcelable(EXTRA_LARGE_ICON_BIG)); - visitIconUri(visitor, extras.getParcelable(EXTRA_PICTURE_ICON)); + visitIconUri(visitor, extras.getParcelable(EXTRA_LARGE_ICON_BIG, Icon.class)); + visitIconUri(visitor, extras.getParcelable(EXTRA_PICTURE_ICON, Icon.class)); // NOTE: The documentation of EXTRA_AUDIO_CONTENTS_URI explicitly says that it is a // String representation of a Uri, but the previous implementation (and unit test) of @@ -2838,7 +2838,7 @@ public class Notification implements Parcelable } } - final Person person = extras.getParcelable(EXTRA_MESSAGING_PERSON); + final Person person = extras.getParcelable(EXTRA_MESSAGING_PERSON, Person.class); if (person != null) { visitor.accept(person.getIconUri()); } @@ -6473,7 +6473,7 @@ public class Notification implements Parcelable public static Notification.Builder recoverBuilder(Context context, Notification n) { // Re-create notification context so we can access app resources. ApplicationInfo applicationInfo = n.extras.getParcelable( - EXTRA_BUILDER_APPLICATION_INFO); + EXTRA_BUILDER_APPLICATION_INFO, ApplicationInfo.class); Context builderContext; if (applicationInfo != null) { try { @@ -6925,9 +6925,8 @@ public class Notification implements Parcelable boolean isMediaStyle = (MediaStyle.class.equals(style) || DecoratedMediaCustomViewStyle.class.equals(style)); - boolean hasMediaSession = (extras.getParcelable(Notification.EXTRA_MEDIA_SESSION) != null - && extras.getParcelable(Notification.EXTRA_MEDIA_SESSION) - instanceof MediaSession.Token); + boolean hasMediaSession = extras.getParcelable(Notification.EXTRA_MEDIA_SESSION, + MediaSession.Token.class) != null; return isMediaStyle && hasMediaSession; } @@ -7522,7 +7521,7 @@ public class Notification implements Parcelable if (extras.containsKey(EXTRA_LARGE_ICON_BIG)) { mBigLargeIconSet = true; - mBigLargeIcon = extras.getParcelable(EXTRA_LARGE_ICON_BIG); + mBigLargeIcon = extras.getParcelable(EXTRA_LARGE_ICON_BIG, Icon.class); } if (extras.containsKey(EXTRA_PICTURE_CONTENT_DESCRIPTION)) { @@ -7542,11 +7541,11 @@ public class Notification implements Parcelable // When this style adds a picture, we only add one of the keys. If both were added, // it would most likely be a legacy app trying to override the picture in some way. // Because of that case it's better to give precedence to the legacy field. - Bitmap bitmapPicture = extras.getParcelable(EXTRA_PICTURE); + Bitmap bitmapPicture = extras.getParcelable(EXTRA_PICTURE, Bitmap.class); if (bitmapPicture != null) { return Icon.createWithBitmap(bitmapPicture); } else { - return extras.getParcelable(EXTRA_PICTURE_ICON); + return extras.getParcelable(EXTRA_PICTURE_ICON, Icon.class); } } @@ -8165,7 +8164,7 @@ public class Notification implements Parcelable protected void restoreFromExtras(Bundle extras) { super.restoreFromExtras(extras); - mUser = extras.getParcelable(EXTRA_MESSAGING_PERSON); + mUser = extras.getParcelable(EXTRA_MESSAGING_PERSON, Person.class); if (mUser == null) { CharSequence displayName = extras.getCharSequence(EXTRA_SELF_DISPLAY_NAME); mUser = new Person.Builder().setName(displayName).build(); @@ -8177,7 +8176,7 @@ public class Notification implements Parcelable mHistoricMessages = Message.getMessagesFromBundleArray(histMessages); mIsGroupConversation = extras.getBoolean(EXTRA_IS_GROUP_CONVERSATION); mUnreadMessageCount = extras.getInt(EXTRA_CONVERSATION_UNREAD_MESSAGE_COUNT); - mShortcutIcon = extras.getParcelable(EXTRA_CONVERSATION_ICON); + mShortcutIcon = extras.getParcelable(EXTRA_CONVERSATION_ICON, Icon.class); } /** @@ -8731,7 +8730,7 @@ public class Notification implements Parcelable return null; } else { - Person senderPerson = bundle.getParcelable(KEY_SENDER_PERSON); + Person senderPerson = bundle.getParcelable(KEY_SENDER_PERSON, Person.class); if (senderPerson == null) { // Legacy apps that use compat don't actually provide the sender objects // We need to fix the compat version to provide people / use @@ -8748,7 +8747,7 @@ public class Notification implements Parcelable if (bundle.containsKey(KEY_DATA_MIME_TYPE) && bundle.containsKey(KEY_DATA_URI)) { message.setData(bundle.getString(KEY_DATA_MIME_TYPE), - (Uri) bundle.getParcelable(KEY_DATA_URI)); + bundle.getParcelable(KEY_DATA_URI, Uri.class)); } if (bundle.containsKey(KEY_EXTRAS_BUNDLE)) { message.getExtras().putAll(bundle.getBundle(KEY_EXTRAS_BUNDLE)); @@ -9154,7 +9153,7 @@ public class Notification implements Parcelable super.restoreFromExtras(extras); if (extras.containsKey(EXTRA_MEDIA_SESSION)) { - mToken = extras.getParcelable(EXTRA_MEDIA_SESSION); + mToken = extras.getParcelable(EXTRA_MEDIA_SESSION, MediaSession.Token.class); } if (extras.containsKey(EXTRA_COMPACT_ACTIONS)) { mActionsToShowInCompact = extras.getIntArray(EXTRA_COMPACT_ACTIONS); @@ -9166,7 +9165,8 @@ public class Notification implements Parcelable mDeviceIcon = extras.getInt(EXTRA_MEDIA_REMOTE_ICON); } if (extras.containsKey(EXTRA_MEDIA_REMOTE_INTENT)) { - mDeviceIntent = extras.getParcelable(EXTRA_MEDIA_REMOTE_INTENT); + mDeviceIntent = extras.getParcelable( + EXTRA_MEDIA_REMOTE_INTENT, PendingIntent.class); } } @@ -9758,12 +9758,12 @@ public class Notification implements Parcelable super.restoreFromExtras(extras); mCallType = extras.getInt(EXTRA_CALL_TYPE); mIsVideo = extras.getBoolean(EXTRA_CALL_IS_VIDEO); - mPerson = extras.getParcelable(EXTRA_CALL_PERSON); + mPerson = extras.getParcelable(EXTRA_CALL_PERSON, Person.class); mVerificationIcon = extras.getParcelable(EXTRA_VERIFICATION_ICON); mVerificationText = extras.getCharSequence(EXTRA_VERIFICATION_TEXT); - mAnswerIntent = extras.getParcelable(EXTRA_ANSWER_INTENT); - mDeclineIntent = extras.getParcelable(EXTRA_DECLINE_INTENT); - mHangUpIntent = extras.getParcelable(EXTRA_HANG_UP_INTENT); + mAnswerIntent = extras.getParcelable(EXTRA_ANSWER_INTENT, PendingIntent.class); + mDeclineIntent = extras.getParcelable(EXTRA_DECLINE_INTENT, PendingIntent.class); + mHangUpIntent = extras.getParcelable(EXTRA_HANG_UP_INTENT, PendingIntent.class); mAnswerButtonColor = extras.containsKey(EXTRA_ANSWER_COLOR) ? extras.getInt(EXTRA_ANSWER_COLOR) : null; mDeclineButtonColor = extras.containsKey(EXTRA_DECLINE_COLOR) @@ -10824,9 +10824,9 @@ public class Notification implements Parcelable // Keys within EXTRA_WEARABLE_EXTENSIONS for wearable options. private static final String KEY_ACTIONS = "actions"; private static final String KEY_FLAGS = "flags"; - private static final String KEY_DISPLAY_INTENT = "displayIntent"; + static final String KEY_DISPLAY_INTENT = "displayIntent"; private static final String KEY_PAGES = "pages"; - private static final String KEY_BACKGROUND = "background"; + static final String KEY_BACKGROUND = "background"; private static final String KEY_CONTENT_ICON = "contentIcon"; private static final String KEY_CONTENT_ICON_GRAVITY = "contentIconGravity"; private static final String KEY_CONTENT_ACTION_INDEX = "contentActionIndex"; @@ -10883,7 +10883,8 @@ public class Notification implements Parcelable } mFlags = wearableBundle.getInt(KEY_FLAGS, DEFAULT_FLAGS); - mDisplayIntent = wearableBundle.getParcelable(KEY_DISPLAY_INTENT); + mDisplayIntent = wearableBundle.getParcelable( + KEY_DISPLAY_INTENT, PendingIntent.class); Notification[] pages = getParcelableArrayFromBundle( wearableBundle, KEY_PAGES, Notification.class); @@ -10891,7 +10892,7 @@ public class Notification implements Parcelable Collections.addAll(mPages, pages); } - mBackground = wearableBundle.getParcelable(KEY_BACKGROUND); + mBackground = wearableBundle.getParcelable(KEY_BACKGROUND, Bitmap.class); mContentIcon = wearableBundle.getInt(KEY_CONTENT_ICON); mContentIconGravity = wearableBundle.getInt(KEY_CONTENT_ICON_GRAVITY, DEFAULT_CONTENT_ICON_GRAVITY); @@ -11604,7 +11605,7 @@ public class Notification implements Parcelable Bundle carBundle = notif.extras == null ? null : notif.extras.getBundle(EXTRA_CAR_EXTENDER); if (carBundle != null) { - mLargeIcon = carBundle.getParcelable(EXTRA_LARGE_ICON); + mLargeIcon = carBundle.getParcelable(EXTRA_LARGE_ICON, Bitmap.class); mColor = carBundle.getInt(EXTRA_COLOR, Notification.COLOR_DEFAULT); Bundle b = carBundle.getBundle(EXTRA_CONVERSATION); @@ -11710,9 +11711,9 @@ public class Notification implements Parcelable private static final String KEY_AUTHOR = "author"; private static final String KEY_TEXT = "text"; private static final String KEY_MESSAGES = "messages"; - private static final String KEY_REMOTE_INPUT = "remote_input"; - private static final String KEY_ON_REPLY = "on_reply"; - private static final String KEY_ON_READ = "on_read"; + static final String KEY_REMOTE_INPUT = "remote_input"; + static final String KEY_ON_REPLY = "on_reply"; + static final String KEY_ON_READ = "on_read"; private static final String KEY_PARTICIPANTS = "participants"; private static final String KEY_TIMESTAMP = "timestamp"; @@ -11837,10 +11838,10 @@ public class Notification implements Parcelable } } - PendingIntent onRead = b.getParcelable(KEY_ON_READ); - PendingIntent onReply = b.getParcelable(KEY_ON_REPLY); + PendingIntent onRead = b.getParcelable(KEY_ON_READ, PendingIntent.class); + PendingIntent onReply = b.getParcelable(KEY_ON_REPLY, PendingIntent.class); - RemoteInput remoteInput = b.getParcelable(KEY_REMOTE_INPUT); + RemoteInput remoteInput = b.getParcelable(KEY_REMOTE_INPUT, RemoteInput.class); String[] participants = b.getStringArray(KEY_PARTICIPANTS); if (participants == null || participants.length != 1) { @@ -11982,8 +11983,8 @@ public class Notification implements Parcelable private static final String EXTRA_TV_EXTENDER = "android.tv.EXTENSIONS"; private static final String EXTRA_FLAGS = "flags"; - private static final String EXTRA_CONTENT_INTENT = "content_intent"; - private static final String EXTRA_DELETE_INTENT = "delete_intent"; + static final String EXTRA_CONTENT_INTENT = "content_intent"; + static final String EXTRA_DELETE_INTENT = "delete_intent"; private static final String EXTRA_CHANNEL_ID = "channel_id"; private static final String EXTRA_SUPPRESS_SHOW_OVER_APPS = "suppressShowOverApps"; @@ -12015,8 +12016,8 @@ public class Notification implements Parcelable mFlags = bundle.getInt(EXTRA_FLAGS); mChannelId = bundle.getString(EXTRA_CHANNEL_ID); mSuppressShowOverApps = bundle.getBoolean(EXTRA_SUPPRESS_SHOW_OVER_APPS); - mContentIntent = bundle.getParcelable(EXTRA_CONTENT_INTENT); - mDeleteIntent = bundle.getParcelable(EXTRA_DELETE_INTENT); + mContentIntent = bundle.getParcelable(EXTRA_CONTENT_INTENT, PendingIntent.class); + mDeleteIntent = bundle.getParcelable(EXTRA_DELETE_INTENT, PendingIntent.class); } } diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java index 0a18588e0131..e022ca306674 100644 --- a/core/java/android/app/WallpaperManager.java +++ b/core/java/android/app/WallpaperManager.java @@ -67,7 +67,6 @@ import android.os.ParcelFileDescriptor; import android.os.RemoteException; import android.os.StrictMode; import android.os.SystemProperties; -import android.service.wallpaper.WallpaperService; import android.text.TextUtils; import android.util.ArrayMap; import android.util.ArraySet; @@ -559,23 +558,26 @@ public class WallpaperManager { } mCachedWallpaper = null; mCachedWallpaperUserId = 0; - try { - mCachedWallpaper = getCurrentWallpaperLocked( - context, userId, hardware, cmProxy); - mCachedWallpaperUserId = userId; - } catch (OutOfMemoryError e) { - Log.w(TAG, "Out of memory loading the current wallpaper: " + e); - } catch (SecurityException e) { - if (context.getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.O_MR1) { - Log.w(TAG, "No permission to access wallpaper, suppressing" - + " exception to avoid crashing legacy app."); - } else { - // Post-O apps really most sincerely need the permission. - throw e; + } + try { + Bitmap currentWallpaper = getCurrentWallpaperLocked( + context, userId, hardware, cmProxy); + if (currentWallpaper != null) { + synchronized (this) { + mCachedWallpaper = currentWallpaper; + mCachedWallpaperUserId = userId; + return mCachedWallpaper; } } - if (mCachedWallpaper != null) { - return mCachedWallpaper; + } catch (OutOfMemoryError e) { + Log.w(TAG, "Out of memory loading the current wallpaper: " + e); + } catch (SecurityException e) { + if (context.getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.O_MR1) { + Log.w(TAG, "No permission to access wallpaper, suppressing" + + " exception to avoid crashing legacy app."); + } else { + // Post-O apps really most sincerely need the permission. + throw e; } } if (returnDefault) { @@ -2472,7 +2474,7 @@ public class WallpaperManager { * * @param colors Wallpaper color info, {@code null} when not available. * @param which A combination of {@link #FLAG_LOCK} and {@link #FLAG_SYSTEM} - * @see WallpaperService.Engine#onComputeColors() + * @see android.service.wallpaper.WallpaperService.Engine#onComputeColors() */ void onColorsChanged(@Nullable WallpaperColors colors, int which); @@ -2484,7 +2486,7 @@ public class WallpaperManager { * @param colors Wallpaper color info, {@code null} when not available. * @param which A combination of {@link #FLAG_LOCK} and {@link #FLAG_SYSTEM} * @param userId Owner of the wallpaper - * @see WallpaperService.Engine#onComputeColors() + * @see android.service.wallpaper.WallpaperService.Engine#onComputeColors() * @hide */ default void onColorsChanged(@Nullable WallpaperColors colors, int which, int userId) { diff --git a/core/java/android/hardware/fingerprint/FingerprintStateListener.java b/core/java/android/hardware/biometrics/BiometricStateListener.java index 551f5120ce2a..2ac0c1edaef0 100644 --- a/core/java/android/hardware/fingerprint/FingerprintStateListener.java +++ b/core/java/android/hardware/biometrics/BiometricStateListener.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package android.hardware.fingerprint; +package android.hardware.biometrics; import android.annotation.IntDef; @@ -22,10 +22,10 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; /** - * Interface for handling state changes in fingerprint-related events. + * Interface for handling state changes in biometric sensors. * @hide */ -public abstract class FingerprintStateListener extends IFingerprintStateListener.Stub { +public abstract class BiometricStateListener extends IBiometricStateListener.Stub { // Operation has not started yet. public static final int STATE_IDLE = 0; @@ -43,16 +43,19 @@ public abstract class FingerprintStateListener extends IFingerprintStateListener @IntDef({STATE_IDLE, STATE_ENROLLING, STATE_KEYGUARD_AUTH, STATE_BP_AUTH, STATE_AUTH_OTHER}) @Retention(RetentionPolicy.SOURCE) - public @interface State {} + public @interface State { + } /** * Defines behavior in response to state update - * @param newState new state of fingerprint sensor + * @param newState new state of the biometric sensor */ - public void onStateChanged(@FingerprintStateListener.State int newState) {} + public void onStateChanged(@BiometricStateListener.State int newState) { + } /** * Invoked when enrollment state changes for the specified user */ - public void onEnrollmentsChanged(int userId, int sensorId, boolean hasEnrollments) {} + public void onEnrollmentsChanged(int userId, int sensorId, boolean hasEnrollments) { + } } diff --git a/core/java/android/hardware/fingerprint/IFingerprintStateListener.aidl b/core/java/android/hardware/biometrics/IBiometricStateListener.aidl index 1aa6fa197066..5bdced034017 100644 --- a/core/java/android/hardware/fingerprint/IFingerprintStateListener.aidl +++ b/core/java/android/hardware/biometrics/IBiometricStateListener.aidl @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021 The Android Open Source Project + * 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. @@ -13,16 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package android.hardware.fingerprint; - -import android.hardware.fingerprint.Fingerprint; +package android.hardware.biometrics; /** - * Communication channel for FingerprintManager to register the FingerprintStateListener - * in FingerprintService. + * Communication channel between <Biometric>Manager and <Biometric>Service for passing the + * listener. * @hide */ -oneway interface IFingerprintStateListener { +oneway interface IBiometricStateListener { void onStateChanged(int newState); void onEnrollmentsChanged(int userId, int sensorId, boolean hasEnrollments); } diff --git a/core/java/android/hardware/fingerprint/FingerprintManager.java b/core/java/android/hardware/fingerprint/FingerprintManager.java index 60c4b523094e..28f1f02b7a93 100644 --- a/core/java/android/hardware/fingerprint/FingerprintManager.java +++ b/core/java/android/hardware/fingerprint/FingerprintManager.java @@ -45,6 +45,7 @@ import android.hardware.biometrics.BiometricAuthenticator; import android.hardware.biometrics.BiometricConstants; import android.hardware.biometrics.BiometricFingerprintConstants; import android.hardware.biometrics.BiometricPrompt; +import android.hardware.biometrics.BiometricStateListener; import android.hardware.biometrics.BiometricTestSession; import android.hardware.biometrics.IBiometricServiceLockoutResetCallback; import android.hardware.biometrics.SensorProperties; @@ -918,13 +919,13 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing /** - * Forwards FingerprintStateListener to FingerprintService - * @param listener new FingerprintStateListener being added + * Forwards BiometricStateListener to FingerprintService + * @param listener new BiometricStateListener being added * @hide */ - public void registerFingerprintStateListener(@NonNull FingerprintStateListener listener) { + public void registerBiometricStateListener(@NonNull BiometricStateListener listener) { try { - mService.registerFingerprintStateListener(listener); + mService.registerBiometricStateListener(listener); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/core/java/android/hardware/fingerprint/IFingerprintService.aidl b/core/java/android/hardware/fingerprint/IFingerprintService.aidl index d60bb6ef1543..0b6344617663 100644 --- a/core/java/android/hardware/fingerprint/IFingerprintService.aidl +++ b/core/java/android/hardware/fingerprint/IFingerprintService.aidl @@ -17,13 +17,13 @@ package android.hardware.fingerprint; import android.hardware.biometrics.IBiometricSensorReceiver; import android.hardware.biometrics.IBiometricServiceLockoutResetCallback; +import android.hardware.biometrics.IBiometricStateListener; import android.hardware.biometrics.IInvalidationCallback; import android.hardware.biometrics.ITestSession; import android.hardware.biometrics.ITestSessionCallback; import android.hardware.fingerprint.IFingerprintClientActiveCallback; import android.hardware.fingerprint.IFingerprintAuthenticatorsRegisteredCallback; import android.hardware.fingerprint.IFingerprintServiceReceiver; -import android.hardware.fingerprint.IFingerprintStateListener; import android.hardware.fingerprint.IUdfpsOverlayController; import android.hardware.fingerprint.ISidefpsController; import android.hardware.fingerprint.Fingerprint; @@ -169,6 +169,6 @@ interface IFingerprintService { // Sets the controller for managing the SideFPS overlay. void setSidefpsController(in ISidefpsController controller); - // Registers FingerprintStateListener in list stored by FingerprintService. - void registerFingerprintStateListener(IFingerprintStateListener listener); + // Registers BiometricStateListener. + void registerBiometricStateListener(IBiometricStateListener listener); } diff --git a/core/java/android/net/vcn/VcnManager.java b/core/java/android/net/vcn/VcnManager.java index 390c3b9453c2..f1b110ab29c8 100644 --- a/core/java/android/net/vcn/VcnManager.java +++ b/core/java/android/net/vcn/VcnManager.java @@ -172,11 +172,11 @@ public class VcnManager { * * <p>An app that has carrier privileges for any of the subscriptions in the given group may * clear a VCN configuration. This API is ONLY permitted for callers running as the primary - * user. Any active VCN will be torn down. + * user. Any active VCN associated with this configuration will be torn down. * * @param subscriptionGroup the subscription group that the configuration should be applied to - * @throws SecurityException if the caller does not have carrier privileges, or is not running - * as the primary user + * @throws SecurityException if the caller does not have carrier privileges, is not the owner of + * the associated configuration, or is not running as the primary user * @throws IOException if the configuration failed to be cleared from disk. This may occur due * to temporary disk errors, or more permanent conditions such as a full disk. */ @@ -196,8 +196,13 @@ public class VcnManager { /** * Retrieves the list of Subscription Groups for which a VCN Configuration has been set. * - * <p>The returned list will include only subscription groups for which the carrier app is - * privileged, and which have an associated {@link VcnConfig}. + * <p>The returned list will include only subscription groups for which an associated {@link + * VcnConfig} exists, and the app is either: + * + * <ul> + * <li>Carrier privileged for that subscription group, or + * <li>Is the provisioning package of the config + * </ul> * * @throws SecurityException if the caller is not running as the primary user */ diff --git a/core/java/android/service/dreams/DreamActivity.java b/core/java/android/service/dreams/DreamActivity.java index 96bbf8ebc2cb..cf4e6a6da96e 100644 --- a/core/java/android/service/dreams/DreamActivity.java +++ b/core/java/android/service/dreams/DreamActivity.java @@ -19,6 +19,7 @@ package android.service.dreams; import android.annotation.Nullable; import android.app.Activity; import android.os.Bundle; +import android.text.TextUtils; import com.android.internal.R; @@ -44,6 +45,7 @@ import com.android.internal.R; */ public class DreamActivity extends Activity { static final String EXTRA_CALLBACK = "binder"; + static final String EXTRA_DREAM_TITLE = "title"; public DreamActivity() {} @@ -51,6 +53,11 @@ public class DreamActivity extends Activity { public void onCreate(@Nullable Bundle bundle) { super.onCreate(bundle); + final String title = getIntent().getStringExtra(EXTRA_DREAM_TITLE); + if (!TextUtils.isEmpty(title)) { + setTitle(title); + } + DreamService.DreamServiceWrapper callback = (DreamService.DreamServiceWrapper) getIntent().getIBinderExtra(EXTRA_CALLBACK); diff --git a/core/java/android/service/dreams/DreamService.java b/core/java/android/service/dreams/DreamService.java index d4f8a3beb89b..95eae6cada9f 100644 --- a/core/java/android/service/dreams/DreamService.java +++ b/core/java/android/service/dreams/DreamService.java @@ -1280,6 +1280,9 @@ public class DreamService extends Service implements Window.Callback { i.setPackage(getApplicationContext().getPackageName()); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); i.putExtra(DreamActivity.EXTRA_CALLBACK, mDreamServiceWrapper); + final ServiceInfo serviceInfo = fetchServiceInfo(this, + new ComponentName(this, getClass())); + i.putExtra(DreamActivity.EXTRA_DREAM_TITLE, fetchDreamLabel(this, serviceInfo)); try { if (!ActivityTaskManager.getService().startDreamActivity(i)) { diff --git a/core/java/android/service/wallpaper/WallpaperService.java b/core/java/android/service/wallpaper/WallpaperService.java index 5131e4e58f54..425dbb9cb204 100644 --- a/core/java/android/service/wallpaper/WallpaperService.java +++ b/core/java/android/service/wallpaper/WallpaperService.java @@ -1685,13 +1685,12 @@ public abstract class WallpaperService extends Service { void updatePage(EngineWindowPage currentPage, int pageIndx, int numPages, float xOffsetStep) { - // to save creating a runnable, check twice - long current = System.currentTimeMillis(); + // in case the clock is zero, we start with negative time + long current = SystemClock.elapsedRealtime() - DEFAULT_UPDATE_SCREENSHOT_DURATION; long lapsed = current - currentPage.getLastUpdateTime(); // Always update the page when the last update time is <= 0 // This is important especially when the device first boots - if (lapsed < DEFAULT_UPDATE_SCREENSHOT_DURATION - && currentPage.getLastUpdateTime() > 0) { + if (lapsed < DEFAULT_UPDATE_SCREENSHOT_DURATION) { return; } Surface surface = mSurfaceHolder.getSurface(); diff --git a/core/java/android/transparency/OWNERS b/core/java/android/transparency/OWNERS index 75bf84c727df..ed0e5e5f36ad 100644 --- a/core/java/android/transparency/OWNERS +++ b/core/java/android/transparency/OWNERS @@ -1,4 +1,5 @@ -# Bug component: 36824 +# Bug component: 1164579 billylau@google.com -vishwath@google.com mpgroover@google.com +vishwath@google.com +wenhaowang@google.com diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index 6be6f9d110ad..96b1abb62dbf 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -1274,6 +1274,7 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall private class SurfaceViewPositionUpdateListener implements RenderNode.PositionUpdateListener { private final int mRtSurfaceWidth; private final int mRtSurfaceHeight; + private boolean mRtFirst = true; private final SurfaceControl.Transaction mPositionChangedTransaction = new SurfaceControl.Transaction(); @@ -1284,14 +1285,15 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall @Override public void positionChanged(long frameNumber, int left, int top, int right, int bottom) { - if (mRTLastReportedPosition.left == left + if (!mRtFirst && (mRTLastReportedPosition.left == left && mRTLastReportedPosition.top == top && mRTLastReportedPosition.right == right && mRTLastReportedPosition.bottom == bottom && mRTLastReportedSurfaceSize.x == mRtSurfaceWidth - && mRTLastReportedSurfaceSize.y == mRtSurfaceHeight) { + && mRTLastReportedSurfaceSize.y == mRtSurfaceHeight)) { return; } + mRtFirst = false; try { if (DEBUG_POSITION) { Log.d(TAG, String.format( diff --git a/core/java/android/window/SplashScreenView.java b/core/java/android/window/SplashScreenView.java index 2d1deb2a57bb..bc9f74ecec99 100644 --- a/core/java/android/window/SplashScreenView.java +++ b/core/java/android/window/SplashScreenView.java @@ -16,9 +16,6 @@ package android.window; import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER; -import static android.view.WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS; -import static android.view.WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION; -import static android.view.WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS; import static com.android.internal.jank.InteractionJankMonitor.CUJ_SPLASHSCREEN_AVD; @@ -29,11 +26,9 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.TestApi; import android.annotation.UiThread; -import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; -import android.graphics.Color; import android.graphics.PixelFormat; import android.graphics.Rect; import android.graphics.drawable.BitmapDrawable; @@ -52,15 +47,12 @@ import android.view.SurfaceView; import android.view.View; import android.view.ViewGroup; import android.view.Window; -import android.view.WindowInsetsController; -import android.view.WindowManager; import android.widget.FrameLayout; import android.widget.ImageView; import com.android.internal.R; import com.android.internal.jank.InteractionJankMonitor; import com.android.internal.policy.DecorView; -import com.android.internal.util.ContrastColorUtil; import java.time.Duration; import java.time.Instant; @@ -87,12 +79,6 @@ public final class SplashScreenView extends FrameLayout { private static final String TAG = SplashScreenView.class.getSimpleName(); private static final boolean DEBUG = Build.IS_DEBUGGABLE; - private static final int LIGHT_BARS_MASK = - WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS - | WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS; - private static final int WINDOW_FLAG_MASK = FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS - | FLAG_TRANSLUCENT_NAVIGATION | FLAG_TRANSLUCENT_STATUS; - private boolean mNotCopyable; private boolean mIsCopied; private int mInitBackgroundColor; @@ -107,9 +93,6 @@ public final class SplashScreenView extends FrameLayout { private final Rect mTmpRect = new Rect(); private final int[] mTmpPos = new int[2]; - // The host activity when transfer view to it. - private Activity mHostActivity; - @Nullable private SurfaceControlViewHost.SurfacePackage mSurfacePackageCopy; @Nullable @@ -123,14 +106,7 @@ public final class SplashScreenView extends FrameLayout { // cache original window and status private Window mWindow; - private int mAppWindowFlags; - private int mStatusBarColor; - private int mNavigationBarColor; - private int mSystemBarsAppearance; private boolean mHasRemoved; - private boolean mNavigationContrastEnforced; - private boolean mStatusContrastEnforced; - private boolean mDecorFitsSystemWindows; /** * Internal builder to create a SplashScreenView object. @@ -570,7 +546,6 @@ public final class SplashScreenView extends FrameLayout { if (decorView != null) { decorView.removeView(this); } - restoreSystemUIColors(); mWindow = null; } mHasRemoved = true; @@ -651,56 +626,12 @@ public final class SplashScreenView extends FrameLayout { } /** - * Called when this view is attached to an activity. This also makes SystemUI colors - * transparent so the content of splash screen view can draw fully. + * Called when this view is attached to a window of an activity. * * @hide */ - public void attachHostActivityAndSetSystemUIColors(Activity activity, Window window) { - mHostActivity = activity; + public void attachHostWindow(Window window) { mWindow = window; - final WindowManager.LayoutParams attr = window.getAttributes(); - mAppWindowFlags = attr.flags; - mStatusBarColor = window.getStatusBarColor(); - mNavigationBarColor = window.getNavigationBarColor(); - mSystemBarsAppearance = window.getInsetsController().getSystemBarsAppearance(); - mNavigationContrastEnforced = window.isNavigationBarContrastEnforced(); - mStatusContrastEnforced = window.isStatusBarContrastEnforced(); - mDecorFitsSystemWindows = window.decorFitsSystemWindows(); - - applySystemBarsContrastColor(window.getInsetsController(), mInitBackgroundColor); - // Let app draw the background of bars. - window.addFlags(FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); - // Use specified bar colors instead of window background. - window.clearFlags(FLAG_TRANSLUCENT_STATUS | FLAG_TRANSLUCENT_NAVIGATION); - window.setStatusBarColor(Color.TRANSPARENT); - window.setNavigationBarColor(Color.TRANSPARENT); - window.setDecorFitsSystemWindows(false); - window.setStatusBarContrastEnforced(false); - window.setNavigationBarContrastEnforced(false); - } - - /** Called when this view is removed from the host activity. */ - private void restoreSystemUIColors() { - mWindow.setFlags(mAppWindowFlags, WINDOW_FLAG_MASK); - mWindow.setStatusBarColor(mStatusBarColor); - mWindow.setNavigationBarColor(mNavigationBarColor); - mWindow.getInsetsController().setSystemBarsAppearance(mSystemBarsAppearance, - LIGHT_BARS_MASK); - mWindow.setDecorFitsSystemWindows(mDecorFitsSystemWindows); - mWindow.setStatusBarContrastEnforced(mStatusContrastEnforced); - mWindow.setNavigationBarContrastEnforced(mNavigationContrastEnforced); - } - - /** - * Makes the icon color of system bars contrast. - * @hide - */ - public static void applySystemBarsContrastColor(WindowInsetsController windowInsetsController, - int backgroundColor) { - final int lightBarAppearance = ContrastColorUtil.isColorLight(backgroundColor) - ? LIGHT_BARS_MASK : 0; - windowInsetsController.setSystemBarsAppearance(lightBarAppearance, LIGHT_BARS_MASK); } /** diff --git a/core/java/com/android/internal/util/LatencyTracker.java b/core/java/com/android/internal/util/LatencyTracker.java index 3f7c4d53d333..2f707a774462 100644 --- a/core/java/com/android/internal/util/LatencyTracker.java +++ b/core/java/com/android/internal/util/LatencyTracker.java @@ -48,7 +48,7 @@ import java.util.concurrent.TimeUnit; */ public class LatencyTracker { private static final String TAG = "LatencyTracker"; - private static final String SETTINGS_ENABLED_KEY = "enabled"; + public static final String SETTINGS_ENABLED_KEY = "enabled"; private static final String SETTINGS_SAMPLING_INTERVAL_KEY = "sampling_interval"; private static final boolean DEBUG = false; /** Default to being enabled on debug builds. */ diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 0e3840a39e25..757f40963bf7 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -674,6 +674,10 @@ <!-- Indicates whether to enable hinge angle sensor when using unfold animation --> <bool name="config_unfoldTransitionHingeAngle">false</bool> + <!-- Indicates the time needed to time out the fold animation if the device stops in half folded + mode. --> + <integer name="config_unfoldTransitionHalfFoldedTimeout">600</integer> + <!-- Indicates that the device supports having more than one internal display on at the same time. Only applicable to devices with more than one internal display. If this option is set to false, DisplayManager will make additional effort to ensure no more than 1 internal @@ -5678,8 +5682,8 @@ restricted level. --> <array name="config_bg_current_drain_threshold_to_bg_restricted"> - <item>10.0</item> <!-- regular device --> - <item>20.0</item> <!-- low ram device --> + <item>4.0</item> <!-- regular device --> + <item>8.0</item> <!-- low ram device --> </array> <!-- The background current drain monitoring window size. --> @@ -5740,6 +5744,12 @@ --> <bool name="config_bg_prompt_fgs_with_noti_to_bg_restricted">false</bool> + <!-- The behavior when the system detects it's abusive, should the system prompt the user + to put it into the bg restricted level. + True - we'll show the prompt to user, False - we'll not show it. + --> + <bool name="config_bg_prompt_abusive_apps_to_bg_restricted">false</bool> + <!-- The types of state where we'll exempt its battery usage during that state. The state here must be one or a combination of STATE_TYPE_* in BaseAppStateTracker. --> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index a9b95da8982a..333482272789 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -3957,6 +3957,7 @@ <java-symbol type="bool" name="config_supportsConcurrentInternalDisplays" /> <java-symbol type="bool" name="config_unfoldTransitionEnabled" /> <java-symbol type="bool" name="config_unfoldTransitionHingeAngle" /> + <java-symbol type="integer" name="config_unfoldTransitionHalfFoldedTimeout" /> <java-symbol type="array" name="config_perDeviceStateRotationLockDefaults" /> @@ -4764,6 +4765,7 @@ <java-symbol type="integer" name="config_bg_current_drain_media_playback_min_duration" /> <java-symbol type="integer" name="config_bg_current_drain_location_min_duration" /> <java-symbol type="bool" name="config_bg_prompt_fgs_with_noti_to_bg_restricted" /> + <java-symbol type="bool" name="config_bg_prompt_abusive_apps_to_bg_restricted" /> <java-symbol type="integer" name="config_bg_current_drain_exempted_types" /> <java-symbol type="bool" name="config_bg_current_drain_high_threshold_by_bg_location" /> <java-symbol type="drawable" name="ic_swap_horiz" /> diff --git a/core/tests/coretests/src/android/app/NotificationTest.java b/core/tests/coretests/src/android/app/NotificationTest.java index a5da4424f722..f9f3b4c8ead1 100644 --- a/core/tests/coretests/src/android/app/NotificationTest.java +++ b/core/tests/coretests/src/android/app/NotificationTest.java @@ -17,6 +17,30 @@ package android.app; import static android.app.Notification.Builder.ensureColorSpanContrast; +import static android.app.Notification.CarExtender.UnreadConversation.KEY_ON_READ; +import static android.app.Notification.CarExtender.UnreadConversation.KEY_ON_REPLY; +import static android.app.Notification.CarExtender.UnreadConversation.KEY_REMOTE_INPUT; +import static android.app.Notification.EXTRA_ANSWER_INTENT; +import static android.app.Notification.EXTRA_BUILDER_APPLICATION_INFO; +import static android.app.Notification.EXTRA_CALL_PERSON; +import static android.app.Notification.EXTRA_CONVERSATION_ICON; +import static android.app.Notification.EXTRA_DECLINE_INTENT; +import static android.app.Notification.EXTRA_HANG_UP_INTENT; +import static android.app.Notification.EXTRA_LARGE_ICON; +import static android.app.Notification.EXTRA_LARGE_ICON_BIG; +import static android.app.Notification.EXTRA_MEDIA_REMOTE_INTENT; +import static android.app.Notification.EXTRA_MEDIA_SESSION; +import static android.app.Notification.EXTRA_MESSAGING_PERSON; +import static android.app.Notification.EXTRA_PICTURE; +import static android.app.Notification.EXTRA_PICTURE_ICON; +import static android.app.Notification.MessagingStyle.Message.KEY_DATA_URI; +import static android.app.Notification.MessagingStyle.Message.KEY_SENDER_PERSON; +import static android.app.Notification.MessagingStyle.Message.KEY_TEXT; +import static android.app.Notification.MessagingStyle.Message.KEY_TIMESTAMP; +import static android.app.Notification.TvExtender.EXTRA_CONTENT_INTENT; +import static android.app.Notification.TvExtender.EXTRA_DELETE_INTENT; +import static android.app.Notification.WearableExtender.KEY_BACKGROUND; +import static android.app.Notification.WearableExtender.KEY_DISPLAY_INTENT; import static com.android.compatibility.common.util.SystemUtil.runShellCommand; import static com.android.internal.util.ContrastColorUtilTest.assertContrastIsAtLeast; @@ -32,6 +56,7 @@ import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.spy; import android.annotation.Nullable; import android.content.Context; @@ -43,6 +68,7 @@ import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Color; import android.graphics.drawable.Icon; +import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Parcel; @@ -170,7 +196,7 @@ public class NotificationTest { assertNotSame(q.getLargeIcon(), n.getLargeIcon()); assertTrue(q.getLargeIcon().getBitmap().sameAs(n.getLargeIcon().getBitmap())); - assertSame(q.getLargeIcon(), q.extras.getParcelable(Notification.EXTRA_LARGE_ICON)); + assertSame(q.getLargeIcon(), q.extras.getParcelable(EXTRA_LARGE_ICON)); } @Test @@ -179,12 +205,12 @@ public class NotificationTest { mContext.getResources(), com.android.frameworks.coretests.R.drawable.test128x96)); Notification n = new Notification.Builder(mContext).build(); - n.extras.putParcelable(Notification.EXTRA_LARGE_ICON, originalIcon); + n.extras.putParcelable(EXTRA_LARGE_ICON, originalIcon); assertSame(n.getLargeIcon(), null); Notification q = writeAndReadParcelable(n); assertSame(q.getLargeIcon(), null); - assertTrue(((Icon) q.extras.getParcelable(Notification.EXTRA_LARGE_ICON)).getBitmap() + assertTrue(((Icon) q.extras.getParcelable(EXTRA_LARGE_ICON)).getBitmap() .sameAs(originalIcon.getBitmap())); } @@ -641,7 +667,7 @@ public class NotificationTest { public void testIsMediaNotification_invalidSession_returnsFalse() { // Extra was set manually to an invalid type Bundle extras = new Bundle(); - extras.putParcelable(Notification.EXTRA_MEDIA_SESSION, new Intent()); + extras.putParcelable(EXTRA_MEDIA_SESSION, new Intent()); Notification.MediaStyle mediaStyle = new Notification.MediaStyle(); Notification notification = new Notification.Builder(mContext, "test id") .setStyle(mediaStyle) @@ -650,6 +676,7 @@ public class NotificationTest { assertFalse(notification.isMediaNotification()); } + @Test public void validateColorizedPaletteForColor(int rawColor) { Notification.Colors cDay = new Notification.Colors(); Notification.Colors cNight = new Notification.Colors(); @@ -681,6 +708,174 @@ public class NotificationTest { } } + @Test + public void testVisitUris_invalidExtra_noCrash() { + Notification n = new Notification.Builder(mContext, "test") + .setSmallIcon(0) + .build(); + Bundle fakeTypes = new Bundle(); + fakeTypes.putParcelable(EXTRA_LARGE_ICON_BIG, new Bundle()); + fakeTypes.putParcelable(EXTRA_PICTURE_ICON, new Bundle()); + fakeTypes.putParcelable(EXTRA_MESSAGING_PERSON, new Bundle()); + + Consumer<Uri> visitor = (Consumer<Uri>) spy(Consumer.class); + n.visitUris(visitor); + + // no crash, good + } + + @Test + public void testRecoverBuilder_invalidExtra_noCrash() { + Notification n = new Notification.Builder(mContext, "test") + .setSmallIcon(0) + .build(); + Bundle fakeTypes = new Bundle(); + fakeTypes.putParcelable(EXTRA_BUILDER_APPLICATION_INFO, new Bundle()); + + Notification.Builder.recoverBuilder(mContext, n); + + // no crash, good + } + + @Test + public void testIsMediaNotification_invalidExtra_noCrash() { + Notification n = new Notification.Builder(mContext, "test") + .setSmallIcon(0) + .setStyle(new Notification.MediaStyle()) + .build(); + Bundle fakeTypes = new Bundle(); + fakeTypes.putParcelable(EXTRA_MEDIA_SESSION, new Bundle()); + + n.isMediaNotification(); + + // no crash, good + } + + @Test + public void testRestoreFromExtras_BigText_invalidExtra_noCrash() { + Notification.Style style = new Notification.BigTextStyle(); + Bundle fakeTypes = new Bundle(); + fakeTypes.putParcelable(EXTRA_LARGE_ICON_BIG, new Bundle()); + + style.restoreFromExtras(fakeTypes); + + // no crash, good + } + + @Test + public void testRestoreFromExtras_Messaging_invalidExtra_noCrash() { + Notification.Style style = new Notification.MessagingStyle(); + Bundle fakeTypes = new Bundle(); + fakeTypes.putParcelable(EXTRA_MESSAGING_PERSON, new Bundle()); + fakeTypes.putParcelable(EXTRA_CONVERSATION_ICON, new Bundle()); + + style.restoreFromExtras(fakeTypes); + + // no crash, good + } + + @Test + public void testRestoreFromExtras_Media_invalidExtra_noCrash() { + Notification.Style style = new Notification.MediaStyle(); + Bundle fakeTypes = new Bundle(); + fakeTypes.putParcelable(EXTRA_MEDIA_SESSION, new Bundle()); + fakeTypes.putParcelable(EXTRA_MEDIA_REMOTE_INTENT, new Bundle()); + + style.restoreFromExtras(fakeTypes); + + // no crash, good + } + + @Test + public void testRestoreFromExtras_Call_invalidExtra_noCrash() { + Notification.Style style = new Notification.CallStyle(); + Bundle fakeTypes = new Bundle(); + fakeTypes.putParcelable(EXTRA_CALL_PERSON, new Bundle()); + fakeTypes.putParcelable(EXTRA_ANSWER_INTENT, new Bundle()); + fakeTypes.putParcelable(EXTRA_DECLINE_INTENT, new Bundle()); + fakeTypes.putParcelable(EXTRA_HANG_UP_INTENT, new Bundle()); + + style.restoreFromExtras(fakeTypes); + + // no crash, good + } + + @Test + public void testGetPictureIcon_invalidExtra_noCrash() { + Bundle fakeTypes = new Bundle(); + fakeTypes.putParcelable(EXTRA_PICTURE, new Bundle()); + fakeTypes.putParcelable(EXTRA_PICTURE_ICON, new Bundle()); + + Notification.BigPictureStyle.getPictureIcon(fakeTypes); + + // no crash, good + } + + @Test + public void testWearableExtender_invalidExtra_noCrash() { + Notification n = new Notification.Builder(mContext, "test") + .setSmallIcon(0) + .setStyle(new Notification.MediaStyle()) + .build(); + Bundle fakeTypes = new Bundle(); + fakeTypes.putParcelable(KEY_DISPLAY_INTENT, new Bundle()); + fakeTypes.putParcelable(KEY_BACKGROUND, new Bundle()); + Notification.WearableExtender extender = new Notification.WearableExtender(n); + + // no crash, good + } + + @Test + public void testCarExtender_invalidExtra_noCrash() { + Notification n = new Notification.Builder(mContext, "test") + .setSmallIcon(0) + .setStyle(new Notification.MediaStyle()) + .build(); + Bundle fakeTypes = new Bundle(); + fakeTypes.putParcelable(EXTRA_LARGE_ICON, new Bundle()); + Notification.CarExtender extender = new Notification.CarExtender(n); + + // no crash, good + } + + @Test + public void testTvExtender_invalidExtra_noCrash() { + Notification n = new Notification.Builder(mContext, "test") + .setSmallIcon(0) + .setStyle(new Notification.MediaStyle()) + .build(); + Bundle fakeTypes = new Bundle(); + fakeTypes.putParcelable(EXTRA_CONTENT_INTENT, new Bundle()); + fakeTypes.putParcelable(EXTRA_DELETE_INTENT, new Bundle()); + Notification.TvExtender extender = new Notification.TvExtender(n); + + // no crash, good + } + + @Test + public void testGetUnreadConversationFromBundle_invalidExtra_noCrash() { + Bundle fakeTypes = new Bundle(); + fakeTypes.putParcelable(KEY_ON_READ, new Bundle()); + fakeTypes.putParcelable(KEY_ON_REPLY, new Bundle()); + fakeTypes.putParcelable(KEY_REMOTE_INPUT, new Bundle()); + Notification.CarExtender.UnreadConversation.getUnreadConversationFromBundle(fakeTypes); + + // no crash, good + } + + @Test + public void testGetMessageFromBundle_invalidExtra_noCrash() { + Bundle fakeTypes = new Bundle(); + fakeTypes.putParcelable(KEY_SENDER_PERSON, new Bundle()); + fakeTypes.putString(KEY_TEXT, "text"); + fakeTypes.putLong(KEY_TIMESTAMP, 0); + fakeTypes.putParcelable(KEY_REMOTE_INPUT, new Bundle()); + fakeTypes.putParcelable(KEY_DATA_URI, new Bundle()); + Notification.MessagingStyle.Message.getMessageFromBundle(fakeTypes); + + // no crash, good + } + private void assertValid(Notification.Colors c) { // Assert that all colors are populated assertThat(c.getBackgroundColor()).isNotEqualTo(Notification.COLOR_INVALID); 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 b6fb82852c2f..5ef24133ca11 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 @@ -385,7 +385,9 @@ public class BubbleController { mMainExecutor.execute(() -> { int expandedId = INVALID_TASK_ID; if (mStackView != null && mStackView.getExpandedBubble() != null - && isStackExpanded() && !mStackView.isExpansionAnimating()) { + && isStackExpanded() + && !mStackView.isExpansionAnimating() + && !mStackView.isSwitchAnimating()) { expandedId = mStackView.getExpandedBubble().getTaskId(); } if (expandedId != INVALID_TASK_ID && expandedId != taskId) { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java index 6eb8d8aec417..7cfacbcc92f8 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java @@ -329,6 +329,11 @@ public class BubblePositioner { : mBubbleSize; } + /** Size of the visible (non-overlapping) part of the pointer. */ + public int getPointerSize() { + return mPointerHeight - mPointerOverlap; + } + /** The maximum number of bubbles that can be displayed comfortably on screen. */ public int getMaxBubbles() { return mMaxBubbles; @@ -367,7 +372,7 @@ public class BubblePositioner { * padding is added. */ public int[] getExpandedViewContainerPadding(boolean onLeft, boolean isOverflow) { - final int pointerTotalHeight = mPointerHeight - mPointerOverlap; + final int pointerTotalHeight = getPointerSize(); final int expandedViewLargeScreenInsetFurthestEdge = getExpandedViewLargeScreenInsetFurthestEdge(isOverflow); if (mIsLargeScreen) { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java index 322c0bf80816..b7c5eb06fbfa 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java @@ -1608,6 +1608,13 @@ public class BubbleStackView extends FrameLayout } /** + * Whether the stack of bubbles is animating a switch between bubbles. + */ + public boolean isSwitchAnimating() { + return mIsBubbleSwitchAnimating; + } + + /** * The {@link Bubble} that is expanded, null if one does not exist. */ @VisibleForTesting @@ -2467,6 +2474,10 @@ public class BubbleStackView extends FrameLayout private void dismissBubbleIfExists(@Nullable BubbleViewProvider bubble) { if (bubble != null && mBubbleData.hasBubbleInStackWithKey(bubble.getKey())) { + if (mIsExpanded && mBubbleData.getBubbles().size() > 1) { + // If we have more than 1 bubble we will perform the switch animation + mIsBubbleSwitchAnimating = true; + } mBubbleData.dismissBubbleWithKey(bubble.getKey(), Bubbles.DISMISS_USER_GESTURE); } } @@ -2887,7 +2898,10 @@ public class BubbleStackView extends FrameLayout PhysicsAnimator.getInstance(mAnimatingOutSurfaceContainer).cancel(); mAnimatingOutSurfaceContainer.setScaleX(1f); mAnimatingOutSurfaceContainer.setScaleY(1f); - mAnimatingOutSurfaceContainer.setTranslationX(mExpandedViewContainer.getPaddingLeft()); + final float translationX = mPositioner.showBubblesVertically() && mStackOnLeftOrWillBe + ? mExpandedViewContainer.getPaddingLeft() + mPositioner.getPointerSize() + : mExpandedViewContainer.getPaddingLeft(); + mAnimatingOutSurfaceContainer.setTranslationX(translationX); mAnimatingOutSurfaceContainer.setTranslationY(0); final int[] taskViewLocation = diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java index 75a999bcb292..d89ddd2074f0 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java @@ -56,7 +56,6 @@ import android.util.ArrayMap; import android.util.Slog; import android.view.ContextThemeWrapper; import android.view.SurfaceControl; -import android.view.View; import android.window.SplashScreenView; import android.window.StartingWindowInfo; import android.window.StartingWindowInfo.StartingWindowType; @@ -543,22 +542,6 @@ public class SplashscreenContentDrawer { mBrandingImageHeight); } final SplashScreenView splashScreenView = builder.build(); - if (mSuggestType != STARTING_WINDOW_TYPE_LEGACY_SPLASH_SCREEN) { - splashScreenView.addOnAttachStateChangeListener( - new View.OnAttachStateChangeListener() { - @Override - public void onViewAttachedToWindow(View v) { - SplashScreenView.applySystemBarsContrastColor( - v.getWindowInsetsController(), - splashScreenView.getInitBackgroundColor()); - } - - @Override - public void onViewDetachedFromWindow(View v) { - } - }); - } - Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER); return splashScreenView; } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java index 11f23e3e941b..464ab1ae2a8c 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java @@ -50,6 +50,7 @@ import android.view.Choreographer; import android.view.Display; import android.view.SurfaceControlViewHost; import android.view.View; +import android.view.WindowInsetsController; import android.view.WindowManager; import android.view.WindowManagerGlobal; import android.widget.FrameLayout; @@ -63,6 +64,7 @@ import android.window.TaskSnapshot; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.protolog.common.ProtoLog; +import com.android.internal.util.ContrastColorUtil; import com.android.launcher3.icons.IconProvider; import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.TransactionPool; @@ -121,6 +123,9 @@ public class StartingSurfaceDrawer { private StartingSurface.SysuiProxy mSysuiProxy; private final StartingWindowRemovalInfo mTmpRemovalInfo = new StartingWindowRemovalInfo(); + private static final int LIGHT_BARS_MASK = + WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS + | WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS; /** * The minimum duration during which the splash screen is shown when the splash screen icon is * animated. @@ -361,9 +366,27 @@ public class StartingSurfaceDrawer { // the window before first round relayoutWindow, which will happen after insets // animation. mChoreographer.postCallback(CALLBACK_INSETS_ANIMATION, setViewSynchronized, null); - // Block until we get the background color. final StartingWindowRecord record = mStartingWindowRecords.get(taskId); + record.parseAppSystemBarColor(context); + // Block until we get the background color. final SplashScreenView contentView = viewSupplier.get(); + if (suggestType != STARTING_WINDOW_TYPE_LEGACY_SPLASH_SCREEN) { + contentView.addOnAttachStateChangeListener( + new View.OnAttachStateChangeListener() { + @Override + public void onViewAttachedToWindow(View v) { + final int lightBarAppearance = ContrastColorUtil.isColorLight( + contentView.getInitBackgroundColor()) + ? LIGHT_BARS_MASK : 0; + contentView.getWindowInsetsController().setSystemBarsAppearance( + lightBarAppearance, LIGHT_BARS_MASK); + } + + @Override + public void onViewDetachedFromWindow(View v) { + } + }); + } record.mBGColor = contentView.getInitBackgroundColor(); } else { // release the icon view host @@ -613,6 +636,7 @@ public class StartingSurfaceDrawer { ProtoLog.v(ShellProtoLogGroup.WM_SHELL_STARTING_WINDOW, "Removing splash screen window for task: %d", taskId); if (record.mContentView != null) { + record.clearSystemBarColor(); if (immediately || record.mSuggestType == STARTING_WINDOW_TYPE_LEGACY_SPLASH_SCREEN) { removeWindowInner(record.mDecorView, false); @@ -670,6 +694,8 @@ public class StartingSurfaceDrawer { private @StartingWindowType int mSuggestType; private int mBGColor; private final long mCreateTime; + private int mSystemBarAppearance; + private boolean mDrawsSystemBarBackgrounds; StartingWindowRecord(IBinder appToken, View decorView, TaskSnapshotWindow taskSnapshotWindow, @StartingWindowType int suggestType) { @@ -690,5 +716,37 @@ public class StartingSurfaceDrawer { mContentView = splashScreenView; mSetSplashScreen = true; } + + private void parseAppSystemBarColor(Context context) { + final TypedArray a = context.obtainStyledAttributes(R.styleable.Window); + mDrawsSystemBarBackgrounds = a.getBoolean( + R.styleable.Window_windowDrawsSystemBarBackgrounds, false); + if (a.getBoolean(R.styleable.Window_windowLightStatusBar, false)) { + mSystemBarAppearance |= WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS; + } + if (a.getBoolean(R.styleable.Window_windowLightNavigationBar, false)) { + mSystemBarAppearance |= WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS; + } + a.recycle(); + } + + // Reset the system bar color which set by splash screen, make it align to the app. + private void clearSystemBarColor() { + if (mDecorView == null) { + return; + } + if (mDecorView.getLayoutParams() instanceof WindowManager.LayoutParams) { + final WindowManager.LayoutParams lp = + (WindowManager.LayoutParams) mDecorView.getLayoutParams(); + if (mDrawsSystemBarBackgrounds) { + lp.flags |= WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS; + } else { + lp.flags &= ~WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS; + } + mDecorView.setLayoutParams(lp); + } + mDecorView.getWindowInsetsController().setSystemBarsAppearance( + mSystemBarAppearance, LIGHT_BARS_MASK); + } } } diff --git a/media/java/android/media/tv/tuner/filter/Filter.java b/media/java/android/media/tv/tuner/filter/Filter.java index a3e731b0ffa1..d0973f4eb11f 100644 --- a/media/java/android/media/tv/tuner/filter/Filter.java +++ b/media/java/android/media/tv/tuner/filter/Filter.java @@ -560,6 +560,11 @@ public class Filter implements AutoCloseable { */ @Override public void close() { + synchronized (mCallbackLock) { + mCallback = null; + mExecutor = null; + } + synchronized (mLock) { if (mIsClosed) { return; @@ -568,8 +573,6 @@ public class Filter implements AutoCloseable { if (res != Tuner.RESULT_SUCCESS) { TunerUtils.throwExceptionForResult(res, "Failed to close filter."); } else { - mCallback = null; - mExecutor = null; mIsStarted = false; mIsClosed = true; } diff --git a/packages/InputDevices/res/values-km/strings.xml b/packages/InputDevices/res/values-km/strings.xml index 4b123214a056..e06ce2c83d49 100644 --- a/packages/InputDevices/res/values-km/strings.xml +++ b/packages/InputDevices/res/values-km/strings.xml @@ -32,10 +32,10 @@ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"ហុងគ្រី"</string> <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"អ៊ីស្លង់"</string> <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"ប្រេស៊ីល"</string> - <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"ព័រទុយហ្គាល់"</string> + <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"ព័រទុយហ្កាល់"</string> <string name="keyboard_layout_slovak" msgid="2469379934672837296">"ស្លូវ៉ាគី"</string> <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"ស្លូវ៉ានី"</string> - <string name="keyboard_layout_turkish" msgid="7736163250907964898">"ទួរគី"</string> + <string name="keyboard_layout_turkish" msgid="7736163250907964898">"តួកគី"</string> <string name="keyboard_layout_turkish_f" msgid="9130320856010776018">"តួកគី F"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"អ៊ុយក្រែន"</string> <string name="keyboard_layout_arabic" msgid="5671970465174968712">"អារ៉ាប់"</string> diff --git a/packages/SettingsLib/Utils/src/com/android/settingslib/utils/BuildCompatUtils.java b/packages/SettingsLib/Utils/src/com/android/settingslib/utils/BuildCompatUtils.java index 88e242340dee..ddbc907018c8 100644 --- a/packages/SettingsLib/Utils/src/com/android/settingslib/utils/BuildCompatUtils.java +++ b/packages/SettingsLib/Utils/src/com/android/settingslib/utils/BuildCompatUtils.java @@ -48,37 +48,13 @@ public final class BuildCompatUtils { } /** - * Implementation of BuildCompat.isAtLeast*() suitable for use in Settings - * - * <p>This still should try using BuildCompat.isAtLeastR() as source of truth, but also checking - * for VERSION_SDK_INT and VERSION.CODENAME in case when BuildCompat implementation returned - * false. Note that both checks should be >= and not = to make sure that when Android version - * increases (i.e., from R to S), this does not stop working. - * - * <p>Supported configurations: - * - * <ul> - * <li>For current Android release: when new API is not finalized yet (CODENAME = "Tiramisu", - * SDK_INT = 32) - * <li>For current Android release: when new API is finalized (CODENAME = "REL", SDK_INT = 33) - * <li>For next Android release (CODENAME = "U", SDK_INT = 34+) - * </ul> - * - * <p>Note that Build.VERSION_CODES.S cannot be used here until final SDK is available, because - * it is equal to Build.VERSION_CODES.CUR_DEVELOPMENT before API finalization. + * Implementation of BuildCompat.isAtLeastT() suitable for use in Settings * * @return Whether the current OS version is higher or equal to T. */ + @ChecksSdkIntAtLeast(api = Build.VERSION_CODES.TIRAMISU) public static boolean isAtLeastT() { - if (!isAtLeastS()) { - return false; - } - - return (VERSION.CODENAME.equals("REL") && VERSION.SDK_INT >= 33) - || (VERSION.CODENAME.length() >= 1 - && VERSION.CODENAME.toUpperCase().charAt(0) >= 'T' - && VERSION.CODENAME.toUpperCase().charAt(0) <= 'Z') - || (Build.VERSION.CODENAME.equals("Tiramisu") && Build.VERSION.SDK_INT >= 32); + return Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU; } private BuildCompatUtils() {} diff --git a/packages/SettingsLib/res/drawable/broadcast_dialog_btn_bg.xml b/packages/SettingsLib/res/drawable/broadcast_dialog_btn_bg.xml new file mode 100644 index 000000000000..5fd7ee29d838 --- /dev/null +++ b/packages/SettingsLib/res/drawable/broadcast_dialog_btn_bg.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2022 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<shape xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" + android:shape="rectangle"> + <solid android:color="?androidprv:attr/colorAccentPrimary" /> + <corners android:radius="@dimen/broadcast_dialog_btn_radius" /> +</shape> diff --git a/packages/SettingsLib/res/layout/broadcast_dialog.xml b/packages/SettingsLib/res/layout/broadcast_dialog.xml new file mode 100644 index 000000000000..ec69aa597180 --- /dev/null +++ b/packages/SettingsLib/res/layout/broadcast_dialog.xml @@ -0,0 +1,84 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2022 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <LinearLayout + android:id="@+id/dialog_bg" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="@dimen/broadcast_dialog_margin" + android:orientation="vertical"> + + <ImageView + android:id="@+id/dialog_icon" + android:layout_width="@dimen/broadcast_dialog_icon_size" + android:layout_height="@dimen/broadcast_dialog_icon_size" + android:layout_marginTop="@dimen/broadcast_dialog_icon_margin_top" + android:layout_marginBottom="@dimen/broadcast_dialog_title_img_margin_top" + android:layout_gravity="center" + android:src="@drawable/settings_input_antenna"/> + + <TextView + style="@style/BroadcastDialogTitleStyle" + android:id="@+id/dialog_title" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:gravity="center" + android:layout_gravity="center"/> + + <TextView + style="@style/BroadcastDialogBodyStyle" + android:id="@+id/dialog_subtitle" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:gravity="center" + android:layout_gravity="center"/> + </LinearLayout> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginHorizontal="@dimen/broadcast_dialog_margin" + android:layout_marginBottom="@dimen/broadcast_dialog_margin" + android:orientation="vertical"> + + <Button + android:layout_marginBottom="@dimen/broadcast_dialog_btn_margin_bottom" + android:id="@+id/positive_btn" + style="@style/BroadcastDialogButtonStyle"/> + + <Button + android:layout_marginBottom="@dimen/broadcast_dialog_btn_margin_bottom" + android:id="@+id/negative_btn" + android:text="@string/bt_le_audio_broadcast_dialog_different_output" + style="@style/BroadcastDialogButtonStyle"/> + + <Button + android:id="@+id/neutral_btn" + android:text="@android:string/cancel" + style="@style/BroadcastDialogButtonStyle"/> + </LinearLayout> + + </LinearLayout> +</FrameLayout> diff --git a/packages/SettingsLib/res/layout/qrcode_scanner_fragment.xml b/packages/SettingsLib/res/layout/qrcode_scanner_fragment.xml index e071f4c469a6..0a7fe0903348 100644 --- a/packages/SettingsLib/res/layout/qrcode_scanner_fragment.xml +++ b/packages/SettingsLib/res/layout/qrcode_scanner_fragment.xml @@ -92,6 +92,7 @@ android:layout_marginStart="?attr/sudMarginStart" android:layout_marginEnd="?attr/sudMarginEnd" android:gravity="center" + android:layout_gravity="center" android:visibility="invisible"/> </LinearLayout> diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml index d901b9294f0b..6bcac9deead2 100644 --- a/packages/SettingsLib/res/values-ar/strings.xml +++ b/packages/SettingsLib/res/values-ar/strings.xml @@ -280,7 +280,7 @@ <string name="wifi_display_certification" msgid="1805579519992520381">"شهادة عرض شاشة لاسلكي"</string> <string name="wifi_verbose_logging" msgid="1785910450009679371">"تفعيل تسجيل Wi‑Fi Verbose"</string> <string name="wifi_scan_throttling" msgid="2985624788509913617">"تقييد البحث عن شبكات Wi-Fi"</string> - <string name="wifi_non_persistent_mac_randomization" msgid="7482769677894247316">"التوزيع العشوائي لعناوين MAC غير الثابتة لشبكة Wi‑Fi."</string> + <string name="wifi_non_persistent_mac_randomization" msgid="7482769677894247316">"التوزيع العشوائي لعناوين MAC غير الثابتة لشبكة Wi‑Fi"</string> <string name="mobile_data_always_on" msgid="8275958101875563572">"بيانات الجوّال نشطة دائمًا"</string> <string name="tethering_hardware_offload" msgid="4116053719006939161">"تسريع الأجهزة للتوصيل"</string> <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"عرض أجهزة البلوتوث بدون أسماء"</string> diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml index 261ee3e50f36..b3bba95f949b 100644 --- a/packages/SettingsLib/res/values-as/strings.xml +++ b/packages/SettingsLib/res/values-as/strings.xml @@ -55,7 +55,7 @@ <string name="wifi_disabled_network_failure" msgid="2660396183242399585">"IP কনফিগাৰেশ্বন বিফল হৈছে"</string> <string name="wifi_disabled_by_recommendation_provider" msgid="1302938248432705534">"নিম্নমানৰ নেটৱৰ্কৰ বাবে সংযোগ কৰা হোৱা নাই"</string> <string name="wifi_disabled_wifi_failure" msgid="8819554899148331100">"ৱাই-ফাই সংযোগ বিফল হৈছে"</string> - <string name="wifi_disabled_password_failure" msgid="6892387079613226738">"সত্য়াপন কৰাত সমস্যা হৈছে"</string> + <string name="wifi_disabled_password_failure" msgid="6892387079613226738">"সত্যাপন কৰাত সমস্যা হৈছে"</string> <string name="wifi_cant_connect" msgid="5718417542623056783">"সংযোগ কৰিব নোৱাৰে"</string> <string name="wifi_cant_connect_to_ap" msgid="3099667989279700135">"\'<xliff:g id="AP_NAME">%1$s</xliff:g>\'ৰ সৈতে সংযোগ কৰিব পৰা নাই"</string> <string name="wifi_check_password_try_again" msgid="8817789642851605628">"পাছৱৰ্ড পৰীক্ষা কৰি আকৌ চেষ্টা কৰক"</string> @@ -146,12 +146,12 @@ <string name="bluetooth_hid_profile_summary_use_for" msgid="4289460627406490952">"ইনপুটৰ বাবে ব্যৱহাৰ কৰক"</string> <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="7689393730163320483">"শ্ৰৱণ যন্ত্ৰৰ বাবে ব্যৱহাৰ কৰক"</string> <string name="bluetooth_le_audio_profile_summary_use_for" msgid="2778318636027348572">"LE_AUDIOৰ বাবে ব্যৱহাৰ কৰক"</string> - <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"যোৰা লগাওক"</string> - <string name="bluetooth_pairing_accept_all_caps" msgid="2734383073450506220">"যোৰা লগাওক"</string> + <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"পেয়াৰ কৰক"</string> + <string name="bluetooth_pairing_accept_all_caps" msgid="2734383073450506220">"পেয়াৰ কৰক"</string> <string name="bluetooth_pairing_decline" msgid="6483118841204885890">"বাতিল কৰক"</string> <string name="bluetooth_pairing_will_share_phonebook" msgid="3064334458659165176">"যোৰা লগালে ইয়ে সংযোজিত কৰাৰ সময়ত আপোনাৰ সম্পৰ্কসমূহ আৰু কলৰ ইতিহাস চাবলৈ অনুমতি দিব।"</string> - <string name="bluetooth_pairing_error_message" msgid="6626399020672335565">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>ৰ সৈতে যোৰা লগাব পৰা নগ\'ল৷"</string> - <string name="bluetooth_pairing_pin_error_message" msgid="264422127613704940">"এটা ভুল পিন বা পাছকীৰ কাৰণে <xliff:g id="DEVICE_NAME">%1$s</xliff:g>ৰ সৈতে যোৰা লগাব পৰা নাই৷"</string> + <string name="bluetooth_pairing_error_message" msgid="6626399020672335565">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>ৰ সৈতে পেয়াৰ কৰিব পৰা নগ’ল।"</string> + <string name="bluetooth_pairing_pin_error_message" msgid="264422127613704940">"এটা ভুল পিন বা পাছকীৰ কাৰণে <xliff:g id="DEVICE_NAME">%1$s</xliff:g>ৰ সৈতে পেয়াৰ কৰিব পৰা নাই।"</string> <string name="bluetooth_pairing_device_down_error_message" msgid="2554424863101358857">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>ৰ সৈতে যোগাযোগ কৰিব পৰা নগ\'ল"</string> <string name="bluetooth_pairing_rejected_error_message" msgid="5943444352777314442">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>এ যোৰা লগাব বিচৰা নাই"</string> <string name="bluetooth_talkback_computer" msgid="3736623135703893773">"কম্পিউটাৰ"</string> @@ -297,8 +297,8 @@ <string name="bluetooth_select_a2dp_codec_type_help_info" msgid="8647200416514412338">"ধোঁৱাবৰণীয়া হৈ থকা মানে এয়া ফ’ন অথবা হেডছেটটোৱে সমৰ্থন নকৰে"</string> <string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="6253965294594390806">"প্ৰতি ছেম্পলত ব্লুটুথ অডিঅ\' বিটসমূহ"</string> <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4898693684282596143">"ব্লুটুথ অডিঅ\' ক\'ডেকৰ বাছনি\nআৰম্ভ কৰক: প্ৰতি নমুনা ইমান বিট"</string> - <string name="bluetooth_select_a2dp_codec_channel_mode" msgid="364277285688014427">"ব্লুটুথ অডিঅ\' চ্চেনেল ম\'ড"</string> - <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="2076949781460359589">"ব্লুটুথ অডিঅ\' ক\'ডেকৰ বাছনি\nআৰম্ভ কৰক: চ্চেনেল ম\'ড"</string> + <string name="bluetooth_select_a2dp_codec_channel_mode" msgid="364277285688014427">"ব্লুটুথ অডিঅ\' চেনেল ম\'ড"</string> + <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="2076949781460359589">"ব্লুটুথ অডিঅ\' ক\'ডেকৰ বাছনি\nআৰম্ভ কৰক: চেনেল ম\'ড"</string> <string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3233402355917446304">"ব্লুটুথ অডিঅ’ LDAC ক’ডেক: পৰিৱেশনৰ মান"</string> <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="7274396574659784285">"ব্লুটুথ অডিঅ\' LDAC\nক\'ডেক বাছনি আৰম্ভ কৰক: প্লেবেকৰ গুণগত মান"</string> <string name="bluetooth_select_a2dp_codec_streaming_label" msgid="2040810756832027227">"ষ্ট্ৰীম কৰি থকা হৈছে: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string> @@ -401,7 +401,7 @@ <string name="show_all_anrs" msgid="9160563836616468726">"নেপথ্য এএনআৰবোৰ দেখুৱাওক"</string> <string name="show_all_anrs_summary" msgid="8562788834431971392">"নেপথ্য এপসমূহৰ বাবে এপে সঁহাৰি দিয়া নাই ডায়ল\'গ প্ৰদৰ্শন কৰক"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"জাননী চ্চেনেলৰ সকীয়নিসমূহ দেখুৱাওক"</string> - <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"কোনো এপে বৈধ চ্চেনেল নোহোৱাকৈ কোনো জাননী প\'ষ্ট কৰিলে স্ক্ৰীনত সকীয়নি প্ৰদৰ্শন হয়"</string> + <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"কোনো এপে বৈধ চেনেল নোহোৱাকৈ কোনো জাননী প\'ষ্ট কৰিলে স্ক্ৰীনত সকীয়নি প্ৰদৰ্শন হয়"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"বাহ্যিক সঞ্চয়াগাৰত এপক বলেৰে অনুমতি দিয়ক"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"মেনিফেষ্টৰ মান যিয়েই নহওক, বাহ্যিক ষ্ট’ৰেজত লিখিবলৈ যিকোনো এপক উপযুক্ত কৰি তোলে"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"বলেৰে কাৰ্যকলাপসমূহৰ আকাৰ সলনি কৰিব পৰা কৰক"</string> @@ -569,7 +569,7 @@ <string name="user_add_user_item_title" msgid="2394272381086965029">"ব্যৱহাৰকাৰী"</string> <string name="user_add_profile_item_title" msgid="3111051717414643029">"সীমিত প্ৰ\'ফাইল"</string> <string name="user_add_user_title" msgid="5457079143694924885">"নতুন ব্যৱহাৰকাৰী যোগ কৰিবনে?"</string> - <string name="user_add_user_message_long" msgid="1527434966294733380">"আপুনি অতিৰিক্ত ব্য়ৱহাৰকাৰীক যোগ কৰি এই ডিভাইচটো অন্য় ব্য়ক্তিৰ সৈতে শ্বেয়াৰ কৰিব পাৰে। প্ৰতিজন ব্য়ৱহাৰকাৰীৰ বাবে নিজাকৈ ঠাই আছে যাক তেওঁলোকে এপ্, ৱালপেপাৰ আৰু অন্য়ান্য় বস্তুৰ বাবে নিজৰ উপযোগিতা অনুযায়ী ব্য়ৱহাৰ কৰিব পাৰে। ব্য়ৱহাৰকাৰীসকলে সকলোকে প্ৰভাৱান্বিত কৰা ৱাই-ফাইৰ নিচিনা ডিভাইচৰ ছেটিং সাল-সলনি কৰিবও পাৰে।\n\nআপুনি যেতিয়া কোনো নতুন ব্য়ৱহাৰকাৰীক যোগ কৰে সেই ব্য়ক্তিজনে নিজেই নিজৰ বাবে ঠাই ছেট আপ কৰিব লাগিব।\n\nসকলো ব্য়ৱহাৰকাৰীয়ে অন্য় ব্য়ৱহাৰকাৰীৰ বাবে এপ্সমূহ আপডে’ট কৰিব পাৰে। সাধ্য় সুবিধাসমূহৰ ছেটিং আৰু সেৱাসমূহ নতুন ব্য়ৱহাৰকাৰীলৈ স্থানান্তৰ নহ\'বও পাৰে।"</string> + <string name="user_add_user_message_long" msgid="1527434966294733380">"আপুনি অতিৰিক্ত ব্যৱহাৰকাৰীক যোগ কৰি এই ডিভাইচটো অন্য় ব্য়ক্তিৰ সৈতে শ্বেয়াৰ কৰিব পাৰে। প্ৰতিজন ব্যৱহাৰকাৰীৰ বাবে নিজাকৈ ঠাই আছে যাক তেওঁলোকে এপ্, ৱালপেপাৰ আৰু অন্য়ান্য় বস্তুৰ বাবে নিজৰ উপযোগিতা অনুযায়ী ব্যৱহাৰ কৰিব পাৰে। ব্যৱহাৰকাৰীসকলে সকলোকে প্ৰভাৱান্বিত কৰা ৱাই-ফাইৰ নিচিনা ডিভাইচৰ ছেটিং সাল-সলনি কৰিবও পাৰে।\n\nআপুনি যেতিয়া কোনো নতুন ব্যৱহাৰকাৰীক যোগ কৰে সেই ব্য়ক্তিজনে নিজেই নিজৰ বাবে ঠাই ছেট আপ কৰিব লাগিব।\n\nসকলো ব্যৱহাৰকাৰীয়ে অন্য় ব্যৱহাৰকাৰীৰ বাবে এপ্সমূহ আপডে’ট কৰিব পাৰে। সাধ্য় সুবিধাসমূহৰ ছেটিং আৰু সেৱাসমূহ নতুন ব্যৱহাৰকাৰীলৈ স্থানান্তৰ নহ\'বও পাৰে।"</string> <string name="user_add_user_message_short" msgid="3295959985795716166">"আপুনি যেতিয়া এজন নতুন ব্যৱহাৰকাৰী যোগ কৰে, তেওঁ নিজৰ ঠাই ছেট আপ কৰা প্ৰয়োজন।\n\nযিকোনো ব্যৱহাৰকাৰীয়ে সকলো ব্যৱহাৰকাৰীৰ বাবে এপ্ আপডে\'ট কৰিব পাৰে।"</string> <string name="user_setup_dialog_title" msgid="8037342066381939995">"ব্যৱহাৰকাৰী এতিয়া ছেট আপ কৰিবনে?"</string> <string name="user_setup_dialog_message" msgid="269931619868102841">"ডিভাইচটো লৈ নিজৰ ঠাই ছেটআপ কৰিবলৈ নতুন ব্যৱহাৰকাৰী উপলব্ধ থকাটো নিশ্চিত কৰক"</string> @@ -655,12 +655,8 @@ <string name="bt_le_audio_scan_qr_code" msgid="3521809854780392679">"কিউআৰ ক’ডটো স্কেন কৰক"</string> <string name="bt_le_audio_scan_qr_code_scanner" msgid="4679500020630341107">"শুনিবলৈ আৰম্ভ কৰিবলৈ, তলৰ মাজৰ অংশত কিউআৰ ক’ডটো ৰাখক"</string> <string name="bt_le_audio_qr_code_is_not_valid_format" msgid="6092191081849434734">"কিউআৰ ক’ডটো মান্য ফৰ্মেটৰ নহয়"</string> - <!-- no translation found for bt_le_audio_broadcast_dialog_title (5392738488989777074) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_sub_title (268234802198852753) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_switch_app (5749813313369517812) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_different_output (2638402023060391333) --> - <skip /> + <string name="bt_le_audio_broadcast_dialog_title" msgid="5392738488989777074">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ সম্প্ৰচাৰ কৰা বন্ধ কৰিবনে?"</string> + <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="268234802198852753">"যদি আপুনি <xliff:g id="SWITCHAPP">%1$s</xliff:g>ৰ সম্প্ৰচাৰ কৰে অথবা আউটপুট সলনি কৰে, তেন্তে, আপোনাৰ বৰ্তমানৰ সম্প্ৰচাৰ বন্ধ হৈ যাব"</string> + <string name="bt_le_audio_broadcast_dialog_switch_app" msgid="5749813313369517812">"<xliff:g id="SWITCHAPP">%1$s</xliff:g> সম্প্ৰচাৰ কৰক"</string> + <string name="bt_le_audio_broadcast_dialog_different_output" msgid="2638402023060391333">"আউটপুট সলনি কৰক"</string> </resources> diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml index fa8c5155be30..ca78c68c83df 100644 --- a/packages/SettingsLib/res/values-az/strings.xml +++ b/packages/SettingsLib/res/values-az/strings.xml @@ -655,12 +655,8 @@ <string name="bt_le_audio_scan_qr_code" msgid="3521809854780392679">"QR kodu skanlayın"</string> <string name="bt_le_audio_scan_qr_code_scanner" msgid="4679500020630341107">"Dinləməyə başlamaq üçün aşağıda QR kodu mərkəzə yerləşdirin"</string> <string name="bt_le_audio_qr_code_is_not_valid_format" msgid="6092191081849434734">"QR kodu doğru formatda deyil"</string> - <!-- no translation found for bt_le_audio_broadcast_dialog_title (5392738488989777074) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_sub_title (268234802198852753) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_switch_app (5749813313369517812) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_different_output (2638402023060391333) --> - <skip /> + <string name="bt_le_audio_broadcast_dialog_title" msgid="5392738488989777074">"<xliff:g id="APP_NAME">%1$s</xliff:g> tətbiqinin yayımlanması dayandırılsın?"</string> + <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="268234802198852753">"<xliff:g id="SWITCHAPP">%1$s</xliff:g> tətbiqini yayımlasanız və ya nəticəni dəyişsəniz, cari yayımınız dayandırılacaq"</string> + <string name="bt_le_audio_broadcast_dialog_switch_app" msgid="5749813313369517812">"<xliff:g id="SWITCHAPP">%1$s</xliff:g> tətbiqini yayımlayın"</string> + <string name="bt_le_audio_broadcast_dialog_different_output" msgid="2638402023060391333">"Nəticəni dəyişdirin"</string> </resources> diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml index c5ac71cea8ca..12a421dcd1e1 100644 --- a/packages/SettingsLib/res/values-bg/strings.xml +++ b/packages/SettingsLib/res/values-bg/strings.xml @@ -225,7 +225,7 @@ <string name="choose_profile" msgid="343803890897657450">"Избор на потребителски профил"</string> <string name="category_personal" msgid="6236798763159385225">"Лични"</string> <string name="category_work" msgid="4014193632325996115">"Служебни"</string> - <string name="development_settings_title" msgid="140296922921597393">"Опции на програмиста"</string> + <string name="development_settings_title" msgid="140296922921597393">"Опции за програмисти"</string> <string name="development_settings_enable" msgid="4285094651288242183">"Активиране на опциите за програмисти"</string> <string name="development_settings_summary" msgid="8718917813868735095">"Задаване на опции за програмиране на приложения"</string> <string name="development_settings_not_available" msgid="355070198089140951">"Опциите за програмисти не са налице за този потребител"</string> @@ -364,7 +364,7 @@ <string name="pointer_location_summary" msgid="957120116989798464">"Насл. на екран показва текущи данни при докосване"</string> <string name="show_touches" msgid="8437666942161289025">"Показване на докосванията"</string> <string name="show_touches_summary" msgid="3692861665994502193">"Показване на визуална обр. връзка за докосванията"</string> - <string name="show_screen_updates" msgid="2078782895825535494">"Актуал. на повърхн: Показв."</string> + <string name="show_screen_updates" msgid="2078782895825535494">"Актуализации на повърхн."</string> <string name="show_screen_updates_summary" msgid="2126932969682087406">"Примигв. на целите повърхности на прозорците при актуализирането им"</string> <string name="show_hw_screen_updates" msgid="2021286231267747506">"Актуализации на изгледите"</string> <string name="show_hw_screen_updates_summary" msgid="3539770072741435691">"Примигв. на изгледите в прозорците при начертаване"</string> diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml index 11e9f1df5778..4b03267c87ba 100644 --- a/packages/SettingsLib/res/values-bn/strings.xml +++ b/packages/SettingsLib/res/values-bn/strings.xml @@ -273,7 +273,7 @@ <string name="oem_unlock_enable_summary" msgid="5857388174390953829">"বুট-লোডার আনলক করার অনুমতি দিন"</string> <string name="confirm_enable_oem_unlock_title" msgid="8249318129774367535">"OEM আনলক করার অনুমতি দিতে চান?"</string> <string name="confirm_enable_oem_unlock_text" msgid="854131050791011970">"সতর্কতা: এই ডিভাইসে সেটিংটি চালু থাকা অবস্থায় ডিভাইস সুরক্ষা বৈশিষ্ট্যগুলি কাজ করবে না৷"</string> - <string name="mock_location_app" msgid="6269380172542248304">"অনুরূপ লোকেশন অ্যাপ্লিকেশান বেছে নিন"</string> + <string name="mock_location_app" msgid="6269380172542248304">"অনুরূপ লোকেশন অ্যাপ বেছে নিন"</string> <string name="mock_location_app_not_set" msgid="6972032787262831155">"কোনো অনুরূপ লোকেশন অ্যাপ্লিকেশান সেট করা নেই"</string> <string name="mock_location_app_set" msgid="4706722469342913843">"অনুরূপ লোকেশন অ্যাপ্লিকেশান: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="debug_networking_category" msgid="6829757985772659599">"নেটওয়ার্কিং"</string> diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml index 7499bbce1857..fae2cd662251 100644 --- a/packages/SettingsLib/res/values-bs/strings.xml +++ b/packages/SettingsLib/res/values-bs/strings.xml @@ -264,7 +264,7 @@ <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Povežite se na WiFi mrežu"</string> <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, otklanjanje grešaka, programer"</string> <string name="bugreport_in_power" msgid="8664089072534638709">"Prečica za izvještaj o greškama"</string> - <string name="bugreport_in_power_summary" msgid="1885529649381831775">"Prikaz dugmeta za prijavu grešaka u meniju napajanja"</string> + <string name="bugreport_in_power_summary" msgid="1885529649381831775">"Vidite dugme za prijavu grešaka u meniju napajanja"</string> <string name="keep_screen_on" msgid="1187161672348797558">"Ne zaključavaj ekran"</string> <string name="keep_screen_on_summary" msgid="1510731514101925829">"Ekran neće prelaziti u stanje mirovanja tokom punjenja"</string> <string name="bt_hci_snoop_log" msgid="7291287955649081448">"Omogući Bluetooth HCI snoop zapis"</string> @@ -299,8 +299,8 @@ <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4898693684282596143">"Aktivirajte Bluetooth Audio Codec\nOdabir: Bitovi po uzorku"</string> <string name="bluetooth_select_a2dp_codec_channel_mode" msgid="364277285688014427">"Način Bluetooth audio kanala"</string> <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="2076949781460359589">"Aktivirajte Bluetooth Audio Codec\nOdabir: Način rada po kanalima"</string> - <string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3233402355917446304">"Bluetooth Audio LDAC kodek: Kvalitet reprodukcije"</string> - <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="7274396574659784285">"Aktivirajte Bluetooth Audio \nOdabir kodeka: Kvalitet reprodukcije"</string> + <string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3233402355917446304">"Bluetooth Audio LDAC kodek: kvalitet reprodukcije"</string> + <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="7274396574659784285">"Aktivirajte Bluetooth Audio \nOdabir kodeka: kvalitet reprodukcije"</string> <string name="bluetooth_select_a2dp_codec_streaming_label" msgid="2040810756832027227">"Prijenos: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string> <string name="select_private_dns_configuration_title" msgid="7887550926056143018">"Privatni DNS"</string> <string name="select_private_dns_configuration_dialog_title" msgid="3731422918335951912">"Odaberite način rada privatnog DNS-a"</string> @@ -336,7 +336,7 @@ <string name="dev_settings_warning_title" msgid="8251234890169074553">"Dopustiti postavke za razvoj?"</string> <string name="dev_settings_warning_message" msgid="37741686486073668">"Ove postavke su namijenjene samo za svrhe razvoja. Mogu izazvati pogrešno ponašanje uređaja i aplikacija na njemu."</string> <string name="verify_apps_over_usb_title" msgid="6031809675604442636">"Potvrdi aplikacije putem USB-a"</string> - <string name="verify_apps_over_usb_summary" msgid="1317933737581167839">"Provjerite da li se u aplikacijama instaliranim putem ADB-a/ADT-a javlja zlonamjerno ponašanje"</string> + <string name="verify_apps_over_usb_summary" msgid="1317933737581167839">"Provjerite javlja li se zlonamjerno ponašanje u aplikacijama instaliranim putem ADB-a/ADT-a"</string> <string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Prikazat će se Bluetooth uređaji bez naziva (samo MAC adrese)"</string> <string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Onemogućava funkciju apsolutne jačine zvuka za Bluetooth u slučaju problema s jačinom zvuka na udaljenim uređajima, kao što je neprihvatljivo glasan zvuk ili nedostatak kontrole."</string> <string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Omogućava grupisanje funkcije Bluetooth Gabeldorsche."</string> @@ -655,12 +655,8 @@ <string name="bt_le_audio_scan_qr_code" msgid="3521809854780392679">"Skenirajte QR kôd"</string> <string name="bt_le_audio_scan_qr_code_scanner" msgid="4679500020630341107">"Da pokrenete slušanje, centrirajte QR kôd ispod"</string> <string name="bt_le_audio_qr_code_is_not_valid_format" msgid="6092191081849434734">"Format QR koda nije važeći"</string> - <!-- no translation found for bt_le_audio_broadcast_dialog_title (5392738488989777074) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_sub_title (268234802198852753) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_switch_app (5749813313369517812) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_different_output (2638402023060391333) --> - <skip /> + <string name="bt_le_audio_broadcast_dialog_title" msgid="5392738488989777074">"Zaustaviti emitiranje aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> + <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="268234802198852753">"Ako emitirate aplikaciju <xliff:g id="SWITCHAPP">%1$s</xliff:g> ili promijenite izlaz, vaše će se trenutačno emitiranje zaustaviti"</string> + <string name="bt_le_audio_broadcast_dialog_switch_app" msgid="5749813313369517812">"Emitiranje aplikacije <xliff:g id="SWITCHAPP">%1$s</xliff:g>"</string> + <string name="bt_le_audio_broadcast_dialog_different_output" msgid="2638402023060391333">"Promjena izlaza"</string> </resources> diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml index 5620cce8884d..e3dca33ed933 100644 --- a/packages/SettingsLib/res/values-ca/strings.xml +++ b/packages/SettingsLib/res/values-ca/strings.xml @@ -312,7 +312,7 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Mostra les opcions per a la certificació de pantalla sense fil"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Augmenta el nivell de registre de la connexió Wi‑Fi i es mostra per SSID RSSI al selector de Wi‑Fi"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Exhaureix menys la bateria i millora el rendiment de la xarxa"</string> - <string name="wifi_non_persistent_mac_randomization_summary" msgid="2159794543105053930">"Quan aquest mode està activat, és possible que l’adreça MAC d\'aquest dispositiu canviï cada vegada que es connecti a una xarxa amb l\'aleatorització d\'adreces MAC activada."</string> + <string name="wifi_non_persistent_mac_randomization_summary" msgid="2159794543105053930">"Quan aquest mode està activat, és possible que l’adreça MAC d\'aquest dispositiu canviï cada vegada que es connecti a una xarxa amb l\'aleatorització d\'adreces MAC activada"</string> <string name="wifi_metered_label" msgid="8737187690304098638">"D\'ús mesurat"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"D\'ús no mesurat"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Mides de la mem. intermèdia del registrador"</string> diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml index 8d4aacd5e83d..58c31eb6a0fd 100644 --- a/packages/SettingsLib/res/values-cs/strings.xml +++ b/packages/SettingsLib/res/values-cs/strings.xml @@ -173,9 +173,9 @@ <string name="data_usage_uninstalled_apps" msgid="1933665711856171491">"Odebrané aplikace"</string> <string name="data_usage_uninstalled_apps_users" msgid="5533981546921913295">"Odebrané aplikace a odebraní uživatelé"</string> <string name="data_usage_ota" msgid="7984667793701597001">"Aktualizace systému"</string> - <string name="tether_settings_title_usb" msgid="3728686573430917722">"Připojení přes USB"</string> + <string name="tether_settings_title_usb" msgid="3728686573430917722">"Tethering přes USB"</string> <string name="tether_settings_title_wifi" msgid="4803402057533895526">"Přenosný hotspot"</string> - <string name="tether_settings_title_bluetooth" msgid="916519902721399656">"Připojení přes Bluetooth"</string> + <string name="tether_settings_title_bluetooth" msgid="916519902721399656">"Tethering přes Bluetooth"</string> <string name="tether_settings_title_usb_bluetooth" msgid="1727111807207577322">"Sdílené připojení"</string> <string name="tether_settings_title_all" msgid="8910259483383010470">"Sdílené připojení a přenosný hotspot"</string> <string name="managed_user_title" msgid="449081789742645723">"Všechny pracovní aplikace"</string> @@ -310,7 +310,7 @@ <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"Zadejte hostitele poskytovatele DNS"</string> <string name="private_dns_mode_provider_failure" msgid="8356259467861515108">"Nelze se připojit"</string> <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Zobrazit možnosti certifikace bezdrátového displeje"</string> - <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Zvýšit úroveň protokolování Wi‑Fi zobrazenou v SSID a RSSI při výběru sítě Wi‑Fi"</string> + <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Zvýšit úroveň protokolování Wi‑Fi, při výběru Wi‑Fi zobrazovat RSSI pro každý SSID"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Snižuje vyčerpávání baterie a vylepšuje výkon sítě"</string> <string name="wifi_non_persistent_mac_randomization_summary" msgid="2159794543105053930">"Když je tento režim aktivován, adresa MAC tohoto zařízení se může změnit pokaždé, když se zařízení připojí k síti s aktivovanou randomizací adres MAC."</string> <string name="wifi_metered_label" msgid="8737187690304098638">"Měřená"</string> @@ -336,7 +336,7 @@ <string name="dev_settings_warning_title" msgid="8251234890169074553">"Povolit nastavení pro vývojáře?"</string> <string name="dev_settings_warning_message" msgid="37741686486073668">"Tato nastavení jsou určena pouze pro vývojáře. Mohou způsobit rozbití nebo nesprávné fungování zařízení a nainstalovaných aplikací."</string> <string name="verify_apps_over_usb_title" msgid="6031809675604442636">"Ověřovat aplikace z USB"</string> - <string name="verify_apps_over_usb_summary" msgid="1317933737581167839">"Kontrolovat škodlivost aplikací nainstalovaných pomocí nástroje ADB/ADT"</string> + <string name="verify_apps_over_usb_summary" msgid="1317933737581167839">"Kontrolovat škodlivost aplikací nainstalovaných pomocí nástroje ADB nebo ADT"</string> <string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Zařízení Bluetooth se budou zobrazovat bez názvů (pouze adresy MAC)"</string> <string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Zakáže funkci absolutní hlasitosti Bluetooth. Zabrání tak problémům s hlasitostí vzdálených zařízení (jako je příliš vysoká hlasitost nebo nemožnost ovládání)."</string> <string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Zapne sadu funkcí Bluetooth Gabeldorche."</string> @@ -351,7 +351,7 @@ <string name="debug_app_set" msgid="6599535090477753651">"Aplikace pro ladění: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="select_application" msgid="2543228890535466325">"Výběr aplikace"</string> <string name="no_application" msgid="9038334538870247690">"Nic"</string> - <string name="wait_for_debugger" msgid="7461199843335409809">"Počkat na ladicí program"</string> + <string name="wait_for_debugger" msgid="7461199843335409809">"Čekat na ladicí program"</string> <string name="wait_for_debugger_summary" msgid="6846330006113363286">"Aplikace čeká na připojení ladicího programu"</string> <string name="debug_input_category" msgid="7349460906970849771">"Vstup"</string> <string name="debug_drawing_category" msgid="5066171112313666619">"Vykreslování"</string> diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml index e9a8da988001..74e2dbbd05c9 100644 --- a/packages/SettingsLib/res/values-en-rAU/strings.xml +++ b/packages/SettingsLib/res/values-en-rAU/strings.xml @@ -655,12 +655,8 @@ <string name="bt_le_audio_scan_qr_code" msgid="3521809854780392679">"Scan QR code"</string> <string name="bt_le_audio_scan_qr_code_scanner" msgid="4679500020630341107">"To start listening, centre the QR code below"</string> <string name="bt_le_audio_qr_code_is_not_valid_format" msgid="6092191081849434734">"QR code isn\'t a valid format"</string> - <!-- no translation found for bt_le_audio_broadcast_dialog_title (5392738488989777074) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_sub_title (268234802198852753) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_switch_app (5749813313369517812) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_different_output (2638402023060391333) --> - <skip /> + <string name="bt_le_audio_broadcast_dialog_title" msgid="5392738488989777074">"Stop broadcasting <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> + <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="268234802198852753">"If you broadcast <xliff:g id="SWITCHAPP">%1$s</xliff:g> or change the output, your current broadcast will stop"</string> + <string name="bt_le_audio_broadcast_dialog_switch_app" msgid="5749813313369517812">"Broadcast <xliff:g id="SWITCHAPP">%1$s</xliff:g>"</string> + <string name="bt_le_audio_broadcast_dialog_different_output" msgid="2638402023060391333">"Change output"</string> </resources> diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml index 788968f438c1..eacaad02883f 100644 --- a/packages/SettingsLib/res/values-en-rCA/strings.xml +++ b/packages/SettingsLib/res/values-en-rCA/strings.xml @@ -655,12 +655,8 @@ <string name="bt_le_audio_scan_qr_code" msgid="3521809854780392679">"Scan QR code"</string> <string name="bt_le_audio_scan_qr_code_scanner" msgid="4679500020630341107">"To start listening, centre the QR code below"</string> <string name="bt_le_audio_qr_code_is_not_valid_format" msgid="6092191081849434734">"QR code isn\'t a valid format"</string> - <!-- no translation found for bt_le_audio_broadcast_dialog_title (5392738488989777074) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_sub_title (268234802198852753) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_switch_app (5749813313369517812) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_different_output (2638402023060391333) --> - <skip /> + <string name="bt_le_audio_broadcast_dialog_title" msgid="5392738488989777074">"Stop broadcasting <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> + <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="268234802198852753">"If you broadcast <xliff:g id="SWITCHAPP">%1$s</xliff:g> or change the output, your current broadcast will stop"</string> + <string name="bt_le_audio_broadcast_dialog_switch_app" msgid="5749813313369517812">"Broadcast <xliff:g id="SWITCHAPP">%1$s</xliff:g>"</string> + <string name="bt_le_audio_broadcast_dialog_different_output" msgid="2638402023060391333">"Change output"</string> </resources> diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml index e9a8da988001..74e2dbbd05c9 100644 --- a/packages/SettingsLib/res/values-en-rGB/strings.xml +++ b/packages/SettingsLib/res/values-en-rGB/strings.xml @@ -655,12 +655,8 @@ <string name="bt_le_audio_scan_qr_code" msgid="3521809854780392679">"Scan QR code"</string> <string name="bt_le_audio_scan_qr_code_scanner" msgid="4679500020630341107">"To start listening, centre the QR code below"</string> <string name="bt_le_audio_qr_code_is_not_valid_format" msgid="6092191081849434734">"QR code isn\'t a valid format"</string> - <!-- no translation found for bt_le_audio_broadcast_dialog_title (5392738488989777074) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_sub_title (268234802198852753) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_switch_app (5749813313369517812) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_different_output (2638402023060391333) --> - <skip /> + <string name="bt_le_audio_broadcast_dialog_title" msgid="5392738488989777074">"Stop broadcasting <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> + <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="268234802198852753">"If you broadcast <xliff:g id="SWITCHAPP">%1$s</xliff:g> or change the output, your current broadcast will stop"</string> + <string name="bt_le_audio_broadcast_dialog_switch_app" msgid="5749813313369517812">"Broadcast <xliff:g id="SWITCHAPP">%1$s</xliff:g>"</string> + <string name="bt_le_audio_broadcast_dialog_different_output" msgid="2638402023060391333">"Change output"</string> </resources> diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml index e9a8da988001..74e2dbbd05c9 100644 --- a/packages/SettingsLib/res/values-en-rIN/strings.xml +++ b/packages/SettingsLib/res/values-en-rIN/strings.xml @@ -655,12 +655,8 @@ <string name="bt_le_audio_scan_qr_code" msgid="3521809854780392679">"Scan QR code"</string> <string name="bt_le_audio_scan_qr_code_scanner" msgid="4679500020630341107">"To start listening, centre the QR code below"</string> <string name="bt_le_audio_qr_code_is_not_valid_format" msgid="6092191081849434734">"QR code isn\'t a valid format"</string> - <!-- no translation found for bt_le_audio_broadcast_dialog_title (5392738488989777074) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_sub_title (268234802198852753) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_switch_app (5749813313369517812) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_different_output (2638402023060391333) --> - <skip /> + <string name="bt_le_audio_broadcast_dialog_title" msgid="5392738488989777074">"Stop broadcasting <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> + <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="268234802198852753">"If you broadcast <xliff:g id="SWITCHAPP">%1$s</xliff:g> or change the output, your current broadcast will stop"</string> + <string name="bt_le_audio_broadcast_dialog_switch_app" msgid="5749813313369517812">"Broadcast <xliff:g id="SWITCHAPP">%1$s</xliff:g>"</string> + <string name="bt_le_audio_broadcast_dialog_different_output" msgid="2638402023060391333">"Change output"</string> </resources> diff --git a/packages/SettingsLib/res/values-en-rXC/strings.xml b/packages/SettingsLib/res/values-en-rXC/strings.xml index 9ca21bb42821..70227dce71e4 100644 --- a/packages/SettingsLib/res/values-en-rXC/strings.xml +++ b/packages/SettingsLib/res/values-en-rXC/strings.xml @@ -655,12 +655,8 @@ <string name="bt_le_audio_scan_qr_code" msgid="3521809854780392679">"Scan QR code"</string> <string name="bt_le_audio_scan_qr_code_scanner" msgid="4679500020630341107">"To start listening, center the QR code below"</string> <string name="bt_le_audio_qr_code_is_not_valid_format" msgid="6092191081849434734">"QR code isn\'t a valid format"</string> - <!-- no translation found for bt_le_audio_broadcast_dialog_title (5392738488989777074) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_sub_title (268234802198852753) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_switch_app (5749813313369517812) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_different_output (2638402023060391333) --> - <skip /> + <string name="bt_le_audio_broadcast_dialog_title" msgid="5392738488989777074">"Stop broadcasting <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> + <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="268234802198852753">"If you broadcast <xliff:g id="SWITCHAPP">%1$s</xliff:g> or change the output, your current broadcast will stop"</string> + <string name="bt_le_audio_broadcast_dialog_switch_app" msgid="5749813313369517812">"Broadcast <xliff:g id="SWITCHAPP">%1$s</xliff:g>"</string> + <string name="bt_le_audio_broadcast_dialog_different_output" msgid="2638402023060391333">"Change output"</string> </resources> diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml index 6ec3f8e7ef30..9df8e7e6634c 100644 --- a/packages/SettingsLib/res/values-es/strings.xml +++ b/packages/SettingsLib/res/values-es/strings.xml @@ -286,10 +286,10 @@ <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Mostrar dispositivos Bluetooth sin nombre"</string> <string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Inhabilitar volumen absoluto"</string> <string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Habilitar Gabeldorsche"</string> - <string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Versión AVRCP de Bluetooth"</string> - <string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Selecciona la versión AVRCP de Bluetooth"</string> - <string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Versión de MAP de Bluetooth"</string> - <string name="bluetooth_select_map_version_dialog_title" msgid="7085934373987428460">"Seleccionar versión de MAP de Bluetooth"</string> + <string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Versión de Bluetooth AVRCP"</string> + <string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Selecciona la versión de Bluetooth AVRCP"</string> + <string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Versión de Bluetooth MAP"</string> + <string name="bluetooth_select_map_version_dialog_title" msgid="7085934373987428460">"Selecciona la versión de Bluetooth MAP"</string> <string name="bluetooth_select_a2dp_codec_type" msgid="952001408455456494">"Códec de audio de Bluetooth"</string> <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="7510542404227225545">"Activar el códec de audio por Bluetooth\nSelección"</string> <string name="bluetooth_select_a2dp_codec_sample_rate" msgid="1638623076480928191">"Frecuencia de muestreo de audio de Bluetooth"</string> @@ -311,11 +311,11 @@ <string name="private_dns_mode_provider_failure" msgid="8356259467861515108">"No se ha podido establecer la conexión"</string> <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Muestra opciones para la certificación de la pantalla inalámbrica"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Aumenta el nivel de registro de la conexión Wi-Fi y se muestra por SSID RSSI en el selector Wi-Fi"</string> - <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Reduce el consumo de batería y mejora el rendimiento de las redes"</string> + <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Reduce el consumo de batería y mejora el rendimiento de la red"</string> <string name="wifi_non_persistent_mac_randomization_summary" msgid="2159794543105053930">"Si este modo está habilitado, es posible que la dirección MAC del dispositivo cambie cada vez que se conecte a una red que tenga habilitada la aleatorización de MAC."</string> <string name="wifi_metered_label" msgid="8737187690304098638">"Medida"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"No medida"</string> - <string name="select_logd_size_title" msgid="1604578195914595173">"Tamaños del búfer para registrar"</string> + <string name="select_logd_size_title" msgid="1604578195914595173">"Tamaños del búfer de registro"</string> <string name="select_logd_size_dialog_title" msgid="2105401994681013578">"Elige el tamaño del Logger por búfer"</string> <string name="dev_logpersist_clear_warning_title" msgid="8631859265777337991">"¿Borrar almacenamiento continuo del registrador?"</string> <string name="dev_logpersist_clear_warning_message" msgid="6447590867594287413">"Cuando ya no supervisamos la actividad con el registrador de forma continua, estamos obligados a borrar los datos del registrador almacenados en el dispositivo."</string> @@ -347,7 +347,7 @@ <string name="hdcp_checking_dialog_title" msgid="7691060297616217781">"Establecer comprobación HDCP"</string> <string name="debug_debugging_category" msgid="535341063709248842">"Depuración"</string> <string name="debug_app" msgid="8903350241392391766">"Elegir aplicación de depuración"</string> - <string name="debug_app_not_set" msgid="1934083001283807188">"Aplicación de depuración no configurada"</string> + <string name="debug_app_not_set" msgid="1934083001283807188">"Aplicación de depuración no establecida"</string> <string name="debug_app_set" msgid="6599535090477753651">"Aplicación de depuración: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="select_application" msgid="2543228890535466325">"Selecciona una aplicación"</string> <string name="no_application" msgid="9038334538870247690">"Ninguna"</string> @@ -366,20 +366,20 @@ <string name="show_touches_summary" msgid="3692861665994502193">"Muestra la ubicación de los toques en la pantalla"</string> <string name="show_screen_updates" msgid="2078782895825535494">"Mostrar cambios de superficies"</string> <string name="show_screen_updates_summary" msgid="2126932969682087406">"Hace parpadear todas las superficies de la ventana cuando se actualizan"</string> - <string name="show_hw_screen_updates" msgid="2021286231267747506">"Ver cambios de vista"</string> + <string name="show_hw_screen_updates" msgid="2021286231267747506">"Ver actualizaciones de vista"</string> <string name="show_hw_screen_updates_summary" msgid="3539770072741435691">"Hacer parpadear las vistas dentro de las ventanas cuando se dibujan"</string> <string name="show_hw_layers_updates" msgid="5268370750002509767">"Ver actualizaciones de capas de hardware"</string> <string name="show_hw_layers_updates_summary" msgid="5850955890493054618">"Hacer parpadear las capas de hardware en verde cuando se actualizan"</string> <string name="debug_hw_overdraw" msgid="8944851091008756796">"Depurar sobredibujos de GPU"</string> <string name="disable_overlays" msgid="4206590799671557143">"Inhabilitar superposiciones de hardware"</string> - <string name="disable_overlays_summary" msgid="1954852414363338166">"Usar siempre la GPU para componer pantallas"</string> + <string name="disable_overlays_summary" msgid="1954852414363338166">"Usa siempre la GPU para componer pantallas"</string> <string name="simulate_color_space" msgid="1206503300335835151">"Simular espacio de color"</string> <string name="enable_opengl_traces_title" msgid="4638773318659125196">"Habilitar seguimiento OpenGL"</string> <string name="usb_audio_disable_routing" msgid="3367656923544254975">"Inhabilitar enrutamiento de audio por USB"</string> <string name="usb_audio_disable_routing_summary" msgid="8768242894849534699">"Inhabilita el enrutamiento automático a periféricos de audio USB"</string> <string name="debug_layout" msgid="1659216803043339741">"Mostrar límites de diseño"</string> <string name="debug_layout_summary" msgid="8825829038287321978">"Muestra límites de vídeo, márgenes, etc."</string> - <string name="force_rtl_layout_all_locales" msgid="8690762598501599796">"Forzar dirección de diseño RTL"</string> + <string name="force_rtl_layout_all_locales" msgid="8690762598501599796">"Forzar dirección RTL"</string> <string name="force_rtl_layout_all_locales_summary" msgid="6663016859517239880">"Fuerza la dirección RTL para todos los idiomas"</string> <string name="window_blurs" msgid="6831008984828425106">"Difuminar ventanas"</string> <string name="force_msaa" msgid="4081288296137775550">"Forzar MSAA 4x"</string> @@ -387,7 +387,7 @@ <string name="show_non_rect_clip" msgid="7499758654867881817">"Depurar operaciones de recorte no rectangulares"</string> <string name="track_frame_time" msgid="522674651937771106">"Trazar la renderización de HWUI"</string> <string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Activar capas de depuración de GPU"</string> - <string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Permite cargar capas de depuración de GPU para aplicaciones de depuración"</string> + <string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Permite cargar capas de depuración de GPU en aplicaciones de depuración"</string> <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Habilitar registro de proveedor detallado"</string> <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Incluye otros registros de proveedor específicos del dispositivo en informes de errores, lo que puede añadir información privada, usar más batería u ocupar más espacio de almacenamiento."</string> <string name="window_animation_scale_title" msgid="5236381298376812508">"Escala de animación de ventana"</string> @@ -399,7 +399,7 @@ <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Destruye actividades cuando el usuario deja de usarlas"</string> <string name="app_process_limit_title" msgid="8361367869453043007">"Límitar procesos en segundo plano"</string> <string name="show_all_anrs" msgid="9160563836616468726">"Mostrar ANR en segundo plano"</string> - <string name="show_all_anrs_summary" msgid="8562788834431971392">"Muestra el cuadro de diálogo de que la aplicación no responde para aplicaciones en segundo plano"</string> + <string name="show_all_anrs_summary" msgid="8562788834431971392">"Muestra un cuadro de diálogo que informa de que la aplicación no responde en aplicaciones en segundo plano"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Ver advertencias del canal de notificaciones"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Muestra una advertencia en pantalla cuando una aplicación publica una notificación sin un canal válido"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Forzar permitir aplicaciones en almacenamiento externo"</string> @@ -552,7 +552,7 @@ <string name="help_label" msgid="3528360748637781274">"Ayuda y comentarios"</string> <string name="storage_category" msgid="2287342585424631813">"Almacenamiento"</string> <string name="shared_data_title" msgid="1017034836800864953">"Datos compartidos"</string> - <string name="shared_data_summary" msgid="5516326713822885652">"Ver y modificar los datos compartidos"</string> + <string name="shared_data_summary" msgid="5516326713822885652">"Consulta y modifica datos compartidos"</string> <string name="shared_data_no_blobs_text" msgid="3108114670341737434">"No hay datos compartidos de este usuario."</string> <string name="shared_data_query_failure_text" msgid="3489828881998773687">"No se han podido generar datos compartidos. Inténtalo de nuevo."</string> <string name="blob_id_text" msgid="8680078988996308061">"ID de datos compartidos: <xliff:g id="BLOB_ID">%d</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml index 996b92fdb457..6cc50575ab44 100644 --- a/packages/SettingsLib/res/values-et/strings.xml +++ b/packages/SettingsLib/res/values-et/strings.xml @@ -47,7 +47,7 @@ <string name="wifi_security_sae" msgid="3644520541721422843">"WPA3-Personal"</string> <string name="wifi_security_psk_sae" msgid="8135104122179904684">"WPA2/WPA3-Personal"</string> <string name="wifi_security_none_owe" msgid="5241745828327404101">"Puudub / Täiustatud avamine"</string> - <string name="wifi_security_owe" msgid="3343421403561657809">"Täiustatud avamine"</string> + <string name="wifi_security_owe" msgid="3343421403561657809">"Enhanced Open"</string> <string name="wifi_security_eap_suiteb" msgid="415842785991698142">"WPA3-Enterprise (192-bitine)"</string> <string name="wifi_remembered" msgid="3266709779723179188">"Salvestatud"</string> <string name="wifi_disconnected" msgid="7054450256284661757">"Pole ühendatud"</string> diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml index d6741dc13364..1154f9c31d4c 100644 --- a/packages/SettingsLib/res/values-eu/strings.xml +++ b/packages/SettingsLib/res/values-eu/strings.xml @@ -286,7 +286,7 @@ <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Erakutsi Bluetooth bidezko gailuak izenik gabe"</string> <string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Desgaitu bolumen absolutua"</string> <string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Gaitu Gabeldorsche"</string> - <string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Bluetooth AVRCP bertsioa"</string> + <string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"Bluetooth AVRCParen bertsioa"</string> <string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"Hautatu Bluetooth AVRCP bertsioa"</string> <string name="bluetooth_select_map_version_string" msgid="526308145174175327">"Bluetooth MAParen bertsioa"</string> <string name="bluetooth_select_map_version_dialog_title" msgid="7085934373987428460">"Hautatu Bluetooth MAParen bertsioa"</string> @@ -372,14 +372,14 @@ <string name="show_hw_layers_updates_summary" msgid="5850955890493054618">"Distirarazi hardware-geruzak berdez haiek eguneratzean"</string> <string name="debug_hw_overdraw" msgid="8944851091008756796">"Araztu GPU gainidazketa"</string> <string name="disable_overlays" msgid="4206590799671557143">"Desgaitu HW gainjartzeak"</string> - <string name="disable_overlays_summary" msgid="1954852414363338166">"Erabili beti GPU pantaila-muntaietarako"</string> + <string name="disable_overlays_summary" msgid="1954852414363338166">"Erabili beti GPUa pantaila-muntaietarako"</string> <string name="simulate_color_space" msgid="1206503300335835151">"Simulatu kolore-eremua"</string> <string name="enable_opengl_traces_title" msgid="4638773318659125196">"Gaitu OpenGL aztarnak"</string> <string name="usb_audio_disable_routing" msgid="3367656923544254975">"Desgaitu USB bidez audioa bideratzeko aukera"</string> <string name="usb_audio_disable_routing_summary" msgid="8768242894849534699">"Desgaitu USB bidezko audio-gailuetara automatikoki bideratzeko aukera"</string> <string name="debug_layout" msgid="1659216803043339741">"Erakutsi diseinu-mugak"</string> <string name="debug_layout_summary" msgid="8825829038287321978">"Erakutsi kliparen mugak, marjinak, etab."</string> - <string name="force_rtl_layout_all_locales" msgid="8690762598501599796">"Behartu eskuin-ezker norabidea"</string> + <string name="force_rtl_layout_all_locales" msgid="8690762598501599796">"Eskuinetik ezkerrerako norabidea"</string> <string name="force_rtl_layout_all_locales_summary" msgid="6663016859517239880">"Behartu pantaila-diseinuaren norabidea eskuin-ezker izatera lurraldeko ezarpen guztiekin"</string> <string name="window_blurs" msgid="6831008984828425106">"Gaitu leiho-lausotzeak"</string> <string name="force_msaa" msgid="4081288296137775550">"Behartu 4x MSAA"</string> diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml index bbb4285b4834..e66d28a13b5c 100644 --- a/packages/SettingsLib/res/values-gl/strings.xml +++ b/packages/SettingsLib/res/values-gl/strings.xml @@ -312,7 +312,7 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Mostra opcións para o certificado de visualización sen fíos"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Aumenta o nivel de rexistro da wifi, móstrao por SSID RSSI no selector de wifi"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Reduce o consumo de batería e mellora o rendemento da rede"</string> - <string name="wifi_non_persistent_mac_randomization_summary" msgid="2159794543105053930">"Cando este modo está activado, o enderezo MAC pode cambiar cada vez que se este dispositivo se conecta a unha rede que teña activada a orde aleatoria de enderezos MAC."</string> + <string name="wifi_non_persistent_mac_randomization_summary" msgid="2159794543105053930">"Cando este modo está activado, o enderezo MAC pode cambiar cada vez que este dispositivo se conecte a unha rede que teña activada a orde aleatoria de enderezos MAC"</string> <string name="wifi_metered_label" msgid="8737187690304098638">"Rede sen tarifa plana"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Rede con tarifa plana"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Tamaño dos búfers do rexistrador"</string> @@ -359,37 +359,37 @@ <string name="media_category" msgid="8122076702526144053">"Multimedia"</string> <string name="debug_monitoring_category" msgid="1597387133765424994">"Supervisión"</string> <string name="strict_mode" msgid="889864762140862437">"Modo estrito activado"</string> - <string name="strict_mode_summary" msgid="1838248687233554654">"Ilumínase se as aplicacións tardan moito no proceso principal"</string> + <string name="strict_mode_summary" msgid="1838248687233554654">"A pantalla ilumínase se as aplicacións tardan moito no proceso principal"</string> <string name="pointer_location" msgid="7516929526199520173">"Localización do punteiro"</string> <string name="pointer_location_summary" msgid="957120116989798464">"Superpón os datos dos toques na pantalla"</string> <string name="show_touches" msgid="8437666942161289025">"Mostrar toques"</string> <string name="show_touches_summary" msgid="3692861665994502193">"Mostra a localización dos toques na pantalla"</string> - <string name="show_screen_updates" msgid="2078782895825535494">"Cambios de superficie"</string> + <string name="show_screen_updates" msgid="2078782895825535494">"Mostrar cambios de superficie"</string> <string name="show_screen_updates_summary" msgid="2126932969682087406">"Ilumina as superficies de ventás ao actualizarse"</string> <string name="show_hw_screen_updates" msgid="2021286231267747506">"Mostrar actualizacións"</string> <string name="show_hw_screen_updates_summary" msgid="3539770072741435691">"Ilumina as vistas das ventás creadas"</string> <string name="show_hw_layers_updates" msgid="5268370750002509767">"Ver actualizacións de capas de hardware"</string> <string name="show_hw_layers_updates_summary" msgid="5850955890493054618">"Ilumina as capas de hardware en verde ao actualizárense"</string> - <string name="debug_hw_overdraw" msgid="8944851091008756796">"Depurar superposición GPU"</string> + <string name="debug_hw_overdraw" msgid="8944851091008756796">"Depurar superposición de GPU"</string> <string name="disable_overlays" msgid="4206590799671557143">"Desactivar superposicións de hardware"</string> - <string name="disable_overlays_summary" msgid="1954852414363338166">"Utiliza sempre GPU para a composición da pantalla"</string> + <string name="disable_overlays_summary" msgid="1954852414363338166">"Utiliza sempre a GPU para a composición da pantalla"</string> <string name="simulate_color_space" msgid="1206503300335835151">"Simular espazo de cor"</string> <string name="enable_opengl_traces_title" msgid="4638773318659125196">"Activar rastros OpenGL"</string> - <string name="usb_audio_disable_routing" msgid="3367656923544254975">"Desactivar encamiñamento audio USB"</string> + <string name="usb_audio_disable_routing" msgid="3367656923544254975">"Desactivar encamiñamento de audio por USB"</string> <string name="usb_audio_disable_routing_summary" msgid="8768242894849534699">"Desactiva o encamiñamento automático a periféricos de audio USB"</string> <string name="debug_layout" msgid="1659216803043339741">"Mostrar límites de deseño"</string> <string name="debug_layout_summary" msgid="8825829038287321978">"Mostra os límites dos clips, as marxes etc."</string> <string name="force_rtl_layout_all_locales" msgid="8690762598501599796">"Forzar dirección do deseño RTL"</string> - <string name="force_rtl_layout_all_locales_summary" msgid="6663016859517239880">"Forza a dirección de pantalla a RTL (dereita a esquerda) para todas as configuración rexionais"</string> - <string name="window_blurs" msgid="6831008984828425106">"Permitir desenfoque ventá"</string> + <string name="force_rtl_layout_all_locales_summary" msgid="6663016859517239880">"Forza a dirección de pantalla de dereita a esquerda para todas as opcións de configuración rexionais"</string> + <string name="window_blurs" msgid="6831008984828425106">"Permitir desenfoque de ventás"</string> <string name="force_msaa" msgid="4081288296137775550">"Forzar MSAA 4x"</string> <string name="force_msaa_summary" msgid="9070437493586769500">"Activa MSAA 4x en aplicacións OpenGL ES 2.0"</string> - <string name="show_non_rect_clip" msgid="7499758654867881817">"Depurar accións recorte non rectangulares"</string> - <string name="track_frame_time" msgid="522674651937771106">"Perfil procesamento HWUI"</string> + <string name="show_non_rect_clip" msgid="7499758654867881817">"Depurar accións de recorte non rectangulares"</string> + <string name="track_frame_time" msgid="522674651937771106">"Perfil de procesamento de HWUI"</string> <string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Activar depuración da GPU"</string> - <string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Permite capas da GPU para apps de depuración"</string> + <string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Permite cargar capas de depuración da GPU para aplicacións de depuración"</string> <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Activar rexistro de provedores"</string> - <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Inclúe outros rexistros de provedores específicos do dispositivo en informes de erros; pode conter información privada, consumir máis batería e ocupar máis espazo almacenamento"</string> + <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Inclúe outros rexistros de provedores específicos do dispositivo en informes de erros; pode conter información privada, consumir máis batería e ocupar máis espazo de almacenamento"</string> <string name="window_animation_scale_title" msgid="5236381298376812508">"Escala de animación da ventá"</string> <string name="transition_animation_scale_title" msgid="1278477690695439337">"Escala animación-transición"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Escala duración animador"</string> diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml index 88e22a15374c..436ad62496e1 100644 --- a/packages/SettingsLib/res/values-gu/strings.xml +++ b/packages/SettingsLib/res/values-gu/strings.xml @@ -406,8 +406,8 @@ <string name="force_allow_on_external_summary" msgid="8525425782530728238">"મેનિફેસ્ટ મૂલ્યોને ધ્યાનમાં લીધા સિવાય, કોઈપણ ઍપને બાહ્ય સ્ટોરેજ પર લખાવા માટે લાયક બનાવે છે"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"પ્રવૃત્તિઓને ફરીથી કદ યોગ્ય થવા માટે ફરજ પાડો"</string> <string name="force_resizable_activities_summary" msgid="2490382056981583062">"મૅનિફેસ્ટ મૂલ્યોને ધ્યાનમાં લીધા સિવાય, તમામ પ્રવૃત્તિઓને મલ્ટી-વિન્ડો માટે ફરીથી કદ બદલી શકે તેવી બનાવો."</string> - <string name="enable_freeform_support" msgid="7599125687603914253">"ફ્રિફોર્મ વિંડોઝ ચાલુ કરો"</string> - <string name="enable_freeform_support_summary" msgid="1822862728719276331">"પ્રાયોગિક ફ્રિફોર્મ વિંડોઝ માટે સમર્થનને ચાલુ કરો."</string> + <string name="enable_freeform_support" msgid="7599125687603914253">"ફ્રીફોર્મ વિન્ડો ચાલુ કરો"</string> + <string name="enable_freeform_support_summary" msgid="1822862728719276331">"પ્રાયોગિક ફ્રીફોર્મ વિન્ડો માટે સપોર્ટને ચાલુ કરો."</string> <string name="local_backup_password_title" msgid="4631017948933578709">"ડેસ્કટૉપ બૅકઅપ પાસવર્ડ"</string> <string name="local_backup_password_summary_none" msgid="7646898032616361714">"ડેસ્કટૉપ સંપૂર્ણ બૅકઅપ હાલમાં સુરક્ષિત નથી"</string> <string name="local_backup_password_summary_change" msgid="1707357670383995567">"ડેસ્કટૉપ સંપૂર્ણ બેકઅપ્સ માટેનો પાસવર્ડ બદલવા અથવા દૂર કરવા માટે ટૅચ કરો"</string> diff --git a/packages/SettingsLib/res/values-hi/arrays.xml b/packages/SettingsLib/res/values-hi/arrays.xml index 4fd8d64883df..7194502c3ede 100644 --- a/packages/SettingsLib/res/values-hi/arrays.xml +++ b/packages/SettingsLib/res/values-hi/arrays.xml @@ -55,7 +55,7 @@ </string-array> <string-array name="hdcp_checking_summaries"> <item msgid="4045840870658484038">"कभी भी HDCP जाँच का उपयोग न करें"</item> - <item msgid="8254225038262324761">"HDCP जांच का उपयोग सिर्फ़ डीआरएम कॉन्टेंट के लिए करें"</item> + <item msgid="8254225038262324761">"HDCP जांच का इस्तेमाल सिर्फ़ डीआरएम कॉन्टेंट के लिए करें"</item> <item msgid="6421717003037072581">"हमेशा HDCP जाँच का उपयोग करें"</item> </string-array> <string-array name="bt_hci_snoop_log_entries"> @@ -64,7 +64,7 @@ <item msgid="2779123106632690576">"चालू है"</item> </string-array> <string-array name="bluetooth_avrcp_versions"> - <item msgid="6603880723315236832">"एवीआरसीपी 1.5 (डिफ़ॉल्ट)"</item> + <item msgid="6603880723315236832">"AVRCP 1.5 (डिफ़ॉल्ट)"</item> <item msgid="1637054408779685086">"AVRCP 1.3"</item> <item msgid="5896162189744596291">"एवीआरसीपी 1.4"</item> <item msgid="7556896992111771426">"AVRCP 1.6"</item> @@ -133,7 +133,7 @@ <item msgid="927546067692441494">"स्टीरियो"</item> </string-array> <string-array name="bluetooth_a2dp_codec_channel_mode_summaries"> - <item msgid="1997302811102880485">"सिस्टम चुनाव का उपयोग करें (डिफ़ॉल्ट)"</item> + <item msgid="1997302811102880485">"सिस्टम से चुने जाने का इस्तेमाल करें (डिफ़ॉल्ट)"</item> <item msgid="8005696114958453588">"मोनो"</item> <item msgid="1333279807604675720">"स्टीरियो"</item> </string-array> @@ -173,7 +173,7 @@ <item msgid="409235464399258501">"बंद"</item> <item msgid="4195153527464162486">"64K प्रति लॉग बफ़र"</item> <item msgid="7464037639415220106">"256K प्रति लॉग बफ़र"</item> - <item msgid="8539423820514360724">"1 एमबी प्रति लॉग बफ़र"</item> + <item msgid="8539423820514360724">"1M प्रति लॉग बफ़र"</item> <item msgid="1984761927103140651">"4M प्रति लॉग बफ़र"</item> <item msgid="2983219471251787208">"8 एमबी प्रति लॉग बफ़र"</item> </string-array> diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml index 859c8764f8ca..01e661782364 100644 --- a/packages/SettingsLib/res/values-hi/strings.xml +++ b/packages/SettingsLib/res/values-hi/strings.xml @@ -234,7 +234,7 @@ <string name="apn_settings_not_available" msgid="1147111671403342300">"ऐक्सेस पॉइंट के नाम की सेटिंग इस उपयोगकर्ता के लिए मौजूद नहीं हैं"</string> <string name="enable_adb" msgid="8072776357237289039">"यूएसबी डीबग करना"</string> <string name="enable_adb_summary" msgid="3711526030096574316">"डीबग मोड जब यूएसबी कनेक्ट किया गया हो"</string> - <string name="clear_adb_keys" msgid="3010148733140369917">"यूएसबी डीबग करने की मंज़ूरी रद्द करें"</string> + <string name="clear_adb_keys" msgid="3010148733140369917">"यूएसबी डीबग करने की मंज़ूरी निरस्त करें"</string> <string name="enable_adb_wireless" msgid="6973226350963971018">"वॉयरलेस डीबगिंग"</string> <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"डिवाइस के वाई-फ़ाई से कनेक्ट हाेने पर, डीबग मोड चालू करें"</string> <string name="adb_wireless_error" msgid="721958772149779856">"गड़बड़ी"</string> @@ -267,35 +267,35 @@ <string name="bugreport_in_power_summary" msgid="1885529649381831775">"गड़बड़ी की रिपोर्ट लेने के लिए पावर मेन्यू में कोई बटन दिखाएं"</string> <string name="keep_screen_on" msgid="1187161672348797558">"स्क्रीन को चालू रखें"</string> <string name="keep_screen_on_summary" msgid="1510731514101925829">"चार्ज करते समय स्क्रीन कभी भी कम बैटरी मोड में नहीं जाएगी"</string> - <string name="bt_hci_snoop_log" msgid="7291287955649081448">"ब्लूटूथ एचसीआई स्नूप लॉग चालू करें"</string> + <string name="bt_hci_snoop_log" msgid="7291287955649081448">"ब्लूटूथ HCI स्नूप लॉग चालू करें"</string> <string name="bt_hci_snoop_log_summary" msgid="6808538971394092284">"ब्लूटूथ पैकेट कैप्चर करें. (यह सेटिंग बदलने के बाद ब्लूटूथ टॉगल करें)"</string> <string name="oem_unlock_enable" msgid="5334869171871566731">"OEM अनलॉक करना"</string> <string name="oem_unlock_enable_summary" msgid="5857388174390953829">"बूटलोडर को अनलाॅक किए जाने की अनुमति दें"</string> <string name="confirm_enable_oem_unlock_title" msgid="8249318129774367535">"OEM अनलॉक करने की अनुमति दें?"</string> <string name="confirm_enable_oem_unlock_text" msgid="854131050791011970">"चेतावनी: इस सेटिंग के चालू रहने पर डिवाइस सुरक्षा सुविधाएं इस डिवाइस पर काम नहीं करेंगी."</string> - <string name="mock_location_app" msgid="6269380172542248304">"जगह की नकली जानकारी देने के लिए ऐप चुनें"</string> - <string name="mock_location_app_not_set" msgid="6972032787262831155">"जगह की नकली जानकारी देने के लिए ऐप सेट नहीं है"</string> - <string name="mock_location_app_set" msgid="4706722469342913843">"जगह की नकली जानकारी देने वाला ऐप: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="mock_location_app" msgid="6269380172542248304">"जगह की दिखावटी जानकारी देने के लिए ऐप्लिकेशन चुनें"</string> + <string name="mock_location_app_not_set" msgid="6972032787262831155">"जगह की दिखावटी जानकारी देने के लिए ऐप सेट नहीं है"</string> + <string name="mock_location_app_set" msgid="4706722469342913843">"जगह की दिखावटी जानकारी देने वाला ऐप: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="debug_networking_category" msgid="6829757985772659599">"नेटवर्किंग"</string> <string name="wifi_display_certification" msgid="1805579519992520381">"वायरलेस डिसप्ले सर्टिफ़िकेशन"</string> <string name="wifi_verbose_logging" msgid="1785910450009679371">"वाई-फ़ाई वर्बोस लॉगिंग चालू करें"</string> - <string name="wifi_scan_throttling" msgid="2985624788509913617">"वाई-फ़ाई के लिए स्कैन की संख्या कम करें"</string> + <string name="wifi_scan_throttling" msgid="2985624788509913617">"वाई-फ़ाई के लिए स्कैन थ्रॉटलिंग करें"</string> <string name="wifi_non_persistent_mac_randomization" msgid="7482769677894247316">"थोड़े समय के लिए वाई-फ़ाई नेटवर्क से जुड़ने पर MAC पता बदलने की सुविधा"</string> <string name="mobile_data_always_on" msgid="8275958101875563572">"मोबाइल डेटा हमेशा चालू"</string> <string name="tethering_hardware_offload" msgid="4116053719006939161">"हार्डवेयर से तेज़ी लाने के लिए टेदर करें"</string> <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"बिना नाम वाले ब्लूटूथ डिवाइस दिखाएं"</string> <string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"ब्लूटूथ से आवाज़ के कंट्रोल की सुविधा रोकें"</string> <string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Gabeldorsche चालू करें"</string> - <string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"ब्लूटूथ एवीआरसीपी वर्शन"</string> + <string name="bluetooth_select_avrcp_version_string" msgid="1710571610177659127">"ब्लूटूथ AVRCP वर्शन"</string> <string name="bluetooth_select_avrcp_version_dialog_title" msgid="7846922290083709633">"ब्लूटूथ AVRCP वर्शन चुनें"</string> <string name="bluetooth_select_map_version_string" msgid="526308145174175327">"ब्लूटूथ का MAP वर्शन"</string> <string name="bluetooth_select_map_version_dialog_title" msgid="7085934373987428460">"ब्लूटूथ का MAP वर्शन चुनें"</string> <string name="bluetooth_select_a2dp_codec_type" msgid="952001408455456494">"ब्लूटूथ ऑडियो कोडेक"</string> <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="7510542404227225545">"ब्लूटूथ ऑडियो कोडेक का\nविकल्प चालू करें"</string> - <string name="bluetooth_select_a2dp_codec_sample_rate" msgid="1638623076480928191">"ब्लूटूथ ऑडियो नमूना दर"</string> + <string name="bluetooth_select_a2dp_codec_sample_rate" msgid="1638623076480928191">"ब्लूटूथ ऑडियो सैंपल रेट"</string> <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5876305103137067798">"ब्लूटूथ ऑडियो कोडेक का\nयह विकल्प चालू करें: सैंपल की दर"</string> <string name="bluetooth_select_a2dp_codec_type_help_info" msgid="8647200416514412338">"धूसर किया गया का मतलब है कि फ़ोन या हेडसेट पर काम नहीं करता"</string> - <string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="6253965294594390806">"ब्लूटूथ ऑडियो बिट प्रति नमूना"</string> + <string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="6253965294594390806">"हर सैंपल के लिए ब्लूटूथ ऑडियो बिट"</string> <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4898693684282596143">"ब्लूटूथ ऑडियो कोडेक का\nयह विकल्प चालू करें: हर सैंपल के लिए बिट की संख्या"</string> <string name="bluetooth_select_a2dp_codec_channel_mode" msgid="364277285688014427">"ब्लूटूथ ऑडियो चैनल मोड"</string> <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="2076949781460359589">"ब्लूटूथ ऑडियो कोडेक का\nयह विकल्प चालू करें: चैनल मोड"</string> @@ -310,12 +310,12 @@ <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"डीएनएस सेवा देने वाले का होस्टनाम डालें"</string> <string name="private_dns_mode_provider_failure" msgid="8356259467861515108">"कनेक्ट नहीं हो सका"</string> <string name="wifi_display_certification_summary" msgid="8111151348106907513">"वायरलेस डिसप्ले सर्टिफ़िकेशन के विकल्प दिखाएं"</string> - <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"वाई-फ़ाई लॉगिंग का स्तर बढ़ाएं, वाई-फ़ाई पिकर में प्रति SSID RSSI दिखाएं"</string> + <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"वाई-फ़ाई लॉगिंग लेवल बढ़ाएं, वाई-फ़ाई पिकर में हर SSID के लिए RSSI दिखाएं"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"बैटरी की खपत कम और नेटवर्क की परफ़ॉर्मेंस बेहतर होती है"</string> <string name="wifi_non_persistent_mac_randomization_summary" msgid="2159794543105053930">"जब यह मोड चालू होता है, तब नेटवर्क से कनेक्ट होने पर हर बार इस डिवाइस का MAC पता बदल सकता है. ऐसा तब होता है, जब डिवाइस किसी ऐसे नेटवर्क से जुड़ता है जिस पर MAC पता बदलने की सुविधा चालू होती है."</string> <string name="wifi_metered_label" msgid="8737187690304098638">"डेटा इस्तेमाल करने की सीमा तय की गई है"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"डेटा इस्तेमाल करने की सीमा तय नहीं की गई है"</string> - <string name="select_logd_size_title" msgid="1604578195914595173">"लॉगर बफ़र आकार"</string> + <string name="select_logd_size_title" msgid="1604578195914595173">"लॉगर बफ़र साइज़"</string> <string name="select_logd_size_dialog_title" msgid="2105401994681013578">"प्रति लॉग बफ़र लॉगर आकार चुनें"</string> <string name="dev_logpersist_clear_warning_title" msgid="8631859265777337991">"लॉगर सतत मेमोरी साफ़ करें?"</string> <string name="dev_logpersist_clear_warning_message" msgid="6447590867594287413">"जब हम सतत लॉगर के साथ निगरानी करना बंद कर देते हैं, तो हमें आपके डिवाइस पर मौजूद लॉगर डेटा को मिटाने की आवश्यकता होती है."</string> @@ -336,7 +336,7 @@ <string name="dev_settings_warning_title" msgid="8251234890169074553">"विकास सेटिंग की अनुमति दें?"</string> <string name="dev_settings_warning_message" msgid="37741686486073668">"ये सेटिंग केवल विकास संबंधी उपयोग के प्रयोजन से हैं. वे आपके डिवाइस और उस पर स्थित ऐप्लिकेशन को खराब कर सकती हैं या उनके दुर्व्यवहार का कारण हो सकती हैं."</string> <string name="verify_apps_over_usb_title" msgid="6031809675604442636">"यूएसबी पर ऐप्लिकेशन की पुष्टि करें"</string> - <string name="verify_apps_over_usb_summary" msgid="1317933737581167839">"नुकसानदेह व्यवहार के लिए ADB/ADT से इंस्टॉल किए गए ऐप्लिकेशन जांचें."</string> + <string name="verify_apps_over_usb_summary" msgid="1317933737581167839">"नुकसान पहुंचाने वाली गतिविधियों के लिए ADB/ADT से इंस्टॉल किए गए ऐप्लिकेशन जांचें."</string> <string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"बिना नाम वाले ब्लूटूथ डिवाइस (सिर्फ़ MAC पते वाले) दिखाए जाएंगे"</string> <string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"दूर के डिवाइस पर आवाज़ बहुत बढ़ जाने या उससे कंट्रोल हटने जैसी समस्याएं होने पर, यह ब्लूटूथ के ज़रिए आवाज़ के कंट्रोल की सुविधा रोक देता है."</string> <string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"ब्लूटूथ सेटिंग में Gabeldorsche सुविधा को चालू करता है."</string> @@ -358,14 +358,14 @@ <string name="debug_hw_drawing_category" msgid="5830815169336975162">"हार्डवेयर ऐक्सेलरेटेड रेंडरिंग"</string> <string name="media_category" msgid="8122076702526144053">"मीडिया"</string> <string name="debug_monitoring_category" msgid="1597387133765424994">"निगरानी"</string> - <string name="strict_mode" msgid="889864762140862437">"सख्त मोड चालू किया गया"</string> + <string name="strict_mode" msgid="889864762140862437">"स्ट्रिक्ट मोड चालू किया गया"</string> <string name="strict_mode_summary" msgid="1838248687233554654">"थ्रेड पर लंबा प्रोसेस होने पर स्क्रीन फ़्लैश करें"</string> <string name="pointer_location" msgid="7516929526199520173">"पॉइंटर की जगह"</string> <string name="pointer_location_summary" msgid="957120116989798464">"मौजूदा टच डेटा दिखाने वाला स्क्रीन ओवरले"</string> <string name="show_touches" msgid="8437666942161289025">"टैप दिखाएं"</string> <string name="show_touches_summary" msgid="3692861665994502193">"टैप के लिए विज़ुअल फ़ीडबैक दिखाएं"</string> <string name="show_screen_updates" msgid="2078782895825535494">"सर्फ़ेस अपडेट दिखाएं"</string> - <string name="show_screen_updates_summary" msgid="2126932969682087406">"अपडेट होने पर पूरे विंडो सर्फ़ेस को फ़्लैश करें"</string> + <string name="show_screen_updates_summary" msgid="2126932969682087406">"अपडेट होने पर पूरे विंडो सर्फ़ेस फ़्लैश करें"</string> <string name="show_hw_screen_updates" msgid="2021286231267747506">"जीपीयू व्यू के अपडेट दिखाएं"</string> <string name="show_hw_screen_updates_summary" msgid="3539770072741435691">"GPU से बनाए गए व्यू, विंडो में फ़्लैश करता है"</string> <string name="show_hw_layers_updates" msgid="5268370750002509767">"हार्डवेयर लेयर अपडेट दिखाएं"</string> @@ -376,7 +376,7 @@ <string name="simulate_color_space" msgid="1206503300335835151">"रंग स्पेस सिम्युलेट करें"</string> <string name="enable_opengl_traces_title" msgid="4638773318659125196">"OpenGL ट्रेस चालू करें"</string> <string name="usb_audio_disable_routing" msgid="3367656923544254975">"यूएसबी ऑडियो रूटिंग बंद करें"</string> - <string name="usb_audio_disable_routing_summary" msgid="8768242894849534699">"यूएसबी ऑडियो पेरिफ़ेरल पर अपने-आप रूटिंग बंद करें"</string> + <string name="usb_audio_disable_routing_summary" msgid="8768242894849534699">"यूएसबी ऑडियो पेरिफ़ेरल पर अपने-आप रूटिंग होना बंद करें"</string> <string name="debug_layout" msgid="1659216803043339741">"लेआउट सीमाएं दिखाएं"</string> <string name="debug_layout_summary" msgid="8825829038287321978">"क्लिप सीमाएं, मार्जिन वगैरह दिखाएं."</string> <string name="force_rtl_layout_all_locales" msgid="8690762598501599796">"लेआउट की दिशा दाएं से बाएं करें"</string> @@ -389,7 +389,7 @@ <string name="enable_gpu_debug_layers" msgid="4986675516188740397">"जीपीयू डीबग लेयर चालू करें"</string> <string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"डीबग ऐप के लिए जीपीयू डीबग लेयर लोड करने दें"</string> <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"वर्बोस वेंडर लॉगिंग चालू करें"</string> - <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"गड़बड़ियों की रिपोर्ट में खास डिवाइस से जुड़े वेंडर लॉग शामिल करें. इन लॉग में निजी जानकारी, बैटरी का ज़्यादा इस्तेमाल, और/या डिवाइस की मेमोरी ज़्यादा इस्तेमाल करने की जानकारी हो सकती है."</string> + <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"गड़बड़ियों की रिपोर्ट में खास डिवाइस से जुड़े वेंडर लॉग शामिल करें. इन लॉग में निजी जानकारी, बैटरी का ज़्यादा इस्तेमाल, और/या डिवाइस का स्टोरेज ज़्यादा इस्तेमाल करने की जानकारी हो सकती है."</string> <string name="window_animation_scale_title" msgid="5236381298376812508">"विंडो एनिमेशन स्केल"</string> <string name="transition_animation_scale_title" msgid="1278477690695439337">"ट्रांज़िशन एनिमेशन स्केल"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"एनिमेटर अवधि स्केल"</string> @@ -401,11 +401,11 @@ <string name="show_all_anrs" msgid="9160563836616468726">"बैकग्राउंड के ANRs दिखाएं"</string> <string name="show_all_anrs_summary" msgid="8562788834431971392">"बैकग्राउंड में चलने वाले ऐप्लिकेशन के लिए, \'यह ऐप्लिकेशन नहीं चल रहा\' मैसेज दिखाएं"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"सूचना चैनल चेतावनी दिखाएं"</string> - <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"ऐप्लिकेशन, मान्य चैनल के बिना सूचना पोस्ट करे तो स्क्रीन पर चेतावनी दिखाएं"</string> - <string name="force_allow_on_external" msgid="9187902444231637880">"ऐप्लिकेशन को बाहरी मेमोरी पर ही चलाएं"</string> - <string name="force_allow_on_external_summary" msgid="8525425782530728238">"इससे कोई भी ऐप्लिकेशन बाहरी मेमोरी में रखने लायक बन जाता है चाहे उसकी मेनिफ़ेस्ट वैल्यू कुछ भी हो"</string> - <string name="force_resizable_activities" msgid="7143612144399959606">"विंडो के हिसाब से गतिविधियों का आकार बदल दें"</string> - <string name="force_resizable_activities_summary" msgid="2490382056981583062">"सभी गतिविधियों को मल्टी-विंडो (एक से ज़्यादा ऐप्लिकेशन, एक साथ) के लिए आकार बदलने लायक बनाएं, चाहे उनकी मेनिफ़ेस्ट वैल्यू कुछ भी हो."</string> + <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"कोई ऐप, मान्य चैनल के बिना सूचना पोस्ट करे, तो स्क्रीन पर चेतावनी दिखाएं"</string> + <string name="force_allow_on_external" msgid="9187902444231637880">"ऐप्लिकेशन को बाहरी स्टोरेज पर ही चलाएं"</string> + <string name="force_allow_on_external_summary" msgid="8525425782530728238">"इससे कोई भी ऐप्लिकेशन बाहरी स्टोरेज में रखने लायक बन जाता है, चाहे उसकी मेनिफ़ेस्ट वैल्यू कुछ भी हो"</string> + <string name="force_resizable_activities" msgid="7143612144399959606">"विंडो के हिसाब से गतिविधियों का साइज़ बदल दें"</string> + <string name="force_resizable_activities_summary" msgid="2490382056981583062">"सभी गतिविधियों को मल्टी-विंडो (एक से ज़्यादा ऐप्लिकेशन, एक साथ) के लिए साइज़ बदलने लायक बनाएं, चाहे उनकी मेनिफ़ेस्ट वैल्यू कुछ भी हो."</string> <string name="enable_freeform_support" msgid="7599125687603914253">"फ़्रीफ़ॉर्म विंडो (एक साथ कई विंडो दिखाना) चालू करें"</string> <string name="enable_freeform_support_summary" msgid="1822862728719276331">"जांच के लिए बनी फ़्रीफ़ॉर्म विंडो के लिए सहायता चालू करें."</string> <string name="local_backup_password_title" msgid="4631017948933578709">"डेस्कटॉप बैक अप पासवर्ड"</string> diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml index 369406fd94d6..fdf14b3fab88 100644 --- a/packages/SettingsLib/res/values-hr/strings.xml +++ b/packages/SettingsLib/res/values-hr/strings.xml @@ -389,7 +389,7 @@ <string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Omogući slojeve za otklanjanje pogrešaka GPU-a"</string> <string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Omogućite učitavanje slojeva za otklanjanje pogrešaka GPU-a za aplikacije za otklanjanje pogrešaka"</string> <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Omogući opširni zapisnik"</string> - <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Uključite dodatne zapisnike dobavljača pojedinog uređaja u izvješća o programskoj pogrešci koja mogu sadržavati privatne podatke, trošiti više baterije i/ili zauzeti više prostora za pohranu."</string> + <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Uključite dodatne zapisnike dobavljača pojedinog uređaja u izvješća o programskim pogreškama koja mogu sadržavati privatne podatke, trošiti više baterije i/ili zauzeti više prostora za pohranu."</string> <string name="window_animation_scale_title" msgid="5236381298376812508">"Brzina animacije prozora"</string> <string name="transition_animation_scale_title" msgid="1278477690695439337">"Brzina animacije prijelaza"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Razmjer duljine animatora"</string> @@ -655,12 +655,8 @@ <string name="bt_le_audio_scan_qr_code" msgid="3521809854780392679">"Skeniraj QR kôd"</string> <string name="bt_le_audio_scan_qr_code_scanner" msgid="4679500020630341107">"Da biste počeli slušati, centrirajte QR kôd u nastavku"</string> <string name="bt_le_audio_qr_code_is_not_valid_format" msgid="6092191081849434734">"QR kôd nije u važećem formatu"</string> - <!-- no translation found for bt_le_audio_broadcast_dialog_title (5392738488989777074) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_sub_title (268234802198852753) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_switch_app (5749813313369517812) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_different_output (2638402023060391333) --> - <skip /> + <string name="bt_le_audio_broadcast_dialog_title" msgid="5392738488989777074">"Zaustaviti emitiranje aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> + <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="268234802198852753">"Ako emitirate aplikaciju <xliff:g id="SWITCHAPP">%1$s</xliff:g> ili promijenite izlaz, vaše će se trenutačno emitiranje zaustaviti"</string> + <string name="bt_le_audio_broadcast_dialog_switch_app" msgid="5749813313369517812">"Emitiranje aplikacije <xliff:g id="SWITCHAPP">%1$s</xliff:g>"</string> + <string name="bt_le_audio_broadcast_dialog_different_output" msgid="2638402023060391333">"Promjena izlaza"</string> </resources> diff --git a/packages/SettingsLib/res/values-in/arrays.xml b/packages/SettingsLib/res/values-in/arrays.xml index 314b1bb21158..6349e53465ee 100644 --- a/packages/SettingsLib/res/values-in/arrays.xml +++ b/packages/SettingsLib/res/values-in/arrays.xml @@ -55,7 +55,7 @@ </string-array> <string-array name="hdcp_checking_summaries"> <item msgid="4045840870658484038">"Jangan gunakan pemeriksaan HDCP"</item> - <item msgid="8254225038262324761">"Gunakan pemeriksaan HDCP untuk konten DRM saja"</item> + <item msgid="8254225038262324761">"Menggunakan pemeriksaan HDCP untuk konten DRM saja"</item> <item msgid="6421717003037072581">"Selalu gunakan pemeriksaan HDCP"</item> </string-array> <string-array name="bt_hci_snoop_log_entries"> diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml index 3bad8e8acfbd..bf952849ab4f 100644 --- a/packages/SettingsLib/res/values-in/strings.xml +++ b/packages/SettingsLib/res/values-in/strings.xml @@ -264,7 +264,7 @@ <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Harap sambungkan ke jaringan Wi-Fi"</string> <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, debug, dev"</string> <string name="bugreport_in_power" msgid="8664089072534638709">"Pintasan laporan bug"</string> - <string name="bugreport_in_power_summary" msgid="1885529649381831775">"Tampilkan tombol di menu daya untuk mengambil laporan bug"</string> + <string name="bugreport_in_power_summary" msgid="1885529649381831775">"Menampilkan tombol di menu daya untuk mengambil laporan bug"</string> <string name="keep_screen_on" msgid="1187161672348797558">"Tetap terjaga"</string> <string name="keep_screen_on_summary" msgid="1510731514101925829">"Layar tidak akan redup selama mengisi daya"</string> <string name="bt_hci_snoop_log" msgid="7291287955649081448">"Aktifkan log pengintaian HCI Bluetooth"</string> @@ -309,8 +309,8 @@ <string name="private_dns_mode_provider" msgid="3619040641762557028">"Hostname penyedia DNS pribadi"</string> <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"Masukkan hostname penyedia DNS"</string> <string name="private_dns_mode_provider_failure" msgid="8356259467861515108">"Tidak dapat terhubung"</string> - <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Tampilkan opsi untuk sertifikasi layar nirkabel"</string> - <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Tingkatkan level pencatatan log Wi-Fi, tampilkan per SSID RSSI di Pemilih Wi‑Fi"</string> + <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Menampilkan opsi untuk sertifikasi tampilan nirkabel"</string> + <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Meningkatkan level pencatatan log Wi-Fi, menampilkan per SSID RSSI di Pemilih Wi‑Fi"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Memperlambat kehabisan baterai & meningkatkan performa jaringan"</string> <string name="wifi_non_persistent_mac_randomization_summary" msgid="2159794543105053930">"Jika mode ini diaktifkan, alamat MAC perangkat ini dapat berubah setiap kali terhubung ke jaringan yang mengaktifkan pengacakan MAC."</string> <string name="wifi_metered_label" msgid="8737187690304098638">"Berbayar"</string> @@ -326,8 +326,8 @@ <string name="allow_mock_location" msgid="2102650981552527884">"Mengizinkan lokasi palsu"</string> <string name="allow_mock_location_summary" msgid="179780881081354579">"Mengizinkan lokasi palsu"</string> <string name="debug_view_attributes" msgid="3539609843984208216">"Aktifkan inspeksi atribut tampilan"</string> - <string name="mobile_data_always_on_summary" msgid="1112156365594371019">"Selalu aktifkan kuota, meski Wi-Fi aktif (agar jaringan beralih dengan cepat)."</string> - <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"Gunakan akselerasi hardware tethering jika tersedia"</string> + <string name="mobile_data_always_on_summary" msgid="1112156365594371019">"Selalu mengaktifkan data seluler, meskipun Wi-Fi aktif (agar jaringan beralih dengan cepat)."</string> + <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"Menggunakan akselerasi hardware tethering jika tersedia"</string> <string name="adb_warning_title" msgid="7708653449506485728">"Izinkan melakukan debug USB?"</string> <string name="adb_warning_message" msgid="8145270656419669221">"Debugging USB dimaksudkan untuk tujuan pengembangan saja. Gunakan untuk menyalin data antara komputer dan perangkat Anda, memasang apl pada perangkat tanpa notifikasi, dan membaca data log."</string> <string name="adbwifi_warning_title" msgid="727104571653031865">"Izinkan proses debug nirkabel?"</string> @@ -336,7 +336,7 @@ <string name="dev_settings_warning_title" msgid="8251234890169074553">"Izinkan setelan pengembangan?"</string> <string name="dev_settings_warning_message" msgid="37741686486073668">"Setelan ini hanya dimaksudkan untuk penggunaan pengembangan. Setelan dapat menyebabkan perangkat dan aplikasi yang menerapkannya rusak atau tidak berfungsi semestinya."</string> <string name="verify_apps_over_usb_title" msgid="6031809675604442636">"Verifikasi aplikasi melalui USB"</string> - <string name="verify_apps_over_usb_summary" msgid="1317933737581167839">"Periksa perilaku membahayakan dalam aplikasi yang terpasang melalui ADB/ADT."</string> + <string name="verify_apps_over_usb_summary" msgid="1317933737581167839">"Memeriksa perilaku berbahaya dalam aplikasi yang diinstal melalui ADB/ADT."</string> <string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Perangkat Bluetooth tanpa nama (hanya alamat MAC) akan ditampilkan"</string> <string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Menonaktifkan fitur volume absolut Bluetooth jika ada masalah volume dengan perangkat jarak jauh, misalnya volume terlalu keras atau kurangnya kontrol."</string> <string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Mengaktifkan stack fitur Gabeldorsche Bluetooth."</string> @@ -359,13 +359,13 @@ <string name="media_category" msgid="8122076702526144053">"Media"</string> <string name="debug_monitoring_category" msgid="1597387133765424994">"Memantau"</string> <string name="strict_mode" msgid="889864762140862437">"Mode ketat diaktifkan"</string> - <string name="strict_mode_summary" msgid="1838248687233554654">"Kedipkan layar saat apl beroperasi lama pada utas utama"</string> + <string name="strict_mode_summary" msgid="1838248687233554654">"Mengedipkan layar saat apl berjalan lama di utas utama"</string> <string name="pointer_location" msgid="7516929526199520173">"Lokasi penunjuk"</string> - <string name="pointer_location_summary" msgid="957120116989798464">"Hamparan layar menampilkan data sentuhan saat ini"</string> + <string name="pointer_location_summary" msgid="957120116989798464">"Overlay layar menampilkan data sentuhan saat ini"</string> <string name="show_touches" msgid="8437666942161289025">"Tampilkan ketukan"</string> - <string name="show_touches_summary" msgid="3692861665994502193">"Tampilkan efek visual untuk ketukan"</string> + <string name="show_touches_summary" msgid="3692861665994502193">"Menampilkan efek visual untuk ketukan"</string> <string name="show_screen_updates" msgid="2078782895825535494">"Lihat pembaruan permukaan"</string> - <string name="show_screen_updates_summary" msgid="2126932969682087406">"Sorot seluruh permukaan jendela saat diperbarui"</string> + <string name="show_screen_updates_summary" msgid="2126932969682087406">"Mengedipkan seluruh permukaan jendela saat diperbarui"</string> <string name="show_hw_screen_updates" msgid="2021286231267747506">"Tampilkan update tampilan"</string> <string name="show_hw_screen_updates_summary" msgid="3539770072741435691">"Tampilan cepat dalam jendela saat digambar"</string> <string name="show_hw_layers_updates" msgid="5268370750002509767">"Tunjukkan update lapisan hardware"</string> @@ -375,39 +375,39 @@ <string name="disable_overlays_summary" msgid="1954852414363338166">"Selalu gunakan GPU untuk pengomposisian layar"</string> <string name="simulate_color_space" msgid="1206503300335835151">"Simulasikan ruang warna"</string> <string name="enable_opengl_traces_title" msgid="4638773318659125196">"Aktifkan jejak OpenGL"</string> - <string name="usb_audio_disable_routing" msgid="3367656923544254975">"Pemilihan rute audio USB nonaktif"</string> - <string name="usb_audio_disable_routing_summary" msgid="8768242894849534699">"Pemilihan rute otomatis ke periferal audio USB nonaktif"</string> + <string name="usb_audio_disable_routing" msgid="3367656923544254975">"Nonaktifkan pemilihan rute audio USB"</string> + <string name="usb_audio_disable_routing_summary" msgid="8768242894849534699">"Menonaktifkan pemilihan rute otomatis ke periferal audio USB"</string> <string name="debug_layout" msgid="1659216803043339741">"Tampilkan batas tata letak"</string> - <string name="debug_layout_summary" msgid="8825829038287321978">"Tampilkan batas klip, margin, dll."</string> + <string name="debug_layout_summary" msgid="8825829038287321978">"Menampilkan batas klip, margin, dll."</string> <string name="force_rtl_layout_all_locales" msgid="8690762598501599796">"Paksa arah tata letak RTL"</string> - <string name="force_rtl_layout_all_locales_summary" msgid="6663016859517239880">"Paksa arah tata letak layar RTL untuk semua lokal"</string> + <string name="force_rtl_layout_all_locales_summary" msgid="6663016859517239880">"Memaksa arah tata letak layar RTL untuk semua lokalitas"</string> <string name="window_blurs" msgid="6831008984828425106">"Izinkan buram level jendela"</string> <string name="force_msaa" msgid="4081288296137775550">"Paksa 4x MSAA"</string> - <string name="force_msaa_summary" msgid="9070437493586769500">"Aktifkan 4x MSAA dalam aplikasi OpenGL ES 2.0"</string> + <string name="force_msaa_summary" msgid="9070437493586769500">"Mengaktifkan 4x MSAA dalam aplikasi OpenGL ES 2.0"</string> <string name="show_non_rect_clip" msgid="7499758654867881817">"Debug operasi klip non-kotak"</string> <string name="track_frame_time" msgid="522674651937771106">"Rendering HWUI profil"</string> <string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Aktifkan lapisan debug GPU"</string> - <string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Izinkan memuat lapisan debug GPU untuk aplikasi debug"</string> + <string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Mengizinkan lapisan debug GPU dimuat di apl debug"</string> <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Aktifkan logging vendor panjang"</string> - <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Sertakan log vendor khusus perangkat tambahan dalam laporan bug, yang mungkin berisi informasi pribadi, menggunakan lebih banyak baterai, dan/atau menggunakan lebih banyak ruang penyimpanan."</string> + <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Menyertakan log vendor khusus perangkat tambahan dalam laporan bug, yang mungkin berisi informasi pribadi, menggunakan lebih banyak baterai, dan/atau menggunakan lebih banyak ruang penyimpanan."</string> <string name="window_animation_scale_title" msgid="5236381298376812508">"Skala animasi jendela"</string> <string name="transition_animation_scale_title" msgid="1278477690695439337">"Skala animasi transisi"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Skala durasi animator"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Simulasikan tampilan sekunder"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Aplikasi"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Jangan simpan aktivitas"</string> - <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Hancurkan tiap aktivitas setelah ditinggal pengguna"</string> + <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Menghancurkan aktivitas setelah apl ditutup"</string> <string name="app_process_limit_title" msgid="8361367869453043007">"Batas proses latar blkng"</string> <string name="show_all_anrs" msgid="9160563836616468726">"Tampilkan ANR latar blkng"</string> - <string name="show_all_anrs_summary" msgid="8562788834431971392">"Tampilkan dialog Aplikasi Tidak Merespons untuk aplikasi yang ada di latar belakang"</string> + <string name="show_all_anrs_summary" msgid="8562788834431971392">"Menampilkan dialog Aplikasi Tidak Merespons untuk aplikasi yang ada di latar belakang"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Tampilkan peringatan saluran notifikasi"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Menampilkan peringatan di layar saat aplikasi memposting notifikasi tanpa channel yang valid"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Paksa izinkan aplikasi di eksternal"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Membuat semua aplikasi dapat ditulis ke penyimpanan eksternal, terlepas dari nilai manifes"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Paksa aktivitas agar ukurannya dapat diubah"</string> - <string name="force_resizable_activities_summary" msgid="2490382056981583062">"Buat semua aktivitas dapat diubah ukurannya untuk banyak jendela, terlepas dari nilai manifes."</string> + <string name="force_resizable_activities_summary" msgid="2490382056981583062">"Membuat semua aktivitas dapat diubah ukurannya untuk banyak jendela, terlepas dari nilai manifes."</string> <string name="enable_freeform_support" msgid="7599125687603914253">"Aktifkan jendela berformat bebas"</string> - <string name="enable_freeform_support_summary" msgid="1822862728719276331">"Aktifkan dukungan untuk jendela eksperimental berformat bebas."</string> + <string name="enable_freeform_support_summary" msgid="1822862728719276331">"Mengaktifkan dukungan untuk jendela eksperimental berformat bebas."</string> <string name="local_backup_password_title" msgid="4631017948933578709">"Sandi cadangan desktop"</string> <string name="local_backup_password_summary_none" msgid="7646898032616361714">"Saat ini cadangan desktop penuh tidak dilindungi"</string> <string name="local_backup_password_summary_change" msgid="1707357670383995567">"Ketuk guna mengubah atau menghapus sandi untuk cadangan lengkap desktop"</string> @@ -448,7 +448,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomali (merah-hijau)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomali (biru-kuning)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Koreksi warna"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="1522101114585266455">"Koreksi warna dapat berguna jika Anda ingin:<br/> <ol> <li>&nbsp;Melihat warna dengan lebih akurat</li> <li>&nbsp;Menghapus warna untuk membantu Anda fokus</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="1522101114585266455">"Koreksi warna dapat berguna jika Anda ingin:<br/> <ol> <li> Melihat warna dengan lebih akurat</li> <li> Menghapus warna agar Anda lebih fokus</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Digantikan oleh <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Sekitar <xliff:g id="TIME_REMAINING">%1$s</xliff:g> lagi"</string> @@ -653,14 +653,10 @@ <string name="allow_turn_screen_on" msgid="6194845766392742639">"Izinkan pengaktifan layar"</string> <string name="allow_turn_screen_on_description" msgid="43834403291575164">"Mengizinkan aplikasi mengaktifkan layar. Jika diizinkan, aplikasi dapat mengaktifkan layar kapan saja tanpa izin Anda."</string> <string name="bt_le_audio_scan_qr_code" msgid="3521809854780392679">"Pindai kode QR"</string> - <string name="bt_le_audio_scan_qr_code_scanner" msgid="4679500020630341107">"Untuk mulai mendengarkan, fokuskan kode QR berikut"</string> + <string name="bt_le_audio_scan_qr_code_scanner" msgid="4679500020630341107">"Untuk mulai mendengarkan, pusatkan kode QR"</string> <string name="bt_le_audio_qr_code_is_not_valid_format" msgid="6092191081849434734">"Format kode QR tidak valid"</string> - <!-- no translation found for bt_le_audio_broadcast_dialog_title (5392738488989777074) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_sub_title (268234802198852753) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_switch_app (5749813313369517812) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_different_output (2638402023060391333) --> - <skip /> + <string name="bt_le_audio_broadcast_dialog_title" msgid="5392738488989777074">"Hentikan siaran <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> + <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="268234802198852753">"Jika Anda menyiarkan <xliff:g id="SWITCHAPP">%1$s</xliff:g> atau mengubah output, siaran saat ini akan dihentikan"</string> + <string name="bt_le_audio_broadcast_dialog_switch_app" msgid="5749813313369517812">"Siarkan <xliff:g id="SWITCHAPP">%1$s</xliff:g>"</string> + <string name="bt_le_audio_broadcast_dialog_different_output" msgid="2638402023060391333">"Ubah output"</string> </resources> diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml index c80e290870bb..f9082911169f 100644 --- a/packages/SettingsLib/res/values-it/strings.xml +++ b/packages/SettingsLib/res/values-it/strings.xml @@ -312,7 +312,7 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Mostra opzioni per la certificazione display wireless"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Aumenta livello di logging Wi-Fi, mostra SSID RSSI nel selettore Wi-Fi"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Riduce il consumo della batteria e migliora le prestazioni della rete"</string> - <string name="wifi_non_persistent_mac_randomization_summary" msgid="2159794543105053930">"Quando questa modalità è attiva, l\'indirizzo MAC del dispositivo potrebbe cambiare ogni volta che il dispositivo si connette a una rete con randomizzazione degli indirizzi MAC attiva."</string> + <string name="wifi_non_persistent_mac_randomization_summary" msgid="2159794543105053930">"Quando questa modalità è attiva, l\'indirizzo MAC del dispositivo potrebbe cambiare ogni volta che il dispositivo si connette a una rete con randomizzazione degli indirizzi MAC attiva"</string> <string name="wifi_metered_label" msgid="8737187690304098638">"A consumo"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Non a consumo"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Dimensioni buffer logger"</string> @@ -359,17 +359,17 @@ <string name="media_category" msgid="8122076702526144053">"Contenuti multimediali"</string> <string name="debug_monitoring_category" msgid="1597387133765424994">"Monitoraggio"</string> <string name="strict_mode" msgid="889864762140862437">"Attiva StrictMode"</string> - <string name="strict_mode_summary" msgid="1838248687233554654">"Schermo lampeggia per operazioni lunghe su thread principale"</string> + <string name="strict_mode_summary" msgid="1838248687233554654">"Fai lampeggiare lo schermo per operazioni lunghe sul thread principale"</string> <string name="pointer_location" msgid="7516929526199520173">"Posizione puntatore"</string> <string name="pointer_location_summary" msgid="957120116989798464">"Overlay schermo che mostra i dati touch correnti"</string> <string name="show_touches" msgid="8437666942161289025">"Mostra tocchi"</string> <string name="show_touches_summary" msgid="3692861665994502193">"Mostra feedback visivi per i tocchi"</string> <string name="show_screen_updates" msgid="2078782895825535494">"Aggiornamenti superficie"</string> - <string name="show_screen_updates_summary" msgid="2126932969682087406">"Superfici delle finestre lampeggiano se aggiornate"</string> + <string name="show_screen_updates_summary" msgid="2126932969682087406">"Fai lampeggiare le superfici delle finestre quando si aggiornano"</string> <string name="show_hw_screen_updates" msgid="2021286231267747506">"Aggiornam. visualizzazione"</string> - <string name="show_hw_screen_updates_summary" msgid="3539770072741435691">"Visualizz. lampeggiano dentro finestre se disegnate"</string> + <string name="show_hw_screen_updates_summary" msgid="3539770072741435691">"Fai lampeggiare gli elementi nelle finestre se disegnati"</string> <string name="show_hw_layers_updates" msgid="5268370750002509767">"Aggiornam. livelli hardware"</string> - <string name="show_hw_layers_updates_summary" msgid="5850955890493054618">"Livelli hardware lampeggiano in verde se aggiornati"</string> + <string name="show_hw_layers_updates_summary" msgid="5850955890493054618">"Fai lampeggiare in verde i livelli hardware se aggiornati"</string> <string name="debug_hw_overdraw" msgid="8944851091008756796">"Debug overdraw GPU"</string> <string name="disable_overlays" msgid="4206590799671557143">"Disabilita overlay HW"</string> <string name="disable_overlays_summary" msgid="1954852414363338166">"Usa sempre GPU per la composizione dello schermo"</string> @@ -405,9 +405,9 @@ <string name="force_allow_on_external" msgid="9187902444231637880">"Forza autorizzazione app su memoria esterna"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Consente l\'installazione di qualsiasi app su memoria esterna, indipendentemente dai valori manifest"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Imponi formato modificabile alle attività"</string> - <string name="force_resizable_activities_summary" msgid="2490382056981583062">"Rendi il formato di tutte le attività modificabile per la modalità multi-finestra, indipendentemente dai valori manifest."</string> + <string name="force_resizable_activities_summary" msgid="2490382056981583062">"Rendi il formato di tutte le attività modificabile per la modalità multi-finestra, indipendentemente dai valori manifest"</string> <string name="enable_freeform_support" msgid="7599125687603914253">"Attiva finestre a forma libera"</string> - <string name="enable_freeform_support_summary" msgid="1822862728719276331">"Attiva il supporto delle finestre a forma libera sperimentali."</string> + <string name="enable_freeform_support_summary" msgid="1822862728719276331">"Attiva il supporto delle finestre a forma libera sperimentali"</string> <string name="local_backup_password_title" msgid="4631017948933578709">"Password di backup desktop"</string> <string name="local_backup_password_summary_none" msgid="7646898032616361714">"I backup desktop completi non sono attualmente protetti"</string> <string name="local_backup_password_summary_change" msgid="1707357670383995567">"Tocca per modificare o rimuovere la password per i backup desktop completi"</string> diff --git a/packages/SettingsLib/res/values-ja/arrays.xml b/packages/SettingsLib/res/values-ja/arrays.xml index 110e72b91b85..ad84d9ed6fba 100644 --- a/packages/SettingsLib/res/values-ja/arrays.xml +++ b/packages/SettingsLib/res/values-ja/arrays.xml @@ -191,30 +191,30 @@ </string-array> <string-array name="window_animation_scale_entries"> <item msgid="2675263395797191850">"アニメーションオフ"</item> - <item msgid="5790132543372767872">"アニメーションスケール.5x"</item> - <item msgid="2529692189302148746">"アニメーションスケール1x"</item> - <item msgid="8072785072237082286">"アニメーションスケール1.5x"</item> - <item msgid="3531560925718232560">"アニメーションスケール2x"</item> - <item msgid="4542853094898215187">"アニメーションスケール5x"</item> - <item msgid="5643881346223901195">"アニメーションスケール10x"</item> + <item msgid="5790132543372767872">"アニメーション スケール .5x"</item> + <item msgid="2529692189302148746">"アニメーション スケール 1x"</item> + <item msgid="8072785072237082286">"アニメーション スケール 1.5x"</item> + <item msgid="3531560925718232560">"アニメーション スケール 2x"</item> + <item msgid="4542853094898215187">"アニメーション スケール 5x"</item> + <item msgid="5643881346223901195">"アニメーション スケール 10x"</item> </string-array> <string-array name="transition_animation_scale_entries"> <item msgid="3376676813923486384">"アニメーションオフ"</item> - <item msgid="753422683600269114">"アニメーションスケール.5x"</item> - <item msgid="3695427132155563489">"アニメーションスケール1x"</item> - <item msgid="9032615844198098981">"アニメーションスケール1.5x"</item> - <item msgid="8473868962499332073">"アニメーションスケール2x"</item> - <item msgid="4403482320438668316">"アニメーションスケール5x"</item> - <item msgid="169579387974966641">"アニメーションスケール10x"</item> + <item msgid="753422683600269114">"アニメーション スケール .5x"</item> + <item msgid="3695427132155563489">"アニメーション スケール 1x"</item> + <item msgid="9032615844198098981">"アニメーション スケール 1.5x"</item> + <item msgid="8473868962499332073">"アニメーション スケール 2x"</item> + <item msgid="4403482320438668316">"アニメーション スケール 5x"</item> + <item msgid="169579387974966641">"アニメーション スケール 10x"</item> </string-array> <string-array name="animator_duration_scale_entries"> <item msgid="6416998593844817378">"アニメーションオフ"</item> - <item msgid="875345630014338616">"アニメーションスケール.5x"</item> - <item msgid="2753729231187104962">"アニメーションスケール1x"</item> - <item msgid="1368370459723665338">"アニメーションスケール1.5x"</item> - <item msgid="5768005350534383389">"アニメーションスケール2x"</item> - <item msgid="3728265127284005444">"アニメーションスケール5x"</item> - <item msgid="2464080977843960236">"アニメーションスケール10x"</item> + <item msgid="875345630014338616">"アニメーション スケール .5x"</item> + <item msgid="2753729231187104962">"アニメーション スケール 1x"</item> + <item msgid="1368370459723665338">"アニメーション スケール 1.5x"</item> + <item msgid="5768005350534383389">"アニメーション スケール 2x"</item> + <item msgid="3728265127284005444">"アニメーション スケール 5x"</item> + <item msgid="2464080977843960236">"アニメーション スケール 10x"</item> </string-array> <string-array name="overlay_display_devices_entries"> <item msgid="4497393944195787240">"なし"</item> diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml index 770f94446d4f..4e769e6dc80c 100644 --- a/packages/SettingsLib/res/values-ja/strings.xml +++ b/packages/SettingsLib/res/values-ja/strings.xml @@ -236,7 +236,7 @@ <string name="enable_adb_summary" msgid="3711526030096574316">"USB 接続時はデバッグモードにする"</string> <string name="clear_adb_keys" msgid="3010148733140369917">"USB デバッグの許可の取り消し"</string> <string name="enable_adb_wireless" msgid="6973226350963971018">"ワイヤレス デバッグ"</string> - <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"Wi-Fi 接続時にデバッグモード"</string> + <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"Wi-Fi 接続時はデバッグモードにする"</string> <string name="adb_wireless_error" msgid="721958772149779856">"エラー"</string> <string name="adb_wireless_settings" msgid="2295017847215680229">"ワイヤレス デバッグ"</string> <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"利用可能なデバイスを確認して使用するには、ワイヤレス デバッグを ON にしてください"</string> @@ -264,7 +264,7 @@ <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Wi-Fi ネットワークに接続してください"</string> <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, デバッグ, dev"</string> <string name="bugreport_in_power" msgid="8664089072534638709">"バグレポートのショートカット"</string> - <string name="bugreport_in_power_summary" msgid="1885529649381831775">"電源ボタン メニューにバグレポートを取得するボタンを表示する"</string> + <string name="bugreport_in_power_summary" msgid="1885529649381831775">"電源ボタンメニューにバグレポートを取得するボタンを表示する"</string> <string name="keep_screen_on" msgid="1187161672348797558">"スリープモードにしない"</string> <string name="keep_screen_on_summary" msgid="1510731514101925829">"充電中に画面をスリープにしない"</string> <string name="bt_hci_snoop_log" msgid="7291287955649081448">"Bluetooth HCI スヌープログ"</string> @@ -336,7 +336,7 @@ <string name="dev_settings_warning_title" msgid="8251234890169074553">"開発用の設定を許可しますか?"</string> <string name="dev_settings_warning_message" msgid="37741686486073668">"これらの設定は開発専用に設計されています。そのためデバイスやデバイス上のアプリが故障したり正常に動作しなくなったりするおそれがあります。"</string> <string name="verify_apps_over_usb_title" msgid="6031809675604442636">"USB 経由のアプリも検証"</string> - <string name="verify_apps_over_usb_summary" msgid="1317933737581167839">"ADB/ADT経由でインストールされたアプリに不正な動作がないかを確認する"</string> + <string name="verify_apps_over_usb_summary" msgid="1317933737581167839">"ADB/ADT 経由でインストールされたアプリに不正な動作がないかを確認する"</string> <string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Bluetooth デバイスを名前なしで(MAC アドレスのみで)表示します"</string> <string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"リモートデバイスで音量に関する問題(音量が大きすぎる、制御できないなど)が発生した場合に、Bluetooth の絶対音量の機能を無効にする"</string> <string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Bluetooth Gabeldorsche 機能スタックを有効にします。"</string> @@ -364,23 +364,23 @@ <string name="pointer_location_summary" msgid="957120116989798464">"現在のタップデータをオーバーレイ表示する"</string> <string name="show_touches" msgid="8437666942161289025">"タップを表示"</string> <string name="show_touches_summary" msgid="3692861665994502193">"タップを視覚表示する"</string> - <string name="show_screen_updates" msgid="2078782895825535494">"表示面の更新を表示"</string> + <string name="show_screen_updates" msgid="2078782895825535494">"表示面の更新を通知"</string> <string name="show_screen_updates_summary" msgid="2126932969682087406">"更新時にウィンドウの表示面全体を点滅させる"</string> <string name="show_hw_screen_updates" msgid="2021286231267747506">"画面の更新を表示"</string> <string name="show_hw_screen_updates_summary" msgid="3539770072741435691">"描画時にウィンドウ内の表示を点滅させる"</string> <string name="show_hw_layers_updates" msgid="5268370750002509767">"ハードウェア層の更新を表示"</string> <string name="show_hw_layers_updates_summary" msgid="5850955890493054618">"更新されたハードウェア層を緑で点滅させる"</string> - <string name="debug_hw_overdraw" msgid="8944851091008756796">"GPUオーバードローをデバッグ"</string> + <string name="debug_hw_overdraw" msgid="8944851091008756796">"GPU オーバードローをデバッグ"</string> <string name="disable_overlays" msgid="4206590799671557143">"HW オーバーレイを無効化"</string> <string name="disable_overlays_summary" msgid="1954852414363338166">"画面合成に常に GPU を使用する"</string> <string name="simulate_color_space" msgid="1206503300335835151">"色空間シミュレート"</string> <string name="enable_opengl_traces_title" msgid="4638773318659125196">"OpenGLトレースを有効化"</string> - <string name="usb_audio_disable_routing" msgid="3367656923544254975">"USBオーディオルーティングを無効化"</string> - <string name="usb_audio_disable_routing_summary" msgid="8768242894849534699">"USBオーディオ周辺機器への自動ルーティングを無効化"</string> + <string name="usb_audio_disable_routing" msgid="3367656923544254975">"USB オーディオ ルーティングを無効化"</string> + <string name="usb_audio_disable_routing_summary" msgid="8768242894849534699">"USB オーディオ周辺機器への自動ルーティングを無効にする"</string> <string name="debug_layout" msgid="1659216803043339741">"レイアウト境界を表示"</string> <string name="debug_layout_summary" msgid="8825829038287321978">"クリップの境界線、マージンなどを表示"</string> - <string name="force_rtl_layout_all_locales" msgid="8690762598501599796">"RTLレイアウト方向を使用"</string> - <string name="force_rtl_layout_all_locales_summary" msgid="6663016859517239880">"すべての言語/地域で画面レイアウト方向をRTLに設定"</string> + <string name="force_rtl_layout_all_locales" msgid="8690762598501599796">"RTL レイアウト方向を使用"</string> + <string name="force_rtl_layout_all_locales_summary" msgid="6663016859517239880">"すべての言語/地域で画面レイアウト方向を RTL に設定"</string> <string name="window_blurs" msgid="6831008984828425106">"ウィンドウ レベルでのぼかしを許可"</string> <string name="force_msaa" msgid="4081288296137775550">"4x MSAA を適用"</string> <string name="force_msaa_summary" msgid="9070437493586769500">"OpenGL ES 2.0 アプリで 4x MSAA を有効にする"</string> @@ -390,18 +390,18 @@ <string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"デバッグアプリに GPU デバッグレイヤの読み込みを許可"</string> <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"ベンダーの詳細なロギングを有効にする"</string> <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"バグレポートには、その他のデバイス固有のベンダーログが含まれます。これには、非公開の情報が含まれることがあります。また、バッテリーやストレージの使用量が増えることもあります。"</string> - <string name="window_animation_scale_title" msgid="5236381298376812508">"ウィンドウアニメスケール"</string> - <string name="transition_animation_scale_title" msgid="1278477690695439337">"トランジションアニメスケール"</string> - <string name="animator_duration_scale_title" msgid="7082913931326085176">"Animator再生時間スケール"</string> - <string name="overlay_display_devices_title" msgid="5411894622334469607">"2次画面シミュレート"</string> + <string name="window_animation_scale_title" msgid="5236381298376812508">"ウィンドウ アニメ スケール"</string> + <string name="transition_animation_scale_title" msgid="1278477690695439337">"トランジション アニメ スケール"</string> + <string name="animator_duration_scale_title" msgid="7082913931326085176">"Animator 再生時間スケール"</string> + <string name="overlay_display_devices_title" msgid="5411894622334469607">"2 次画面シミュレート"</string> <string name="debug_applications_category" msgid="5394089406638954196">"アプリ"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"アクティビティを保持しない"</string> - <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"ユーザーが離れたアクティビティをただちに破棄します"</string> + <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"ユーザーが離れたアクティビティを直ちに破棄する"</string> <string name="app_process_limit_title" msgid="8361367869453043007">"バックグラウンドプロセスの上限"</string> <string name="show_all_anrs" msgid="9160563836616468726">"バックグラウンド ANR の表示"</string> - <string name="show_all_anrs_summary" msgid="8562788834431971392">"バックグラウンド アプリが応答しない場合にダイアログを表示"</string> + <string name="show_all_anrs_summary" msgid="8562788834431971392">"バックグラウンド アプリが応答しない場合にダイアログを表示する"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"通知チャネルの警告を表示"</string> - <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"アプリから有効なチャネルのない通知が投稿されたときに画面上に警告を表示します"</string> + <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"アプリから有効なチャネルのない通知が投稿されたときに、画面上に警告を表示する"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"外部ストレージへのアプリの書き込みを許可"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"マニフェストの値に関係なく、すべてのアプリを外部ストレージに書き込めるようになります"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"アクティビティをサイズ変更可能にする"</string> diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml index 66a05f19474f..c6a50ac9e565 100644 --- a/packages/SettingsLib/res/values-ka/strings.xml +++ b/packages/SettingsLib/res/values-ka/strings.xml @@ -655,12 +655,8 @@ <string name="bt_le_audio_scan_qr_code" msgid="3521809854780392679">"QR კოდის სკანირება"</string> <string name="bt_le_audio_scan_qr_code_scanner" msgid="4679500020630341107">"მოსმენის დასაწყებად ცენტრში მოაქციეთ ქვემოთ მოცემული QR კოდი"</string> <string name="bt_le_audio_qr_code_is_not_valid_format" msgid="6092191081849434734">"QR კოდის ფორმატი არასწორია"</string> - <!-- no translation found for bt_le_audio_broadcast_dialog_title (5392738488989777074) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_sub_title (268234802198852753) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_switch_app (5749813313369517812) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_different_output (2638402023060391333) --> - <skip /> + <string name="bt_le_audio_broadcast_dialog_title" msgid="5392738488989777074">"გსურთ <xliff:g id="APP_NAME">%1$s</xliff:g>-ის ტრანსლაციის შეჩერება?"</string> + <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="268234802198852753">"<xliff:g id="SWITCHAPP">%1$s</xliff:g>-ის ტრანსლაციის შემთხვევაში ან აუდიოს გამოსასვლელის შეცვლისას, მიმდინარე ტრანსლაცია შეჩერდება"</string> + <string name="bt_le_audio_broadcast_dialog_switch_app" msgid="5749813313369517812">"<xliff:g id="SWITCHAPP">%1$s</xliff:g>-ის ტრანსლაცია"</string> + <string name="bt_le_audio_broadcast_dialog_different_output" msgid="2638402023060391333">"აუდიოს გამოსასვლელის შეცვლა"</string> </resources> diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml index bbfa2a3e1513..f5559d270f0a 100644 --- a/packages/SettingsLib/res/values-kk/strings.xml +++ b/packages/SettingsLib/res/values-kk/strings.xml @@ -175,7 +175,7 @@ <string name="data_usage_ota" msgid="7984667793701597001">"Жүйелік жаңарту"</string> <string name="tether_settings_title_usb" msgid="3728686573430917722">"USB тетеринг"</string> <string name="tether_settings_title_wifi" msgid="4803402057533895526">"Алынбалы хот-спот"</string> - <string name="tether_settings_title_bluetooth" msgid="916519902721399656">"Bluetooth модем"</string> + <string name="tether_settings_title_bluetooth" msgid="916519902721399656">"Bluetooth тетеринг"</string> <string name="tether_settings_title_usb_bluetooth" msgid="1727111807207577322">"Тетеринг"</string> <string name="tether_settings_title_all" msgid="8910259483383010470">"Тетеринг және алынбалы хотспот"</string> <string name="managed_user_title" msgid="449081789742645723">"Барлық жұмыс қолданбалары"</string> @@ -327,7 +327,7 @@ <string name="allow_mock_location_summary" msgid="179780881081354579">"Жасанды аймақтарды пайдалануға рұқсат беру"</string> <string name="debug_view_attributes" msgid="3539609843984208216">"Көру төлсипатын тексеруді қосу"</string> <string name="mobile_data_always_on_summary" msgid="1112156365594371019">"Wi‑Fi қосулы кезде де мобильдік интернетті өшірмеу (желіні жылдам ауыстыру үшін)"</string> - <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"Тетеринг режиміндегі аппараттық жеделдетуді пайдалану (қолжетімді болса)"</string> + <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"Тетеринг режимінде аппаратпен жеделдетуді пайдалану (қолжетімді болса)"</string> <string name="adb_warning_title" msgid="7708653449506485728">"USB арқылы түзетуге рұқсат берілсін бе?"</string> <string name="adb_warning_message" msgid="8145270656419669221">"USB арқылы түзету дамыту мақсаттарына ғана арналған. Оны компьютер және құрылғы арасында дерек көшіру, құрылғыға ескертусіз қолданба орнату және журнал деректерін оқу үшін қолданыңыз."</string> <string name="adbwifi_warning_title" msgid="727104571653031865">"Сымсыз түзетуге рұқсат берілсін бе?"</string> @@ -352,7 +352,7 @@ <string name="select_application" msgid="2543228890535466325">"Қолданба таңдау"</string> <string name="no_application" msgid="9038334538870247690">"Ешнәрсе"</string> <string name="wait_for_debugger" msgid="7461199843335409809">"Түзеткішті күту"</string> - <string name="wait_for_debugger_summary" msgid="6846330006113363286">"Орындау алдында түзелетін қолданба түзетушінің қосылуын күтеді"</string> + <string name="wait_for_debugger_summary" msgid="6846330006113363286">"Орындау алдында түзелетін қолданба түзетушінің қосылуын күтеді."</string> <string name="debug_input_category" msgid="7349460906970849771">"Енгізу"</string> <string name="debug_drawing_category" msgid="5066171112313666619">"Сызу"</string> <string name="debug_hw_drawing_category" msgid="5830815169336975162">"Бейнелеуді аппаратпен жеделдету"</string> @@ -385,7 +385,7 @@ <string name="force_msaa" msgid="4081288296137775550">"4x MSAA қолдану"</string> <string name="force_msaa_summary" msgid="9070437493586769500">"4x MSAA функциясын OpenGL ES 2.0 қолданбаларында іске қосу"</string> <string name="show_non_rect_clip" msgid="7499758654867881817">"Тіктөртбұрыштан басқа пішінге қиюды түзету"</string> - <string name="track_frame_time" msgid="522674651937771106">"Профиль бойынша HWUI рендерингі"</string> + <string name="track_frame_time" msgid="522674651937771106">"Профильдегі HWUI рендерингі"</string> <string name="enable_gpu_debug_layers" msgid="4986675516188740397">"GPU түзету қабаттары"</string> <string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"GPU түзету қабаттарының жүктелуіне рұқсат ету"</string> <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Жеткізуші туралы толық мәліметті тіркеу"</string> @@ -397,16 +397,16 @@ <string name="debug_applications_category" msgid="5394089406638954196">"Қолданбалар"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Әрекеттерді сақтамау"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Әр әрекетті пайдаланушы аяқтай салысымен жою"</string> - <string name="app_process_limit_title" msgid="8361367869453043007">"Фондық үрдіс шектеуі"</string> + <string name="app_process_limit_title" msgid="8361367869453043007">"Фондық процесті шектеу"</string> <string name="show_all_anrs" msgid="9160563836616468726">"Фондық ANR-ларды көрсету"</string> <string name="show_all_anrs_summary" msgid="8562788834431971392">"Фондық қолданбалар үшін \"Қолданба жауап бермейді\" терезесін шығару"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Хабарландыру арнасының ескертулерін көрсету"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Қолданба жарамсыз арна арқылы хабарландыру жариялағанда, экранға ескерту шығарады."</string> - <string name="force_allow_on_external" msgid="9187902444231637880">"Сыртқы жадта қолданбаларға рұқсат ету"</string> + <string name="force_allow_on_external" msgid="9187902444231637880">"Сыртқы жадта сақтауға рұқсат ету"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Манифест мәндеріне қарамастан, кез келген қолданбаны сыртқы жадқа жазуға рұқсат беру"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Әрекеттердің өлшемін өзгертуге рұқсат ету"</string> <string name="force_resizable_activities_summary" msgid="2490382056981583062">"Манифест мәндеріне қарамастан, бірнеше терезе режимінде барлық әрекеттердің өлшемін өзгертуге рұқсат беру"</string> - <string name="enable_freeform_support" msgid="7599125687603914253">"Еркін пішіндегі терезелерді қосу"</string> + <string name="enable_freeform_support" msgid="7599125687603914253">"Еркін пішінді терезелерге рұқсат беру"</string> <string name="enable_freeform_support_summary" msgid="1822862728719276331">"Еркін пішінді терезелерді құру эксперименттік функиясын қосу"</string> <string name="local_backup_password_title" msgid="4631017948933578709">"Компьютердегі сақтық көшірме құпия сөзі"</string> <string name="local_backup_password_summary_none" msgid="7646898032616361714">"Компьютердегі толық сақтық көшірмелер қазір қорғалмаған."</string> @@ -429,7 +429,7 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Белсенді емес. Ауыстырып қосу үшін түртіңіз."</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"Белсенді. Ауыстырып қосу үшін түртіңіз."</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"Қолданбаның күту режимі: <xliff:g id="BUCKET"> %s</xliff:g>"</string> - <string name="transcode_settings_title" msgid="2581975870429850549">"Медиамазмұнды қайта кодтау параметрлері"</string> + <string name="transcode_settings_title" msgid="2581975870429850549">"Медиафайлдарды қайта кодтау параметрлері"</string> <string name="transcode_user_control" msgid="6176368544817731314">"Қайта қодтаудың әдепкі параметрлерін қайта анықтау"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Қайта кодтауды қосу"</string> <string name="transcode_default" msgid="3784803084573509491">"Қолданбалар қазіргі заманғы форматтарды қолдайды делік"</string> @@ -605,7 +605,7 @@ <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Тым көп қате әрекет жасалды. Бұл пайдаланушы жойылады."</string> <string name="failed_attempts_now_wiping_profile" msgid="7626589520888963129">"Тым көп қате әрекет жасалды. Бұл жұмыс профилі мен оның деректері жойылады."</string> <string name="failed_attempts_now_wiping_dialog_dismiss" msgid="2749889771223578925">"Жабу"</string> - <string name="cached_apps_freezer_device_default" msgid="2616594131750144342">"Құрылғының әдепкі параметрлері"</string> + <string name="cached_apps_freezer_device_default" msgid="2616594131750144342">"Құрылғының әдепкі параметрі"</string> <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Өшірулі"</string> <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Қосулы"</string> <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Бұл өзгеріс күшіне енуі үшін, құрылғыны қайта жүктеу керек. Қазір қайта жүктеңіз не бас тартыңыз."</string> diff --git a/packages/SettingsLib/res/values-km/arrays.xml b/packages/SettingsLib/res/values-km/arrays.xml index 56b98dc59a6e..ef3aa522163a 100644 --- a/packages/SettingsLib/res/values-km/arrays.xml +++ b/packages/SettingsLib/res/values-km/arrays.xml @@ -249,7 +249,7 @@ <string-array name="debug_hw_overdraw_entries"> <item msgid="1968128556747588800">"បិទ"</item> <item msgid="3033215374382962216">"បង្ហាញតំបន់ដែលលើស"</item> - <item msgid="3474333938380896988">"បង្ហាញតំបន់សម្រាប់ Deuteranomaly"</item> + <item msgid="3474333938380896988">"បង្ហាញតំបន់សម្រាប់បញ្ហាខ្វាក់ពណ៌បៃតង"</item> </string-array> <string-array name="app_process_limit_entries"> <item msgid="794656271086646068">"ដែនកំណត់ស្តង់ដារ"</item> diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml index 9085fb6a25b3..7a45212d2139 100644 --- a/packages/SettingsLib/res/values-km/strings.xml +++ b/packages/SettingsLib/res/values-km/strings.xml @@ -224,7 +224,7 @@ </string-array> <string name="choose_profile" msgid="343803890897657450">"ជ្រើសរើសកម្រងព័ត៌មាន"</string> <string name="category_personal" msgid="6236798763159385225">"ផ្ទាល់ខ្លួន"</string> - <string name="category_work" msgid="4014193632325996115">"កន្លែងធ្វើការ"</string> + <string name="category_work" msgid="4014193632325996115">"ការងារ"</string> <string name="development_settings_title" msgid="140296922921597393">"ជម្រើសសម្រាប់អ្នកអភិវឌ្ឍន៍"</string> <string name="development_settings_enable" msgid="4285094651288242183">"បើកដំណើរការជម្រើសអ្នកអភិវឌ្ឍន៍"</string> <string name="development_settings_summary" msgid="8718917813868735095">"កំណត់ជម្រើសសម្រាប់ការអភិវឌ្ឍកម្មវិធី"</string> @@ -234,7 +234,7 @@ <string name="apn_settings_not_available" msgid="1147111671403342300">"ការកំណត់ឈ្មោះចូលដំណើរការមិនអាចប្រើបានសម្រាប់អ្នកប្រើនេះ"</string> <string name="enable_adb" msgid="8072776357237289039">"ការជួសជុលតាម USB"</string> <string name="enable_adb_summary" msgid="3711526030096574316">"មុខងារជួសជុល នៅពេលភ្ជាប់ USB"</string> - <string name="clear_adb_keys" msgid="3010148733140369917">"ដកសិទ្ធិកែកំហុសតាម USB"</string> + <string name="clear_adb_keys" msgid="3010148733140369917">"ដកសិទ្ធិជួសជុលតាម USB"</string> <string name="enable_adb_wireless" msgid="6973226350963971018">"ការជួសជុលដោយឥតខ្សែ"</string> <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"មុខងារជួសជុល នៅពេលភ្ជាប់ Wi‑Fi"</string> <string name="adb_wireless_error" msgid="721958772149779856">"បញ្ហា"</string> @@ -399,7 +399,7 @@ <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"បំផ្លាញគ្រប់សកម្មភាព ពេលអ្នកប្រើចាកចេញ"</string> <string name="app_process_limit_title" msgid="8361367869453043007">"ដែនកំណត់ដំណើរការក្នុងផ្ទៃខាងក្រោយ"</string> <string name="show_all_anrs" msgid="9160563836616468726">"បង្ហាញ ANR ផ្ទៃខាងក្រោយ"</string> - <string name="show_all_anrs_summary" msgid="8562788834431971392">"បង្ហាញប្រអប់កម្មវិធីមិនឆ្លើយតបសម្រាប់កម្មវិធីផ្ទៃខាងក្រោយ"</string> + <string name="show_all_anrs_summary" msgid="8562788834431971392">"បង្ហាញប្រអប់ \"កម្មវិធីមិនឆ្លើយតប\" សម្រាប់កម្មវិធីផ្ទៃខាងក្រោយ"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"បង្ហាញការព្រមានអំពីបណ្តាញជូនដំណឹង"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"បង្ហាញការព្រមាននៅលើអេក្រង់ នៅពេលកម្មវិធីបង្ហោះការជូនដំណឹងដោយមិនមានបណ្តាញត្រឹមត្រូវ"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"បង្ខំឲ្យអនុញ្ញាតកម្មវិធីលើឧបករណ៍ផ្ទុកខាងក្រៅ"</string> @@ -407,7 +407,7 @@ <string name="force_resizable_activities" msgid="7143612144399959606">"បង្ខំឲ្យសកម្មភាពអាចប្តូរទំហំបាន"</string> <string name="force_resizable_activities_summary" msgid="2490382056981583062">"ធ្វើឲ្យសកម្មភាពទាំងអស់អាចប្តូរទំហំបានសម្រាប់ពហុវិនដូ ដោយមិនគិតពីតម្លៃមេនីហ្វេសថ៍។"</string> <string name="enable_freeform_support" msgid="7599125687603914253">"បើកដំណើរការផ្ទាំងវិនដូទម្រង់សេរី"</string> - <string name="enable_freeform_support_summary" msgid="1822862728719276331">"បើកដំណើរការគាំទ្រផ្ទាំងវិនដូទម្រង់សេរីសាកល្បង"</string> + <string name="enable_freeform_support_summary" msgid="1822862728719276331">"បើកឱ្យអាចប្រើផ្ទាំងវិនដូទម្រង់សេរីពិសោធន៍។"</string> <string name="local_backup_password_title" msgid="4631017948933578709">"ពាក្យសម្ងាត់បម្រុងទុកលើកុំព្យូទ័រ"</string> <string name="local_backup_password_summary_none" msgid="7646898032616361714">"បច្ចុប្បន្ន ការបម្រុងទុកពេញលេញនៅលើកុំព្យូទ័រមិនត្រូវបានការពារទេ"</string> <string name="local_backup_password_summary_change" msgid="1707357670383995567">"ប៉ះដើម្បីប្ដូរ ឬយកពាក្យសម្ងាត់ចេញសម្រាប់ការបម្រុងទុកពេញលេញលើកុំព្យូទ័រ"</string> @@ -444,10 +444,10 @@ <string name="picture_color_mode_desc" msgid="151780973768136200">"ប្រើ sRGB"</string> <string name="daltonizer_mode_disabled" msgid="403424372812399228">"បានបិទ"</string> <string name="daltonizer_mode_monochromacy" msgid="362060873835885014">"Monochromacy"</string> - <string name="daltonizer_mode_deuteranomaly" msgid="3507284319584683963">"Deuteranomaly (ក្រហមពណ៌បៃតង)"</string> - <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomaly (ក្រហមពណ៌បៃតង)"</string> - <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomaly (ពណ៌ខៀវ-លឿង)"</string> - <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"ការកែពណ៌"</string> + <string name="daltonizer_mode_deuteranomaly" msgid="3507284319584683963">"ខ្វាក់ពណ៌បៃតង (ក្រហមបៃតង)"</string> + <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"ខ្វាក់ពណ៌ក្រហម (ក្រហមបៃតង)"</string> + <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"ខ្វាក់ពណ៌ខៀវ (ខៀវលឿង)"</string> + <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"ការកែតម្រូវពណ៌"</string> <string name="accessibility_display_daltonizer_preference_subtitle" msgid="1522101114585266455">"ការកែតម្រូវពណ៌អាចមានប្រយោជន៍ នៅពេលអ្នកចង់៖<br/> <ol> <li>&nbsp;មើលពណ៌កាន់តែត្រឹមត្រូវ</li> <li>&nbsp;លុបពណ៌ចេញ ដើម្បីជួយឱ្យអ្នកផ្ដោតអារម្មណ៍</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"បដិសេធដោយ <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml index fc0df561154e..362665b490a4 100644 --- a/packages/SettingsLib/res/values-ky/strings.xml +++ b/packages/SettingsLib/res/values-ky/strings.xml @@ -236,7 +236,7 @@ <string name="enable_adb_summary" msgid="3711526030096574316">"USB компьютерге сайылганда мүчүлүштүктөрдү оңдоо режими иштейт"</string> <string name="clear_adb_keys" msgid="3010148733140369917">"USB аркылуу мүчүлүштүктөрдү аныктоо уруксатын артка кайтаруу"</string> <string name="enable_adb_wireless" msgid="6973226350963971018">"Мүчүлүштүктөрдү Wi-Fi аркылуу аныктоо"</string> - <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"Wi‑Fi\'га туташканда, мүчүлүштүктөрдү аныктоо режими иштейт оңдоо режими"</string> + <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"Wi‑Fi\'га туташканда, мүчүлүштүктөрдү аныктоо режими иштейт"</string> <string name="adb_wireless_error" msgid="721958772149779856">"Ката"</string> <string name="adb_wireless_settings" msgid="2295017847215680229">"Мүчүлүштүктөрдү Wi-Fi аркылуу аныктоо"</string> <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Жеткиликтүү түзмөктөрдү көрүү үчүн мүчүлүштүктөрдү Wi-Fi аркылуу аныктоону күйгүзүңүз"</string> @@ -279,8 +279,8 @@ <string name="debug_networking_category" msgid="6829757985772659599">"Тармактар"</string> <string name="wifi_display_certification" msgid="1805579519992520381">"Зымсыз мониторлорду тастыктамалоо"</string> <string name="wifi_verbose_logging" msgid="1785910450009679371">"Wi‑Fi таржымалы"</string> - <string name="wifi_scan_throttling" msgid="2985624788509913617">"Wi‑Fi тармактарын издөөнү жөнгө салуу"</string> - <string name="wifi_non_persistent_mac_randomization" msgid="7482769677894247316">"Wi‑Fi туташуусу туруксуз MAC даректерин башаламан иретте түзүү"</string> + <string name="wifi_scan_throttling" msgid="2985624788509913617">"Wi‑Fi тармактарын издөөнү чектөө"</string> + <string name="wifi_non_persistent_mac_randomization" msgid="7482769677894247316">"Wi-Fi тармагындагы башаламан MAC даректери"</string> <string name="mobile_data_always_on" msgid="8275958101875563572">"Мобилдик Интернет иштей берет"</string> <string name="tethering_hardware_offload" msgid="4116053719006939161">"Модем режиминде аппараттын иштешин тездетүү"</string> <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Аталышсыз Bluetooth түзмөктөрү көрүнсүн"</string> @@ -312,7 +312,7 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Зымсыз мониторлорду тастыктамалоо параметрлери көрүнүп турат"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Wi-Fi тандалганда ар бир SSID үчүн RSSI көрүнүп турат"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Батареяны үнөмдөп, тармактын иштешин жакшыртат"</string> - <string name="wifi_non_persistent_mac_randomization_summary" msgid="2159794543105053930">"Бул режим өчүрүлгөндөн кийин, түзмөк MAC дарегин башаламан иретте түзүү функциясы иштетилген тармакка туташкан сайын анын MAC дареги өзгөрүшү мүмкүн."</string> + <string name="wifi_non_persistent_mac_randomization_summary" msgid="2159794543105053930">"Бул режим иштетилсе, түзмөктүн MAC дареги башаламан MAC даректерди түзгөн тармакка туташкан сайын өзгөрүп турушу мүмкүн."</string> <string name="wifi_metered_label" msgid="8737187690304098638">"Трафик ченелет"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Чектелбеген тармак"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Журнал буферинин өлчөмү"</string> @@ -398,7 +398,7 @@ <string name="immediately_destroy_activities" msgid="1826287490705167403">"Аракеттер сакталбасын"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Колдонуучу чыгып кетери менен бардык аракеттер өчүрүлөт"</string> <string name="app_process_limit_title" msgid="8361367869453043007">"Фондогу процесстер чеги"</string> - <string name="show_all_anrs" msgid="9160563836616468726">"Фондогу \"Колдонмо жооп бербей жатат\" деп көрсөтүү"</string> + <string name="show_all_anrs" msgid="9160563836616468726">"Фондук режимдеги ANR"</string> <string name="show_all_anrs_summary" msgid="8562788834431971392">"Фондогу колдонмо жооп бербей жатат деп билдирип турат"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Билдирмелер каналынын эскертүүлөрүн көрсөтүү"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Тыюу салынган каналдын колдонмосунун жаңы билдирмелери тууралуу эскертүүлөр көрүнөт"</string> @@ -552,7 +552,7 @@ <string name="help_label" msgid="3528360748637781274">"Жардам/Пикир билдирүү"</string> <string name="storage_category" msgid="2287342585424631813">"Сактагыч"</string> <string name="shared_data_title" msgid="1017034836800864953">"Бөлүшүлгөн маалымат"</string> - <string name="shared_data_summary" msgid="5516326713822885652">"Бөлүшүлгөн маалыматты көрүп, өзгөртүү"</string> + <string name="shared_data_summary" msgid="5516326713822885652">"Бөлүшүлгөн маалыматты көрүп, өзгөртөсүз"</string> <string name="shared_data_no_blobs_text" msgid="3108114670341737434">"Бул колдонуучу менен бөлүшүлгөн маалымат жок."</string> <string name="shared_data_query_failure_text" msgid="3489828881998773687">"Бөлүшүлгөн маалыматты алууда ката кетти. Кайталоо."</string> <string name="blob_id_text" msgid="8680078988996308061">"Бөлүшүлгөн маалыматты идентификатору: <xliff:g id="BLOB_ID">%d</xliff:g>"</string> @@ -655,12 +655,8 @@ <string name="bt_le_audio_scan_qr_code" msgid="3521809854780392679">"QR кодун скандоо"</string> <string name="bt_le_audio_scan_qr_code_scanner" msgid="4679500020630341107">"Угуп баштоо үчүн QR кодун борборго жайгаштырыңыз"</string> <string name="bt_le_audio_qr_code_is_not_valid_format" msgid="6092191081849434734">"QR кодунун форматы жараксыз"</string> - <!-- no translation found for bt_le_audio_broadcast_dialog_title (5392738488989777074) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_sub_title (268234802198852753) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_switch_app (5749813313369517812) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_different_output (2638402023060391333) --> - <skip /> + <string name="bt_le_audio_broadcast_dialog_title" msgid="5392738488989777074">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосунда кабарлоо токтотулсунбу?"</string> + <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="268234802198852753">"Эгер <xliff:g id="SWITCHAPP">%1$s</xliff:g> колдонмосунда кабарласаңыз же аудионун чыгуусун өзгөртсөңүз, учурдагы кабарлоо токтотулат"</string> + <string name="bt_le_audio_broadcast_dialog_switch_app" msgid="5749813313369517812">"<xliff:g id="SWITCHAPP">%1$s</xliff:g> колдонмосунда кабарлоо"</string> + <string name="bt_le_audio_broadcast_dialog_different_output" msgid="2638402023060391333">"Аудионун чыгуусун өзгөртүү"</string> </resources> diff --git a/packages/SettingsLib/res/values-lo/arrays.xml b/packages/SettingsLib/res/values-lo/arrays.xml index 4d9f5d9875e9..56a9741d3419 100644 --- a/packages/SettingsLib/res/values-lo/arrays.xml +++ b/packages/SettingsLib/res/values-lo/arrays.xml @@ -76,7 +76,7 @@ <item msgid="1963366694959681026">"avrcp16"</item> </string-array> <string-array name="bluetooth_map_versions"> - <item msgid="8786402640610987099">"MAP 1.2 (Default)"</item> + <item msgid="8786402640610987099">"MAP 1.2 (ຄ່າເລີ່ມຕົ້ນ)"</item> <item msgid="6817922176194686449">"MAP 1.3"</item> <item msgid="3423518690032737851">"MAP 1.4"</item> </string-array> diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml index 9ad508791733..b3be17ad5efc 100644 --- a/packages/SettingsLib/res/values-lo/strings.xml +++ b/packages/SettingsLib/res/values-lo/strings.xml @@ -393,7 +393,7 @@ <string name="window_animation_scale_title" msgid="5236381298376812508">"ຂະໜາດໜ້າຈໍຂອງອະນິເມຊັນ"</string> <string name="transition_animation_scale_title" msgid="1278477690695439337">"ຂະໜາດສະຫຼັບອະນິເມຊັນ"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"ໄລຍະເວລາອະນິເມຊັນ"</string> - <string name="overlay_display_devices_title" msgid="5411894622334469607">"ຈຳລອງຈໍສະແດງຜົນທີ່ສອງ"</string> + <string name="overlay_display_devices_title" msgid="5411894622334469607">"ຈຳລອງຈໍສະແດງຜົນທີສອງ"</string> <string name="debug_applications_category" msgid="5394089406638954196">"ແອັບ"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"ບໍ່ຕ້ອງຮັກສາການເຄື່ອນໄຫວ"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"ລຶບທຸກການເຄື່ອນໄຫວທັນທີທີ່ຜູ້ໃຊ້ອອກຈາກມັນ"</string> diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml index 6f2f7042064a..250d24af0d38 100644 --- a/packages/SettingsLib/res/values-lt/strings.xml +++ b/packages/SettingsLib/res/values-lt/strings.xml @@ -655,12 +655,8 @@ <string name="bt_le_audio_scan_qr_code" msgid="3521809854780392679">"QR kodo nuskaitymas"</string> <string name="bt_le_audio_scan_qr_code_scanner" msgid="4679500020630341107">"Jei norite pradėti klausyti, nustatykite toliau pateiktą QR kodą per vidurį"</string> <string name="bt_le_audio_qr_code_is_not_valid_format" msgid="6092191081849434734">"QR kodas netinkamo formato"</string> - <!-- no translation found for bt_le_audio_broadcast_dialog_title (5392738488989777074) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_sub_title (268234802198852753) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_switch_app (5749813313369517812) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_different_output (2638402023060391333) --> - <skip /> + <string name="bt_le_audio_broadcast_dialog_title" msgid="5392738488989777074">"Sustabdyti „<xliff:g id="APP_NAME">%1$s</xliff:g>“ transliaciją?"</string> + <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="268234802198852753">"Jei transliuosite „<xliff:g id="SWITCHAPP">%1$s</xliff:g>“ arba pakeisite išvestį, dabartinė transliacija bus sustabdyta"</string> + <string name="bt_le_audio_broadcast_dialog_switch_app" msgid="5749813313369517812">"Transliuoti „<xliff:g id="SWITCHAPP">%1$s</xliff:g>“"</string> + <string name="bt_le_audio_broadcast_dialog_different_output" msgid="2638402023060391333">"Keisti išvestį"</string> </resources> diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml index bbd792e29ae1..be13fd7f9886 100644 --- a/packages/SettingsLib/res/values-mk/strings.xml +++ b/packages/SettingsLib/res/values-mk/strings.xml @@ -266,7 +266,7 @@ <string name="bugreport_in_power" msgid="8664089072534638709">"Кратенка за извештај за грешка"</string> <string name="bugreport_in_power_summary" msgid="1885529649381831775">"Прикажи копче во менито за вклучување за да се направи извештај за грешка"</string> <string name="keep_screen_on" msgid="1187161672348797558">"Остани во активен режим"</string> - <string name="keep_screen_on_summary" msgid="1510731514101925829">"Екранот никогаш нема да биде во режим на штедење додека се полни"</string> + <string name="keep_screen_on_summary" msgid="1510731514101925829">"Екранот никогаш нема да биде во режим на спиење додека се полни"</string> <string name="bt_hci_snoop_log" msgid="7291287955649081448">"Овозможи Bluetooth HCI за евиденција на пресретнување пакети"</string> <string name="bt_hci_snoop_log_summary" msgid="6808538971394092284">"Снимај Bluetooth-пакети. (Вклучи Bluetooth по промената на поставкава)"</string> <string name="oem_unlock_enable" msgid="5334869171871566731">"Отклучување со OEM"</string> @@ -337,7 +337,7 @@ <string name="dev_settings_warning_message" msgid="37741686486073668">"Овие поставки се наменети само за употреба за развој. Тие може да предизвикаат уредот и апликациите во него да се расипат или да се однесуваат необично."</string> <string name="verify_apps_over_usb_title" msgid="6031809675604442636">"Потврди апликации преку USB"</string> <string name="verify_apps_over_usb_summary" msgid="1317933737581167839">"Провери апликации инсталирани преку ADB/ADT за штетно однесување."</string> - <string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Уредите со Bluetooth без имиња (само MAC-адреси) ќе се прикажуваат"</string> + <string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Ќе се прикажуваат уредите со Bluetooth без имиња (само MAC-адреси)"</string> <string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Ја оневозможува функцијата за апсолутна јачина на звук преку Bluetooth во случај кога ќе настанат проблеми со далечинските уреди, како на пр., неприфатливо силен звук или недоволна контрола."</string> <string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"Ја овозможува функцијата Bluetooth Gabeldorsche."</string> <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Ја овозможува функцијата „Подобрена поврзливост“."</string> @@ -352,7 +352,7 @@ <string name="select_application" msgid="2543228890535466325">"Избери апликација"</string> <string name="no_application" msgid="9038334538870247690">"Ништо"</string> <string name="wait_for_debugger" msgid="7461199843335409809">"Почекај ја програмата за отстранување грешки"</string> - <string name="wait_for_debugger_summary" msgid="6846330006113363286">"Пред да се изврши, апликација за отстранување грешки чека програмата за отстранување грешки да се закачи"</string> + <string name="wait_for_debugger_summary" msgid="6846330006113363286">"Пред да се изврши, апликацијата во која се отстрануваат грешки чека да се закачи програмата за отстранување грешки"</string> <string name="debug_input_category" msgid="7349460906970849771">"Внесување"</string> <string name="debug_drawing_category" msgid="5066171112313666619">"Цртање"</string> <string name="debug_hw_drawing_category" msgid="5830815169336975162">"Хардверско забрзување"</string> @@ -378,7 +378,7 @@ <string name="usb_audio_disable_routing" msgid="3367656923544254975">"Исклучи USB-пренасочување"</string> <string name="usb_audio_disable_routing_summary" msgid="8768242894849534699">"Исклучи автоматско пренасочување до USB-аудиоуреди"</string> <string name="debug_layout" msgid="1659216803043339741">"Прикажи граници на слој"</string> - <string name="debug_layout_summary" msgid="8825829038287321978">"Прикажи граници на клип, маргини, итн."</string> + <string name="debug_layout_summary" msgid="8825829038287321978">"Прикажи граници на клип, маргини итн."</string> <string name="force_rtl_layout_all_locales" msgid="8690762598501599796">"Принудно користи RTL за насока"</string> <string name="force_rtl_layout_all_locales_summary" msgid="6663016859517239880">"Принудно постави насока на распоред на екранот во RTL за сите локални стандарди"</string> <string name="window_blurs" msgid="6831008984828425106">"Дозволи замаглување прозорец"</string> @@ -483,7 +483,7 @@ <string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Бавно полнење"</string> <string name="battery_info_status_charging_wireless" msgid="8924722966861282197">"Се полни безжично"</string> <string name="battery_info_status_discharging" msgid="6962689305413556485">"Не се полни"</string> - <string name="battery_info_status_not_charging" msgid="3371084153747234837">"Поврзана, не се полни"</string> + <string name="battery_info_status_not_charging" msgid="3371084153747234837">"Поврзано, не се полни"</string> <string name="battery_info_status_full" msgid="1339002294876531312">"Полна"</string> <string name="battery_info_status_full_charged" msgid="3536054261505567948">"Целосно полна"</string> <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Контролирано од администраторот"</string> diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml index fe3577253e55..cd41b81381d1 100644 --- a/packages/SettingsLib/res/values-mn/strings.xml +++ b/packages/SettingsLib/res/values-mn/strings.xml @@ -655,12 +655,8 @@ <string name="bt_le_audio_scan_qr_code" msgid="3521809854780392679">"QR код скан хийх"</string> <string name="bt_le_audio_scan_qr_code_scanner" msgid="4679500020630341107">"Сонсож эхлэхийн тулд доорх QR кодыг голлуулаарай"</string> <string name="bt_le_audio_qr_code_is_not_valid_format" msgid="6092191081849434734">"QR код буруу форматтай байна"</string> - <!-- no translation found for bt_le_audio_broadcast_dialog_title (5392738488989777074) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_sub_title (268234802198852753) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_switch_app (5749813313369517812) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_different_output (2638402023060391333) --> - <skip /> + <string name="bt_le_audio_broadcast_dialog_title" msgid="5392738488989777074">"<xliff:g id="APP_NAME">%1$s</xliff:g>-г нэвтрүүлэхээ зогсоох уу?"</string> + <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="268234802198852753">"Хэрэв та <xliff:g id="SWITCHAPP">%1$s</xliff:g>-г нэвтрүүлсэн эсвэл гаралтыг өөрчилсөн бол таны одоогийн нэвтрүүлэлтийг зогсооно"</string> + <string name="bt_le_audio_broadcast_dialog_switch_app" msgid="5749813313369517812">"<xliff:g id="SWITCHAPP">%1$s</xliff:g>-г нэвтрүүлэх"</string> + <string name="bt_le_audio_broadcast_dialog_different_output" msgid="2638402023060391333">"Гаралтыг өөрчлөх"</string> </resources> diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml index 9e483c2cfa7c..6c2dbe439e96 100644 --- a/packages/SettingsLib/res/values-mr/strings.xml +++ b/packages/SettingsLib/res/values-mr/strings.xml @@ -520,7 +520,7 @@ <string name="ims_reg_status_not_registered" msgid="2989287366045704694">"नोंदवलेले नाही"</string> <string name="status_unavailable" msgid="5279036186589861608">"उपलब्ध नाही"</string> <string name="wifi_status_mac_randomized" msgid="466382542497832189">"MAC रँडमाइझ केला आहे"</string> - <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{0 device connected}=1{एक डिव्हाइस कनेक्ट केले}other{# डिव्हाइस कनेक्ट केली}}"</string> + <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{0 डिव्हाइस कनेक्ट केले}=1{एक डिव्हाइस कनेक्ट केले}other{# डिव्हाइस कनेक्ट केली}}"</string> <string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"जास्त वेळ."</string> <string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"कमी वेळ."</string> <string name="cancel" msgid="5665114069455378395">"रद्द करा"</string> diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml index 51d5a2ce3618..cbe99f3288c9 100644 --- a/packages/SettingsLib/res/values-ne/strings.xml +++ b/packages/SettingsLib/res/values-ne/strings.xml @@ -357,7 +357,7 @@ <string name="debug_drawing_category" msgid="5066171112313666619">"रेखाचित्र"</string> <string name="debug_hw_drawing_category" msgid="5830815169336975162">"हार्डवेयरले बढाएको रेन्डरिङ"</string> <string name="media_category" msgid="8122076702526144053">"मिडिया"</string> - <string name="debug_monitoring_category" msgid="1597387133765424994">"अनुगमन गर्दै"</string> + <string name="debug_monitoring_category" msgid="1597387133765424994">"अनुगमन गरिँदै छ"</string> <string name="strict_mode" msgid="889864762140862437">"स्ट्रिक्ट मोड अन गरियोस्"</string> <string name="strict_mode_summary" msgid="1838248687233554654">"एपले मुख्य थ्रेडमा लामा गतिविधि गर्दा स्क्रिन फ्ल्यास गरियोस्"</string> <string name="pointer_location" msgid="7516929526199520173">"पोइन्टरको स्थान"</string> @@ -402,7 +402,7 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"ब्याकग्राउन्डका एपको हकमा \'नचलिरहेका एप\' सन्देश देखाइयोस्"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"सूचना च्यानलसम्बन्धी चेतावनी देखाइयोस्"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"एपले मान्य च्यानलबिना सूचना पोस्ट गर्दा स्क्रिनमा चेतावनी देखाइयोस्"</string> - <string name="force_allow_on_external" msgid="9187902444231637880">"एपलाई बहिरी मेमोरीमा पनि चल्ने दिइयोस्"</string> + <string name="force_allow_on_external" msgid="9187902444231637880">"एपलाई बहिरी मेमोरीमा पनि चल्न दिइयोस्"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"तोकिएको नियमको ख्याल नगरी एपलाई बाह्य भण्डारणमा चल्ने बनाइयोस्"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"बलपूर्वक एपहरूको आकार मिलाउन मिल्ने बनाइयोस्"</string> <string name="force_resizable_activities_summary" msgid="2490382056981583062">"तोकिएको नियमको ख्याल नगरी एपलाई एकभन्दा बढी विन्डोमा रिसाइज गर्न सकिने बनाइयोस्।"</string> @@ -442,7 +442,7 @@ <string name="select_webview_provider_toast_text" msgid="8512254949169359848">"यो छनोट अब मान्य छैन। फेरि प्रयास गर्नुहोस्।"</string> <string name="picture_color_mode" msgid="1013807330552931903">"चित्र रङ्ग मोड"</string> <string name="picture_color_mode_desc" msgid="151780973768136200">"sRGB प्रयोग गर्नुहोस्"</string> - <string name="daltonizer_mode_disabled" msgid="403424372812399228">"असक्षम गरिएको छ"</string> + <string name="daltonizer_mode_disabled" msgid="403424372812399228">"अफ गरिएको छ"</string> <string name="daltonizer_mode_monochromacy" msgid="362060873835885014">"मोनोक्रोमेसी"</string> <string name="daltonizer_mode_deuteranomaly" msgid="3507284319584683963">"ड्युटरएनोमली (रातो-हरियो)"</string> <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"प्रोटानेमली (रातो, हरियो)"</string> diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml index ac953657868b..0da516c80698 100644 --- a/packages/SettingsLib/res/values-pa/strings.xml +++ b/packages/SettingsLib/res/values-pa/strings.xml @@ -309,9 +309,9 @@ <string name="private_dns_mode_provider" msgid="3619040641762557028">"ਨਿੱਜੀ DNS ਪ੍ਰਦਾਨਕ ਹੋਸਟਨਾਮ"</string> <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"DNS ਪ੍ਰਦਾਨਕ ਦਾ ਹੋਸਟਨਾਮ ਦਾਖਲ ਕਰੋ"</string> <string name="private_dns_mode_provider_failure" msgid="8356259467861515108">"ਕਨੈਕਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ"</string> - <string name="wifi_display_certification_summary" msgid="8111151348106907513">"ਵਾਇਰਲੈੱਸ ਡਿਸਪਲੇ ਪ੍ਰਮਾਣੀਕਰਨ ਲਈ ਚੋਣਾਂ ਪ੍ਰਦਰਸ਼ਿਤ ਕਰੋ"</string> + <string name="wifi_display_certification_summary" msgid="8111151348106907513">"ਵਾਇਰਲੈੱਸ ਡਿਸਪਲੇ ਪ੍ਰਮਾਣੀਕਰਨ ਲਈ ਵਿਕਲਪ ਦਿਖਾਓ"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"ਵਾਈ‑ਫਾਈ ਲੌਗਿੰਗ ਪੱਧਰ ਵਧਾਓ, ਵਾਈ‑ਫਾਈ ਚੋਣਕਾਰ ਵਿੱਚ ਪ੍ਰਤੀ SSID RSSI ਦਿਖਾਓ"</string> - <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"ਬੈਟਰੀ ਦੀ ਵਰਤੋਂ ਘਟਾ ਕੇ ਨੈੱਟਵਰਕ ਕਾਰਗੁਜ਼ਾਰੀ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਂਦਾ ਹੈ"</string> + <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"ਤੇਜ਼ੀ ਨਾਲ ਹੋਣ ਵਾਲੇ ਬੈਟਰੀ ਖਰਚ ਨੂੰ ਘਟਾ ਕੇ ਨੈੱਟਵਰਕ ਕਾਰਗੁਜ਼ਾਰੀ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਂਦਾ ਹੈ"</string> <string name="wifi_non_persistent_mac_randomization_summary" msgid="2159794543105053930">"ਜਦੋਂ ਇਹ ਮੋਡ ਚਾਲੂ ਹੁੰਦਾ ਹੈ, ਤਾਂ ਇਸ ਡੀਵਾਈਸ ਦਾ MAC ਪਤਾ ਹਰ ਵਾਰ ਬਦਲ ਸਕਦਾ ਹੈ ਜਦੋਂ ਇਹ ਕਿਸੇ ਅਜਿਹੇ ਨੈੱਟਵਰਕ ਨਾਲ ਕਨੈਕਟ ਹੁੰਦਾ ਹੈ ਜਿਸ ਵਿੱਚ MAC ਬੇਤਰਤੀਬਵਾਰ ਚਾਲੂ ਹੁੰਦਾ ਹੈ।"</string> <string name="wifi_metered_label" msgid="8737187690304098638">"ਮੀਟਰਬੱਧ ਕੀਤਾ ਗਿਆ"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"ਗੈਰ-ਮੀਟਰਬੱਧ ਕੀਤਾ ਗਿਆ"</string> @@ -326,7 +326,7 @@ <string name="allow_mock_location" msgid="2102650981552527884">"ਨਕਲੀ ਨਿਰਧਾਰਿਤ ਸਥਾਨਾਂ ਦੀ ਆਗਿਆ ਦਿਓ"</string> <string name="allow_mock_location_summary" msgid="179780881081354579">"ਨਕਲੀ ਨਿਰਧਾਰਿਤ ਸਥਾਨਾਂ ਦੀ ਆਗਿਆ ਦਿਓ"</string> <string name="debug_view_attributes" msgid="3539609843984208216">"\'ਵਿਸ਼ੇਸ਼ਤਾ ਨਿਰੀਖਣ ਦੇਖੋ\' ਨੂੰ ਚਾਲੂ ਕਰੋ"</string> - <string name="mobile_data_always_on_summary" msgid="1112156365594371019">"ਵਾਈ‑ਫਾਈ ਕਿਰਿਆਸ਼ੀਲ ਹੋਣ \'ਤੇ ਵੀ ਹਮੇਸ਼ਾਂ ਮੋਬਾਈਲ ਡਾਟਾ ਨੂੰ ਕਿਰਿਆਸ਼ੀਲ ਰੱਖੋ(ਤੇਜ਼ ਨੈੱਟਵਰਕ ਸਵਿੱਚਿੰਗ ਲਈ)।"</string> + <string name="mobile_data_always_on_summary" msgid="1112156365594371019">"ਵਾਈ‑ਫਾਈ ਕਿਰਿਆਸ਼ੀਲ ਹੋਣ \'ਤੇ ਵੀ ਹਮੇਸ਼ਾਂ ਮੋਬਾਈਲ ਡਾਟਾ ਨੂੰ ਕਿਰਿਆਸ਼ੀਲ ਰੱਖੋ (ਤੇਜ਼ ਨੈੱਟਵਰਕ ਸਵਿੱਚਿੰਗ ਲਈ)।"</string> <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"ਉਪਲਬਧ ਹੋਣ \'ਤੇ ਟੈਦਰਿੰਗ ਹਾਰਡਵੇਅਰ ਐਕਸੈੱਲਰੇਸ਼ਨ ਵਰਤੋ"</string> <string name="adb_warning_title" msgid="7708653449506485728">"ਕੀ USB ਡੀਬਗਿੰਗ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string> <string name="adb_warning_message" msgid="8145270656419669221">"USB ਡੀਬਗਿੰਗ ਸਿਰਫ਼ ਵਿਕਾਸ ਮੰਤਵਾਂ ਲਈ ਹੁੰਦੀ ਹੈ। ਇਸਨੂੰ ਆਪਣੇ ਕੰਪਿਊਟਰ ਅਤੇ ਆਪਣੇ ਡੀਵਾਈਸ ਵਿਚਕਾਰ ਡਾਟਾ ਕਾਪੀ ਕਰਨ ਲਈ ਵਰਤੋ, ਸੂਚਨਾ ਦੇ ਬਿਨਾਂ ਆਪਣੇ ਡੀਵਾਈਸ ਤੇ ਐਪਾਂ ਸਥਾਪਤ ਕਰੋ ਅਤੇ ਲੌਗ ਡਾਟਾ ਪੜ੍ਹੋ।"</string> @@ -336,7 +336,7 @@ <string name="dev_settings_warning_title" msgid="8251234890169074553">"ਕੀ ਵਿਕਾਸ ਸੈਟਿੰਗਾਂ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string> <string name="dev_settings_warning_message" msgid="37741686486073668">"ਇਹ ਸੈਟਿੰਗਾਂ ਕੇਵਲ ਵਿਕਾਸਕਾਰ ਦੀ ਵਰਤੋਂ ਲਈ ਹਨ। ਇਹ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਅਤੇ ਇਸਤੇ ਮੌਜੂਦ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਬ੍ਰੇਕ ਕਰਨ ਜਾਂ ਦੁਰਵਿਵਹਾਰ ਕਰਨ ਦਾ ਕਾਰਨ ਬਣ ਸਕਦੇ ਹਨ।"</string> <string name="verify_apps_over_usb_title" msgid="6031809675604442636">"USB \'ਤੇ ਐਪਾਂ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ"</string> - <string name="verify_apps_over_usb_summary" msgid="1317933737581167839">"ਹਾਨੀਕਾਰਕ ਵਿਵਹਾਰ ਲਈ ADB/ADT ਰਾਹੀਂ ਸਥਾਪਤ ਕੀਤੀਆਂ ਐਪਾਂ ਦੀ ਜਾਂਚ ਕਰੋ।"</string> + <string name="verify_apps_over_usb_summary" msgid="1317933737581167839">"ADB/ADT ਰਾਹੀਂ ਸਥਾਪਤ ਕੀਤੀਆਂ ਐਪਾਂ ਦੀ ਹਾਨੀਕਾਰਕ ਵਿਵਹਾਰ ਲਈ ਜਾਂਚ ਕਰੋ।"</string> <string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"ਅਨਾਮ ਬਲੂਟੁੱਥ ਡੀਵਾਈਸਾਂ ਦਿਖਾਈਆਂ ਜਾਣਗੀਆਂ (ਸਿਰਫ਼ MAC ਪਤੇ)"</string> <string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"ਰਿਮੋਟ ਡੀਵਾਈਸਾਂ ਨਾਲ ਅਵਾਜ਼ੀ ਸਮੱਸਿਆਵਾਂ ਜਿਵੇਂ ਕਿ ਨਾ ਪਸੰਦ ਕੀਤੀ ਜਾਣ ਵਾਲੀ ਉੱਚੀ ਅਵਾਜ਼ ਜਾਂ ਕੰਟਰੋਲ ਦੀ ਕਮੀ ਵਰਗੀ ਹਾਲਤ ਵਿੱਚ ਬਲੂਟੁੱਥ ਪੂਰਨ ਅਵਾਜ਼ ਵਿਸ਼ੇਸ਼ਤਾ ਨੂੰ ਬੰਦ ਕਰਦਾ ਹੈ।"</string> <string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"ਬਲੂਟੁੱਥ Gabeldorsche ਵਿਸ਼ੇਸ਼ਤਾ ਸਟੈਕ ਨੂੰ ਚਾਲੂ ਕਰਦਾ ਹੈ।"</string> @@ -367,9 +367,9 @@ <string name="show_screen_updates" msgid="2078782895825535494">"ਸਰਫ਼ੇਸ ਅੱਪਡੇਟ ਦਿਖਾਓ"</string> <string name="show_screen_updates_summary" msgid="2126932969682087406">"ਅੱਪਡੇਟ ਹੋਣ \'ਤੇ, ਸਮੁੱਚੀਆਂ ਵਿੰਡੋ ਸਰਫ਼ੇਸਾਂ ਫਲੈਸ਼ ਕਰੋ"</string> <string name="show_hw_screen_updates" msgid="2021286231267747506">"\'ਅੱਪਡੇਟ ਦੇਖੋ\' ਨੂੰ ਦਿਖਾਓ"</string> - <string name="show_hw_screen_updates_summary" msgid="3539770072741435691">"ਡ੍ਰਾ ਕੀਤੇ ਜਾਣ \'ਤੇ ਵਿੰਡੋਜ਼ ਦੇ ਅੰਦਰ ਦ੍ਰਿਸ਼ ਫਲੈਸ਼ ਕਰੋ"</string> + <string name="show_hw_screen_updates_summary" msgid="3539770072741435691">"ਡ੍ਰਾ ਕੀਤੇ ਜਾਣ \'ਤੇ ਵਿੰਡੋ ਦੇ ਅੰਦਰ ਦ੍ਰਿਸ਼ ਫਲੈਸ਼ ਕਰੋ"</string> <string name="show_hw_layers_updates" msgid="5268370750002509767">"ਹਾਰਡਵੇਅਰ ਤਹਿਆਂ ਦੇ ਅੱਪਡੇਟ ਦਿਖਾਓ"</string> - <string name="show_hw_layers_updates_summary" msgid="5850955890493054618">"ਹਾਰਡਵੇਅਰ ਤਹਿਆਂ ਅੱਪਡੇਟ ਹੋਣ \'ਤੇ ਉਹਨਾਂ ਨੂੰ ਹਰਾ ਕਰੋ"</string> + <string name="show_hw_layers_updates_summary" msgid="5850955890493054618">"ਅੱਪਡੇਟ ਹੋਣ ਤੋਂ ਬਾਅਦ ਹਾਰਡਵੇਅਰ ਤਹਿਆਂ ਨੂੰ ਹਰਾ ਕਰੋ"</string> <string name="debug_hw_overdraw" msgid="8944851091008756796">"GPU ਓਵਰਡ੍ਰਾ ਡੀਬੱਗ ਕਰੋ"</string> <string name="disable_overlays" msgid="4206590799671557143">"HW ਓਵਰਲੇ ਨੂੰ ਬੰਦ ਕਰੋ"</string> <string name="disable_overlays_summary" msgid="1954852414363338166">"ਸਕ੍ਰੀਨ ਕੰਪੋਜ਼ਿਟਿੰਗ ਲਈ ਹਮੇਸ਼ਾਂ GPU ਵਰਤੋ"</string> @@ -382,7 +382,7 @@ <string name="force_rtl_layout_all_locales" msgid="8690762598501599796">"ਸੱਜੇ ਤੋਂ ਖੱਬੇ ਵਾਲਾ ਖਾਕਾ ਲਾਗੂ ਕਰੋ"</string> <string name="force_rtl_layout_all_locales_summary" msgid="6663016859517239880">"ਸਾਰੀਆਂ ਭਾਸ਼ਾਵਾਂ ਲਈ ਸਕ੍ਰੀਨ \'ਤੇ ਸੱਜੇ ਤੋਂ ਖੱਬੇ ਵਾਲਾ ਖਾਕਾ ਲਾਗੂ ਕਰੋ"</string> <string name="window_blurs" msgid="6831008984828425106">"ਵਿੰਡੋ-ਪੱਧਰ \'ਤੇ ਧੁੰਦਲਾ ਕਰਨ ਦਿਓ"</string> - <string name="force_msaa" msgid="4081288296137775550">"4x MSAA ਤੇ ਜ਼ੋਰ ਪਾਓ"</string> + <string name="force_msaa" msgid="4081288296137775550">"4x MSAA ਜ਼ਬਰਦਸਤੀ ਲਾਗੂ ਕਰੋ"</string> <string name="force_msaa_summary" msgid="9070437493586769500">"OpenGL ES 2.0 ਐਪਾਂ ਵਿੱਚ 4x MSAA ਨੂੰ ਚਾਲੂ ਕਰੋ"</string> <string name="show_non_rect_clip" msgid="7499758654867881817">"ਗੈਰ-ਆਇਤਾਕਾਰ ਕਲਿੱਪ ਓਪਰੇਸ਼ਨ ਡੀਬੱਗ ਕਰੋ"</string> <string name="track_frame_time" msgid="522674651937771106">"ਪ੍ਰੋਫਾਈਲ HWUI ਰੈਂਡਰਿੰਗ"</string> @@ -404,7 +404,7 @@ <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"ਐਪ ਵੱਲੋਂ ਵੈਧ ਚੈਨਲ ਤੋਂ ਬਿਨਾਂ ਸੂਚਨਾ ਪੋਸਟ ਕਰਨ \'ਤੇ ਸਕ੍ਰੀਨ \'ਤੇ ਚਿਤਾਵਨੀ ਦਿਖਾਉਂਦੀ ਹੈ"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"ਐਪਾਂ ਨੂੰ ਜ਼ਬਰਦਸਤੀ ਬਾਹਰੀ ਸਟੋਰੇਜ \'ਤੇ ਆਗਿਆ ਦਿਓ"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"ਮੈਨੀਫੈਸਟ ਮੁੱਲਾਂ ਦੀ ਪਰਵਾਹ ਕੀਤੇ ਬਿਨਾਂ, ਕਿਸੇ ਵੀ ਐਪ ਨੂੰ ਬਾਹਰੀ ਸਟੋਰੇਜ \'ਤੇ ਲਿਖਣ ਦੇ ਯੋਗ ਬਣਾਉਂਦੀ ਹੈ"</string> - <string name="force_resizable_activities" msgid="7143612144399959606">"ਆਕਾਰ ਬਦਲਣਯੋਗ ਬਣਾਉਣ ਲਈ ਸਰਗਰਮੀਆਂ \'ਤੇ ਜ਼ੋਰ ਦਿਓ"</string> + <string name="force_resizable_activities" msgid="7143612144399959606">"ਵਿੰਡੋ ਮੁਤਾਬਕ ਸਰਗਰਮੀਆਂ ਦਾ ਆਕਾਰ ਬਦਲ ਦਿਓ"</string> <string name="force_resizable_activities_summary" msgid="2490382056981583062">"ਮੈਨੀਫ਼ੈਸਟ ਮੁੱਲਾਂ ਦੀ ਪਰਵਾਹ ਕੀਤੇ ਬਿਨਾਂ, ਮਲਟੀ-ਵਿੰਡੋ ਲਈ ਸਾਰੀਆਂ ਸਰਗਰਮੀਆਂ ਨੂੰ ਆਕਾਰ ਬਦਲਣਯੋਗ ਬਣਾਓ।"</string> <string name="enable_freeform_support" msgid="7599125687603914253">"ਫ੍ਰੀਫਾਰਮ ਵਿੰਡੋਜ਼ ਨੂੰ ਚਾਲੂ ਕਰੋ"</string> <string name="enable_freeform_support_summary" msgid="1822862728719276331">"ਪ੍ਰਯੋਗਮਈ ਫ੍ਰੀਫਾਰਮ ਵਿੰਡੋਜ਼ ਲਈ ਸਮਰਥਨ ਨੂੰ ਚਾਲੂ ਕਰੋ।"</string> @@ -436,7 +436,7 @@ <string name="transcode_notification" msgid="5560515979793436168">"ਟ੍ਰਾਂਸਕੋਡਿੰਗ ਸੂਚਨਾਵਾਂ ਦਿਖਾਓ"</string> <string name="transcode_disable_cache" msgid="3160069309377467045">"ਟ੍ਰਾਂਸਕੋਡਿੰਗ ਕੈਸ਼ੇ ਬੰਦ ਕਰੋ"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"ਚੱਲ ਰਹੀਆਂ ਸੇਵਾਵਾਂ"</string> - <string name="runningservices_settings_summary" msgid="1046080643262665743">"ਇਸ ਵੇਲੇ ਚੱਲ ਰਹੀਆਂ ਸੇਵਾਵਾਂ ਦੇਖੋ ਅਤੇ ਇਹਨਾਂ ਨੂੰ ਕੰਟਰੋਲ ਕਰੋ"</string> + <string name="runningservices_settings_summary" msgid="1046080643262665743">"ਇਸ ਵੇਲੇ ਚੱਲ ਰਹੀਆਂ ਸੇਵਾਵਾਂ ਦੇਖੋ ਅਤੇ ਉਨ੍ਹਾਂ ਨੂੰ ਕੰਟਰੋਲ ਕਰੋ"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView ਅਮਲੀਕਰਨ"</string> <string name="select_webview_provider_dialog_title" msgid="2444261109877277714">"WebView ਅਮਲੀਕਰਨ ਸੈੱਟ ਕਰੋ"</string> <string name="select_webview_provider_toast_text" msgid="8512254949169359848">"ਇਹ ਚੋਣ ਹੁਣ ਵੈਧ ਨਹੀਂ ਹੈ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string> @@ -552,7 +552,7 @@ <string name="help_label" msgid="3528360748637781274">"ਮਦਦ ਅਤੇ ਵਿਚਾਰ"</string> <string name="storage_category" msgid="2287342585424631813">"ਸਟੋਰੇਜ"</string> <string name="shared_data_title" msgid="1017034836800864953">"ਸਾਂਝਾ ਕੀਤਾ ਡਾਟਾ"</string> - <string name="shared_data_summary" msgid="5516326713822885652">"ਸਾਂਝਾ ਕੀਤੇ ਡਾਟੇ ਨੂੰ ਦੇਖੋ ਅਤੇ ਸੋਧੋ"</string> + <string name="shared_data_summary" msgid="5516326713822885652">"ਸਾਂਝਾ ਕੀਤਾ ਡਾਟਾ ਦੇਖੋ ਅਤੇ ਉਸ ਨੂੰ ਸੋਧੋ"</string> <string name="shared_data_no_blobs_text" msgid="3108114670341737434">"ਇਸ ਵਰਤੋਂਕਾਰ ਲਈ ਕੋਈ ਸਾਂਝਾ ਕੀਤਾ ਡਾਟਾ ਨਹੀਂ ਹੈ।"</string> <string name="shared_data_query_failure_text" msgid="3489828881998773687">"ਸਾਂਝੇ ਕੀਤੇ ਡਾਟੇ ਨੂੰ ਪ੍ਰਾਪਤ ਕਰਨ ਵੇਲੇ ਕੋਈ ਗੜਬੜ ਹੋ ਗਈ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string> <string name="blob_id_text" msgid="8680078988996308061">"ਸਾਂਝਾ ਕੀਤੇ ਡਾਟੇ ਦੀ ਆਈਡੀ: <xliff:g id="BLOB_ID">%d</xliff:g>"</string> @@ -655,12 +655,8 @@ <string name="bt_le_audio_scan_qr_code" msgid="3521809854780392679">"QR ਕੋਡ ਸਕੈਨ ਕਰੋ"</string> <string name="bt_le_audio_scan_qr_code_scanner" msgid="4679500020630341107">"ਸੁਣਨਾ ਸ਼ੁਰੂ ਕਰਨ ਲਈ, ਹੇਠਾਂ ਦਿੱਤੇ QR ਕੋਡ ਨੂੰ ਕੇਂਦਰ ਵਿੱਚ ਰੱਖੋ"</string> <string name="bt_le_audio_qr_code_is_not_valid_format" msgid="6092191081849434734">"QR ਕੋਡ ਦਾ ਫਾਰਮੈਟ ਵੈਧ ਨਹੀਂ ਹੈ"</string> - <!-- no translation found for bt_le_audio_broadcast_dialog_title (5392738488989777074) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_sub_title (268234802198852753) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_switch_app (5749813313369517812) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_different_output (2638402023060391333) --> - <skip /> + <string name="bt_le_audio_broadcast_dialog_title" msgid="5392738488989777074">"ਕੀ <xliff:g id="APP_NAME">%1$s</xliff:g> ਦੇ ਪ੍ਰਸਾਰਨ ਨੂੰ ਰੋਕਣਾ ਹੈ?"</string> + <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="268234802198852753">"ਜੇ ਤੁਸੀਂ <xliff:g id="SWITCHAPP">%1$s</xliff:g> ਦਾ ਪ੍ਰਸਾਰਨ ਕਰਦੇ ਹੋ ਜਾਂ ਆਊਟਪੁੱਟ ਬਦਲਦੇ ਹੋ, ਤਾਂ ਤੁਹਾਡਾ ਮੌਜੂਦਾ ਪ੍ਰਸਾਰਨ ਰੁਕ ਜਾਵੇਗਾ"</string> + <string name="bt_le_audio_broadcast_dialog_switch_app" msgid="5749813313369517812">"<xliff:g id="SWITCHAPP">%1$s</xliff:g> ਦਾ ਪ੍ਰਸਾਰਨ ਕਰੋ"</string> + <string name="bt_le_audio_broadcast_dialog_different_output" msgid="2638402023060391333">"ਆਊਟਪੁੱਟ ਬਦਲੋ"</string> </resources> diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml index d523148de088..a72e4df7bb4c 100644 --- a/packages/SettingsLib/res/values-pl/strings.xml +++ b/packages/SettingsLib/res/values-pl/strings.xml @@ -389,7 +389,7 @@ <string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Warstwy debugowania GPU"</string> <string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Zezwalaj na ładowanie warstw debugowania GPU"</string> <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Włącz szczegółowe rejestrowanie dostawcy"</string> - <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Dołączaj do raportów o błędach dodatkowe dane dostawcy dotyczące konkretnego urządzenia, które mogą zawierać dane prywatne oraz wykorzystywać więcej baterii lub pamięci."</string> + <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Dołączaj do raportów o błędach dodatkowe dane dostawcy dotyczące konkretnego urządzenia, które mogą zawierać dane prywatne oraz wykorzystywać więcej baterii lub pamięci"</string> <string name="window_animation_scale_title" msgid="5236381298376812508">"Skala animacji okna"</string> <string name="transition_animation_scale_title" msgid="1278477690695439337">"Skala animacji przejścia"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Skala długości animacji"</string> diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml index 627d7ba7ac4b..cd7bbfebdfb0 100644 --- a/packages/SettingsLib/res/values-pt-rBR/strings.xml +++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml @@ -266,7 +266,7 @@ <string name="bugreport_in_power" msgid="8664089072534638709">"Atalho para relatório de bugs"</string> <string name="bugreport_in_power_summary" msgid="1885529649381831775">"Mostrar um botão para gerar relatórios de bugs no menu do botão liga/desliga"</string> <string name="keep_screen_on" msgid="1187161672348797558">"Permanecer ativo"</string> - <string name="keep_screen_on_summary" msgid="1510731514101925829">"A tela nunca entrará em suspensão enquanto estiver carregando"</string> + <string name="keep_screen_on_summary" msgid="1510731514101925829">"A tela nunca entra em suspensão enquanto está carregando"</string> <string name="bt_hci_snoop_log" msgid="7291287955649081448">"Ativar registro de rastreamento Bluetooth HCI"</string> <string name="bt_hci_snoop_log_summary" msgid="6808538971394092284">"Capturar pacotes de Bluetooth. Ative o Bluetooth depois de alterar essa configuração."</string> <string name="oem_unlock_enable" msgid="5334869171871566731">"Desbloqueio de OEM"</string> @@ -282,7 +282,7 @@ <string name="wifi_scan_throttling" msgid="2985624788509913617">"Limitar busca por Wi-Fi"</string> <string name="wifi_non_persistent_mac_randomization" msgid="7482769677894247316">"Ordem aleatória de MAC não persistente no Wi-Fi"</string> <string name="mobile_data_always_on" msgid="8275958101875563572">"Dados móveis sempre ativos"</string> - <string name="tethering_hardware_offload" msgid="4116053719006939161">"Aceleração de hardware de tethering"</string> + <string name="tethering_hardware_offload" msgid="4116053719006939161">"Aceleração de hardware para tethering"</string> <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Mostrar dispositivos Bluetooth sem nomes"</string> <string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Desativar volume absoluto"</string> <string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Ativar Gabeldorsche"</string> @@ -327,7 +327,7 @@ <string name="allow_mock_location_summary" msgid="179780881081354579">"Permitir locais fictícios"</string> <string name="debug_view_attributes" msgid="3539609843984208216">"Ativar visualização de inspeção de atributo"</string> <string name="mobile_data_always_on_summary" msgid="1112156365594371019">"Sempre manter dados móveis ativos, mesmo quando o Wi-Fi estiver ativado (para troca rápida de rede)"</string> - <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"Usar aceleração de hardware de tethering quando disponível"</string> + <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"Usar aceleração de hardware para tethering quando disponível"</string> <string name="adb_warning_title" msgid="7708653449506485728">"Permitir a depuração USB?"</string> <string name="adb_warning_message" msgid="8145270656419669221">"A depuração USB serve apenas para fins de desenvolvimento. Use-a para copiar dados entre o computador e o dispositivo, instalar apps no seu aparelho sem notificação e ler dados de registro."</string> <string name="adbwifi_warning_title" msgid="727104571653031865">"Permitir a depuração por Wi-Fi?"</string> diff --git a/packages/SettingsLib/res/values-pt-rPT/arrays.xml b/packages/SettingsLib/res/values-pt-rPT/arrays.xml index 6ae02a556eea..3e7ee052ba1c 100644 --- a/packages/SettingsLib/res/values-pt-rPT/arrays.xml +++ b/packages/SettingsLib/res/values-pt-rPT/arrays.xml @@ -56,7 +56,7 @@ <string-array name="hdcp_checking_summaries"> <item msgid="4045840870658484038">"Nunca utilizar a verificação HDCP"</item> <item msgid="8254225038262324761">"Utilizar a verificação HDCP para conteúdo DRM apenas"</item> - <item msgid="6421717003037072581">"Utilizar sempre a verificação HDCP"</item> + <item msgid="6421717003037072581">"Usar sempre a verificação HDCP"</item> </string-array> <string-array name="bt_hci_snoop_log_entries"> <item msgid="695678520785580527">"Desativado"</item> diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml index 98d65f5c6a5b..d4ef1039cada 100644 --- a/packages/SettingsLib/res/values-pt-rPT/strings.xml +++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml @@ -335,7 +335,7 @@ <string name="adb_keys_warning_message" msgid="2968555274488101220">"Revogar acesso à depuração USB de todos os computadores anteriormente autorizados?"</string> <string name="dev_settings_warning_title" msgid="8251234890169074553">"Permitir definições de programação?"</string> <string name="dev_settings_warning_message" msgid="37741686486073668">"Estas definições destinam-se apenas a programação. Podem fazer com que o seu aparelho e as aplicações nele existentes falhem ou funcionem mal."</string> - <string name="verify_apps_over_usb_title" msgid="6031809675604442636">"Verificar aplicações de USB"</string> + <string name="verify_apps_over_usb_title" msgid="6031809675604442636">"Verificar apps por USB"</string> <string name="verify_apps_over_usb_summary" msgid="1317933737581167839">"Verificar as aplicações instaladas via ADB/ADT para detetar comportamento perigoso"</string> <string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"São apresentados os dispositivos Bluetooth sem nomes (apenas endereços MAC)"</string> <string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"Desativa a funcionalidade de volume absoluto do Bluetooth caso existam problemas de volume com dispositivos remotos, como um volume insuportavelmente alto ou a ausência de controlo"</string> @@ -372,7 +372,7 @@ <string name="show_hw_layers_updates_summary" msgid="5850955890493054618">"Piscar camadas de hardware em verde ao atualizar"</string> <string name="debug_hw_overdraw" msgid="8944851091008756796">"Depurar sobreposição GPU"</string> <string name="disable_overlays" msgid="4206590799671557143">"Desativar sobreposições HW"</string> - <string name="disable_overlays_summary" msgid="1954852414363338166">"Utilizar sempre GPU para a composição do ecrã"</string> + <string name="disable_overlays_summary" msgid="1954852414363338166">"Usar sempre GPU para a composição do ecrã"</string> <string name="simulate_color_space" msgid="1206503300335835151">"Simular espaço da cor"</string> <string name="enable_opengl_traces_title" msgid="4638773318659125196">"Ativar vestígios OpenGL"</string> <string name="usb_audio_disable_routing" msgid="3367656923544254975">"Desativar encaminhamento áudio USB"</string> diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml index 627d7ba7ac4b..cd7bbfebdfb0 100644 --- a/packages/SettingsLib/res/values-pt/strings.xml +++ b/packages/SettingsLib/res/values-pt/strings.xml @@ -266,7 +266,7 @@ <string name="bugreport_in_power" msgid="8664089072534638709">"Atalho para relatório de bugs"</string> <string name="bugreport_in_power_summary" msgid="1885529649381831775">"Mostrar um botão para gerar relatórios de bugs no menu do botão liga/desliga"</string> <string name="keep_screen_on" msgid="1187161672348797558">"Permanecer ativo"</string> - <string name="keep_screen_on_summary" msgid="1510731514101925829">"A tela nunca entrará em suspensão enquanto estiver carregando"</string> + <string name="keep_screen_on_summary" msgid="1510731514101925829">"A tela nunca entra em suspensão enquanto está carregando"</string> <string name="bt_hci_snoop_log" msgid="7291287955649081448">"Ativar registro de rastreamento Bluetooth HCI"</string> <string name="bt_hci_snoop_log_summary" msgid="6808538971394092284">"Capturar pacotes de Bluetooth. Ative o Bluetooth depois de alterar essa configuração."</string> <string name="oem_unlock_enable" msgid="5334869171871566731">"Desbloqueio de OEM"</string> @@ -282,7 +282,7 @@ <string name="wifi_scan_throttling" msgid="2985624788509913617">"Limitar busca por Wi-Fi"</string> <string name="wifi_non_persistent_mac_randomization" msgid="7482769677894247316">"Ordem aleatória de MAC não persistente no Wi-Fi"</string> <string name="mobile_data_always_on" msgid="8275958101875563572">"Dados móveis sempre ativos"</string> - <string name="tethering_hardware_offload" msgid="4116053719006939161">"Aceleração de hardware de tethering"</string> + <string name="tethering_hardware_offload" msgid="4116053719006939161">"Aceleração de hardware para tethering"</string> <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Mostrar dispositivos Bluetooth sem nomes"</string> <string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Desativar volume absoluto"</string> <string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Ativar Gabeldorsche"</string> @@ -327,7 +327,7 @@ <string name="allow_mock_location_summary" msgid="179780881081354579">"Permitir locais fictícios"</string> <string name="debug_view_attributes" msgid="3539609843984208216">"Ativar visualização de inspeção de atributo"</string> <string name="mobile_data_always_on_summary" msgid="1112156365594371019">"Sempre manter dados móveis ativos, mesmo quando o Wi-Fi estiver ativado (para troca rápida de rede)"</string> - <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"Usar aceleração de hardware de tethering quando disponível"</string> + <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"Usar aceleração de hardware para tethering quando disponível"</string> <string name="adb_warning_title" msgid="7708653449506485728">"Permitir a depuração USB?"</string> <string name="adb_warning_message" msgid="8145270656419669221">"A depuração USB serve apenas para fins de desenvolvimento. Use-a para copiar dados entre o computador e o dispositivo, instalar apps no seu aparelho sem notificação e ler dados de registro."</string> <string name="adbwifi_warning_title" msgid="727104571653031865">"Permitir a depuração por Wi-Fi?"</string> diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml index c38bd788395a..e6b18322baac 100644 --- a/packages/SettingsLib/res/values-ro/strings.xml +++ b/packages/SettingsLib/res/values-ro/strings.xml @@ -403,7 +403,7 @@ <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Afișați avertismentele de pe canalul de notificări"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Afișați avertisment pe ecran când o aplicație postează o notificare fără canal valid"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Forțați accesul aplicațiilor la stocarea externă"</string> - <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Faceți ca orice aplicație eligibilă să fie scrisă în stocarea externă, indiferent de valorile manifestului"</string> + <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Permiteți scrierea oricărei aplicații eligibile în stocarea externă, indiferent de valorile manifestului"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Forțați redimensionarea activităților"</string> <string name="force_resizable_activities_summary" msgid="2490382056981583062">"Permiteți redimensionarea tuturor activităților pentru modul cu ferestre multiple, indiferent de valorile manifestului."</string> <string name="enable_freeform_support" msgid="7599125687603914253">"Activați ferestrele cu formă liberă"</string> diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml index 2d7ed111d8ac..6b74d5bb5096 100644 --- a/packages/SettingsLib/res/values-ru/strings.xml +++ b/packages/SettingsLib/res/values-ru/strings.xml @@ -233,10 +233,10 @@ <string name="tethering_settings_not_available" msgid="266821736434699780">"Этот пользователь не может изменять настройки режима модема"</string> <string name="apn_settings_not_available" msgid="1147111671403342300">"Этот пользователь не может изменять настройки точки доступа"</string> <string name="enable_adb" msgid="8072776357237289039">"Отладка по USB"</string> - <string name="enable_adb_summary" msgid="3711526030096574316">"Включить режим отладки при подключении к компьютеру по USB"</string> - <string name="clear_adb_keys" msgid="3010148733140369917">"Отозвать доступ для USB-отладки"</string> + <string name="enable_adb_summary" msgid="3711526030096574316">"Режим отладки при подключении по USB"</string> + <string name="clear_adb_keys" msgid="3010148733140369917">"Отозвать доступ для отладки по USB"</string> <string name="enable_adb_wireless" msgid="6973226350963971018">"Отладка по Wi-Fi"</string> - <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"Режим отладки при подключении к сети Wi‑Fi"</string> + <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"Режим отладки при подключении по Wi‑Fi"</string> <string name="adb_wireless_error" msgid="721958772149779856">"Ошибка"</string> <string name="adb_wireless_settings" msgid="2295017847215680229">"Отладка по Wi-Fi"</string> <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Чтобы увидеть и использовать доступные устройства, включите отладку по Wi-Fi."</string> @@ -281,7 +281,7 @@ <string name="wifi_verbose_logging" msgid="1785910450009679371">"Подробный журнал Wi‑Fi"</string> <string name="wifi_scan_throttling" msgid="2985624788509913617">"Ограничивать поиск сетей Wi‑Fi"</string> <string name="wifi_non_persistent_mac_randomization" msgid="7482769677894247316">"Случайные MAC-адреса в сети Wi-Fi"</string> - <string name="mobile_data_always_on" msgid="8275958101875563572">"Не отключать мобильный Интернет"</string> + <string name="mobile_data_always_on" msgid="8275958101875563572">"Не отключать мобильный интернет"</string> <string name="tethering_hardware_offload" msgid="4116053719006939161">"Аппаратное ускорение в режиме модема"</string> <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Показывать Bluetooth-устройства без названий"</string> <string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Отключить абсолютный уровень громкости"</string> @@ -312,7 +312,7 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Показывать параметры сертификации беспроводных мониторов"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Вести подробный журнал, показывать RSSI для каждого SSID при выборе сети"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Уменьшает расход заряда батареи и улучшает работу сети"</string> - <string name="wifi_non_persistent_mac_randomization_summary" msgid="2159794543105053930">"Если этот режим активирован, MAC-адрес устройства может меняться при каждом подключении к сети, в которой возможно создание случайных MAC-адресов."</string> + <string name="wifi_non_persistent_mac_randomization_summary" msgid="2159794543105053930">"Если этот режим активирован, MAC-адрес устройства может меняться при каждом подключении к сети, в которой возможно создание случайных MAC-адресов"</string> <string name="wifi_metered_label" msgid="8737187690304098638">"Сеть с тарификацией трафика"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Сеть без тарификации трафика"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Размер буфера журнала"</string> @@ -380,7 +380,7 @@ <string name="debug_layout" msgid="1659216803043339741">"Показывать границы элементов"</string> <string name="debug_layout_summary" msgid="8825829038287321978">"Показывать границы обрезки, поля и т. п."</string> <string name="force_rtl_layout_all_locales" msgid="8690762598501599796">"Отразить интерфейс"</string> - <string name="force_rtl_layout_all_locales_summary" msgid="6663016859517239880">"Принудительно расположить элементы интерфейса справа налево во всех локалях"</string> + <string name="force_rtl_layout_all_locales_summary" msgid="6663016859517239880">"Принудительно расположить элементы интерфейса справа налево вне зависимости от региональных настроек"</string> <string name="window_blurs" msgid="6831008984828425106">"Размытие на уровне окон"</string> <string name="force_msaa" msgid="4081288296137775550">"Включить 4x MSAA"</string> <string name="force_msaa_summary" msgid="9070437493586769500">"Включить 4x MSAA в приложениях OpenGL ES 2.0"</string> @@ -448,7 +448,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Протаномалия (красный/зеленый)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Тританомалия (синий/желтый)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Коррекция цвета"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="1522101114585266455">"Коррекция цвета поможет вам:<br/> <ol> <li>&nbsp;Добиться нужной цветопередачи.</li> <li>&nbsp;Убрать цвета, которые мешают сосредоточиться.</li> </ol>"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="1522101114585266455">"Коррекция цвета поможет вам:<br/> <ol> <li>&nbsp;Добиться нужной цветопередачи.</li> <li>&nbsp;Включить черно-белый режим, чтобы меньше отвлекаться.</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Новая настройка: <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"Уровень заряда – <xliff:g id="PERCENTAGE">%1$s</xliff:g>. <xliff:g id="TIME_STRING">%2$s</xliff:g>."</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"Заряда хватит примерно на <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> @@ -553,7 +553,7 @@ <string name="storage_category" msgid="2287342585424631813">"Хранилище"</string> <string name="shared_data_title" msgid="1017034836800864953">"Общие данные"</string> <string name="shared_data_summary" msgid="5516326713822885652">"Просмотр и изменение общих данных"</string> - <string name="shared_data_no_blobs_text" msgid="3108114670341737434">"Нет общих данных для этого пользователя."</string> + <string name="shared_data_no_blobs_text" msgid="3108114670341737434">"Для этого пользователя нет общих данных"</string> <string name="shared_data_query_failure_text" msgid="3489828881998773687">"При получении общих данных произошла ошибка. Повторите попытку."</string> <string name="blob_id_text" msgid="8680078988996308061">"Идентификатор общих данных: <xliff:g id="BLOB_ID">%d</xliff:g>"</string> <string name="blob_expires_text" msgid="7882727111491739331">"Срок действия истекает <xliff:g id="DATE">%s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml index d5dd6c534c67..fd2406e53830 100644 --- a/packages/SettingsLib/res/values-sk/strings.xml +++ b/packages/SettingsLib/res/values-sk/strings.xml @@ -173,9 +173,9 @@ <string name="data_usage_uninstalled_apps" msgid="1933665711856171491">"Odstránené aplikácie"</string> <string name="data_usage_uninstalled_apps_users" msgid="5533981546921913295">"Odstránené aplikácie a používatelia"</string> <string name="data_usage_ota" msgid="7984667793701597001">"Aktualizácie systému"</string> - <string name="tether_settings_title_usb" msgid="3728686573430917722">"Pripojenie cez USB"</string> + <string name="tether_settings_title_usb" msgid="3728686573430917722">"Tethering cez USB"</string> <string name="tether_settings_title_wifi" msgid="4803402057533895526">"Prenosný prístupový bod"</string> - <string name="tether_settings_title_bluetooth" msgid="916519902721399656">"Pripojenie cez Bluetooth"</string> + <string name="tether_settings_title_bluetooth" msgid="916519902721399656">"Tethering cez Bluetooth"</string> <string name="tether_settings_title_usb_bluetooth" msgid="1727111807207577322">"Zdieľané pripojenie"</string> <string name="tether_settings_title_all" msgid="8910259483383010470">"Zdieľané pripojenie a prenosný hotspot"</string> <string name="managed_user_title" msgid="449081789742645723">"Všetky pracovné aplikácie"</string> diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml index a609ab83a049..c413bee673c9 100644 --- a/packages/SettingsLib/res/values-sl/strings.xml +++ b/packages/SettingsLib/res/values-sl/strings.xml @@ -655,12 +655,8 @@ <string name="bt_le_audio_scan_qr_code" msgid="3521809854780392679">"Optično branje kode QR"</string> <string name="bt_le_audio_scan_qr_code_scanner" msgid="4679500020630341107">"Če želite začeti poslušati, postavite spodnjo kodo QR na sredino."</string> <string name="bt_le_audio_qr_code_is_not_valid_format" msgid="6092191081849434734">"Koda QR nima pravilne oblike zapisa."</string> - <!-- no translation found for bt_le_audio_broadcast_dialog_title (5392738488989777074) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_sub_title (268234802198852753) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_switch_app (5749813313369517812) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_different_output (2638402023060391333) --> - <skip /> + <string name="bt_le_audio_broadcast_dialog_title" msgid="5392738488989777074">"Želite ustaviti oddajanje aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> + <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="268234802198852753">"Če oddajate aplikacijo <xliff:g id="SWITCHAPP">%1$s</xliff:g> ali spremenite izhod, bo trenutno oddajanje ustavljeno."</string> + <string name="bt_le_audio_broadcast_dialog_switch_app" msgid="5749813313369517812">"Oddajaj aplikacijo <xliff:g id="SWITCHAPP">%1$s</xliff:g>"</string> + <string name="bt_le_audio_broadcast_dialog_different_output" msgid="2638402023060391333">"Sprememba izhoda"</string> </resources> diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml index 9a5d1eebbfe2..e1bb76631322 100644 --- a/packages/SettingsLib/res/values-ta/strings.xml +++ b/packages/SettingsLib/res/values-ta/strings.xml @@ -233,7 +233,7 @@ <string name="tethering_settings_not_available" msgid="266821736434699780">"இவரால் இணைப்புமுறை அமைப்புகளை மாற்ற முடியாது"</string> <string name="apn_settings_not_available" msgid="1147111671403342300">"இவரால் ஆக்சஸ் பாயிண்ட் நேம் அமைப்புகளை மாற்ற முடியாது"</string> <string name="enable_adb" msgid="8072776357237289039">"USB பிழைதிருத்தம்"</string> - <string name="enable_adb_summary" msgid="3711526030096574316">"USB இணைக்கப்பட்டிருக்கும்போது பிழைத்திருத்தப் பயன்முறையை அமை"</string> + <string name="enable_adb_summary" msgid="3711526030096574316">"USB இணைக்கப்பட்டிருக்கும்போது பிழைத்திருத்தப் பயன்முறை இயக்கப்படும்"</string> <string name="clear_adb_keys" msgid="3010148733140369917">"USB பிழைத்திருத்த அங்கீகரிப்புகளை நிராகரி"</string> <string name="enable_adb_wireless" msgid="6973226350963971018">"வைஃபை பிழைதிருத்தம்"</string> <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"வைஃபையை இணைக்கும்போது பிழைதிருத்தப் பயன்முறை இயக்கப்படும்"</string> @@ -309,8 +309,8 @@ <string name="private_dns_mode_provider" msgid="3619040641762557028">"தனிப்பட்ட DNS வழங்குநரின் ஹோஸ்ட் பெயர்"</string> <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"DNS வழங்குநரின் ஹோஸ்ட் பெயரை உள்ளிடவும்"</string> <string name="private_dns_mode_provider_failure" msgid="8356259467861515108">"இணைக்க முடியவில்லை"</string> - <string name="wifi_display_certification_summary" msgid="8111151348106907513">"வயர்லெஸ் காட்சி சான்றுக்கான விருப்பங்களைக் காட்டு"</string> - <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"வைஃபை நுழைவு அளவை அதிகரித்து, வைஃபை தேர்வுக் கருவியில் ஒவ்வொன்றிற்கும் SSID RSSI ஐ காட்டுக"</string> + <string name="wifi_display_certification_summary" msgid="8111151348106907513">"வயர்லெஸ் காட்சி சான்றுக்கான விருப்பங்களைக் காட்டும்"</string> + <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"வைஃபை நுழைவு அளவை அதிகரித்து, வைஃபை தேர்வுக் கருவியில் ஒவ்வொன்றிற்கும் SSID RSSI ஐ காட்டும்"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"பேட்டரி தீர்ந்துபோவதைக் குறைத்து நெட்வொர்க்கின் செயல்திறனை மேம்படுத்தும்"</string> <string name="wifi_non_persistent_mac_randomization_summary" msgid="2159794543105053930">"இந்தப் பயன்முறை இயக்கப்பட்டிருக்கும்போது இந்தச் சாதனத்தின் MAC முகவரி ஒவ்வொரு முறை \'MAC முகவரியை ரேண்டம் ஆக்குதல்\' இயக்கப்பட்டிருக்கும் நெட்வொர்க்குடன் இணைக்கப்படும்போதும் மாறக்கூடும்."</string> <string name="wifi_metered_label" msgid="8737187690304098638">"கட்டண நெட்வொர்க்"</string> @@ -347,7 +347,7 @@ <string name="hdcp_checking_dialog_title" msgid="7691060297616217781">"HDCP சரிபார்க்கும் செயல்பாடுகளை அமை"</string> <string name="debug_debugging_category" msgid="535341063709248842">"பிழைதிருத்தம்"</string> <string name="debug_app" msgid="8903350241392391766">"பிழைத்திருத்தப் பயன்பாட்டைத் தேர்ந்தெடுக்கவும்"</string> - <string name="debug_app_not_set" msgid="1934083001283807188">"பிழைத்திருத்தப் ஆப்ஸ் அமைக்கப்படவில்லை"</string> + <string name="debug_app_not_set" msgid="1934083001283807188">"பிழைத்திருத்த ஆப்ஸ் அமைக்கப்படவில்லை"</string> <string name="debug_app_set" msgid="6599535090477753651">"பிழைதிருத்தும் ஆப்ஸ்: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="select_application" msgid="2543228890535466325">"பயன்பாட்டைத் தேர்ந்தெடுக்கவும்"</string> <string name="no_application" msgid="9038334538870247690">"ஒன்றுமில்லை"</string> @@ -359,28 +359,28 @@ <string name="media_category" msgid="8122076702526144053">"மீடியா"</string> <string name="debug_monitoring_category" msgid="1597387133765424994">"கண்காணி"</string> <string name="strict_mode" msgid="889864762140862437">"நிலையான பயன்முறை இயக்கப்பட்டது"</string> - <string name="strict_mode_summary" msgid="1838248687233554654">"முக்கியத் தொடரிழையில் நீண்ட நேரம் செயல்படும்போது திரையைக் காட்சிப்படுத்து"</string> + <string name="strict_mode_summary" msgid="1838248687233554654">"முக்கியத் தொடரிழையில் நீண்ட நேரம் செயல்படும்போது திரையைக் காட்சிப்படுத்தும்"</string> <string name="pointer_location" msgid="7516929526199520173">"குறிப்பான் இடம்"</string> <string name="pointer_location_summary" msgid="957120116989798464">"திரையின் மேல் அடுக்கானது தற்போது தொடப்பட்டிருக்கும் தரவைக் காண்பிக்கிறது"</string> <string name="show_touches" msgid="8437666942161289025">"தட்டல்களைக் காட்டு"</string> - <string name="show_touches_summary" msgid="3692861665994502193">"தட்டல்களின் போது காட்சி அறிகுறிகளைக் காட்டு"</string> + <string name="show_touches_summary" msgid="3692861665994502193">"தட்டல்களின் போது காட்சி அறிகுறிகளைக் காட்டும்"</string> <string name="show_screen_updates" msgid="2078782895825535494">"மேலோட்ட புதுப்பிப்புகளைக் காட்டு"</string> - <string name="show_screen_updates_summary" msgid="2126932969682087406">"சாளரத்தின் பரப்புநிலைகள் புதுப்பிக்கப்படும்போது, அவற்றை முழுவதுமாகக் காட்டு"</string> + <string name="show_screen_updates_summary" msgid="2126932969682087406">"சாளரத்தின் பரப்புநிலைகள் புதுப்பிக்கப்படும்போது, அவற்றை முழுவதுமாகக் காட்டும்"</string> <string name="show_hw_screen_updates" msgid="2021286231267747506">"வியூ அப்டேட்ஸைக் காட்டு"</string> - <string name="show_hw_screen_updates_summary" msgid="3539770072741435691">"வரையும்போது, சாளரங்களில் காட்சிகளைக் காட்டு"</string> + <string name="show_hw_screen_updates_summary" msgid="3539770072741435691">"வரையும்போது, சாளரங்களில் காட்சிகளைக் காட்டும்"</string> <string name="show_hw_layers_updates" msgid="5268370750002509767">"வன்பொருள் லேயர்களின் புதுப்பிப்புகளைக் காட்டு"</string> - <string name="show_hw_layers_updates_summary" msgid="5850955890493054618">"வன்பொருள் லேயர்களைப் புதுப்பிக்கும்போது, அவற்றைப் பச்சை நிறத்தில் காட்டு"</string> + <string name="show_hw_layers_updates_summary" msgid="5850955890493054618">"வன்பொருள் லேயர்களைப் புதுப்பிக்கும்போது, அவற்றைப் பச்சை நிறத்தில் காட்டும்"</string> <string name="debug_hw_overdraw" msgid="8944851091008756796">"GPU ஓவர்டிரா பிழைதிருத்து"</string> <string name="disable_overlays" msgid="4206590799671557143">"HW மேலடுக்குகளை முடக்கு"</string> <string name="disable_overlays_summary" msgid="1954852414363338166">"திரைத் தொகுத்தலுக்கு எப்போதும் GPU ஐப் பயன்படுத்து"</string> <string name="simulate_color_space" msgid="1206503300335835151">"வண்ணத்தின் இடைவெளியை உருவகப்படுத்து"</string> <string name="enable_opengl_traces_title" msgid="4638773318659125196">"OpenGL தடயங்களை இயக்கு"</string> <string name="usb_audio_disable_routing" msgid="3367656923544254975">"USB ஆடியோ ரூட்டிங்கை முடக்கு"</string> - <string name="usb_audio_disable_routing_summary" msgid="8768242894849534699">"USB ஆடியோ உபகரணத்திற்கு தன்னியக்க ரூட்டிங்கை முடக்கு"</string> + <string name="usb_audio_disable_routing_summary" msgid="8768242894849534699">"USB ஆடியோ உபகரணத்திற்கு தன்னியக்க ரூட்டிங்கை முடக்கும்"</string> <string name="debug_layout" msgid="1659216803043339741">"தளவமைப்பு எல்லைகளைக் காட்டு"</string> <string name="debug_layout_summary" msgid="8825829038287321978">"கிளிப் எல்லைகள், ஓரங்கள், மேலும் பலவற்றைக் காட்டு"</string> <string name="force_rtl_layout_all_locales" msgid="8690762598501599796">"RTL தளவமைப்பின் திசையை வலியுறுத்து"</string> - <string name="force_rtl_layout_all_locales_summary" msgid="6663016859517239880">"எல்லா மொழிகளுக்கும் திரையின் தளவமைப்பு திசையை RTL க்கு மாற்று"</string> + <string name="force_rtl_layout_all_locales_summary" msgid="6663016859517239880">"எல்லா மொழிகளுக்கும் திரையின் தளவமைப்பு திசையை RTL க்கு மாற்றும்"</string> <string name="window_blurs" msgid="6831008984828425106">"திரை-நிலை மங்கலை அனுமதி"</string> <string name="force_msaa" msgid="4081288296137775550">"4x MSAA ஐ வலியுறுத்து"</string> <string name="force_msaa_summary" msgid="9070437493586769500">"OpenGL ES 2.0 பயன்பாடுகளில் 4x MSAA ஐ இயக்கு"</string> @@ -396,7 +396,7 @@ <string name="overlay_display_devices_title" msgid="5411894622334469607">"இரண்டாம்நிலைக் காட்சிகளை உருவகப்படுத்து"</string> <string name="debug_applications_category" msgid="5394089406638954196">"ஆப்ஸ்"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"செயல்பாடுகளை வைத்திருக்காதே"</string> - <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"பயனர் வெளியேறியதும் செயல்பாடுகளை நீக்கு"</string> + <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"பயனர் வெளியேறியதும் செயல்பாடுகளை நீக்கும்"</string> <string name="app_process_limit_title" msgid="8361367869453043007">"பின்புலச் செயல்முறை வரம்பு"</string> <string name="show_all_anrs" msgid="9160563836616468726">"பின்புல ANRகளைக் காட்டு"</string> <string name="show_all_anrs_summary" msgid="8562788834431971392">"பின்புல ஆப்ஸுக்கு, ஆப்ஸ் பதிலளிக்கவில்லை என்ற செய்தியைக் காட்டும்"</string> diff --git a/packages/SettingsLib/res/values-te/arrays.xml b/packages/SettingsLib/res/values-te/arrays.xml index bca00c222c98..52554e216436 100644 --- a/packages/SettingsLib/res/values-te/arrays.xml +++ b/packages/SettingsLib/res/values-te/arrays.xml @@ -192,7 +192,7 @@ <string-array name="window_animation_scale_entries"> <item msgid="2675263395797191850">"యానిమేషన్ ఆఫ్లో ఉంది"</item> <item msgid="5790132543372767872">"యానిమేషన్ ప్రమాణం .5x"</item> - <item msgid="2529692189302148746">"యానిమేషన్ ప్రమాణం 1x"</item> + <item msgid="2529692189302148746">"యానిమేషన్ స్కేల్ 1x"</item> <item msgid="8072785072237082286">"యానిమేషన్ ప్రమాణం 1.5x"</item> <item msgid="3531560925718232560">"యానిమేషన్ ప్రమాణం 2x"</item> <item msgid="4542853094898215187">"యానిమేషన్ ప్రమాణం 5x"</item> @@ -201,7 +201,7 @@ <string-array name="transition_animation_scale_entries"> <item msgid="3376676813923486384">"యానిమేషన్ ఆఫ్లో ఉంది"</item> <item msgid="753422683600269114">"యానిమేషన్ ప్రమాణం .5x"</item> - <item msgid="3695427132155563489">"యానిమేషన్ ప్రమాణం 1x"</item> + <item msgid="3695427132155563489">"యానిమేషన్ స్కేల్ 1x"</item> <item msgid="9032615844198098981">"యానిమేషన్ ప్రమాణం 1.5x"</item> <item msgid="8473868962499332073">"యానిమేషన్ ప్రమాణం 2x"</item> <item msgid="4403482320438668316">"యానిమేషన్ ప్రమాణం 5x"</item> @@ -210,7 +210,7 @@ <string-array name="animator_duration_scale_entries"> <item msgid="6416998593844817378">"యానిమేషన్ ఆఫ్లో ఉంది"</item> <item msgid="875345630014338616">"యానిమేషన్ ప్రమాణం .5x"</item> - <item msgid="2753729231187104962">"యానిమేషన్ ప్రమాణం 1x"</item> + <item msgid="2753729231187104962">"యానిమేషన్ స్కేల్ 1x"</item> <item msgid="1368370459723665338">"యానిమేషన్ ప్రమాణం 1.5x"</item> <item msgid="5768005350534383389">"యానిమేషన్ ప్రమాణం 2x"</item> <item msgid="3728265127284005444">"యానిమేషన్ ప్రమాణం 5x"</item> diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml index 97bd52e6de83..41db0cc7ba63 100644 --- a/packages/SettingsLib/res/values-te/strings.xml +++ b/packages/SettingsLib/res/values-te/strings.xml @@ -282,7 +282,7 @@ <string name="wifi_scan_throttling" msgid="2985624788509913617">"Wi‑Fi స్కాన్ కుదింపు"</string> <string name="wifi_non_persistent_mac_randomization" msgid="7482769677894247316">"Wi‑Fi నిరంతరం కాని MAC ర్యాండమైజేషన్"</string> <string name="mobile_data_always_on" msgid="8275958101875563572">"మొబైల్ డేటాని ఎల్లప్పుడూ యాక్టివ్గా ఉంచు"</string> - <string name="tethering_hardware_offload" msgid="4116053719006939161">"టెథెరింగ్ హార్డ్వేర్ వేగవృద్ధి"</string> + <string name="tethering_hardware_offload" msgid="4116053719006939161">"టెథెరింగ్ హార్డ్వేర్ యాగ్జిలరేషన్"</string> <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"పేర్లు లేని బ్లూటూత్ పరికరాలు చూపించు"</string> <string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"సంపూర్ణ వాల్యూమ్ను డిజేబుల్ చేయి"</string> <string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Gabeldorscheను ఎనేబుల్ చేయి"</string> @@ -310,7 +310,7 @@ <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"DNS ప్రొవైడర్ హోస్ట్పేరును ఎంటర్ చేయండి"</string> <string name="private_dns_mode_provider_failure" msgid="8356259467861515108">"కనెక్ట్ చేయడం సాధ్యపడలేదు"</string> <string name="wifi_display_certification_summary" msgid="8111151348106907513">"వైర్లెస్ డిస్ప్లే సర్టిఫికేషన్ ఆప్షన్లను చూపు"</string> - <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Wi‑Fi ఎంపికలో SSID RSSI ప్రకారం చూపబడే Wi‑Fi లాగింగ్ స్థాయిని పెంచండి"</string> + <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Wi‑Fi పికర్లో SSID RSSI ప్రకారం చూపబడే Wi‑Fi లాగింగ్ స్థాయిని పెంచండి"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"బ్యాటరీ శక్తి వినియోగాన్ని తగ్గించి & నెట్వర్క్ పనితీరును మెరుగుపరుస్తుంది"</string> <string name="wifi_non_persistent_mac_randomization_summary" msgid="2159794543105053930">"ఈ మోడ్ ఎనేబుల్ అయ్యాక, MAC ర్యాండమైజేషన్ను ఎనేబుల్ చేసిన నెట్వర్క్తో కనెక్ట్ అయ్యే ప్రతిసారీ ఈ పరికరం MAC అడ్రస్ను మారవచ్చు."</string> <string name="wifi_metered_label" msgid="8737187690304098638">"గణించబడుతోంది"</string> @@ -327,7 +327,7 @@ <string name="allow_mock_location_summary" msgid="179780881081354579">"డమ్మీ లొకేషన్లను అనుమతించండి"</string> <string name="debug_view_attributes" msgid="3539609843984208216">"వీక్షణ అట్రిబ్యూట్ పర్యవేక్షణను ఎనేబుల్ చేయి"</string> <string name="mobile_data_always_on_summary" msgid="1112156365594371019">"ఎల్లప్పుడూ మొబైల్ డేటాను యాక్టివ్గా ఉంచు, Wi‑Fi యాక్టివ్గా ఉన్నా కూడా (వేగవంతమైన నెట్వర్క్ మార్పు కోసం)."</string> - <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"అందుబాటులో ఉంటే టెథెరింగ్ హార్డ్వేర్ వేగవృద్ధిని ఉపయోగించండి"</string> + <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"అందుబాటులో ఉంటే గనుక టెథెరింగ్ హార్డ్వేర్ యాగ్జిలరేషన్ను ఉపయోగించండి"</string> <string name="adb_warning_title" msgid="7708653449506485728">"USB డీబగ్గింగ్ను అనుమతించాలా?"</string> <string name="adb_warning_message" msgid="8145270656419669221">"USB డీబగ్గింగ్ అనేది అభివృద్ధి ప్రయోజనాల కోసం మాత్రమే ఉద్దేశించబడింది. మీ కంప్యూటర్ మరియు మీ పరికరం మధ్య డేటాను కాపీ చేయడానికి, నోటిఫికేషన్ లేకుండా మీ పరికరంలో యాప్లను ఇన్స్టాల్ చేయడానికి మరియు లాగ్ డేటాను చదవడానికి దీన్ని ఉపయోగించండి."</string> <string name="adbwifi_warning_title" msgid="727104571653031865">"వైర్లెస్ డీబగ్గింగ్ను అనుమతించాలా?"</string> @@ -352,20 +352,20 @@ <string name="select_application" msgid="2543228890535466325">"యాప్ను ఎంచుకోండి"</string> <string name="no_application" msgid="9038334538870247690">"ఏదీ వద్దు"</string> <string name="wait_for_debugger" msgid="7461199843335409809">"డీబగ్గర్ కోసం వేచి ఉండండి"</string> - <string name="wait_for_debugger_summary" msgid="6846330006113363286">"డీబగ్ చేయబడిన యాప్ అమలు కావడానికి ముందు జోడించాల్సిన డీబగ్గర్ కోసం వేచి ఉంటుంది"</string> + <string name="wait_for_debugger_summary" msgid="6846330006113363286">"డీబగ్ చేయబడిన యాప్, ఎగ్జిక్యూట్ కావడానికి ముందు జోడించాల్సిన డీబగ్గర్ కోసం వేచి ఉంటుంది"</string> <string name="debug_input_category" msgid="7349460906970849771">"ఇన్పుట్"</string> <string name="debug_drawing_category" msgid="5066171112313666619">"డ్రాయింగ్"</string> - <string name="debug_hw_drawing_category" msgid="5830815169336975162">"హార్డ్వేర్తో వేగవంతమైన రెండరింగ్"</string> + <string name="debug_hw_drawing_category" msgid="5830815169336975162">"హార్డ్వేర్ యాగ్జిలరేషన్ ఆధారిత రెండరింగ్"</string> <string name="media_category" msgid="8122076702526144053">"మీడియా"</string> <string name="debug_monitoring_category" msgid="1597387133765424994">"పర్యవేక్షణ"</string> <string name="strict_mode" msgid="889864762140862437">"ఖచ్చితమైన మోడ్ ప్రారంభించబడింది"</string> <string name="strict_mode_summary" msgid="1838248687233554654">"యాప్లు ప్రధాన థ్రెడ్లో సుదీర్ఘ చర్యలు చేసేటప్పుడు స్క్రీన్ను ఫ్లాష్ చేయండి"</string> <string name="pointer_location" msgid="7516929526199520173">"పాయింటర్ లొకేషన్"</string> - <string name="pointer_location_summary" msgid="957120116989798464">"ప్రస్తుత స్పర్శ డేటాను చూపుతోన్న స్క్రీన్"</string> + <string name="pointer_location_summary" msgid="957120116989798464">"ప్రస్తుత టచ్ డేటాను చూపుతోన్న స్క్రీన్"</string> <string name="show_touches" msgid="8437666942161289025">"నొక్కినవి చూపు"</string> <string name="show_touches_summary" msgid="3692861665994502193">"నొక్కినప్పుడు దృశ్యపరమైన ప్రతిస్పందన చూపు"</string> - <string name="show_screen_updates" msgid="2078782895825535494">"సర్ఫేస్ అప్డేట్లను చూపండి"</string> - <string name="show_screen_updates_summary" msgid="2126932969682087406">"పూర్తి విండో ఉపరితలాలు అప్డేట్ చేయబడినప్పుడు వాటిని ఫ్లాష్ చేయండి"</string> + <string name="show_screen_updates" msgid="2078782895825535494">"సర్ఫేస్ అప్డేట్లను చూపు"</string> + <string name="show_screen_updates_summary" msgid="2126932969682087406">"విండో సర్ఫేస్లన్నీ అప్డేట్ అయితే ఫ్లాష్ చేయి"</string> <string name="show_hw_screen_updates" msgid="2021286231267747506">"వీక్షణ అప్డేట్లను చూపు"</string> <string name="show_hw_screen_updates_summary" msgid="3539770072741435691">"గీసినప్పుడు విండోల లోపల వీక్షణలను ఫ్లాష్ చేయి"</string> <string name="show_hw_layers_updates" msgid="5268370750002509767">"హార్డ్వేర్ లేయర్ల అప్డేట్లను చూపు"</string> @@ -373,16 +373,16 @@ <string name="debug_hw_overdraw" msgid="8944851091008756796">"GPU ఓవర్డ్రాను డీబగ్ చేయండి"</string> <string name="disable_overlays" msgid="4206590799671557143">"డిజేబుల్- HW ఓవర్లేలు"</string> <string name="disable_overlays_summary" msgid="1954852414363338166">"స్క్రీన్ కంపాజిటింగ్కు ఎల్లప్పుడూ GPUని ఉపయోగించు"</string> - <string name="simulate_color_space" msgid="1206503300335835151">"వివిధ రంగులను అనుకరించు"</string> + <string name="simulate_color_space" msgid="1206503300335835151">"రంగులను సిమ్యులేట్ చేయి"</string> <string name="enable_opengl_traces_title" msgid="4638773318659125196">"OpenGL ట్రేస్లను ప్రారంభించండి"</string> <string name="usb_audio_disable_routing" msgid="3367656923544254975">"USB ఆడియో రూటింగ్ నిలిపివేయి"</string> <string name="usb_audio_disable_routing_summary" msgid="8768242894849534699">"USB ఆడియో పరికరాలకు ఆటోమేటిక్ రూటింగ్ను నిలిపివేయండి"</string> - <string name="debug_layout" msgid="1659216803043339741">"లేఅవుట్ బౌండ్లు చూపు"</string> + <string name="debug_layout" msgid="1659216803043339741">"లేఅవుట్ హద్దులను చూపు"</string> <string name="debug_layout_summary" msgid="8825829038287321978">"క్లిప్ సరిహద్దులు, అంచులు మొ. చూపు"</string> <string name="force_rtl_layout_all_locales" msgid="8690762598501599796">"RTL లేఅవుట్ దిశను నిర్బంధం చేయండి"</string> <string name="force_rtl_layout_all_locales_summary" msgid="6663016859517239880">"అన్ని లొకేల్ల కోసం RTLకి స్క్రీన్ లేఅవుట్ దిశను నిర్భందించు"</string> <string name="window_blurs" msgid="6831008984828425106">"విండో-స్థాయి బ్లర్ అనుమతించు"</string> - <string name="force_msaa" msgid="4081288296137775550">"నిర్భందం 4x MSAA"</string> + <string name="force_msaa" msgid="4081288296137775550">"4x MSAA అమలు తప్పనిసరి"</string> <string name="force_msaa_summary" msgid="9070437493586769500">"OpenGL ES 2.0 యాప్లలో 4x MSAAను ప్రారంభించండి"</string> <string name="show_non_rect_clip" msgid="7499758654867881817">"దీర్ఘ చతురస్రం కాని క్లిప్ చర్యలను డీబగ్ చేయండి"</string> <string name="track_frame_time" msgid="522674651937771106">"ప్రొఫైల్ HWUI రెండరింగ్"</string> @@ -390,13 +390,13 @@ <string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"డీబగ్ యాప్ల కోసం GPU డీబగ్ లేయర్లను లోడ్ చేయడాన్ని అనుమతించండి"</string> <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"వివరణాత్మక వెండార్ లాగింగ్ను ఎనేబుల్ చేయండి"</string> <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"బగ్ రిపోర్ట్లలో అదనపు పరికర-నిర్దిష్ట వెండార్ లాగ్లను చేర్చండి, అవి ప్రైవేట్ సమాచారాన్ని కలిగి ఉండవచ్చు, మరింత బ్యాటరీని, మరియు/లేదా మరింత స్టోరేజ్ను ఉపయోగించవచ్చు."</string> - <string name="window_animation_scale_title" msgid="5236381298376812508">"విండో యానిమేషన్ ప్రమాణం"</string> - <string name="transition_animation_scale_title" msgid="1278477690695439337">"పరివర్తన యానిమేషన్ ప్రమాణం"</string> - <string name="animator_duration_scale_title" msgid="7082913931326085176">"యానిమేటర్ వ్యవధి ప్రమాణం"</string> - <string name="overlay_display_devices_title" msgid="5411894622334469607">"ప్రత్యామ్నాయ ప్రదర్శనలను అనుకరించండి"</string> + <string name="window_animation_scale_title" msgid="5236381298376812508">"విండో యానిమేషన్ స్కేల్"</string> + <string name="transition_animation_scale_title" msgid="1278477690695439337">"ట్రాన్సిషన్ యానిమేషన్ స్కేల్"</string> + <string name="animator_duration_scale_title" msgid="7082913931326085176">"యానిమేటర్ వ్యవధి స్కేల్"</string> + <string name="overlay_display_devices_title" msgid="5411894622334469607">"ఇతర డిస్ప్లేలను సిమ్యులేట్ చేయండి"</string> <string name="debug_applications_category" msgid="5394089406638954196">"యాప్లు"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"యాక్టివిటీస్ను ఉంచవద్దు"</string> - <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"యూజర్ నిష్క్రమించాక పూర్తి యాక్టివిటీ తొలగింపు"</string> + <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"యూజర్ నిష్క్రమించాక పూర్తి యాక్టివిటీని తొలగించు"</string> <string name="app_process_limit_title" msgid="8361367869453043007">"బ్యాక్గ్రౌండ్ ప్రాసెస్ పరిమితి"</string> <string name="show_all_anrs" msgid="9160563836616468726">"బ్యాక్గ్రౌండ్ ANRలను చూపు"</string> <string name="show_all_anrs_summary" msgid="8562788834431971392">"బ్యాక్గ్రౌండ్ యాప్ల కోసం యాప్ ప్రతిస్పందించడం లేదు అనే డైలాగ్ను చూపు"</string> @@ -655,12 +655,8 @@ <string name="bt_le_audio_scan_qr_code" msgid="3521809854780392679">"QR కోడ్ను స్కాన్ చేయండి"</string> <string name="bt_le_audio_scan_qr_code_scanner" msgid="4679500020630341107">"వినడం ప్రారంభించడానికి, కింద ఉన్న QR కోడ్ను మధ్యలో ఉంచండి"</string> <string name="bt_le_audio_qr_code_is_not_valid_format" msgid="6092191081849434734">"QR కోడ్ చెల్లుబాటు అయ్యే ఫార్మాట్లో లేదు"</string> - <!-- no translation found for bt_le_audio_broadcast_dialog_title (5392738488989777074) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_sub_title (268234802198852753) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_switch_app (5749813313369517812) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_different_output (2638402023060391333) --> - <skip /> + <string name="bt_le_audio_broadcast_dialog_title" msgid="5392738488989777074">"<xliff:g id="APP_NAME">%1$s</xliff:g> ప్రసారం చేయడాన్ని ఆపివేయాలా?"</string> + <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="268234802198852753">"మీరు <xliff:g id="SWITCHAPP">%1$s</xliff:g> ప్రసారం చేస్తే లేదా అవుట్పుట్ను మార్చినట్లయితే, మీ ప్రస్తుత ప్రసారం ఆగిపోతుంది"</string> + <string name="bt_le_audio_broadcast_dialog_switch_app" msgid="5749813313369517812">"<xliff:g id="SWITCHAPP">%1$s</xliff:g> ప్రసారం చేయండి"</string> + <string name="bt_le_audio_broadcast_dialog_different_output" msgid="2638402023060391333">"అవుట్పుట్ను మార్చండి"</string> </resources> diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml index 96b40d510897..41ef1e41b90f 100644 --- a/packages/SettingsLib/res/values-th/strings.xml +++ b/packages/SettingsLib/res/values-th/strings.xml @@ -226,9 +226,9 @@ <string name="category_personal" msgid="6236798763159385225">"ส่วนตัว"</string> <string name="category_work" msgid="4014193632325996115">"ที่ทำงาน"</string> <string name="development_settings_title" msgid="140296922921597393">"ตัวเลือกสำหรับนักพัฒนาแอป"</string> - <string name="development_settings_enable" msgid="4285094651288242183">"เปิดใช้ตัวเลือกสำหรับนักพัฒนาซอฟต์แวร์"</string> + <string name="development_settings_enable" msgid="4285094651288242183">"เปิดใช้ตัวเลือกสำหรับนักพัฒนาแอป"</string> <string name="development_settings_summary" msgid="8718917813868735095">"ตั้งค่าตัวเลือกสำหรับการพัฒนาแอปพลิเคชัน"</string> - <string name="development_settings_not_available" msgid="355070198089140951">"ตัวเลือกสำหรับนักพัฒนาซอฟต์แวร์ไม่สามารถใช้ได้สำหรับผู้ใช้นี้"</string> + <string name="development_settings_not_available" msgid="355070198089140951">"ตัวเลือกสำหรับนักพัฒนาแอปไม่สามารถใช้ได้สำหรับผู้ใช้นี้"</string> <string name="vpn_settings_not_available" msgid="2894137119965668920">"การตั้งค่า VPN ไม่สามารถใช้ได้สำหรับผู้ใช้รายนี้"</string> <string name="tethering_settings_not_available" msgid="266821736434699780">"การตั้งค่าการปล่อยสัญญาณไม่สามารถใช้ได้สำหรับผู้ใช้รายนี้"</string> <string name="apn_settings_not_available" msgid="1147111671403342300">"การตั้งค่าจุดเข้าใช้งานไม่สามารถใช้ได้สำหรับผู้ใช้รายนี้"</string> @@ -352,7 +352,7 @@ <string name="select_application" msgid="2543228890535466325">"เลือกแอปพลิเคชัน"</string> <string name="no_application" msgid="9038334538870247690">"ไม่มี"</string> <string name="wait_for_debugger" msgid="7461199843335409809">"รอโปรแกรมแก้ไขข้อบกพร่อง"</string> - <string name="wait_for_debugger_summary" msgid="6846330006113363286">"แอปพลิเคชันที่มีการแก้ปัญหาจะรอให้โปรแกรมแก้ไขข้อบกพร่องแนบข้อมูลก่อนปฏิบัติการ"</string> + <string name="wait_for_debugger_summary" msgid="6846330006113363286">"แอปพลิเคชันที่มีการแก้ไขข้อบกพร่องจะรอให้โปรแกรมแก้ไขข้อบกพร่องแนบข้อมูลก่อนปฏิบัติการ"</string> <string name="debug_input_category" msgid="7349460906970849771">"อินพุต"</string> <string name="debug_drawing_category" msgid="5066171112313666619">"การวาดภาพ"</string> <string name="debug_hw_drawing_category" msgid="5830815169336975162">"การแสดงผลที่มีการเร่งด้วยฮาร์ดแวร์"</string> @@ -379,8 +379,8 @@ <string name="usb_audio_disable_routing_summary" msgid="8768242894849534699">"ปิดการกำหนดเส้นทางโดยอัตโนมัติไปยังอุปกรณ์ต่อพ่วงเสียงทาง USB"</string> <string name="debug_layout" msgid="1659216803043339741">"แสดงขอบของการจัดวาง"</string> <string name="debug_layout_summary" msgid="8825829038287321978">"แสดงหน้าปกคลิป ขอบ ฯลฯ"</string> - <string name="force_rtl_layout_all_locales" msgid="8690762598501599796">"บังคับทิศทางการจัดวาง RTL"</string> - <string name="force_rtl_layout_all_locales_summary" msgid="6663016859517239880">"บังคับทิศทางการจัดวางหน้าจอเป็น RTL สำหรับทุกภาษา"</string> + <string name="force_rtl_layout_all_locales" msgid="8690762598501599796">"บังคับทิศทางการจัดวางขวาไปซ้าย"</string> + <string name="force_rtl_layout_all_locales_summary" msgid="6663016859517239880">"บังคับทิศทางการจัดวางหน้าจอเป็นขวาไปซ้ายสำหรับทุกภาษา"</string> <string name="window_blurs" msgid="6831008984828425106">"อนุญาตการเบลอระดับหน้าต่าง"</string> <string name="force_msaa" msgid="4081288296137775550">"บังคับใช้ 4x MSAA"</string> <string name="force_msaa_summary" msgid="9070437493586769500">"เปิดใช้งาน 4x MSAA ในแอปพลิเคชัน OpenGL ES 2.0"</string> @@ -398,7 +398,7 @@ <string name="immediately_destroy_activities" msgid="1826287490705167403">"ไม่เก็บกิจกรรม"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"ล้างทุกกิจกรรมทันทีที่ผู้ใช้ออกไป"</string> <string name="app_process_limit_title" msgid="8361367869453043007">"ขีดจำกัดกระบวนการเบื้องหลัง"</string> - <string name="show_all_anrs" msgid="9160563836616468726">"แสดง ANR พื้นหลัง"</string> + <string name="show_all_anrs" msgid="9160563836616468726">"แสดง ANR เบื้องหลัง"</string> <string name="show_all_anrs_summary" msgid="8562788834431971392">"แสดงกล่องโต้ตอบ \"แอปไม่ตอบสนอง\" สำหรับแอปเบื้องหลัง"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"แสดงคำเตือนจากช่องทางการแจ้งเตือน"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"แสดงคำเตือนบนหน้าจอเมื่อแอปโพสต์การแจ้งเตือนโดยไม่มีช่องทางที่ถูกต้อง"</string> @@ -655,12 +655,8 @@ <string name="bt_le_audio_scan_qr_code" msgid="3521809854780392679">"สแกนคิวอาร์โค้ด"</string> <string name="bt_le_audio_scan_qr_code_scanner" msgid="4679500020630341107">"ถือให้คิวอาร์โค้ดอยู่กลางช่องด้านล่างเพื่อเริ่มฟัง"</string> <string name="bt_le_audio_qr_code_is_not_valid_format" msgid="6092191081849434734">"คิวอาร์โค้ดมีรูปแบบไม่ถูกต้อง"</string> - <!-- no translation found for bt_le_audio_broadcast_dialog_title (5392738488989777074) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_sub_title (268234802198852753) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_switch_app (5749813313369517812) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_different_output (2638402023060391333) --> - <skip /> + <string name="bt_le_audio_broadcast_dialog_title" msgid="5392738488989777074">"หยุดการออกอากาศ <xliff:g id="APP_NAME">%1$s</xliff:g> ไหม"</string> + <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="268234802198852753">"หากคุณออกอากาศ <xliff:g id="SWITCHAPP">%1$s</xliff:g> หรือเปลี่ยนแปลงเอาต์พุต การออกอากาศในปัจจุบันจะหยุดลง"</string> + <string name="bt_le_audio_broadcast_dialog_switch_app" msgid="5749813313369517812">"ออกอากาศ <xliff:g id="SWITCHAPP">%1$s</xliff:g>"</string> + <string name="bt_le_audio_broadcast_dialog_different_output" msgid="2638402023060391333">"เปลี่ยนเอาต์พุต"</string> </resources> diff --git a/packages/SettingsLib/res/values-tl/arrays.xml b/packages/SettingsLib/res/values-tl/arrays.xml index 4e06a6d80a30..bdd8706329cc 100644 --- a/packages/SettingsLib/res/values-tl/arrays.xml +++ b/packages/SettingsLib/res/values-tl/arrays.xml @@ -55,7 +55,7 @@ </string-array> <string-array name="hdcp_checking_summaries"> <item msgid="4045840870658484038">"Huwag kailanman gumamit ng pagsusuring HDCP"</item> - <item msgid="8254225038262324761">"Gamitin lang ang pagsusuring HDCP para sa nilalamang DRM"</item> + <item msgid="8254225038262324761">"Gamitin ang pagsusuring HDCP para sa content na DRM lang"</item> <item msgid="6421717003037072581">"Palaging gumamit ng pagsusuring HDCP"</item> </string-array> <string-array name="bt_hci_snoop_log_entries"> diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml index 73d3dd5205cd..7d4a4b49bc0d 100644 --- a/packages/SettingsLib/res/values-tl/strings.xml +++ b/packages/SettingsLib/res/values-tl/strings.xml @@ -266,7 +266,7 @@ <string name="bugreport_in_power" msgid="8664089072534638709">"Shortcut ng ulat sa bug"</string> <string name="bugreport_in_power_summary" msgid="1885529649381831775">"Magpakita ng button sa power menu sa pagkuha ng ulat sa bug"</string> <string name="keep_screen_on" msgid="1187161672348797558">"Manatiling gumagana"</string> - <string name="keep_screen_on_summary" msgid="1510731514101925829">"Hindi kailanman hihinto ang screen kapag kinakargahan"</string> + <string name="keep_screen_on_summary" msgid="1510731514101925829">"Hindi kailanman hihinto ang screen kapag nagcha-charge"</string> <string name="bt_hci_snoop_log" msgid="7291287955649081448">"I-enable ang Bluetooth HCI snoop log"</string> <string name="bt_hci_snoop_log_summary" msgid="6808538971394092284">"I-capture ang mga Bluetooth packet. (I-toggle ang Bluetooth pagkatapos baguhin ang setting na ito)"</string> <string name="oem_unlock_enable" msgid="5334869171871566731">"Pag-a-unlock ng OEM"</string> @@ -367,7 +367,7 @@ <string name="show_screen_updates" msgid="2078782895825535494">"Ipakita update sa surface"</string> <string name="show_screen_updates_summary" msgid="2126932969682087406">"I-flash ang buong window surface kapag nag-update"</string> <string name="show_hw_screen_updates" msgid="2021286231267747506">"Ipakita update ng view"</string> - <string name="show_hw_screen_updates_summary" msgid="3539770072741435691">"I-flash mga view sa loob ng window kapag na-draw"</string> + <string name="show_hw_screen_updates_summary" msgid="3539770072741435691">"I-flash ang views sa loob ng window kapag na-draw"</string> <string name="show_hw_layers_updates" msgid="5268370750002509767">"Ipakita ang mga update ng hardware layers"</string> <string name="show_hw_layers_updates_summary" msgid="5850955890493054618">"I-flash nang berde ang hardware layer pag nag-update ito"</string> <string name="debug_hw_overdraw" msgid="8944851091008756796">"I-debug ang GPU overdraw"</string> @@ -655,12 +655,8 @@ <string name="bt_le_audio_scan_qr_code" msgid="3521809854780392679">"I-scan ang QR code"</string> <string name="bt_le_audio_scan_qr_code_scanner" msgid="4679500020630341107">"Para simulang makinig, igitna ang QR code sa ibaba"</string> <string name="bt_le_audio_qr_code_is_not_valid_format" msgid="6092191081849434734">"Hindi valid na format ang QR code"</string> - <!-- no translation found for bt_le_audio_broadcast_dialog_title (5392738488989777074) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_sub_title (268234802198852753) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_switch_app (5749813313369517812) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_different_output (2638402023060391333) --> - <skip /> + <string name="bt_le_audio_broadcast_dialog_title" msgid="5392738488989777074">"Ihinto ang pag-broadcast ng <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> + <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="268234802198852753">"Kung magbo-broadcast ka ng <xliff:g id="SWITCHAPP">%1$s</xliff:g> o babaguhin mo ang output, hihinto ang iyong kasalukuyang broadcast"</string> + <string name="bt_le_audio_broadcast_dialog_switch_app" msgid="5749813313369517812">"I-broadcast ang <xliff:g id="SWITCHAPP">%1$s</xliff:g>"</string> + <string name="bt_le_audio_broadcast_dialog_different_output" msgid="2638402023060391333">"Baguhin ang output"</string> </resources> diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml index cca694b2f887..8ef368cbd37b 100644 --- a/packages/SettingsLib/res/values-tr/strings.xml +++ b/packages/SettingsLib/res/values-tr/strings.xml @@ -280,7 +280,7 @@ <string name="wifi_display_certification" msgid="1805579519992520381">"Kablosuz ekran sertifikası"</string> <string name="wifi_verbose_logging" msgid="1785910450009679371">"Kablosuz Ayrıntılı Günlük Kaydını etkinleştir"</string> <string name="wifi_scan_throttling" msgid="2985624788509913617">"Kablosuz ağ taramasını kısma"</string> - <string name="wifi_non_persistent_mac_randomization" msgid="7482769677894247316">"Kablosuz kalıcı olmayan MAC rastgele hale getirme süreci"</string> + <string name="wifi_non_persistent_mac_randomization" msgid="7482769677894247316">"Kablosuz kalıcı olmayan MAC rastgele hale getirme modu"</string> <string name="mobile_data_always_on" msgid="8275958101875563572">"Mobil veri her zaman etkin"</string> <string name="tethering_hardware_offload" msgid="4116053719006939161">"Tethering donanım hızlandırıcısı"</string> <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Adsız Bluetooth cihazlarını göster"</string> diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml index ebbd45e8a885..5c535096ed97 100644 --- a/packages/SettingsLib/res/values-ur/strings.xml +++ b/packages/SettingsLib/res/values-ur/strings.xml @@ -279,7 +279,7 @@ <string name="debug_networking_category" msgid="6829757985772659599">"نیٹ ورکنگ"</string> <string name="wifi_display_certification" msgid="1805579519992520381">"وائرلیس ڈسپلے سرٹیفیکیشن"</string> <string name="wifi_verbose_logging" msgid="1785910450009679371">"Wi‑Fi وربوس لاگنگ فعال کریں"</string> - <string name="wifi_scan_throttling" msgid="2985624788509913617">"Wi‑Fi اسکین کو زبردستی روکا جا رہا ہے"</string> + <string name="wifi_scan_throttling" msgid="2985624788509913617">"Wi‑Fi اسکین کو زبردستی روکنا"</string> <string name="wifi_non_persistent_mac_randomization" msgid="7482769677894247316">"Wi-Fi غیر مستقل MAC کی رینڈمائزیشن"</string> <string name="mobile_data_always_on" msgid="8275958101875563572">"موبائل ڈیٹا ہمیشہ فعال رکھیں"</string> <string name="tethering_hardware_offload" msgid="4116053719006939161">"ٹیدرنگ ہارڈویئر سرعت کاری"</string> diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml index 783777986d3c..52cc9cbd7c03 100644 --- a/packages/SettingsLib/res/values-uz/strings.xml +++ b/packages/SettingsLib/res/values-uz/strings.xml @@ -327,7 +327,7 @@ <string name="allow_mock_location_summary" msgid="179780881081354579">"Joylashuv emulyatsiyasiga ruxsat berish"</string> <string name="debug_view_attributes" msgid="3539609843984208216">"Alomatlar tekshiruvini yoqish"</string> <string name="mobile_data_always_on_summary" msgid="1112156365594371019">"Mobil internet har doim yoniq tursin, hatto Wi-Fi yoniq bo‘lsa ham (bir tarmoqdan ikkinchisiga tezroq o‘tish uchun)."</string> - <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"Modem rejimida apparatli tezlashtirishdan foydalanish (agar mavjud bo‘lsa)"</string> + <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"Modem rejimida apparatli tezlatishdan foydalanish (mavjud bo‘lsa)."</string> <string name="adb_warning_title" msgid="7708653449506485728">"USB orqali nosozliklarni tuzatishga ruxsat berilsinmi?"</string> <string name="adb_warning_message" msgid="8145270656419669221">"USB orqali nosozliklarni aniqlash faqat dasturlash maqsadlarida yoqiladi. Undan maʼlumotlarni qurilmangiz va kompyuter o‘rtasida ko‘chirish, ilovalarni xabarnomasiz o‘rnatish va jurnal maʼlumotlarini o‘qish uchun foydalaniladi."</string> <string name="adbwifi_warning_title" msgid="727104571653031865">"Wi-Fi orqali debagging uchun ruxsat berilsinmi?"</string> @@ -375,14 +375,14 @@ <string name="disable_overlays_summary" msgid="1954852414363338166">"Ekranda tasvirlarni biriktirish uchun doim GPU ishlatilsin"</string> <string name="simulate_color_space" msgid="1206503300335835151">"Rang maydonini simulyatsiyalash"</string> <string name="enable_opengl_traces_title" msgid="4638773318659125196">"OpenGL trassasini yoqish"</string> - <string name="usb_audio_disable_routing" msgid="3367656923544254975">"Audio uzatishni o‘ch. qo‘yish (USB)"</string> - <string name="usb_audio_disable_routing_summary" msgid="8768242894849534699">"Tashqi USB qurilmaga avto-yo‘naltirishni o‘ch. qo‘yish"</string> + <string name="usb_audio_disable_routing" msgid="3367656923544254975">"Audio uzatishni faolsizlantirish (USB)"</string> + <string name="usb_audio_disable_routing_summary" msgid="8768242894849534699">"Tashqi USB qurilmaga avto-yo‘naltirishni faolsizlantirish"</string> <string name="debug_layout" msgid="1659216803043339741">"Elementlar hoshiyasi"</string> <string name="debug_layout_summary" msgid="8825829038287321978">"Klip, maydon va h.k. chegaralarini ko‘rsatish"</string> <string name="force_rtl_layout_all_locales" msgid="8690762598501599796">"O‘ngdan chapga qarab yozish"</string> <string name="force_rtl_layout_all_locales_summary" msgid="6663016859517239880">"Barcha tillarda o‘ngdan chapga qarab yozish"</string> <string name="window_blurs" msgid="6831008984828425106">"Oyna xiralashga ruxsat"</string> - <string name="force_msaa" msgid="4081288296137775550">"4x MSAAni yoqish"</string> + <string name="force_msaa" msgid="4081288296137775550">"4x MSAA sozlamasini yoqish"</string> <string name="force_msaa_summary" msgid="9070437493586769500">"OpenGL ES 2.0 ilovasidan 4x MSAAni yoqish"</string> <string name="show_non_rect_clip" msgid="7499758654867881817">"To‘g‘ri burchakli bo‘lmagan kesishma amallarini tuzatish"</string> <string name="track_frame_time" msgid="522674651937771106">"HWUI ishlash vaqtining hisobi"</string> @@ -655,12 +655,8 @@ <string name="bt_le_audio_scan_qr_code" msgid="3521809854780392679">"QR kodni skanerlash"</string> <string name="bt_le_audio_scan_qr_code_scanner" msgid="4679500020630341107">"Tinglashni boshlash uchun quyidagi QR kodni markazga joylang"</string> <string name="bt_le_audio_qr_code_is_not_valid_format" msgid="6092191081849434734">"QR xato formatda"</string> - <!-- no translation found for bt_le_audio_broadcast_dialog_title (5392738488989777074) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_sub_title (268234802198852753) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_switch_app (5749813313369517812) --> - <skip /> - <!-- no translation found for bt_le_audio_broadcast_dialog_different_output (2638402023060391333) --> - <skip /> + <string name="bt_le_audio_broadcast_dialog_title" msgid="5392738488989777074">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasiga translatsiya toʻxtatilsinmi?"</string> + <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="268234802198852753">"Agar <xliff:g id="SWITCHAPP">%1$s</xliff:g> ilovasiga translatsiya qilsangiz yoki ovoz chiqishini oʻzgartirsangiz, joriy translatsiya toʻxtab qoladi"</string> + <string name="bt_le_audio_broadcast_dialog_switch_app" msgid="5749813313369517812">"<xliff:g id="SWITCHAPP">%1$s</xliff:g> ilovasiga translatsiya"</string> + <string name="bt_le_audio_broadcast_dialog_different_output" msgid="2638402023060391333">"Ovoz chiqishini oʻzgartirish"</string> </resources> diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml index b669708462bd..5280f10b767d 100644 --- a/packages/SettingsLib/res/values-zh-rCN/strings.xml +++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml @@ -369,7 +369,7 @@ <string name="show_hw_screen_updates" msgid="2021286231267747506">"显示视图更新"</string> <string name="show_hw_screen_updates_summary" msgid="3539770072741435691">"绘图时闪烁显示窗口中的视图"</string> <string name="show_hw_layers_updates" msgid="5268370750002509767">"显示硬件层更新"</string> - <string name="show_hw_layers_updates_summary" msgid="5850955890493054618">"Flash 硬件层在进行更新时会显示为绿色"</string> + <string name="show_hw_layers_updates_summary" msgid="5850955890493054618">"Flash 硬件层在更新时会显示为绿色"</string> <string name="debug_hw_overdraw" msgid="8944851091008756796">"调试 GPU 过度绘制"</string> <string name="disable_overlays" msgid="4206590799671557143">"停用 HW 叠加层"</string> <string name="disable_overlays_summary" msgid="1954852414363338166">"始终使用 GPU 进行屏幕合成"</string> diff --git a/packages/SettingsLib/res/values/dimens.xml b/packages/SettingsLib/res/values/dimens.xml index 8315e8b069c8..cbc79d2d5d93 100644 --- a/packages/SettingsLib/res/values/dimens.xml +++ b/packages/SettingsLib/res/values/dimens.xml @@ -120,4 +120,18 @@ <dimen name="qrcode_preview_margin">40dp</dimen> <dimen name="qrcode_preview_radius">30dp</dimen> <dimen name="qrcode_icon_size">27dp</dimen> + + <!-- Broadcast dialog --> + <dimen name="broadcast_dialog_title_img_margin_top">18dp</dimen> + <dimen name="broadcast_dialog_title_text_size">24sp</dimen> + <dimen name="broadcast_dialog_title_text_margin">16dp</dimen> + <dimen name="broadcast_dialog_title_text_margin_top">18dp</dimen> + <dimen name="broadcast_dialog_subtitle_text_size">14sp</dimen> + <dimen name="broadcast_dialog_icon_size">24dp</dimen> + <dimen name="broadcast_dialog_icon_margin_top">25dp</dimen> + <dimen name="broadcast_dialog_btn_radius">100dp</dimen> + <dimen name="broadcast_dialog_btn_margin_bottom">4dp</dimen> + <dimen name="broadcast_dialog_btn_text_size">16sp</dimen> + <dimen name="broadcast_dialog_btn_minHeight">44dp</dimen> + <dimen name="broadcast_dialog_margin">16dp</dimen> </resources> diff --git a/packages/SettingsLib/res/values/styles.xml b/packages/SettingsLib/res/values/styles.xml index 28cd27bf0cad..32345150531d 100644 --- a/packages/SettingsLib/res/values/styles.xml +++ b/packages/SettingsLib/res/values/styles.xml @@ -39,4 +39,49 @@ <item name="android:textColor">?android:attr/textColorPrimary</item> <item name="android:textDirection">locale</item> </style> + + <style name="BroadcastDialogTitleStyle"> + <item name="android:textAppearance">@style/TextAppearanceBroadcastDialogTitle</item> + <item name="android:layout_marginStart">@dimen/broadcast_dialog_title_text_margin</item> + <item name="android:layout_marginEnd">@dimen/broadcast_dialog_title_text_margin</item> + <item name="android:layout_marginTop">@dimen/broadcast_dialog_title_text_margin_top</item> + <item name="android:layout_marginBottom">18dp</item> + </style> + + <style name="TextAppearanceBroadcastDialogTitle" parent="@android:TextAppearance.DeviceDefault.Headline"> + <item name="android:textSize">@dimen/broadcast_dialog_title_text_size</item> + <item name="android:textColor">?android:attr/textColorPrimary</item> + <item name="android:textDirection">locale</item> + <item name="android:ellipsize">end</item> + </style> + + <style name="BroadcastDialogBodyStyle"> + <item name="android:textAppearance">@style/TextAppearanceBroadcastDialogSubTitle</item> + <item name="android:layout_margin">@dimen/broadcast_dialog_title_text_margin</item> + </style> + + <style name="TextAppearanceBroadcastDialogSubTitle" parent="@android:TextAppearance.DeviceDefault.Headline"> + <item name="android:textSize">@dimen/broadcast_dialog_subtitle_text_size</item> + <item name="android:textColor">?android:attr/textColorSecondary</item> + <item name="android:textDirection">locale</item> + <item name="android:ellipsize">end</item> + </style> + + <style name="BroadcastDialogButtonStyle"> + <item name="android:textAppearance">@style/TextAppearanceBroadcastDialogButton</item> + <item name="android:layout_width">match_parent</item> + <item name="android:layout_height">wrap_content</item> + <item name="android:layout_gravity">center</item> + <item name="android:gravity">center</item> + <item name="android:stateListAnimator">@null</item> + <item name="android:elevation">0dp</item> + <item name="android:minHeight">@dimen/broadcast_dialog_btn_minHeight</item> + <item name="android:background">@drawable/broadcast_dialog_btn_bg</item> + </style> + + <style name="TextAppearanceBroadcastDialogButton" parent="@android:TextAppearance.DeviceDefault.Headline"> + <item name="android:textColor">?android:attr/textColorPrimary</item> + <item name="android:textSize">@dimen/broadcast_dialog_btn_text_size</item> + </style> + </resources> diff --git a/packages/SettingsLib/src/com/android/settingslib/DeviceInfoUtils.java b/packages/SettingsLib/src/com/android/settingslib/DeviceInfoUtils.java index 0f340239cd24..f627bcb5db95 100644 --- a/packages/SettingsLib/src/com/android/settingslib/DeviceInfoUtils.java +++ b/packages/SettingsLib/src/com/android/settingslib/DeviceInfoUtils.java @@ -36,7 +36,8 @@ import android.util.Log; import androidx.annotation.RequiresApi; import androidx.annotation.VisibleForTesting; -import androidx.core.os.BuildCompat; + +import com.android.settingslib.utils.BuildCompatUtils; import java.io.BufferedReader; import java.io.FileReader; @@ -220,7 +221,7 @@ public class DeviceInfoUtils { } private static String getRawPhoneNumber(Context context, int subscriptionId) { - if (BuildCompat.isAtLeastT()) { + if (BuildCompatUtils.isAtLeastT()) { return getRawPhoneNumberFromT(context, subscriptionId); } else { final TelephonyManager telephonyManager = context.getSystemService( diff --git a/packages/SettingsLib/src/com/android/settingslib/RestrictedPreferenceHelper.java b/packages/SettingsLib/src/com/android/settingslib/RestrictedPreferenceHelper.java index 3a4a8d27b2f3..284da73efb6f 100644 --- a/packages/SettingsLib/src/com/android/settingslib/RestrictedPreferenceHelper.java +++ b/packages/SettingsLib/src/com/android/settingslib/RestrictedPreferenceHelper.java @@ -31,10 +31,11 @@ import android.util.TypedValue; import android.widget.TextView; import androidx.annotation.RequiresApi; -import androidx.core.os.BuildCompat; import androidx.preference.Preference; import androidx.preference.PreferenceViewHolder; +import com.android.settingslib.utils.BuildCompatUtils; + /** * Helper class for managing settings preferences that can be disabled * by device admins via user restrictions. @@ -105,7 +106,7 @@ public class RestrictedPreferenceHelper { if (mDisabledSummary) { final TextView summaryView = (TextView) holder.findViewById(android.R.id.summary); if (summaryView != null) { - final CharSequence disabledText = BuildCompat.isAtLeastT() + final CharSequence disabledText = BuildCompatUtils.isAtLeastT() ? getDisabledByAdminUpdatableString() : mContext.getString(R.string.disabled_by_admin_summary_text); if (mDisabledByAdmin) { diff --git a/packages/SettingsLib/src/com/android/settingslib/Utils.java b/packages/SettingsLib/src/com/android/settingslib/Utils.java index aaa011458258..feb4212035bc 100644 --- a/packages/SettingsLib/src/com/android/settingslib/Utils.java +++ b/packages/SettingsLib/src/com/android/settingslib/Utils.java @@ -45,7 +45,6 @@ import androidx.annotation.NonNull; import androidx.annotation.RequiresApi; import androidx.core.graphics.drawable.RoundedBitmapDrawable; import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory; -import androidx.core.os.BuildCompat; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.UserIcons; @@ -53,6 +52,7 @@ import com.android.launcher3.icons.BaseIconFactory.IconOptions; import com.android.launcher3.icons.IconFactory; import com.android.settingslib.drawable.UserIconDrawable; import com.android.settingslib.fuelgauge.BatteryStatus; +import com.android.settingslib.utils.BuildCompatUtils; import java.text.NumberFormat; @@ -130,7 +130,7 @@ public class Utils { String name = info != null ? info.name : null; if (info.isManagedProfile()) { // We use predefined values for managed profiles - return BuildCompat.isAtLeastT() + return BuildCompatUtils.isAtLeastT() ? getUpdatableManagedUserTitle(context) : context.getString(R.string.managed_user_title); } else if (info.isGuest()) { diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BroadcastDialog.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BroadcastDialog.java new file mode 100644 index 000000000000..cb4eba422366 --- /dev/null +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BroadcastDialog.java @@ -0,0 +1,66 @@ +/** + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settingslib.bluetooth; + +import android.app.AlertDialog; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.view.Window; +import android.widget.Button; +import android.widget.TextView; + +import com.android.settingslib.R; + +public class BroadcastDialog extends AlertDialog { + + private static final String TAG = "BroadcastDialog"; + + private String mCurrentApp; + private String mSwitchApp; + private Context mContext; + + public BroadcastDialog(Context context) { + super(context); + mContext = context; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + + View layout = View.inflate(mContext, R.layout.broadcast_dialog, null); + final Window window = getWindow(); + window.setContentView(layout); + window.setWindowAnimations(R.style.Theme_AlertDialog_SettingsLib); + + TextView title = layout.findViewById(R.id.dialog_title); + TextView subTitle = layout.findViewById(R.id.dialog_subtitle); + title.setText(mContext.getString(R.string.bt_le_audio_broadcast_dialog_title, mCurrentApp)); + subTitle.setText( + mContext.getString(R.string.bt_le_audio_broadcast_dialog_sub_title, mSwitchApp)); + Button positiveBtn = layout.findViewById(R.id.positive_btn); + Button negativeBtn = layout.findViewById(R.id.negative_btn); + Button neutralBtn = layout.findViewById(R.id.neutral_btn); + positiveBtn.setText(mContext.getString( + R.string.bt_le_audio_broadcast_dialog_switch_app, mSwitchApp), null); + neutralBtn.setOnClickListener((view) -> { + Log.d(TAG, "BroadcastDialog dismiss."); + dismiss(); + }); + } +} diff --git a/packages/SettingsLib/src/com/android/settingslib/drawable/UserIconDrawable.java b/packages/SettingsLib/src/com/android/settingslib/drawable/UserIconDrawable.java index 91d7388bc46d..11fae24aa677 100644 --- a/packages/SettingsLib/src/com/android/settingslib/drawable/UserIconDrawable.java +++ b/packages/SettingsLib/src/com/android/settingslib/drawable/UserIconDrawable.java @@ -47,7 +47,8 @@ import android.os.UserHandle; import androidx.annotation.RequiresApi; import androidx.annotation.VisibleForTesting; -import androidx.core.os.BuildCompat; + +import com.android.settingslib.utils.BuildCompatUtils; /** * Converts the user avatar icon to a circularly clipped one with an optional badge and frame @@ -87,7 +88,7 @@ public class UserIconDrawable extends Drawable implements Drawable.Callback { * @return drawable containing just the badge */ public static Drawable getManagedUserDrawable(Context context) { - if (BuildCompat.isAtLeastT()) { + if (BuildCompatUtils.isAtLeastT()) { return getUpdatableManagedUserDrawable(context); } else { return getDrawableForDisplayDensity( @@ -226,7 +227,7 @@ public class UserIconDrawable extends Drawable implements Drawable.Callback { } private static Drawable getManagementBadge(Context context) { - if (BuildCompat.isAtLeastT()) { + if (BuildCompatUtils.isAtLeastT()) { return getUpdatableManagementBadge(context); } else { return getDrawableForDisplayDensity( diff --git a/packages/SettingsLib/src/com/android/settingslib/qrcode/QrCodeScanModeActivity.java b/packages/SettingsLib/src/com/android/settingslib/qrcode/QrCodeScanModeActivity.java index 9021fcbc3f99..15a910e13aa8 100644 --- a/packages/SettingsLib/src/com/android/settingslib/qrcode/QrCodeScanModeActivity.java +++ b/packages/SettingsLib/src/com/android/settingslib/qrcode/QrCodeScanModeActivity.java @@ -26,8 +26,8 @@ import android.util.Log; import androidx.fragment.app.FragmentTransaction; -import com.android.settingslib.bluetooth.BluetoothBroadcastUtils; import com.android.settingslib.R; +import com.android.settingslib.bluetooth.BluetoothBroadcastUtils; import com.android.settingslib.bluetooth.BluetoothUtils; public class QrCodeScanModeActivity extends QrCodeScanModeBaseActivity { diff --git a/packages/SettingsLib/src/com/android/settingslib/qrcode/QrCodeScanModeBaseActivity.java b/packages/SettingsLib/src/com/android/settingslib/qrcode/QrCodeScanModeBaseActivity.java index 9aaec41e721a..361fd5b57556 100644 --- a/packages/SettingsLib/src/com/android/settingslib/qrcode/QrCodeScanModeBaseActivity.java +++ b/packages/SettingsLib/src/com/android/settingslib/qrcode/QrCodeScanModeBaseActivity.java @@ -1,4 +1,4 @@ -/* +/** * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -21,8 +21,8 @@ import android.os.Bundle; import androidx.fragment.app.FragmentManager; -import com.android.settingslib.core.lifecycle.ObservableActivity; import com.android.settingslib.R; +import com.android.settingslib.core.lifecycle.ObservableActivity; public abstract class QrCodeScanModeBaseActivity extends ObservableActivity { diff --git a/packages/SettingsLib/src/com/android/settingslib/qrcode/QrCodeScanModeController.java b/packages/SettingsLib/src/com/android/settingslib/qrcode/QrCodeScanModeController.java index d7640bb1b564..153d2d20e801 100644 --- a/packages/SettingsLib/src/com/android/settingslib/qrcode/QrCodeScanModeController.java +++ b/packages/SettingsLib/src/com/android/settingslib/qrcode/QrCodeScanModeController.java @@ -1,4 +1,4 @@ -/* +/** * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/packages/SettingsLib/src/com/android/settingslib/qrcode/QrCodeScanModeFragment.java b/packages/SettingsLib/src/com/android/settingslib/qrcode/QrCodeScanModeFragment.java index 81165aa3330c..069b9507ccef 100644 --- a/packages/SettingsLib/src/com/android/settingslib/qrcode/QrCodeScanModeFragment.java +++ b/packages/SettingsLib/src/com/android/settingslib/qrcode/QrCodeScanModeFragment.java @@ -1,4 +1,4 @@ -/* +/** * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -35,9 +35,9 @@ import android.view.ViewOutlineProvider; import android.view.accessibility.AccessibilityEvent; import android.widget.TextView; +import com.android.settingslib.R; import com.android.settingslib.bluetooth.BluetoothBroadcastUtils; import com.android.settingslib.bluetooth.BluetoothUtils; -import com.android.settingslib.R; import com.android.settingslib.core.lifecycle.ObservableFragment; import androidx.annotation.NonNull; diff --git a/packages/SettingsLib/src/com/android/settingslib/qrcode/QrDecorateView.java b/packages/SettingsLib/src/com/android/settingslib/qrcode/QrDecorateView.java index 7005d3638f9e..51cf59c25502 100644 --- a/packages/SettingsLib/src/com/android/settingslib/qrcode/QrDecorateView.java +++ b/packages/SettingsLib/src/com/android/settingslib/qrcode/QrDecorateView.java @@ -1,4 +1,4 @@ -/* +/** * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/packages/SettingsLib/src/com/android/settingslib/qrcode/QrYuvLuminanceSource.java b/packages/SettingsLib/src/com/android/settingslib/qrcode/QrYuvLuminanceSource.java index 421cf5c40b69..33f0cddb22e0 100644 --- a/packages/SettingsLib/src/com/android/settingslib/qrcode/QrYuvLuminanceSource.java +++ b/packages/SettingsLib/src/com/android/settingslib/qrcode/QrYuvLuminanceSource.java @@ -1,4 +1,4 @@ -/* +/** * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml index a28c4cf6b0d4..3b862ffbbd9e 100644 --- a/packages/Shell/AndroidManifest.xml +++ b/packages/Shell/AndroidManifest.xml @@ -686,6 +686,9 @@ <!-- Permission required for CTS test - CtsKeystoreTestCases --> <uses-permission android:name="android.permission.REQUEST_UNIQUE_ID_ATTESTATION" /> + <!-- Permission required for CTS test - CtsDevicePolicyManagerTestCases --> + <uses-permission android:name="android.permission.READ_NEARBY_STREAMING_POLICY" /> + <application android:label="@string/app_label" android:theme="@android:style/Theme.DeviceDefault.DayNight" android:defaultToDeviceProtectedStorage="true" diff --git a/packages/Shell/res/values-as/strings.xml b/packages/Shell/res/values-as/strings.xml index 6e80931e3619..9b9db6e872be 100644 --- a/packages/Shell/res/values-as/strings.xml +++ b/packages/Shell/res/values-as/strings.xml @@ -28,7 +28,7 @@ <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"ষ্ক্ৰীণশ্বট নোলোৱাকৈ বাগ সম্পৰ্কীয় অভিযোগ শ্বেয়াৰ কৰিবলৈ বাছনি কৰক বা ষ্ক্ৰীণশ্বট লোৱা কাৰ্য সম্পূৰ্ণ হোৱালৈ অপেক্ষা কৰক"</string> <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"স্ক্ৰীণশ্বট নোলোৱাকৈ বাগ সম্পর্কীয় অভিযোগ শ্বেয়াৰ কৰিবলৈ ইয়াত টিপক বা স্ক্ৰীণশ্বট সম্পূৰ্ণ হোৱালৈ অপেক্ষা কৰক"</string> <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"স্ক্ৰীণশ্বট নোলোৱাকৈ বাগ সম্পর্কীয় অভিযোগ শ্বেয়াৰ কৰিবলৈ ইয়াত টিপক বা স্ক্ৰীণশ্বট সম্পূৰ্ণ হোৱালৈ অপেক্ষা কৰক"</string> - <string name="bugreport_confirm" msgid="5917407234515812495">"বাগ সম্পর্কীয় অভিযোগত ছিষ্টেমৰ বিভিন্ন লগ ফাইল থাকে, ইয়াৰ ভিতৰত আপুনি স্পর্শকাতৰ বুলি গণ্য কৰা ডেটা (যেনে এপৰ ব্য়ৱহাৰ আৰু অৱস্থান সম্পৰ্কীয় তথ্য়) অন্তর্ভুক্ত হ\'ব পাৰে। কেৱল আপোনাৰ বিশ্বাসী লোক বা এপৰ সৈতেহে বাগ সম্পর্কীয় অভিযোগ শ্বেয়াৰ কৰিব।"</string> + <string name="bugreport_confirm" msgid="5917407234515812495">"বাগ সম্পর্কীয় অভিযোগত ছিষ্টেমৰ বিভিন্ন লগ ফাইল থাকে, ইয়াৰ ভিতৰত আপুনি স্পর্শকাতৰ বুলি গণ্য কৰা ডেটা (যেনে এপৰ ব্যৱহাৰ আৰু অৱস্থান সম্পৰ্কীয় তথ্য) অন্তর্ভুক্ত হ\'ব পাৰে। কেৱল আপোনাৰ বিশ্বাসী লোক বা এপৰ সৈতেহে বাগ সম্পর্কীয় অভিযোগ শ্বেয়াৰ কৰিব।"</string> <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"পুনৰাই নেদেখুৱাব"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"বাগ সম্পর্কীয় প্ৰতিবেদনসমূহ"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"বাগ সম্পর্কীয় অভিযোগৰ ফাইলটো পঢ়িব পৰা নগ\'ল"</string> diff --git a/packages/SystemUI/docs/usb_audio.md b/packages/SystemUI/docs/usb_audio.md new file mode 100644 index 000000000000..66e2df944fbc --- /dev/null +++ b/packages/SystemUI/docs/usb_audio.md @@ -0,0 +1,30 @@ +# USB audio Permission and Confirmation warning dialog resource string id matrix table +### go/support-usb-access-aoc-offload-feature + + |---|------------|----------------|------------------|-----------------|--------------------| + | # | Permission |isUsbAudioDevice| hasAudioPlayback | hasAudioCapture | string resource ID | + |---|------------|----------------|------------------|-----------------|--------------------| + | 1 | TRUE | TRUE | TRUE | FALSE | usb_audio_device_ + permission_prompt | + |---|------------|----------------|------------------|-----------------|--------------------| + | 2 | TRUE | TRUE | FALSE | TRUE | usb_audio_device_ + permission_prompt | + |---|------------|----------------|------------------|-----------------|--------------------| + | 3 | TRUE | TRUE | TRUE | TRUE | usb_audio_device_ + permission_prompt | + |---|------------|----------------|------------------|-----------------|--------------------| + | 4 | TRUE | FALSE | N/A | N/A | usb_device_ + permission_prompt | + |---|------------|----------------|------------------|-----------------|--------------------| + | 5 | FALSE | TRUE | TRUE | FALSE | usb_audio_device_ + permission_prompt | + |---|------------|----------------|------------------|-----------------|--------------------| + | 6 | FALSE | TRUE | FALSE | TRUE | usb_audio_device_ + permission_prompt_warn + |---|------------|----------------|------------------|-----------------|--------------------| + | 7 | FALSE | TRUE | TRUE | TRUE | usb_audio_device_ + permission_prompt_warn + |---|------------|----------------|------------------|-----------------|--------------------| + | 8 | FALSE | FALSE | N/A | N/A | usb_device_ + permission_prompt | + |---|------------|----------------|------------------|-----------------|--------------------| diff --git a/packages/SystemUI/res/layout/media_output_list_item.xml b/packages/SystemUI/res/layout/media_output_list_item.xml index d39b0d53c743..b85ea598dbb4 100644 --- a/packages/SystemUI/res/layout/media_output_list_item.xml +++ b/packages/SystemUI/res/layout/media_output_list_item.xml @@ -33,7 +33,7 @@ android:layout_height="match_parent" android:background="@drawable/media_output_item_background" android:layout_gravity="center_vertical|start"> - <com.android.systemui.media.dialog.MediaOutputSeekbar + <SeekBar android:id="@+id/volume_seekbar" android:splitTrack="false" android:visibility="gone" @@ -119,15 +119,24 @@ android:importantForAccessibility="no" android:visibility="gone"/> + <LinearLayout + android:id="@+id/end_action_area" + android:visibility="gone" + android:orientation="vertical" + android:layout_width="48dp" + android:layout_height="64dp" + android:layout_gravity="right|center" + android:gravity="center_vertical"> <CheckBox android:id="@+id/check_box" android:layout_width="24dp" android:layout_height="24dp" android:layout_marginEnd="16dp" - android:layout_gravity="right|center" + android:layout_gravity="right" android:button="@drawable/ic_circle_check_box" android:visibility="gone" - android:clickable="false" /> + + </LinearLayout> </FrameLayout> </LinearLayout>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/media_smartspace_recommendations.xml b/packages/SystemUI/res/layout/media_smartspace_recommendations.xml index c3fc66952395..6611c59651fc 100644 --- a/packages/SystemUI/res/layout/media_smartspace_recommendations.xml +++ b/packages/SystemUI/res/layout/media_smartspace_recommendations.xml @@ -22,163 +22,145 @@ android:id="@+id/media_recommendations" android:layout_width="match_parent" android:layout_height="wrap_content" - android:paddingStart="@dimen/qs_media_padding" - android:paddingEnd="@dimen/qs_media_padding" android:clipChildren="false" android:clipToPadding="false" android:forceHasOverlappingRendering="false" android:background="@drawable/qs_media_background" android:theme="@style/MediaPlayer"> - <androidx.constraintlayout.widget.Guideline - android:id="@+id/media_vertical_start_guideline" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:orientation="vertical" - app:layout_constraintGuide_percent="0.25" /> - - <androidx.constraintlayout.widget.Guideline - android:id="@+id/media_horizontal_center_guideline" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:orientation="horizontal" - app:layout_constraintGuide_percent="0.5" /> + <!-- This view just ensures the full media player is a certain height. --> + <View + android:id="@+id/sizing_view" + android:layout_width="match_parent" + android:layout_height="@dimen/qs_media_session_height_expanded" /> <com.android.internal.widget.CachingIconView android:id="@+id/recommendation_card_icon" - android:layout_width="@dimen/qs_media_icon_size" - android:layout_height="@dimen/qs_media_icon_size" - android:layout_marginTop="@dimen/qs_media_padding" - android:src="@drawable/ic_headset" - style="@style/MediaPlayer.AppIcon" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintEnd_toStartOf="@id/media_vertical_start_guideline" - app:layout_constraintHorizontal_bias="0"/> - - <TextView - android:id="@+id/recommendation_card_text" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:maxLines="1" - android:text="@string/controls_media_smartspace_rec_title" - android:fontFamily="google-sans-medium" - android:textDirection="locale" - android:textSize="@dimen/qq_aa_media_rec_header_text_size" - android:hyphenationFrequency="none" - app:layout_constraintTop_toBottomOf="@id/recommendation_card_icon" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintEnd_toStartOf="@id/media_vertical_start_guideline" - app:layout_constraintHorizontal_bias="0"/> - - <View - android:id="@+id/recommendation_gradient_view" - android:layout_width="@dimen/qs_aa_media_gradient_bg_width" - android:layout_height="0dp" - android:clipToPadding="false" - android:clipChildren="false" - android:background="@drawable/qs_media_recommendation_bg_gradient" - app:layout_constraintTop_toTopOf="@id/recommendation_card_text" - app:layout_constraintBottom_toBottomOf="@id/recommendation_card_text" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintEnd_toStartOf="@id/media_vertical_start_guideline" - app:layout_constraintHorizontal_bias="1"/> + style="@style/MediaPlayer.Recommendation.AppIcon" /> <FrameLayout android:id="@+id/media_cover1_container" - android:layout_width="0dp" - android:layout_height="@dimen/qs_aa_media_rec_album_size_collapsed" - android:background="@drawable/qs_media_light_source"> + style="@style/MediaPlayer.Recommendation.AlbumContainer" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintBottom_toTopOf="@+id/media_title1" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toStartOf="@id/media_cover2_container" + android:layout_marginEnd="@dimen/qs_media_rec_album_side_margin" + app:layout_constraintHorizontal_chainStyle="packed" + app:layout_constraintHorizontal_bias="1.0" + app:layout_constraintVertical_bias="0.5" + > <ImageView android:id="@+id/media_cover1" android:layout_width="match_parent" android:layout_height="match_parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintBottom_toBottomOf="parent" android:adjustViewBounds="true" android:background="@drawable/bg_smartspace_media_item" - style="@style/MediaPlayer.Album" + style="@style/MediaPlayer.Recommendation.Album" android:clipToOutline="true" android:scaleType="centerCrop"/> </FrameLayout> + <TextView + android:id="@+id/media_title1" + style="@style/MediaPlayer.Recommendation.Text.Title" + app:layout_constraintStart_toStartOf="@+id/media_cover1_container" + app:layout_constraintEnd_toEndOf="@+id/media_cover1_container" + app:layout_constraintTop_toBottomOf="@+id/media_cover1_container" + app:layout_constraintBottom_toTopOf="@+id/media_subtitle1" + /> + + <TextView + android:id="@+id/media_subtitle1" + style="@style/MediaPlayer.Recommendation.Text.Subtitle" + app:layout_constraintStart_toStartOf="@+id/media_cover1_container" + app:layout_constraintEnd_toEndOf="@+id/media_cover1_container" + app:layout_constraintTop_toBottomOf="@+id/media_title1" + app:layout_constraintBottom_toBottomOf="parent" + android:layout_marginBottom="@dimen/qs_media_padding" + /> + <FrameLayout android:id="@+id/media_cover2_container" - android:layout_width="0dp" - android:layout_height="@dimen/qs_aa_media_rec_album_size_collapsed" - android:background="@drawable/qs_media_light_source"> + style="@style/MediaPlayer.Recommendation.AlbumContainer" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintBottom_toTopOf="@id/media_title2" + app:layout_constraintStart_toEndOf="@id/media_cover1_container" + app:layout_constraintEnd_toStartOf="@id/media_cover3_container" + android:layout_marginEnd="@dimen/qs_media_rec_album_side_margin" + app:layout_constraintVertical_bias="0.5" + > <ImageView android:id="@+id/media_cover2" android:layout_width="match_parent" android:layout_height="match_parent" android:adjustViewBounds="true" android:background="@drawable/bg_smartspace_media_item" - style="@style/MediaPlayer.Album" + style="@style/MediaPlayer.Recommendation.Album" android:clipToOutline="true" android:scaleType="centerCrop"/> </FrameLayout> + <TextView + android:id="@+id/media_title2" + style="@style/MediaPlayer.Recommendation.Text.Title" + app:layout_constraintStart_toStartOf="@+id/media_cover2_container" + app:layout_constraintEnd_toEndOf="@+id/media_cover2_container" + app:layout_constraintTop_toBottomOf="@+id/media_cover2_container" + app:layout_constraintBottom_toTopOf="@+id/media_subtitle2" + /> + + <TextView + android:id="@+id/media_subtitle2" + style="@style/MediaPlayer.Recommendation.Text.Subtitle" + app:layout_constraintStart_toStartOf="@+id/media_cover2_container" + app:layout_constraintEnd_toEndOf="@+id/media_cover2_container" + app:layout_constraintTop_toBottomOf="@+id/media_title2" + app:layout_constraintBottom_toBottomOf="parent" + android:layout_marginBottom="@dimen/qs_media_padding" + /> + <FrameLayout android:id="@+id/media_cover3_container" - android:layout_width="0dp" - android:layout_height="@dimen/qs_aa_media_rec_album_size_collapsed" - android:background="@drawable/qs_media_light_source"> + style="@style/MediaPlayer.Recommendation.AlbumContainer" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintBottom_toTopOf="@id/media_title3" + app:layout_constraintStart_toEndOf="@id/media_cover2_container" + app:layout_constraintEnd_toEndOf="parent" + android:layout_marginEnd="@dimen/qs_media_padding" + app:layout_constraintVertical_bias="0.5" + > <ImageView android:id="@+id/media_cover3" android:layout_width="match_parent" android:layout_height="match_parent" android:adjustViewBounds="true" android:background="@drawable/bg_smartspace_media_item" - style="@style/MediaPlayer.Album" - android:clipToOutline="true" - android:scaleType="centerCrop"/> - </FrameLayout> - - <FrameLayout - android:id="@+id/media_cover4_container" - android:layout_width="0dp" - android:layout_height="@dimen/qs_aa_media_rec_album_size_collapsed" - android:background="@drawable/qs_media_light_source"> - <ImageView - android:id="@+id/media_cover4" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:adjustViewBounds="true" - android:background="@drawable/bg_smartspace_media_item" - style="@style/MediaPlayer.Album" + style="@style/MediaPlayer.Recommendation.Album" android:clipToOutline="true" android:scaleType="centerCrop"/> </FrameLayout> - <FrameLayout - android:id="@+id/media_cover5_container" - android:layout_width="0dp" - android:layout_height="@dimen/qs_aa_media_rec_album_size_collapsed" - android:background="@drawable/qs_media_light_source"> - <ImageView - android:id="@+id/media_cover5" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:adjustViewBounds="true" - android:background="@drawable/bg_smartspace_media_item" - style="@style/MediaPlayer.Album" - android:clipToOutline="true" - android:scaleType="centerCrop"/> - </FrameLayout> + <TextView + android:id="@+id/media_title3" + style="@style/MediaPlayer.Recommendation.Text.Title" + app:layout_constraintStart_toStartOf="@+id/media_cover3_container" + app:layout_constraintEnd_toEndOf="@+id/media_cover3_container" + app:layout_constraintTop_toBottomOf="@+id/media_cover3_container" + app:layout_constraintBottom_toTopOf="@+id/media_subtitle3" + /> - <FrameLayout - android:id="@+id/media_cover6_container" - android:layout_width="0dp" - android:layout_height="@dimen/qs_aa_media_rec_album_size_collapsed" - android:background="@drawable/qs_media_light_source"> - <ImageView - android:id="@+id/media_cover6" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:adjustViewBounds="true" - android:background="@drawable/bg_smartspace_media_item" - style="@style/MediaPlayer.Album" - android:clipToOutline="true" - android:scaleType="centerCrop"/> - </FrameLayout> + <TextView + android:id="@+id/media_subtitle3" + style="@style/MediaPlayer.Recommendation.Text.Subtitle" + app:layout_constraintStart_toStartOf="@+id/media_cover3_container" + app:layout_constraintEnd_toEndOf="@+id/media_cover3_container" + app:layout_constraintTop_toBottomOf="@+id/media_title3" + app:layout_constraintBottom_toBottomOf="parent" + android:layout_marginBottom="@dimen/qs_media_padding" + /> <!-- Long press menu --> <TextView @@ -273,4 +255,4 @@ android:text="@string/controls_media_dismiss_button" /> </FrameLayout> -</com.android.systemui.util.animation.TransitionLayout>
\ No newline at end of file +</com.android.systemui.util.animation.TransitionLayout> diff --git a/packages/SystemUI/res/values-pl/tiles_states_strings.xml b/packages/SystemUI/res/values-pl/tiles_states_strings.xml index aae48c815d69..f5d8f1fe815d 100644 --- a/packages/SystemUI/res/values-pl/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-pl/tiles_states_strings.xml @@ -87,9 +87,9 @@ <item msgid="2075645297847971154">"Włączony"</item> </string-array> <string-array name="tile_states_color_correction"> - <item msgid="2840507878437297682">"Brak dostępu"</item> - <item msgid="1909756493418256167">"Wyłączono"</item> - <item msgid="4531508423703413340">"Włączono"</item> + <item msgid="2840507878437297682">"Niedostępna"</item> + <item msgid="1909756493418256167">"Wyłączona"</item> + <item msgid="4531508423703413340">"Włączona"</item> </string-array> <string-array name="tile_states_inversion"> <item msgid="3638187931191394628">"Niedostępne"</item> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 4725515d16fb..80582efec6a4 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -959,7 +959,6 @@ <dimen name="qs_media_album_radius">14dp</dimen> <dimen name="qs_media_info_margin">12dp</dimen> <dimen name="qs_media_info_spacing">8dp</dimen> - <dimen name="qs_media_icon_size">20dp</dimen> <dimen name="qs_media_icon_offset">4dp</dimen> <dimen name="qs_center_guideline_padding">10dp</dimen> <dimen name="qs_media_action_spacing">4dp</dimen> @@ -980,12 +979,10 @@ <dimen name="qs_media_session_collapsed_guideline">144dp</dimen> <!-- Size of Smartspace media recommendations cards in the QSPanel carousel --> - <dimen name="qs_aa_media_rec_album_size_collapsed">72dp</dimen> - <dimen name="qs_aa_media_rec_album_size_expanded">76dp</dimen> - <dimen name="qs_aa_media_gradient_bg_width">32dp</dimen> - <dimen name="qs_aa_media_rec_album_margin">8dp</dimen> - <dimen name="qs_aa_media_rec_album_margin_vert">4dp</dimen> - <dimen name="qq_aa_media_rec_header_text_size">16sp</dimen> + <dimen name="qs_media_rec_album_size">88dp</dimen> + <dimen name="qs_media_rec_album_side_margin">16dp</dimen> + <dimen name="qs_media_rec_album_bottom_margin">8dp</dimen> + <dimen name="qs_media_rec_icon_size">24dp</dimen> <!-- Media tap-to-transfer chip for sender device --> <dimen name="media_ttt_chip_outer_padding">16dp</dimen> @@ -1368,7 +1365,7 @@ <dimen name="keyguard_unfold_translation_x">16dp</dimen> - <dimen name="fgs_manager_min_width_minor">100%</dimen> + <dimen name="fgs_manager_list_top_spacing">12dp</dimen> <!-- Dream overlay related dimensions --> <dimen name="dream_overlay_status_bar_height">60dp</dimen> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 0f5115b5c0f5..f7acda7ec379 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -2440,14 +2440,16 @@ <!-- Label for the entry point to open the dialog which shows currently running applications [CHAR LIMIT=NONE]--> <plurals name="fgs_manager_footer_label"> - <item quantity="one"><xliff:g id="count" example="1">%s</xliff:g> active app</item> - <item quantity="other"><xliff:g id="count" example="2">%s</xliff:g> active apps</item> + <item quantity="one"><xliff:g id="count" example="1">%s</xliff:g> app is active</item> + <item quantity="other"><xliff:g id="count" example="2">%s</xliff:g> apps are active</item> </plurals> <!-- Content description for a dot indicator in the running application indicating that there is new information [CHAR LIMIT=NONE] --> <string name="fgs_dot_content_description">New information</string> <!-- Title for dialog listing applications currently running [CHAR LIMIT=NONE]--> <string name="fgs_manager_dialog_title">Active apps</string> + <!-- Detailed message for dialog listing applications currently running [CHAR LIMIT=NONE]--> + <string name="fgs_manager_dialog_message">Even if you\u2019re not using these apps, they\u2019re still active and might affect battery life</string> <!-- Label of the button to stop an app from running [CHAR LIMIT=12]--> <string name="fgs_manager_app_item_stop_button_label">Stop</string> <!-- Label of the button to stop an app from running but the app is already stopped and the button is disabled [CHAR LIMIT=12]--> diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml index d7799a7addd1..827631b7eb53 100644 --- a/packages/SystemUI/res/values/styles.xml +++ b/packages/SystemUI/res/values/styles.xml @@ -653,16 +653,50 @@ <item name="android:textColor">?android:attr/textColorPrimary</item> </style> - <style name="MediaPlayer.AppIcon"> + <style name="MediaPlayer.Recommendation"/> + + <style name="MediaPlayer.Recommendation.AppIcon"> <item name="android:background">@drawable/qs_media_icon_background</item> <item name="android:backgroundTint">@color/media_player_solid_button_bg</item> - <item name="android:padding">4dp</item> + <item name="android:layout_width">@dimen/qs_media_rec_icon_size</item> + <item name="android:layout_height">@dimen/qs_media_rec_icon_size</item> + <item name="layout_constraintTop_toTopOf">parent</item> + <item name="layout_constraintStart_toStartOf">parent</item> + <item name="android:layout_marginTop">@dimen/qs_media_padding</item> + <item name="android:layout_marginStart">@dimen/qs_media_padding</item> + <item name="android:src">@drawable/ic_headset</item> + </style> + + <style name="MediaPlayer.Recommendation.AlbumContainer"> + <item name="android:layout_width">@dimen/qs_media_rec_album_size</item> + <item name="android:layout_height">@dimen/qs_media_rec_album_size</item> + <item name="android:background">@drawable/qs_media_light_source</item> + <item name="android:layout_marginTop">@dimen/qs_media_padding</item> + <item name="android:layout_marginBottom">@dimen/qs_media_rec_album_bottom_margin</item> </style> - <style name="MediaPlayer.Album"> + <style name="MediaPlayer.Recommendation.Album"> <item name="android:backgroundTint">@color/media_player_album_bg</item> </style> + <style name="MediaPlayer.Recommendation.Text"> + <item name="android:layout_width">@dimen/qs_media_rec_album_size</item> + <item name="android:layout_height">wrap_content</item> + <item name="android:maxLines">1</item> + <item name="android:ellipsize">end</item> + <item name="android:textSize">14sp</item> + <item name="android:gravity">start</item> + </style> + + <style name="MediaPlayer.Recommendation.Text.Title"> + <item name="android:textColor">?android:attr/textColorPrimary</item> + </style> + + <style name="MediaPlayer.Recommendation.Text.Subtitle"> + <item name="android:textColor">?android:attr/textColorSecondary</item> + </style> + + <!-- Used to style charging animation AVD animation --> <style name="ChargingAnim" /> @@ -1085,6 +1119,7 @@ <style name="FgsManagerAppLabel" parent="TextAppearance.Dialog.Body"> <item name="android:textDirection">locale</item> + <item name="android:textStyle">bold</item> </style> <style name="FgsManagerAppDuration"> diff --git a/packages/SystemUI/res/xml/media_recommendation_collapsed.xml b/packages/SystemUI/res/xml/media_recommendation_collapsed.xml index b6258d1c71eb..a6113473b065 100644 --- a/packages/SystemUI/res/xml/media_recommendation_collapsed.xml +++ b/packages/SystemUI/res/xml/media_recommendation_collapsed.xml @@ -16,91 +16,84 @@ --> <ConstraintSet xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto"> + xmlns:app="http://schemas.android.com/apk/res-auto" > <Constraint + android:id="@+id/sizing_view" + android:layout_width="match_parent" + android:layout_height="@dimen/qs_media_session_height_collapsed" + /> + + <!-- Only the constraintBottom and marginBottom are different. The rest of the constraints are + the same as the constraints in media_smartspace_recommendations. But due to how + ConstraintSets work, all the constraints need to be in the same place. + Ditto for the other cover containers. --> + <Constraint android:id="@+id/media_cover1_container" - android:layout_width="0dp" - android:layout_height="@dimen/qs_aa_media_rec_album_size_collapsed" - app:layout_constraintWidth_max="@dimen/qs_aa_media_rec_album_size_collapsed" - app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" - android:layout_marginTop="@dimen/qs_media_padding" android:layout_marginBottom="@dimen/qs_media_padding" - android:layout_marginEnd="@dimen/qs_aa_media_rec_album_margin" - app:layout_constraintStart_toEndOf="@id/media_vertical_start_guideline" + style="@style/MediaPlayer.Recommendation.AlbumContainer" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toStartOf="@id/media_cover2_container" + android:layout_marginEnd="@dimen/qs_media_rec_album_side_margin" app:layout_constraintHorizontal_chainStyle="packed" - app:layout_constraintHorizontal_bias="1" - android:visibility="gone" /> + app:layout_constraintHorizontal_bias="1.0" + app:layout_constraintVertical_bias="0.5" + /> + + <Constraint + android:id="@+id/media_title1" + android:visibility="gone" + /> + + <Constraint + android:id="@+id/media_subtitle1" + android:visibility="gone" + /> <Constraint android:id="@+id/media_cover2_container" - android:layout_width="0dp" - android:layout_height="@dimen/qs_aa_media_rec_album_size_collapsed" - app:layout_constraintWidth_max="@dimen/qs_aa_media_rec_album_size_collapsed" - android:layout_marginTop="@dimen/qs_media_padding" + app:layout_constraintBottom_toBottomOf="parent" android:layout_marginBottom="@dimen/qs_media_padding" - android:layout_marginEnd="@dimen/qs_aa_media_rec_album_margin" + style="@style/MediaPlayer.Recommendation.AlbumContainer" app:layout_constraintTop_toTopOf="parent" - app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toEndOf="@id/media_cover1_container" app:layout_constraintEnd_toStartOf="@id/media_cover3_container" - app:layout_constraintHorizontal_chainStyle="packed" - app:layout_constraintHorizontal_bias="1" - android:visibility="gone" /> + android:layout_marginEnd="@dimen/qs_media_rec_album_side_margin" + app:layout_constraintVertical_bias="0.5" + /> + + <Constraint + android:id="@+id/media_title2" + android:visibility="gone" + /> + + <Constraint + android:id="@+id/media_subtitle2" + android:visibility="gone" + /> <Constraint android:id="@+id/media_cover3_container" - android:layout_width="0dp" - android:layout_height="@dimen/qs_aa_media_rec_album_size_collapsed" - app:layout_constraintWidth_max="@dimen/qs_aa_media_rec_album_size_collapsed" - android:layout_marginTop="@dimen/qs_media_padding" + app:layout_constraintBottom_toBottomOf="parent" android:layout_marginBottom="@dimen/qs_media_padding" + style="@style/MediaPlayer.Recommendation.AlbumContainer" app:layout_constraintTop_toTopOf="parent" - app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toEndOf="@id/media_cover2_container" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_chainStyle="packed" - app:layout_constraintHorizontal_bias="1" - android:visibility="gone" /> + android:layout_marginEnd="@dimen/qs_media_padding" + app:layout_constraintVertical_bias="0.5" + /> <Constraint - android:id="@+id/media_cover4_container" - android:layout_width="0dp" - android:layout_height="0dp" - android:layout_marginEnd="@dimen/qs_aa_media_rec_album_margin" - app:layout_constraintTop_toBottomOf="@+id/media_cover1_container" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintStart_toEndOf="@id/media_vertical_start_guideline" - app:layout_constraintEnd_toStartOf="@id/media_cover5_container" - app:layout_constraintHorizontal_chainStyle="packed" - app:layout_constraintHorizontal_bias="1" - android:visibility="gone" /> + android:id="@+id/media_title3" + android:visibility="gone" + /> <Constraint - android:id="@+id/media_cover5_container" - android:layout_width="0dp" - android:layout_height="0dp" - android:layout_marginEnd="@dimen/qs_aa_media_rec_album_margin" - app:layout_constraintTop_toBottomOf="@+id/media_cover2_container" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintStart_toEndOf="@+id/media_cover4_container" - app:layout_constraintEnd_toStartOf="@+id/media_cover6_container" - app:layout_constraintHorizontal_chainStyle="packed" - app:layout_constraintHorizontal_bias="1" - android:visibility="gone" /> - - <Constraint - android:id="@+id/media_cover6_container" - android:layout_width="0dp" - android:layout_height="0dp" - app:layout_constraintTop_toBottomOf="@id/media_cover3_container" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintStart_toEndOf="@id/media_cover5_container" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_chainStyle="packed" - app:layout_constraintHorizontal_bias="1" - android:visibility="gone" /> + android:id="@+id/media_subtitle3" + android:visibility="gone" + /> </ConstraintSet> diff --git a/packages/SystemUI/res/xml/media_recommendation_expanded.xml b/packages/SystemUI/res/xml/media_recommendation_expanded.xml index 2fb33415e0df..09ffebb8b4a9 100644 --- a/packages/SystemUI/res/xml/media_recommendation_expanded.xml +++ b/packages/SystemUI/res/xml/media_recommendation_expanded.xml @@ -15,113 +15,12 @@ ~ limitations under the License --> <ConstraintSet - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto"> + xmlns:android="http://schemas.android.com/apk/res/android" > <Constraint - android:id="@+id/media_cover1_container" - android:layout_width="0dp" - android:layout_height="@dimen/qs_aa_media_rec_album_size_expanded" - app:layout_constraintWidth_max="@dimen/qs_aa_media_rec_album_size_expanded" - android:layout_marginTop="@dimen/qs_media_padding" - android:layout_marginBottom="@dimen/qs_aa_media_rec_album_margin_vert" - android:layout_marginEnd="@dimen/qs_aa_media_rec_album_margin" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintBottom_toTopOf="@+id/media_horizontal_center_guideline" - app:layout_constraintStart_toEndOf="@id/media_vertical_start_guideline" - app:layout_constraintEnd_toStartOf="@id/media_cover2_container" - app:layout_constraintHorizontal_chainStyle="packed" - app:layout_constraintHorizontal_bias="1" - app:layout_constraintVertical_chainStyle="packed" - app:layout_constraintVertical_bias="0" - android:visibility="gone" /> - - <Constraint - android:id="@+id/media_cover2_container" - android:layout_width="0dp" - android:layout_height="@dimen/qs_aa_media_rec_album_size_expanded" - app:layout_constraintWidth_max="@dimen/qs_aa_media_rec_album_size_expanded" - android:layout_marginTop="@dimen/qs_media_padding" - android:layout_marginBottom="@dimen/qs_aa_media_rec_album_margin_vert" - android:layout_marginEnd="@dimen/qs_aa_media_rec_album_margin" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintBottom_toTopOf="@+id/media_horizontal_center_guideline" - app:layout_constraintStart_toEndOf="@id/media_cover1_container" - app:layout_constraintEnd_toStartOf="@id/media_cover3_container" - app:layout_constraintHorizontal_chainStyle="packed" - app:layout_constraintHorizontal_bias="1" - app:layout_constraintVertical_chainStyle="packed" - app:layout_constraintVertical_bias="0" - android:visibility="gone" /> - - <Constraint - android:id="@+id/media_cover3_container" - android:layout_width="0dp" - android:layout_height="@dimen/qs_aa_media_rec_album_size_expanded" - app:layout_constraintWidth_max="@dimen/qs_aa_media_rec_album_size_expanded" - android:layout_marginTop="@dimen/qs_media_padding" - android:layout_marginBottom="@dimen/qs_aa_media_rec_album_margin_vert" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintBottom_toTopOf="@+id/media_horizontal_center_guideline" - app:layout_constraintStart_toEndOf="@id/media_cover2_container" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_chainStyle="packed" - app:layout_constraintHorizontal_bias="1" - app:layout_constraintVertical_chainStyle="packed" - app:layout_constraintVertical_bias="0" - android:visibility="gone" /> - - <Constraint - android:id="@+id/media_cover4_container" - android:layout_width="0dp" - android:layout_height="@dimen/qs_aa_media_rec_album_size_expanded" - app:layout_constraintWidth_max="@dimen/qs_aa_media_rec_album_size_expanded" - android:layout_marginTop="@dimen/qs_aa_media_rec_album_margin_vert" - android:layout_marginBottom="@dimen/qs_media_padding" - android:layout_marginEnd="@dimen/qs_aa_media_rec_album_margin" - app:layout_constraintTop_toBottomOf="@+id/media_horizontal_center_guideline" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintStart_toEndOf="@id/media_vertical_start_guideline" - app:layout_constraintEnd_toStartOf="@id/media_cover5_container" - app:layout_constraintHorizontal_chainStyle="packed" - app:layout_constraintHorizontal_bias="1" - app:layout_constraintVertical_chainStyle="packed" - app:layout_constraintVertical_bias="1" - android:visibility="gone" /> - - <Constraint - android:id="@+id/media_cover5_container" - android:layout_width="0dp" - android:layout_height="@dimen/qs_aa_media_rec_album_size_expanded" - app:layout_constraintWidth_max="@dimen/qs_aa_media_rec_album_size_expanded" - android:layout_marginTop="@dimen/qs_aa_media_rec_album_margin_vert" - android:layout_marginBottom="@dimen/qs_media_padding" - android:layout_marginEnd="@dimen/qs_aa_media_rec_album_margin" - app:layout_constraintTop_toBottomOf="@+id/media_horizontal_center_guideline" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintStart_toEndOf="@+id/media_cover4_container" - app:layout_constraintEnd_toStartOf="@+id/media_cover6_container" - app:layout_constraintHorizontal_chainStyle="packed" - app:layout_constraintHorizontal_bias="1" - app:layout_constraintVertical_chainStyle="packed" - app:layout_constraintVertical_bias="1" - android:visibility="gone" /> - - <Constraint - android:id="@+id/media_cover6_container" - android:layout_width="0dp" - android:layout_height="@dimen/qs_aa_media_rec_album_size_expanded" - app:layout_constraintWidth_max="@dimen/qs_aa_media_rec_album_size_expanded" - android:layout_marginTop="@dimen/qs_aa_media_rec_album_margin_vert" - android:layout_marginBottom="@dimen/qs_media_padding" - app:layout_constraintTop_toBottomOf="@id/media_horizontal_center_guideline" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintStart_toEndOf="@id/media_cover5_container" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_chainStyle="packed" - app:layout_constraintHorizontal_bias="1" - app:layout_constraintVertical_chainStyle="packed" - app:layout_constraintVertical_bias="1" - android:visibility="gone" /> + android:id="@+id/sizing_view" + android:layout_width="match_parent" + android:layout_height="@dimen/qs_media_session_height_expanded" + /> </ConstraintSet> diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/rotation/RotationButtonController.java b/packages/SystemUI/shared/src/com/android/systemui/shared/rotation/RotationButtonController.java index bb7a0a719a74..01f417f147d7 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/rotation/RotationButtonController.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/rotation/RotationButtonController.java @@ -568,7 +568,7 @@ public class RotationButtonController { } } - private class TaskStackListenerImpl extends TaskStackChangeListener { + private class TaskStackListenerImpl implements TaskStackChangeListener { // Invalidate any rotation suggestion on task change or activity orientation change // Note: all callbacks happen on main thread diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java index c5d54391959a..f65d82a5d6d2 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java @@ -26,30 +26,30 @@ import com.android.systemui.shared.recents.model.ThumbnailData; * An interface to track task stack changes. Classes should implement this instead of * {@link android.app.ITaskStackListener} to reduce IPC calls from system services. */ -public abstract class TaskStackChangeListener { +public interface TaskStackChangeListener { // Binder thread callbacks - public void onTaskStackChangedBackground() { } + default void onTaskStackChangedBackground() { } // Main thread callbacks - public void onTaskStackChanged() { } - public void onTaskSnapshotChanged(int taskId, ThumbnailData snapshot) { } - public void onActivityPinned(String packageName, int userId, int taskId, int stackId) { } - public void onActivityUnpinned() { } - public void onActivityRestartAttempt(RunningTaskInfo task, boolean homeTaskVisible, + default void onTaskStackChanged() { } + default void onTaskSnapshotChanged(int taskId, ThumbnailData snapshot) { } + default void onActivityPinned(String packageName, int userId, int taskId, int stackId) { } + default void onActivityUnpinned() { } + default void onActivityRestartAttempt(RunningTaskInfo task, boolean homeTaskVisible, boolean clearedTask, boolean wasVisible) { } - public void onActivityForcedResizable(String packageName, int taskId, int reason) { } - public void onActivityDismissingDockedStack() { } - public void onActivityLaunchOnSecondaryDisplayFailed() { } + default void onActivityForcedResizable(String packageName, int taskId, int reason) { } + default void onActivityDismissingDockedStack() { } + default void onActivityLaunchOnSecondaryDisplayFailed() { } - public void onActivityLaunchOnSecondaryDisplayFailed(RunningTaskInfo taskInfo) { + default void onActivityLaunchOnSecondaryDisplayFailed(RunningTaskInfo taskInfo) { onActivityLaunchOnSecondaryDisplayFailed(); } /** * @see #onActivityLaunchOnSecondaryDisplayRerouted(RunningTaskInfo taskInfo) */ - public void onActivityLaunchOnSecondaryDisplayRerouted() { } + default void onActivityLaunchOnSecondaryDisplayRerouted() { } /** * Called when an activity was requested to be launched on a secondary display but was rerouted @@ -57,16 +57,16 @@ public abstract class TaskStackChangeListener { * * @param taskInfo info about the Activity's task */ - public void onActivityLaunchOnSecondaryDisplayRerouted(RunningTaskInfo taskInfo) { + default void onActivityLaunchOnSecondaryDisplayRerouted(RunningTaskInfo taskInfo) { onActivityLaunchOnSecondaryDisplayRerouted(); } - public void onTaskProfileLocked(int taskId, int userId) { } - public void onTaskCreated(int taskId, ComponentName componentName) { } - public void onTaskRemoved(int taskId) { } - public void onTaskMovedToFront(int taskId) { } + default void onTaskProfileLocked(int taskId, int userId) { } + default void onTaskCreated(int taskId, ComponentName componentName) { } + default void onTaskRemoved(int taskId) { } + default void onTaskMovedToFront(int taskId) { } - public void onTaskMovedToFront(RunningTaskInfo taskInfo) { + default void onTaskMovedToFront(RunningTaskInfo taskInfo) { onTaskMovedToFront(taskInfo.taskId); } @@ -74,13 +74,14 @@ public abstract class TaskStackChangeListener { * Called when a task’s description is changed due to an activity calling * ActivityManagerService.setTaskDescription * - * @param taskInfo info about the task which changed, with {@link TaskInfo#taskDescription} + * @param taskInfo info about the task which changed, with + * {@link RunningTaskInfo#taskDescription} */ - public void onTaskDescriptionChanged(RunningTaskInfo taskInfo) { } + default void onTaskDescriptionChanged(RunningTaskInfo taskInfo) { } - public void onActivityRequestedOrientationChanged(int taskId, int requestedOrientation) { } + default void onActivityRequestedOrientationChanged(int taskId, int requestedOrientation) { } - public void onBackPressedOnTaskRoot(RunningTaskInfo taskInfo) { } + default void onBackPressedOnTaskRoot(RunningTaskInfo taskInfo) { } /** * Called when a task is reparented to a stack on a different display. @@ -88,22 +89,22 @@ public abstract class TaskStackChangeListener { * @param taskId id of the task which was moved to a different display. * @param newDisplayId id of the new display. */ - public void onTaskDisplayChanged(int taskId, int newDisplayId) { } + default void onTaskDisplayChanged(int taskId, int newDisplayId) { } /** * Called when any additions or deletions to the recent tasks list have been made. */ - public void onRecentTaskListUpdated() { } + default void onRecentTaskListUpdated() { } /** @see ITaskStackListener#onRecentTaskListFrozenChanged(boolean) */ - public void onRecentTaskListFrozenChanged(boolean frozen) { } + default void onRecentTaskListFrozenChanged(boolean frozen) { } /** @see ITaskStackListener#onActivityRotation(int)*/ - public void onActivityRotation(int displayId) { } + default void onActivityRotation(int displayId) { } /** * Called when the lock task mode changes. See ActivityManager#LOCK_TASK_MODE_* and * LockTaskController. */ - public void onLockTaskModeChanged(int mode) { } + default void onLockTaskModeChanged(int mode) { } } diff --git a/packages/SystemUI/shared/src/com/android/systemui/unfold/updates/DeviceFoldStateProvider.kt b/packages/SystemUI/shared/src/com/android/systemui/unfold/updates/DeviceFoldStateProvider.kt index ed973d6a6854..83b72e84a169 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/unfold/updates/DeviceFoldStateProvider.kt +++ b/packages/SystemUI/shared/src/com/android/systemui/unfold/updates/DeviceFoldStateProvider.kt @@ -57,6 +57,15 @@ constructor( private val foldStateListener = FoldStateListener(context) private val timeoutRunnable = TimeoutRunnable() + /** + * Time after which [FOLD_UPDATE_FINISH_HALF_OPEN] is emitted following a + * [FOLD_UPDATE_START_CLOSING] or [FOLD_UPDATE_START_OPENING] event, if an end state is not + * reached. + */ + private val halfOpenedTimeoutMillis: Int = + context.resources.getInteger( + com.android.internal.R.integer.config_unfoldTransitionHalfFoldedTimeout) + private var isFolded = false private var isUnfoldHandled = true @@ -171,7 +180,7 @@ constructor( if (isTransitionInProgess) { cancelTimeout() } - handler.postDelayed(timeoutRunnable, HALF_OPENED_TIMEOUT_MILLIS) + handler.postDelayed(timeoutRunnable, halfOpenedTimeoutMillis.toLong()) } private fun cancelTimeout() { @@ -222,12 +231,6 @@ private fun stateToString(@FoldUpdate update: Int): String { private const val TAG = "DeviceFoldProvider" private const val DEBUG = false -/** - * Time after which [FOLD_UPDATE_FINISH_HALF_OPEN] is emitted following a - * [FOLD_UPDATE_START_CLOSING] or [FOLD_UPDATE_START_OPENING] event, if an end state is not reached. - */ -@VisibleForTesting const val HALF_OPENED_TIMEOUT_MILLIS = 600L - /** Threshold after which we consider the device fully unfolded. */ @VisibleForTesting const val FULLY_OPEN_THRESHOLD_DEGREES = 15f diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardListenModel.kt b/packages/SystemUI/src/com/android/keyguard/KeyguardListenModel.kt index 5953611b454a..db2b4ac2c669 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardListenModel.kt +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardListenModel.kt @@ -63,7 +63,8 @@ data class KeyguardFaceListenModel( val primaryUser: Boolean, val scanningAllowedByStrongAuth: Boolean, val secureCameraLaunched: Boolean, - val switchingUser: Boolean + val switchingUser: Boolean, + val udfpsBouncerShowing: Boolean ) : KeyguardListenModel() /** * Verbose debug information associated with [KeyguardUpdateMonitor.shouldTriggerActiveUnlock]. @@ -73,6 +74,7 @@ data class KeyguardActiveUnlockModel( override val userId: Int, override val listening: Boolean, // keep sorted + val awakeKeyguard: Boolean, val authInterruptActive: Boolean, val encryptedOrTimedOut: Boolean, val fpLockout: Boolean, diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java index 3103219d8978..53d7b8cee3be 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java @@ -700,6 +700,7 @@ public class KeyguardSecurityContainer extends FrameLayout { } public void reset() { + mViewMode.reset(); mDisappearAnimRunning = false; } @@ -798,9 +799,6 @@ public class KeyguardSecurityContainer extends FrameLayout { mUserSwitcherViewGroup = mView.findViewById(R.id.keyguard_bouncer_user_switcher); } - Drawable userIcon = findUserIcon(KeyguardUpdateMonitor.getCurrentUser()); - ((ImageView) mView.findViewById(R.id.user_icon)).setImageDrawable(userIcon); - updateSecurityViewLocation(); mUserSwitcher = mView.findViewById(R.id.user_switcher_header); @@ -813,6 +811,7 @@ public class KeyguardSecurityContainer extends FrameLayout { mPopup.dismiss(); mPopup = null; } + setupUserSwitcher(); } private Drawable findUserIcon(int userId) { @@ -858,6 +857,12 @@ public class KeyguardSecurityContainer extends FrameLayout { private void setupUserSwitcher() { final UserRecord currentUser = mUserSwitcherController.getCurrentUserRecord(); + if (currentUser == null) { + Log.wtf(TAG, "Current user in user switcher is null."); + return; + } + Drawable userIcon = findUserIcon(currentUser.info.id); + ((ImageView) mView.findViewById(R.id.user_icon)).setImageDrawable(userIcon); mUserSwitcher.setText(mUserSwitcherController.getCurrentUserName()); ViewGroup anchor = mView.findViewById(R.id.user_switcher_anchor); diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java index 1a325d3586f4..ce4aad882df9 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java @@ -219,6 +219,11 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard mKeyguardSecurityCallback.userActivity(); showMessage(null, null); } + if (mUpdateMonitor.isFaceEnrolled() + && mUpdateMonitor.mRequestActiveUnlockOnUnlockIntent) { + mUpdateMonitor.requestActiveUnlock("unlock-intent, reason=swipeUpOnBouncer", + true); + } } }; private ConfigurationController.ConfigurationListener mConfigurationListener = diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index f1bec819560d..a6feedb50a12 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -56,6 +56,7 @@ import android.content.pm.ResolveInfo; import android.content.pm.UserInfo; import android.database.ContentObserver; import android.hardware.SensorPrivacyManager; +import android.hardware.biometrics.BiometricFaceConstants; import android.hardware.biometrics.BiometricFingerprintConstants; import android.hardware.biometrics.BiometricManager; import android.hardware.biometrics.BiometricSourceType; @@ -88,6 +89,7 @@ import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener; import android.telephony.TelephonyCallback; import android.telephony.TelephonyManager; +import android.text.TextUtils; import android.util.Log; import android.util.SparseArray; import android.util.SparseBooleanArray; @@ -246,6 +248,12 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab } } + public final boolean mRequestActiveUnlockOnAssistant; + public final boolean mRequestActiveUnlockOnWakeup; + public final boolean mInitiateActiveUnlockOnWakeup; + public final boolean mRequestActiveUnlockOnUnlockIntent; + public final boolean mRequestActiveUnlockOnBioFail; + private final Context mContext; private final boolean mIsPrimaryUser; private final boolean mIsAutomotive; @@ -281,6 +289,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab private boolean mGoingToSleep; private boolean mBouncerFullyShown; private boolean mBouncerIsOrWillBeShowing; + private boolean mUdfpsBouncerShowing; private boolean mAuthInterruptActive; private boolean mNeedsSlowUnlockTransition; private boolean mAssistantVisible; @@ -451,10 +460,16 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab } } - if (KeyguardUpdateMonitor.getCurrentUser() == userId && getUserHasTrust(userId)) { + if (KeyguardUpdateMonitor.getCurrentUser() == userId) { CharSequence message = null; - if (trustGrantedMessages != null && trustGrantedMessages.size() > 0) { - message = trustGrantedMessages.get(0); // for now only shows the first in the list + final boolean userHasTrust = getUserHasTrust(userId); + if (userHasTrust && trustGrantedMessages != null) { + for (String msg : trustGrantedMessages) { + if (!TextUtils.isEmpty(msg)) { + message = msg; + break; + } + } } for (int i = 0; i < mCallbacks.size(); i++) { KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); @@ -463,6 +478,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab } } } + } @Override @@ -1354,8 +1370,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab void setAssistantVisible(boolean assistantVisible) { mAssistantVisible = assistantVisible; updateBiometricListeningState(BIOMETRIC_ACTION_UPDATE); - if (mAssistantVisible) { - requestActiveUnlock(); + if (mAssistantVisible && mRequestActiveUnlockOnAssistant) { + requestActiveUnlock("assistant", false); } } @@ -1502,11 +1518,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab @Override public void onAuthenticationFailed() { + if (mRequestActiveUnlockOnBioFail) { + requestActiveUnlock("biometric-failure, extra=fingerprintFailure", + true); + } handleFingerprintAuthFailed(); - - // TODO(b/225231929): Refactor as needed, add tests, etc. - mTrustManager.reportUserRequestedUnlock( - KeyguardUpdateMonitor.getCurrentUser(), true); } @Override @@ -1564,6 +1580,15 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab @Override public void onAuthenticationFailed() { + if (shouldRequestActiveUnlockOnFaceError()) { + String reason = + mKeyguardBypassController.canBypass() ? "bypass" + : mUdfpsBouncerShowing ? "udfpsBouncer" : + mBouncerFullyShown ? "bouncer" : "udfpsFpDown"; + requestActiveUnlock("biometric-failure" + + ", extra=faceFailure-" + reason, true); + } + handleFaceAuthFailed(); if (mKeyguardBypassController != null) { mKeyguardBypassController.setUserHasDeviceEntryIntent(false); @@ -1592,12 +1617,23 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab if (mKeyguardBypassController != null) { mKeyguardBypassController.setUserHasDeviceEntryIntent(false); } + if (errMsgId == BiometricFaceConstants.FACE_ERROR_TIMEOUT + && shouldRequestActiveUnlockOnFaceError()) { + requestActiveUnlock("biometric-failure" + + ", extra=faceError-" + errMsgId, true); + } } @Override public void onAuthenticationAcquired(int acquireInfo) { handleFaceAcquired(acquireInfo); } + + private boolean shouldRequestActiveUnlockOnFaceError() { + return mRequestActiveUnlockOnBioFail + && (mKeyguardBypassController.canBypass() || mBouncerFullyShown + || mUdfpsBouncerShowing || mAuthController.isUdfpsFingerDown()); + } }; @VisibleForTesting @@ -1713,7 +1749,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab Trace.beginSection("KeyguardUpdateMonitor#handleStartedWakingUp"); Assert.isMainThread(); updateBiometricListeningState(BIOMETRIC_ACTION_UPDATE); - requestActiveUnlock(); + if (mRequestActiveUnlockOnWakeup) { + requestActiveUnlock("wake-unlock"); + } else if (mInitiateActiveUnlockOnWakeup) { + initiateActiveUnlock("wake-initiate"); + } for (int i = 0; i < mCallbacks.size(); i++) { KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); if (cb != null) { @@ -1860,6 +1900,18 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab dumpManager.registerDumpable(getClass().getName(), this); mSensorPrivacyManager = context.getSystemService(SensorPrivacyManager.class); + // TODO, b/222459888: add official configurable names to Settings.java + mRequestActiveUnlockOnWakeup = Settings.Global.getInt( + mContext.getContentResolver(), "wake-unlock", 0) == 1; + mInitiateActiveUnlockOnWakeup = Settings.Global.getInt( + mContext.getContentResolver(), "wake-initiate", 1) == 1; + mRequestActiveUnlockOnUnlockIntent = Settings.Global.getInt( + mContext.getContentResolver(), "unlock-intent", 0) == 1; + mRequestActiveUnlockOnBioFail = Settings.Global.getInt( + mContext.getContentResolver(), "bio-fail", 0) == 1; + mRequestActiveUnlockOnAssistant = Settings.Global.getInt( + mContext.getContentResolver(), "assistant", 0) == 1; + mHandler = new Handler(mainLooper) { @Override public void handleMessage(Message msg) { @@ -2194,7 +2246,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab } // don't start running fingerprint until they're registered - if (!mAuthController.areAllAuthenticatorsRegistered()) { + if (!mAuthController.areAllFingerprintAuthenticatorsRegistered()) { return; } final boolean shouldListenForFingerprint = shouldListenForFingerprint(isUdfpsSupported()); @@ -2240,7 +2292,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab } mAuthInterruptActive = active; updateFaceListeningState(BIOMETRIC_ACTION_UPDATE); - requestActiveUnlock(); + if (mRequestActiveUnlockOnWakeup) { + requestActiveUnlock("wake-unlock, extra=onReach"); + } else if (mInitiateActiveUnlockOnWakeup) { + initiateActiveUnlock("wake-initiate, extra=onReach"); + } } /** @@ -2290,25 +2346,69 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab } /** - * Attempts to trigger active unlock. + * Initiates active unlock to get the unlock token ready. */ - public void requestActiveUnlock() { + public void initiateActiveUnlock(String reason) { // If this message exists, FP has already authenticated, so wait until that is handled if (mHandler.hasMessages(MSG_BIOMETRIC_AUTHENTICATION_CONTINUE)) { return; } if (shouldTriggerActiveUnlock()) { - // TODO(b/225231929): Refactor surrounding code to reflect calling of new method + if (DEBUG) { + Log.d("ActiveUnlock", "initiate active unlock triggerReason=" + reason); + } mTrustManager.reportUserMayRequestUnlock(KeyguardUpdateMonitor.getCurrentUser()); } } + /** + * Attempts to trigger active unlock from trust agent. + */ + public void requestActiveUnlock(String reason, boolean dismissKeyguard) { + // If this message exists, FP has already authenticated, so wait until that is handled + if (mHandler.hasMessages(MSG_BIOMETRIC_AUTHENTICATION_CONTINUE)) { + return; + } + + if (shouldTriggerActiveUnlock()) { + if (DEBUG) { + Log.d("ActiveUnlock", "reportUserRequestedUnlock triggerReason=" + reason + + " dismissKeyguard=" + dismissKeyguard); + } + mTrustManager.reportUserRequestedUnlock(KeyguardUpdateMonitor.getCurrentUser(), + dismissKeyguard); + } + } + + /** + * Attempts to trigger active unlock from trust agent. + * Only dismisses the keyguard if only face is enrolled (no FP) and bypass is enabled. + */ + public void requestActiveUnlock(String reason) { + requestActiveUnlock(reason, isFaceEnrolled() && !isUdfpsEnrolled() + && mKeyguardBypassController.getBypassEnabled()); + } + + /** + * Whether the UDFPS bouncer is showing. + */ + public void setUdfpsBouncerShowing(boolean showing) { + mUdfpsBouncerShowing = showing; + if (mUdfpsBouncerShowing) { + updateFaceListeningState(BIOMETRIC_ACTION_START); + if (mRequestActiveUnlockOnUnlockIntent) { + requestActiveUnlock("unlock-intent, extra=udfpsBouncer", true); + } + } + } + private boolean shouldTriggerActiveUnlock() { // Triggers: final boolean triggerActiveUnlockForAssistant = shouldTriggerActiveUnlockForAssistant(); - final boolean awakeKeyguard = mKeyguardIsVisible && mDeviceInteractive && !mGoingToSleep - && mStatusBarState != StatusBarState.SHADE_LOCKED; + final boolean awakeKeyguard = mBouncerFullyShown || mUdfpsBouncerShowing + || (mKeyguardIsVisible && mDeviceInteractive && !mGoingToSleep + && mStatusBarState != StatusBarState.SHADE_LOCKED); // Gates: final int user = getCurrentUser(); @@ -2341,20 +2441,19 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab && !mSecureCameraLaunched; // Aggregate relevant fields for debug logging. - if (DEBUG_ACTIVE_UNLOCK || DEBUG_SPEW) { - maybeLogListenerModelData( - new KeyguardActiveUnlockModel( - System.currentTimeMillis(), - user, - shouldTriggerActiveUnlock, - mAuthInterruptActive, - isEncryptedOrTimedOut, - fpLockedout, - isLockDown, - mSwitchingUser, - triggerActiveUnlockForAssistant, - userCanDismissLockScreen)); - } + maybeLogListenerModelData( + new KeyguardActiveUnlockModel( + System.currentTimeMillis(), + user, + shouldTriggerActiveUnlock, + awakeKeyguard, + mAuthInterruptActive, + isEncryptedOrTimedOut, + fpLockedout, + isLockDown, + mSwitchingUser, + triggerActiveUnlockForAssistant, + userCanDismissLockScreen)); return shouldTriggerActiveUnlock; } @@ -2507,7 +2606,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab || mOccludingAppRequestingFace || awakeKeyguard || shouldListenForFaceAssistant - || mAuthController.isUdfpsFingerDown()) + || mAuthController.isUdfpsFingerDown() + || mUdfpsBouncerShowing) && !mSwitchingUser && !faceDisabledForUser && becauseCannotSkipBouncer && !mKeyguardGoingAway && biometricEnabledForUser && !mLockIconPressed && strongAuthAllowsScanning && mIsPrimaryUser @@ -2537,7 +2637,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab mIsPrimaryUser, strongAuthAllowsScanning, mSecureCameraLaunched, - mSwitchingUser)); + mSwitchingUser, + mUdfpsBouncerShowing)); } return shouldListen; @@ -2550,8 +2651,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab } if (DEBUG_ACTIVE_UNLOCK - && model instanceof KeyguardActiveUnlockModel - && model.getListening()) { + && model instanceof KeyguardActiveUnlockModel) { mListenModels.add(model); return; } @@ -3133,6 +3233,9 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab } if (wasBouncerFullyShown != mBouncerFullyShown) { + if (mBouncerFullyShown && mRequestActiveUnlockOnUnlockIntent) { + requestActiveUnlock("unlock-intent, reason=bouncerFullyShown", true); + } for (int i = 0; i < mCallbacks.size(); i++) { KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); if (cb != null) { @@ -3619,8 +3722,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab final int strongAuthFlags = mStrongAuthTracker.getStrongAuthForUser(userId); BiometricAuthenticated fingerprint = mUserFingerprintAuthenticated.get(userId); pw.println(" Fingerprint state (user=" + userId + ")"); - pw.println(" areAllAuthenticatorsRegistered=" - + mAuthController.areAllAuthenticatorsRegistered()); + pw.println(" areAllFpAuthenticatorsRegistered=" + + mAuthController.areAllFingerprintAuthenticatorsRegistered()); pw.println(" allowed=" + (fingerprint != null && isUnlockingWithBiometricAllowed(fingerprint.mIsStrongBiometric))); @@ -3641,6 +3744,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab pw.println(" shouldListenForUdfps=" + shouldListenForFingerprint(true)); pw.println(" mBouncerIsOrWillBeShowing=" + mBouncerIsOrWillBeShowing); pw.println(" mStatusBarState=" + StatusBarState.toString(mStatusBarState)); + pw.println(" mUdfpsBouncerShowing=" + mUdfpsBouncerShowing); } } if (mFaceManager != null && mFaceManager.isHardwareDetected()) { @@ -3667,6 +3771,13 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab } mListenModels.print(pw); + pw.println("Enabled active unlock triggers:"); + pw.println(" mRequestActiveUnlockOnWakeup=" + mRequestActiveUnlockOnWakeup); + pw.println(" mInitiateActiveUnlockOnWakeup=" + mInitiateActiveUnlockOnWakeup); + pw.println(" mRequestActiveUnlockOnUnlockIntent=" + mRequestActiveUnlockOnUnlockIntent); + pw.println(" mRequestActiveUnlockOnBiometricFail=" + mRequestActiveUnlockOnBioFail); + pw.println(" mRequestActiveUnlockOnAssistant=" + mRequestActiveUnlockOnAssistant); + if (mIsAutomotive) { pw.println(" Running on Automotive build"); } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardViewController.java index 295d77d55b56..ca8728aecb4c 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardViewController.java @@ -55,6 +55,11 @@ public interface KeyguardViewController { void reset(boolean hideBouncerWhenShowing); /** + * Stop showing any alternate auth methods. + */ + void resetAlternateAuth(boolean forceUpdateScrim); + + /** * Called when the device started going to sleep. */ default void onStartedGoingToSleep() {}; diff --git a/packages/SystemUI/src/com/android/systemui/LatencyTester.java b/packages/SystemUI/src/com/android/systemui/LatencyTester.java index 7afd43d1cb06..9cdce6400e56 100644 --- a/packages/SystemUI/src/com/android/systemui/LatencyTester.java +++ b/packages/SystemUI/src/com/android/systemui/LatencyTester.java @@ -23,21 +23,31 @@ import android.content.IntentFilter; import android.hardware.biometrics.BiometricConstants; import android.hardware.biometrics.BiometricSourceType; import android.os.Build; +import android.provider.DeviceConfig; +import androidx.annotation.NonNull; + +import com.android.internal.util.LatencyTracker; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.SysUISingleton; +import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.statusbar.phone.BiometricUnlockController; +import com.android.systemui.util.DeviceConfigProxy; +import com.android.systemui.util.concurrency.DelayableExecutor; + +import java.io.PrintWriter; import javax.inject.Inject; /** - * Class that only runs on debuggable builds that listens to broadcasts that simulate actions in the + * Class that only runs on debuggable builds with the LatencyTracker setting enabled + * that listens to broadcasts that simulate actions in the * system that are used for testing the latency. */ @SysUISingleton public class LatencyTester extends CoreStartable { - + private static final boolean DEFAULT_ENABLED = Build.IS_ENG; private static final String ACTION_FINGERPRINT_WAKE = "com.android.systemui.latency.ACTION_FINGERPRINT_WAKE"; @@ -46,42 +56,78 @@ public class LatencyTester extends CoreStartable { "com.android.systemui.latency.ACTION_FACE_WAKE"; private final BiometricUnlockController mBiometricUnlockController; private final BroadcastDispatcher mBroadcastDispatcher; + private final DeviceConfigProxy mDeviceConfigProxy; + + private boolean mEnabled; @Inject - public LatencyTester(Context context, BiometricUnlockController biometricUnlockController, - BroadcastDispatcher broadcastDispatcher) { + public LatencyTester( + Context context, + BiometricUnlockController biometricUnlockController, + BroadcastDispatcher broadcastDispatcher, + DeviceConfigProxy deviceConfigProxy, + @Main DelayableExecutor mainExecutor + ) { super(context); - mBiometricUnlockController = biometricUnlockController; mBroadcastDispatcher = broadcastDispatcher; + mDeviceConfigProxy = deviceConfigProxy; + + updateEnabled(); + mDeviceConfigProxy.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_LATENCY_TRACKER, + mainExecutor, properties -> updateEnabled()); } @Override public void start() { - if (!Build.IS_DEBUGGABLE) { - return; - } - - IntentFilter filter = new IntentFilter(); - filter.addAction(ACTION_FINGERPRINT_WAKE); - filter.addAction(ACTION_FACE_WAKE); - mBroadcastDispatcher.registerReceiver(new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - String action = intent.getAction(); - if (ACTION_FINGERPRINT_WAKE.equals(action)) { - fakeWakeAndUnlock(BiometricSourceType.FINGERPRINT); - } else if (ACTION_FACE_WAKE.equals(action)) { - fakeWakeAndUnlock(BiometricSourceType.FACE); - } - } - }, filter); + registerForBroadcasts(mEnabled); } private void fakeWakeAndUnlock(BiometricSourceType type) { + if (!mEnabled) { + return; + } mBiometricUnlockController.onBiometricAcquired(type, BiometricConstants.BIOMETRIC_ACQUIRED_GOOD); mBiometricUnlockController.onBiometricAuthenticated( KeyguardUpdateMonitor.getCurrentUser(), type, true /* isStrongBiometric */); } + + private void registerForBroadcasts(boolean register) { + if (register) { + IntentFilter filter = new IntentFilter(); + filter.addAction(ACTION_FINGERPRINT_WAKE); + filter.addAction(ACTION_FACE_WAKE); + mBroadcastDispatcher.registerReceiver(mBroadcastReceiver, filter); + } else { + mBroadcastDispatcher.unregisterReceiver(mBroadcastReceiver); + } + } + + private void updateEnabled() { + boolean wasEnabled = mEnabled; + mEnabled = Build.IS_DEBUGGABLE + && mDeviceConfigProxy.getBoolean(DeviceConfig.NAMESPACE_LATENCY_TRACKER, + LatencyTracker.SETTINGS_ENABLED_KEY, DEFAULT_ENABLED); + if (mEnabled != wasEnabled) { + registerForBroadcasts(mEnabled); + } + } + + @Override + public void dump(@NonNull PrintWriter pw, @NonNull String[] args) { + pw.println("mEnabled=" + mEnabled); + } + + private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + if (ACTION_FINGERPRINT_WAKE.equals(action)) { + fakeWakeAndUnlock(BiometricSourceType.FINGERPRINT); + } else if (ACTION_FACE_WAKE.equals(action)) { + fakeWakeAndUnlock(BiometricSourceType.FACE); + } + } + }; } diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java index b05bc245a79f..15d0648ae163 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java @@ -37,6 +37,7 @@ import android.hardware.biometrics.BiometricConstants; import android.hardware.biometrics.BiometricManager.Authenticators; import android.hardware.biometrics.BiometricManager.BiometricMultiSensorMode; import android.hardware.biometrics.BiometricPrompt; +import android.hardware.biometrics.BiometricStateListener; import android.hardware.biometrics.IBiometricContextListener; import android.hardware.biometrics.IBiometricSysuiReceiver; import android.hardware.biometrics.PromptInfo; @@ -45,7 +46,6 @@ import android.hardware.face.FaceManager; import android.hardware.face.FaceSensorPropertiesInternal; import android.hardware.fingerprint.FingerprintManager; import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; -import android.hardware.fingerprint.FingerprintStateListener; import android.hardware.fingerprint.IFingerprintAuthenticatorsRegisteredCallback; import android.hardware.fingerprint.IUdfpsHbmListener; import android.os.Bundle; @@ -138,7 +138,7 @@ public class AuthController extends CoreStartable implements CommandQueue.Callba @NonNull private final SparseBooleanArray mUdfpsEnrolledForUser; @NonNull private final SensorPrivacyManager mSensorPrivacyManager; private final WakefulnessLifecycle mWakefulnessLifecycle; - private boolean mAllAuthenticatorsRegistered; + private boolean mAllFingerprintAuthenticatorsRegistered; @NonNull private final UserManager mUserManager; @NonNull private final LockPatternUtils mLockPatternUtils; private final @Background DelayableExecutor mBackgroundExecutor; @@ -157,12 +157,12 @@ public class AuthController extends CoreStartable implements CommandQueue.Callba @Override public void onAllAuthenticatorsRegistered( List<FingerprintSensorPropertiesInternal> sensors) { - mHandler.post(() -> handleAllAuthenticatorsRegistered(sensors)); + mHandler.post(() -> handleAllFingerprintAuthenticatorsRegistered(sensors)); } }; - private final FingerprintStateListener mFingerprintStateListener = - new FingerprintStateListener() { + private final BiometricStateListener mBiometricStateListener = + new BiometricStateListener() { @Override public void onEnrollmentsChanged(int userId, int sensorId, boolean hasEnrollments) { mHandler.post( @@ -234,20 +234,20 @@ public class AuthController extends CoreStartable implements CommandQueue.Callba } /** - * Whether all authentictors have been registered. + * Whether all fingerprint authentictors have been registered. */ - public boolean areAllAuthenticatorsRegistered() { - return mAllAuthenticatorsRegistered; + public boolean areAllFingerprintAuthenticatorsRegistered() { + return mAllFingerprintAuthenticatorsRegistered; } - private void handleAllAuthenticatorsRegistered( + private void handleAllFingerprintAuthenticatorsRegistered( List<FingerprintSensorPropertiesInternal> sensors) { mExecution.assertIsMainThread(); if (DEBUG) { Log.d(TAG, "handleAllAuthenticatorsRegistered | sensors: " + Arrays.toString( sensors.toArray())); } - mAllAuthenticatorsRegistered = true; + mAllFingerprintAuthenticatorsRegistered = true; mFpProps = sensors; List<FingerprintSensorPropertiesInternal> udfpsProps = new ArrayList<>(); List<FingerprintSensorPropertiesInternal> sidefpsProps = new ArrayList<>(); @@ -281,7 +281,7 @@ public class AuthController extends CoreStartable implements CommandQueue.Callba for (Callback cb : mCallbacks) { cb.onAllAuthenticatorsRegistered(); } - mFingerprintManager.registerFingerprintStateListener(mFingerprintStateListener); + mFingerprintManager.registerBiometricStateListener(mBiometricStateListener); } private void handleEnrollmentsChanged(int userId, int sensorId, boolean hasEnrollments) { diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java index 2ac240885faa..eba87e49d35b 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java @@ -799,6 +799,11 @@ public class UdfpsController implements DozeReceiver { if (!mKeyguardUpdateMonitor.isFaceDetectionRunning()) { mKeyguardUpdateMonitor.requestFaceAuth(/* userInitiatedRequest */ false); } + + if (mKeyguardUpdateMonitor.mRequestActiveUnlockOnUnlockIntent) { + mKeyguardUpdateMonitor.requestActiveUnlock("unlock-intent extra=udfpsFingerDown", + true); + } } mOnFingerDown = true; mFingerprintManager.onPointerDown(requestId, mSensorProps.sensorId, x, y, minor, major); diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java index f5f07c8ca989..1a726ce4448f 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java @@ -475,7 +475,7 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud public void onPanelExpansionChanged( float fraction, boolean expanded, boolean tracking) { mPanelExpansionFraction = - mKeyguardViewManager.bouncerIsInTransit() ? BouncerPanelExpansionCalculator + mKeyguardViewManager.isBouncerInTransit() ? BouncerPanelExpansionCalculator .aboutToShowBouncerProgress(fraction) : fraction; updateAlpha(); } diff --git a/packages/SystemUI/src/com/android/systemui/dagger/DefaultActivityBinder.java b/packages/SystemUI/src/com/android/systemui/dagger/DefaultActivityBinder.java index 1653e0adadb5..fb016911f913 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/DefaultActivityBinder.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/DefaultActivityBinder.java @@ -29,8 +29,10 @@ import com.android.systemui.sensorprivacy.television.TvUnblockSensorActivity; import com.android.systemui.settings.brightness.BrightnessDialog; import com.android.systemui.statusbar.tv.notifications.TvNotificationPanelActivity; import com.android.systemui.tuner.TunerActivity; +import com.android.systemui.usb.UsbConfirmActivity; import com.android.systemui.usb.UsbDebuggingActivity; import com.android.systemui.usb.UsbDebuggingSecondaryUserActivity; +import com.android.systemui.usb.UsbPermissionActivity; import com.android.systemui.user.CreateUserActivity; import dagger.Binds; @@ -80,6 +82,18 @@ public abstract class DefaultActivityBinder { public abstract Activity bindUsbDebuggingSecondaryUserActivity( UsbDebuggingSecondaryUserActivity activity); + /** Inject into UsbPermissionActivity. */ + @Binds + @IntoMap + @ClassKey(UsbPermissionActivity.class) + public abstract Activity bindUsbPermissionActivity(UsbPermissionActivity activity); + + /** Inject into UsbConfirmActivity. */ + @Binds + @IntoMap + @ClassKey(UsbConfirmActivity.class) + public abstract Activity bindUsbConfirmActivity(UsbConfirmActivity activity); + /** Inject into CreateUserActivity. */ @Binds @IntoMap diff --git a/packages/SystemUI/src/com/android/systemui/flags/FeatureFlagsDebug.java b/packages/SystemUI/src/com/android/systemui/flags/FeatureFlagsDebug.java index aaa4d9eefd29..c4531b573d22 100644 --- a/packages/SystemUI/src/com/android/systemui/flags/FeatureFlagsDebug.java +++ b/packages/SystemUI/src/com/android/systemui/flags/FeatureFlagsDebug.java @@ -42,10 +42,14 @@ import com.android.systemui.Dumpable; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dump.DumpManager; +import com.android.systemui.statusbar.commandline.Command; +import com.android.systemui.statusbar.commandline.CommandRegistry; import com.android.systemui.util.settings.SecureSettings; import java.io.PrintWriter; +import java.lang.reflect.Field; import java.util.ArrayList; +import java.util.List; import java.util.Map; import java.util.Objects; import java.util.TreeMap; @@ -59,6 +63,10 @@ import javax.inject.Named; * * Flags can be set (or unset) via the following adb command: * + * adb shell cmd statusbar flag <id> <on|off|toggle|erase> + * + * Alternatively, you can change flags via a broadcast intent: + * * adb shell am broadcast -a com.android.systemui.action.SET_FLAG --ei id <id> [--ez value <0|1>] * * To restore a flag back to its default, leave the `--ez value <0|1>` off of the command. @@ -67,6 +75,7 @@ import javax.inject.Named; public class FeatureFlagsDebug implements FeatureFlags, Dumpable { private static final String TAG = "SysUIFlags"; static final String ALL_FLAGS = "all_flags"; + private static final String FLAG_COMMAND = "flag"; private final FlagManager mFlagManager; private final SecureSettings mSecureSettings; @@ -86,12 +95,15 @@ public class FeatureFlagsDebug implements FeatureFlags, Dumpable { @Main Resources resources, DumpManager dumpManager, @Named(ALL_FLAGS) Map<Integer, Flag<?>> allFlags, + CommandRegistry commandRegistry, IStatusBarService barService) { mFlagManager = flagManager; mSecureSettings = secureSettings; mResources = resources; mSystemProperties = systemProperties; mAllFlags = allFlags; + mBarService = barService; + IntentFilter filter = new IntentFilter(); filter.addAction(ACTION_SET_FLAG); filter.addAction(ACTION_GET_FLAGS); @@ -100,7 +112,7 @@ public class FeatureFlagsDebug implements FeatureFlags, Dumpable { context.registerReceiver(mReceiver, filter, null, null, Context.RECEIVER_EXPORTED_UNAUDITED); dumpManager.registerDumpable(TAG, this); - mBarService = barService; + commandRegistry.registerCommand(FLAG_COMMAND, FlagCommand::new); } @Override @@ -276,6 +288,31 @@ public class FeatureFlagsDebug implements FeatureFlags, Dumpable { } } + private void setBooleanFlagInternal(Flag<?> flag, boolean value) { + if (flag instanceof BooleanFlag) { + setFlagValue(flag.getId(), value, BooleanFlagSerializer.INSTANCE); + } else if (flag instanceof ResourceBooleanFlag) { + setFlagValue(flag.getId(), value, BooleanFlagSerializer.INSTANCE); + } else if (flag instanceof SysPropBooleanFlag) { + // Store SysProp flags in SystemProperties where they can read by outside parties. + mSystemProperties.setBoolean(((SysPropBooleanFlag) flag).getName(), value); + dispatchListenersAndMaybeRestart(flag.getId(), + FeatureFlagsDebug.this::restartAndroid); + } else { + throw new IllegalArgumentException("Unknown flag type"); + } + } + + private void setStringFlagInternal(Flag<?> flag, String value) { + if (flag instanceof StringFlag) { + setFlagValue(flag.getId(), value, StringFlagSerializer.INSTANCE); + } else if (flag instanceof ResourceStringFlag) { + setFlagValue(flag.getId(), value, StringFlagSerializer.INSTANCE); + } else { + throw new IllegalArgumentException("Unknown flag type"); + } + } + private final BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { @@ -327,24 +364,19 @@ public class FeatureFlagsDebug implements FeatureFlags, Dumpable { } Object value = extras.get(EXTRA_VALUE); - if (flag instanceof BooleanFlag && value instanceof Boolean) { - setFlagValue(id, (Boolean) value, BooleanFlagSerializer.INSTANCE); - } else if (flag instanceof ResourceBooleanFlag && value instanceof Boolean) { - setFlagValue(id, (Boolean) value, BooleanFlagSerializer.INSTANCE); - } else if (flag instanceof SysPropBooleanFlag && value instanceof Boolean) { - // Store SysProp flags in SystemProperties where they can read by outside parties. - mSystemProperties.setBoolean( - ((SysPropBooleanFlag) flag).getName(), (Boolean) value); - dispatchListenersAndMaybeRestart(flag.getId(), - FeatureFlagsDebug.this::restartAndroid); - } else if (flag instanceof StringFlag && value instanceof String) { - setFlagValue(id, (String) value, StringFlagSerializer.INSTANCE); - } else if (flag instanceof ResourceStringFlag && value instanceof String) { - setFlagValue(id, (String) value, StringFlagSerializer.INSTANCE); - } else { + + try { + if (value instanceof Boolean) { + setBooleanFlagInternal(flag, (Boolean) value); + } else if (value instanceof String) { + setStringFlagInternal(flag, (String) value); + } else { + throw new IllegalArgumentException("Unknown value type"); + } + } catch (IllegalArgumentException e) { Log.w(TAG, - "Unable to set " + id + " of type " + flag.getClass() + " to value of type " - + (value == null ? null : value.getClass())); + "Unable to set " + flag.getId() + " of type " + flag.getClass() + + " to value of type " + (value == null ? null : value.getClass())); } } @@ -388,4 +420,153 @@ public class FeatureFlagsDebug implements FeatureFlags, Dumpable { mStringFlagCache.forEach((key, value) -> pw.println(" sysui_flag_" + key + ": [length=" + value.length() + "] \"" + value + "\"")); } + + class FlagCommand implements Command { + private final List<String> mOnCommands = List.of("true", "on", "1", "enabled"); + private final List<String> mOffCommands = List.of("false", "off", "0", "disable"); + + @Override + public void execute(@NonNull PrintWriter pw, @NonNull List<String> args) { + if (args.size() == 0) { + pw.println("Error: no flag id supplied"); + help(pw); + pw.println(); + printKnownFlags(pw); + return; + } + + if (args.size() > 2) { + pw.println("Invalid number of arguments."); + help(pw); + return; + } + + int id = 0; + try { + id = Integer.parseInt(args.get(0)); + if (!mAllFlags.containsKey(id)) { + pw.println("Unknown flag id: " + id); + pw.println(); + printKnownFlags(pw); + return; + } + } catch (NumberFormatException e) { + id = flagNameToId(args.get(0)); + if (id == 0) { + pw.println("Invalid flag. Must an integer id or flag name: " + args.get(0)); + return; + } + } + Flag<?> flag = mAllFlags.get(id); + + String cmd = ""; + if (args.size() == 2) { + cmd = args.get(1).toLowerCase(); + } + + if ("erase".equals(cmd) || "reset".equals(cmd)) { + eraseFlag(flag); + return; + } + + boolean newValue = true; + if (args.size() == 1 || "toggle".equals(cmd)) { + boolean enabled = isBooleanFlagEnabled(flag); + + if (args.size() == 1) { + pw.println("Flag " + id + " is " + enabled); + return; + } + + newValue = !enabled; + } else { + newValue = mOnCommands.contains(cmd); + if (!newValue && !mOffCommands.contains(cmd)) { + pw.println("Invalid on/off argument supplied"); + help(pw); + return; + } + } + + pw.flush(); // Next command will restart sysui, so flush before we do so. + setBooleanFlagInternal(flag, newValue); + } + + @Override + public void help(PrintWriter pw) { + pw.println( + "Usage: adb shell cmd statusbar flag <id> " + + "[true|false|1|0|on|off|enable|disable|toggle|erase|reset]"); + pw.println("The id can either be a numeric integer or the corresponding field name"); + pw.println( + "If no argument is supplied after the id, the flags runtime value is output"); + } + + private boolean isBooleanFlagEnabled(Flag<?> flag) { + if (flag instanceof BooleanFlag) { + return isEnabled((BooleanFlag) flag); + } else if (flag instanceof ResourceBooleanFlag) { + return isEnabled((ResourceBooleanFlag) flag); + } else if (flag instanceof SysPropFlag) { + return isEnabled((SysPropBooleanFlag) flag); + } + + return false; + } + + private int flagNameToId(String flagName) { + List<Field> fields = Flags.getFlagFields(); + for (Field field : fields) { + if (flagName.equals(field.getName())) { + return fieldToId(field); + } + } + + return 0; + } + + private int fieldToId(Field field) { + try { + Flag<?> flag = (Flag<?>) field.get(null); + return flag.getId(); + } catch (IllegalAccessException e) { + // no-op + } + + return 0; + } + + private void printKnownFlags(PrintWriter pw) { + List<Field> fields = Flags.getFlagFields(); + + int longestFieldName = 0; + for (Field field : fields) { + longestFieldName = Math.max(longestFieldName, field.getName().length()); + } + + pw.println("Known Flags:"); + pw.print("Flag Name"); + for (int i = 0; i < longestFieldName - "Flag Name".length() + 1; i++) { + pw.print(" "); + } + pw.println("ID Enabled?"); + for (int i = 0; i < longestFieldName; i++) { + pw.print("="); + } + pw.println(" ==== ========"); + for (Field field : fields) { + int id = fieldToId(field); + if (id == 0 || !mAllFlags.containsKey(id)) { + continue; + } + pw.print(field.getName()); + int fieldWidth = field.getName().length(); + for (int i = 0; i < longestFieldName - fieldWidth + 1; i++) { + pw.print(" "); + } + pw.printf("%-4d ", id); + pw.println(isBooleanFlagEnabled(mAllFlags.get(id))); + } + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/flags/Flags.java b/packages/SystemUI/src/com/android/systemui/flags/Flags.java index 44580aa4230a..afa7d5e0a9c4 100644 --- a/packages/SystemUI/src/com/android/systemui/flags/Flags.java +++ b/packages/SystemUI/src/com/android/systemui/flags/Flags.java @@ -20,7 +20,9 @@ import com.android.internal.annotations.Keep; import com.android.systemui.R; import java.lang.reflect.Field; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; /** @@ -182,25 +184,36 @@ public class Flags { if (sFlagMap != null) { return sFlagMap; } + Map<Integer, Flag<?>> flags = new HashMap<>(); + List<Field> flagFields = getFlagFields(); + + for (Field field : flagFields) { + try { + Flag<?> flag = (Flag<?>) field.get(null); + flags.put(flag.getId(), flag); + } catch (IllegalAccessException e) { + // no-op + } + } + sFlagMap = flags; + + return sFlagMap; + } + + static List<Field> getFlagFields() { Field[] fields = Flags.class.getFields(); + List<Field> result = new ArrayList<>(); for (Field field : fields) { Class<?> t = field.getType(); if (Flag.class.isAssignableFrom(t)) { - try { - Flag<?> flag = (Flag<?>) field.get(null); - flags.put(flag.getId(), flag); - } catch (IllegalAccessException e) { - // no-op - } + result.add(field); } } - sFlagMap = flags; - - return sFlagMap; + return result; } // | . . . . . . . . . . . . . . . . . . . | // | | diff --git a/packages/SystemUI/src/com/android/systemui/media/ColorSchemeTransition.kt b/packages/SystemUI/src/com/android/systemui/media/ColorSchemeTransition.kt index 8f0305f6dc6d..2ae1806f3b3d 100644 --- a/packages/SystemUI/src/com/android/systemui/media/ColorSchemeTransition.kt +++ b/packages/SystemUI/src/com/android/systemui/media/ColorSchemeTransition.kt @@ -85,12 +85,13 @@ typealias ColorTransitionFactory = (Int, (ColorScheme) -> Int, (Int) -> Unit) -> */ class ColorSchemeTransition internal constructor( private val context: Context, - bgColor: Int, mediaViewHolder: MediaViewHolder, colorTransitionFactory: ColorTransitionFactory ) { - constructor(context: Context, bgColor: Int, mediaViewHolder: MediaViewHolder) : - this(context, bgColor, mediaViewHolder, ::ColorTransition) + constructor(context: Context, mediaViewHolder: MediaViewHolder) : + this(context, mediaViewHolder, ::ColorTransition) + + val bgColor = context.getColor(com.android.systemui.R.color.material_dynamic_secondary95) val surfaceColor = colorTransitionFactory( bgColor, diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt index 8e81831a8dc3..49966a6de36f 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt @@ -904,7 +904,6 @@ internal object MediaPlayerData { private val EMPTY = MediaData( userId = -1, initialized = false, - backgroundColor = 0, app = null, appIcon = null, artist = null, diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java index a264afd3e0ef..766e7b02cdbc 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java +++ b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java @@ -100,8 +100,7 @@ public class MediaControlPanel { + ".android.apps.gsa.staticplugins.opa.smartspace.ExportedSmartspaceTrampolineActivity"; private static final String EXTRAS_SMARTSPACE_INTENT = "com.google.android.apps.gsa.smartspace.extra.SMARTSPACE_INTENT"; - private static final int MEDIA_RECOMMENDATION_ITEMS_PER_ROW = 3; - private static final int MEDIA_RECOMMENDATION_MAX_NUM = 6; + private static final int MEDIA_RECOMMENDATION_MAX_NUM = 3; private static final String KEY_SMARTSPACE_ARTIST_NAME = "artist_name"; private static final String KEY_SMARTSPACE_OPEN_IN_FOREGROUND = "KEY_OPEN_IN_FOREGROUND"; private static final String KEY_SMARTSPACE_APP_NAME = "KEY_SMARTSPACE_APP_NAME"; @@ -151,7 +150,6 @@ public class MediaControlPanel { private MediaSession.Token mToken; private MediaController mController; private Lazy<MediaDataManager> mMediaDataManagerLazy; - private int mBackgroundColor; // Uid for the media app. protected int mUid = Process.INVALID_UID; private int mSmartspaceMediaItemsCount; @@ -344,8 +342,7 @@ public class MediaControlPanel { AnimatorSet exit = loadAnimator(R.anim.media_metadata_exit, Interpolators.EMPHASIZED_ACCELERATE, titleText, artistText); - mColorSchemeTransition = new ColorSchemeTransition( - mContext, mBackgroundColor, mMediaViewHolder); + mColorSchemeTransition = new ColorSchemeTransition(mContext, mMediaViewHolder); mMetadataAnimationHandler = new MetadataAnimationHandler(exit, enter); } @@ -410,7 +407,6 @@ public class MediaControlPanel { } mInstanceId = data.getInstanceId(); - mBackgroundColor = data.getBackgroundColor(); if (mToken == null || !mToken.equals(token)) { mToken = token; } @@ -486,7 +482,7 @@ public class MediaControlPanel { Drawable icon = device.getIcon(); if (icon instanceof AdaptiveIcon) { AdaptiveIcon aIcon = (AdaptiveIcon) icon; - aIcon.setBackgroundColor(mBackgroundColor); + aIcon.setBackgroundColor(mColorSchemeTransition.getBgColor()); iconView.setImageDrawable(aIcon); } else { iconView.setImageDrawable(icon); @@ -957,11 +953,11 @@ public class MediaControlPanel { } mSmartspaceId = SmallHash.hash(data.getTargetId()); - mBackgroundColor = data.getBackgroundColor(); + int backgroundColor = data.getBackgroundColor(); mPackageName = data.getPackageName(); mInstanceId = data.getInstanceId(); TransitionLayout recommendationCard = mRecommendationViewHolder.getRecommendations(); - recommendationCard.setBackgroundTintList(ColorStateList.valueOf(mBackgroundColor)); + recommendationCard.setBackgroundTintList(ColorStateList.valueOf(backgroundColor)); List<SmartspaceAction> mediaRecommendationList = data.getRecommendations(); if (mediaRecommendationList == null || mediaRecommendationList.isEmpty()) { @@ -1001,11 +997,6 @@ public class MediaControlPanel { appName = packageManager.getApplicationLabel(applicationInfo); } } - // Set the app name as card's title. - if (!TextUtils.isEmpty(appName)) { - TextView headerTitleText = mRecommendationViewHolder.getCardText(); - headerTitleText.setText(appName); - } // Set up media rec card's tap action if applicable. setSmartspaceRecItemOnClickListener(recommendationCard, data.getCardAction(), @@ -1016,11 +1007,6 @@ public class MediaControlPanel { List<ImageView> mediaCoverItems = mRecommendationViewHolder.getMediaCoverItems(); List<ViewGroup> mediaCoverContainers = mRecommendationViewHolder.getMediaCoverContainers(); - List<Integer> mediaCoverItemsResIds = mRecommendationViewHolder.getMediaCoverItemsResIds(); - List<Integer> mediaCoverContainersResIds = - mRecommendationViewHolder.getMediaCoverContainersResIds(); - ConstraintSet expandedSet = mMediaViewController.getExpandedLayout(); - ConstraintSet collapsedSet = mMediaViewController.getCollapsedLayout(); int mediaRecommendationNum = Math.min(mediaRecommendationList.size(), MEDIA_RECOMMENDATION_MAX_NUM); int uiComponentIndex = 0; @@ -1065,21 +1051,24 @@ public class MediaControlPanel { recommendation.getTitle(), artistName, appName)); } - if (uiComponentIndex < MEDIA_RECOMMENDATION_ITEMS_PER_ROW) { - setVisibleAndAlpha(collapsedSet, - mediaCoverItemsResIds.get(uiComponentIndex), true); - setVisibleAndAlpha(collapsedSet, - mediaCoverContainersResIds.get(uiComponentIndex), true); - } else { - setVisibleAndAlpha(collapsedSet, - mediaCoverItemsResIds.get(uiComponentIndex), false); - setVisibleAndAlpha(collapsedSet, - mediaCoverContainersResIds.get(uiComponentIndex), false); - } - setVisibleAndAlpha(expandedSet, - mediaCoverItemsResIds.get(uiComponentIndex), true); - setVisibleAndAlpha(expandedSet, - mediaCoverContainersResIds.get(uiComponentIndex), true); + + // Set up title + CharSequence title = recommendation.getTitle(); + TextView titleView = + mRecommendationViewHolder.getMediaTitles().get(uiComponentIndex); + titleView.setText(title); + // TODO(b/223603970): If none of them have titles, should we then hide the views? + + // Set up subtitle + CharSequence subtitle = recommendation.getSubtitle(); + TextView subtitleView = + mRecommendationViewHolder.getMediaSubtitles().get(uiComponentIndex); + // It would look awkward to show a subtitle if we don't have a title. + boolean shouldShowSubtitleText = !TextUtils.isEmpty(title); + CharSequence subtitleText = shouldShowSubtitleText ? subtitle : ""; + subtitleView.setText(subtitleText); + // TODO(b/223603970): If none of them have subtitles, should we then hide the views? + uiComponentIndex++; } diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaData.kt b/packages/SystemUI/src/com/android/systemui/media/MediaData.kt index f6d531b5b9d6..d04ec40c9f28 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaData.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaData.kt @@ -27,7 +27,6 @@ import com.android.systemui.R data class MediaData( val userId: Int, val initialized: Boolean = false, - val backgroundColor: Int, /** * App name that will be displayed on the player. */ diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt b/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt index 0d65514bddc2..fd44993b45d8 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt @@ -85,7 +85,6 @@ private const val EXTRAS_SMARTSPACE_DISMISS_INTENT_KEY = "dismiss_intent" private val LOADING = MediaData( userId = -1, initialized = false, - backgroundColor = 0, app = null, appIcon = null, artist = null, @@ -177,7 +176,6 @@ class MediaDataManager( private val themeText = com.android.settingslib.Utils.getColorAttr(context, com.android.internal.R.attr.textColorPrimary).defaultColor - private val bgColor = context.getColor(R.color.material_dynamic_secondary95) // Internal listeners are part of the internal pipeline. External listeners (those registered // with [MediaDeviceManager.addListener]) receive events after they have propagated through @@ -591,7 +589,7 @@ class MediaDataManager( val mediaAction = getResumeMediaAction(resumeAction) val lastActive = systemClock.elapsedRealtime() foregroundExecutor.execute { - onMediaDataLoaded(packageName, null, MediaData(userId, true, bgColor, appName, + onMediaDataLoaded(packageName, null, MediaData(userId, true, appName, null, desc.subtitle, desc.title, artworkIcon, listOf(mediaAction), listOf(0), MediaButton(playOrPause = mediaAction), packageName, token, appIntent, device = null, active = false, @@ -601,14 +599,17 @@ class MediaDataManager( } } - private fun loadMediaDataInBg( + fun loadMediaDataInBg( key: String, sbn: StatusBarNotification, oldKey: String?, logEvent: Boolean = false ) { - val token = sbn.notification.extras.getParcelable(Notification.EXTRA_MEDIA_SESSION) - as MediaSession.Token? + val token = sbn.notification.extras.getParcelable( + Notification.EXTRA_MEDIA_SESSION, MediaSession.Token::class.java) + if (token == null) { + return + } val mediaController = mediaControllerFactory.create(token) val metadata = mediaController.metadata @@ -655,8 +656,8 @@ class MediaDataManager( val extras = sbn.notification.extras val deviceName = extras.getCharSequence(Notification.EXTRA_MEDIA_REMOTE_DEVICE, null) val deviceIcon = extras.getInt(Notification.EXTRA_MEDIA_REMOTE_ICON, -1) - val deviceIntent = extras.getParcelable(Notification.EXTRA_MEDIA_REMOTE_INTENT) - as PendingIntent? + val deviceIntent = extras.getParcelable( + Notification.EXTRA_MEDIA_REMOTE_INTENT, PendingIntent::class.java) Log.d(TAG, "$key is RCN for $deviceName") if (deviceName != null && deviceIcon > -1) { @@ -710,7 +711,7 @@ class MediaDataManager( val resumeAction: Runnable? = mediaEntries[key]?.resumeAction val hasCheckedForResume = mediaEntries[key]?.hasCheckedForResume == true val active = mediaEntries[key]?.active ?: true - onMediaDataLoaded(key, oldKey, MediaData(sbn.normalizedUserId, true, bgColor, app, + onMediaDataLoaded(key, oldKey, MediaData(sbn.normalizedUserId, true, app, smallIcon, artist, song, artWorkIcon, actionIcons, actionsToShowCollapsed, semanticActions, sbn.packageName, token, notif.contentIntent, device, active, resumeAction = resumeAction, playbackLocation = playbackLocation, diff --git a/packages/SystemUI/src/com/android/systemui/media/RecommendationViewHolder.kt b/packages/SystemUI/src/com/android/systemui/media/RecommendationViewHolder.kt index c0f79d575dc6..a83984036f60 100644 --- a/packages/SystemUI/src/com/android/systemui/media/RecommendationViewHolder.kt +++ b/packages/SystemUI/src/com/android/systemui/media/RecommendationViewHolder.kt @@ -31,35 +31,26 @@ class RecommendationViewHolder private constructor(itemView: View) { // Recommendation screen val cardIcon = itemView.requireViewById<ImageView>(R.id.recommendation_card_icon) - val cardText = itemView.requireViewById<TextView>(R.id.recommendation_card_text) val mediaCoverItems = listOf<ImageView>( itemView.requireViewById(R.id.media_cover1), itemView.requireViewById(R.id.media_cover2), - itemView.requireViewById(R.id.media_cover3), - itemView.requireViewById(R.id.media_cover4), - itemView.requireViewById(R.id.media_cover5), - itemView.requireViewById(R.id.media_cover6)) + itemView.requireViewById(R.id.media_cover3) + ) val mediaCoverContainers = listOf<ViewGroup>( itemView.requireViewById(R.id.media_cover1_container), itemView.requireViewById(R.id.media_cover2_container), - itemView.requireViewById(R.id.media_cover3_container), - itemView.requireViewById(R.id.media_cover4_container), - itemView.requireViewById(R.id.media_cover5_container), - itemView.requireViewById(R.id.media_cover6_container)) - val mediaCoverItemsResIds = listOf<Int>( - R.id.media_cover1, - R.id.media_cover2, - R.id.media_cover3, - R.id.media_cover4, - R.id.media_cover5, - R.id.media_cover6) - val mediaCoverContainersResIds = listOf<Int>( - R.id.media_cover1_container, - R.id.media_cover2_container, - R.id.media_cover3_container, - R.id.media_cover4_container, - R.id.media_cover5_container, - R.id.media_cover6_container) + itemView.requireViewById(R.id.media_cover3_container) + ) + val mediaTitles: List<TextView> = listOf( + itemView.requireViewById(R.id.media_title1), + itemView.requireViewById(R.id.media_title2), + itemView.requireViewById(R.id.media_title3) + ) + val mediaSubtitles: List<TextView> = listOf( + itemView.requireViewById(R.id.media_subtitle1), + itemView.requireViewById(R.id.media_subtitle2), + itemView.requireViewById(R.id.media_subtitle3) + ) // Settings/Guts screen val longPressText = itemView.requireViewById<TextView>(R.id.remove_text) @@ -107,19 +98,12 @@ class RecommendationViewHolder private constructor(itemView: View) { // Res Ids for the control components on the recommendation view. val controlsIds = setOf( R.id.recommendation_card_icon, - R.id.recommendation_card_text, R.id.media_cover1, R.id.media_cover2, R.id.media_cover3, - R.id.media_cover4, - R.id.media_cover5, - R.id.media_cover6, R.id.media_cover1_container, R.id.media_cover2_container, R.id.media_cover3_container, - R.id.media_cover4_container, - R.id.media_cover5_container, - R.id.media_cover6_container ) // Res Ids for the components on the guts panel. diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java index 0edadcc82a24..73ab66e8471b 100644 --- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java +++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java @@ -117,6 +117,7 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter { } mCheckBox.setVisibility(View.GONE); mStatusIcon.setVisibility(View.GONE); + mEndTouchArea.setVisibility(View.GONE); mContainerLayout.setOnClickListener(null); mTitleText.setTextColor(mController.getColorItemContent()); mSubTitleText.setTextColor(mController.getColorItemContent()); @@ -168,12 +169,16 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter { setSingleLineLayout(getItemTitle(device), true /* bFocused */, true /* showSeekBar */, false /* showProgressBar */, false /* showStatus */); + mCheckBox.setOnCheckedChangeListener(null); mCheckBox.setVisibility(View.VISIBLE); mCheckBox.setChecked(true); - mSeekBar.setOnClickListener(null); - mSeekBar.setOnClickListener(v -> onGroupActionTriggered(false, device)); + mCheckBox.setOnCheckedChangeListener( + (buttonView, isChecked) -> onGroupActionTriggered(false, device)); setCheckBoxColor(mCheckBox, mController.getColorItemContent()); initSeekbar(device); + mEndTouchArea.setVisibility(View.VISIBLE); + mEndTouchArea.setOnClickListener(null); + mEndTouchArea.setOnClickListener((v) -> mCheckBox.performClick()); } else if (!mController.hasAdjustVolumeUserRestriction() && currentlyConnected) { mStatusIcon.setImageDrawable( mContext.getDrawable(R.drawable.media_output_status_check)); @@ -185,8 +190,12 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter { initSeekbar(device); mCurrentActivePosition = position; } else if (isDeviceIncluded(mController.getSelectableMediaDevice(), device)) { + mCheckBox.setOnCheckedChangeListener(null); mCheckBox.setVisibility(View.VISIBLE); mCheckBox.setChecked(false); + mCheckBox.setOnCheckedChangeListener( + (buttonView, isChecked) -> onGroupActionTriggered(true, device)); + mEndTouchArea.setVisibility(View.VISIBLE); mContainerLayout.setOnClickListener(v -> onGroupActionTriggered(true, device)); setCheckBoxColor(mCheckBox, mController.getColorItemContent()); setSingleLineLayout(getItemTitle(device), false /* bFocused */, diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseAdapter.java b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseAdapter.java index 5c536d469212..9dc29bd6e090 100644 --- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseAdapter.java +++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseAdapter.java @@ -144,6 +144,7 @@ public abstract class MediaOutputBaseAdapter extends final LinearLayout mTwoLineLayout; final ImageView mStatusIcon; final CheckBox mCheckBox; + final LinearLayout mEndTouchArea; private String mDeviceId; MediaDeviceBaseViewHolder(View view) { @@ -159,6 +160,7 @@ public abstract class MediaOutputBaseAdapter extends mSeekBar = view.requireViewById(R.id.volume_seekbar); mStatusIcon = view.requireViewById(R.id.media_output_item_status); mCheckBox = view.requireViewById(R.id.check_box); + mEndTouchArea = view.requireViewById(R.id.end_action_area); } void onBind(MediaDevice device, boolean topMargin, boolean bottomMargin, int position) { diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputSeekbar.java b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputSeekbar.java deleted file mode 100644 index 72f308e4f6b1..000000000000 --- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputSeekbar.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2022 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.media.dialog; - -import android.content.Context; -import android.util.AttributeSet; -import android.view.MotionEvent; -import android.widget.SeekBar; - -/** - * Customized seekbar used by MediaOutputDialog, which only changes progress when dragging, - * otherwise performs click. - */ -public class MediaOutputSeekbar extends SeekBar { - private int mLastDownPosition = -1; - - public MediaOutputSeekbar(Context context) { - super(context); - } - - public MediaOutputSeekbar(Context context, AttributeSet attrs) { - super(context, attrs); - } - - @Override - public boolean onTouchEvent(MotionEvent event) { - if (event.getAction() == MotionEvent.ACTION_DOWN) { - mLastDownPosition = Math.round(event.getX()); - } else if (event.getAction() == MotionEvent.ACTION_UP) { - if (mLastDownPosition == event.getX()) { - performClick(); - return true; - } - mLastDownPosition = -1; - } - return super.onTouchEvent(event); - } - - @Override - public boolean performClick() { - return super.performClick(); - } -} diff --git a/packages/SystemUI/src/com/android/systemui/qs/FgsManagerController.kt b/packages/SystemUI/src/com/android/systemui/qs/FgsManagerController.kt index cc37ef40321c..13340b7245fa 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/FgsManagerController.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/FgsManagerController.kt @@ -234,6 +234,7 @@ class FgsManagerController @Inject constructor( val dialog = SystemUIDialog(context) dialog.setTitle(R.string.fgs_manager_dialog_title) + dialog.setMessage(R.string.fgs_manager_dialog_message) val dialogContext = dialog.context @@ -241,7 +242,9 @@ class FgsManagerController @Inject constructor( recyclerView.layoutManager = LinearLayoutManager(dialogContext) recyclerView.adapter = appListAdapter - dialog.setView(recyclerView) + val topSpacing = dialogContext.resources + .getDimensionPixelSize(R.dimen.fgs_manager_list_top_spacing) + dialog.setView(recyclerView, 0, topSpacing, 0, 0) this.dialog = dialog diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java index 76ec6bd086db..f87cb29a8758 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java @@ -612,7 +612,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca } else if (progress > 0 && view.getVisibility() != View.VISIBLE) { view.setVisibility((View.VISIBLE)); } - float alpha = mQSPanelController.bouncerInTransit() + float alpha = mQSPanelController.isBouncerInTransit() ? BouncerPanelExpansionCalculator.aboutToShowBouncerProgress(progress) : ShadeInterpolation.getContentAlpha(progress); view.setAlpha(alpha); diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java index 5670836566ab..851307ac615f 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java @@ -254,8 +254,8 @@ public class QSPanelController extends QSPanelControllerBase<QSPanel> { * * @return if bouncer is in transit */ - public boolean bouncerInTransit() { - return mStatusBarKeyguardViewManager.bouncerIsInTransit(); + public boolean isBouncerInTransit() { + return mStatusBarKeyguardViewManager.isBouncerInTransit(); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java index 83138f0666c1..551e8b51ae11 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java @@ -502,8 +502,8 @@ public class KeyguardIndicationController { private void updateLockScreenTrustMsg(int userId, CharSequence trustGrantedIndication, CharSequence trustManagedIndication) { - if (!TextUtils.isEmpty(trustGrantedIndication) - && mKeyguardUpdateMonitor.getUserHasTrust(userId)) { + final boolean userHasTrust = mKeyguardUpdateMonitor.getUserHasTrust(userId); + if (!TextUtils.isEmpty(trustGrantedIndication) && userHasTrust) { mRotateTextViewController.updateIndication( INDICATION_TYPE_TRUST, new KeyguardIndication.Builder() @@ -513,7 +513,7 @@ public class KeyguardIndicationController { false); } else if (!TextUtils.isEmpty(trustManagedIndication) && mKeyguardUpdateMonitor.getUserTrustIsManaged(userId) - && !mKeyguardUpdateMonitor.getUserHasTrust(userId)) { + && !userHasTrust) { mRotateTextViewController.updateIndication( INDICATION_TYPE_TRUST, new KeyguardIndication.Builder() diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java index 241a745b92e2..76f9db44af66 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java @@ -454,7 +454,7 @@ public class NotificationMediaManager implements Dumpable { * update this manager's internal state. * @return whether the current MediaMetadata changed (and needs to be announced to listeners). */ - private boolean findPlayingMediaNotification( + boolean findPlayingMediaNotification( @NonNull Collection<NotificationEntry> allNotifications) { boolean metaDataChanged = false; // Promote the media notification with a controller in 'playing' state, if any. @@ -465,7 +465,7 @@ public class NotificationMediaManager implements Dumpable { if (notif.isMediaNotification()) { final MediaSession.Token token = entry.getSbn().getNotification().extras.getParcelable( - Notification.EXTRA_MEDIA_SESSION); + Notification.EXTRA_MEDIA_SESSION, MediaSession.Token.class); if (token != null) { MediaController aController = new MediaController(mContext, token); if (PlaybackState.STATE_PLAYING diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java index 0fb6ea669458..039a3625c70c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java @@ -573,11 +573,10 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi } catch (RuntimeException e) { Log.e(TAG, "Unable to recover builder", e); // Trying to get the app name from the app info instead. - Parcelable appInfo = n.extras.getParcelable( - Notification.EXTRA_BUILDER_APPLICATION_INFO); - if (appInfo instanceof ApplicationInfo) { - appName = String.valueOf(((ApplicationInfo) appInfo).loadLabel( - c.getPackageManager())); + ApplicationInfo appInfo = n.extras.getParcelable( + Notification.EXTRA_BUILDER_APPLICATION_INFO, ApplicationInfo.class); + if (appInfo != null) { + appName = String.valueOf(appInfo.loadLabel(c.getPackageManager())); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java index 0fd9272c7da7..4fc347a09292 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java @@ -542,7 +542,8 @@ public final class NotificationEntry extends ListEntry { if (senderPerson == null) { return true; } - Person user = extras.getParcelable(Notification.EXTRA_MESSAGING_PERSON); + Person user = extras.getParcelable( + Notification.EXTRA_MESSAGING_PERSON, Person.class); return Objects.equals(user, senderPerson); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationBigPictureTemplateViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationBigPictureTemplateViewWrapper.java index 79f99b85c410..8732696dc7a1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationBigPictureTemplateViewWrapper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationBigPictureTemplateViewWrapper.java @@ -44,9 +44,8 @@ public class NotificationBigPictureTemplateViewWrapper extends NotificationTempl private void updateImageTag(StatusBarNotification sbn) { final Bundle extras = sbn.getNotification().extras; - boolean bigLargeIconSet = extras.containsKey(Notification.EXTRA_LARGE_ICON_BIG); - if (bigLargeIconSet) { - Icon bigLargeIcon = extras.getParcelable(Notification.EXTRA_LARGE_ICON_BIG); + Icon bigLargeIcon = extras.getParcelable(Notification.EXTRA_LARGE_ICON_BIG, Icon.class); + if (bigLargeIcon != null) { mRightIcon.setTag(ImageTransformState.ICON_TAG, bigLargeIcon); mLeftIcon.setTag(ImageTransformState.ICON_TAG, bigLargeIcon); } else { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java index 2f1022a904e8..25999a7f8dba 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java @@ -31,6 +31,7 @@ import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow import com.android.systemui.statusbar.notification.row.ExpandableView; import com.android.systemui.statusbar.notification.stack.StackScrollAlgorithm.BypassController; import com.android.systemui.statusbar.notification.stack.StackScrollAlgorithm.SectionProvider; +import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import javax.inject.Inject; @@ -45,6 +46,10 @@ public class AmbientState { private final SectionProvider mSectionProvider; private final BypassController mBypassController; + /** + * Used to read bouncer states. + */ + private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; private int mScrollY; private boolean mDimmed; private ActivatableNotificationView mActivatedChild; @@ -204,9 +209,11 @@ public class AmbientState { public AmbientState( Context context, @NonNull SectionProvider sectionProvider, - @NonNull BypassController bypassController) { + @NonNull BypassController bypassController, + @Nullable StatusBarKeyguardViewManager statusBarKeyguardViewManager) { mSectionProvider = sectionProvider; mBypassController = bypassController; + mStatusBarKeyguardViewManager = statusBarKeyguardViewManager; reload(context); } @@ -661,4 +668,14 @@ public class AmbientState { public int getStackTopMargin() { return mStackTopMargin; } + + /** + * Check to see if we are about to show bouncer. + * + * @return if bouncer expansion is between 0 and 1. + */ + public boolean isBouncerInTransit() { + return mStatusBarKeyguardViewManager != null + && mStatusBarKeyguardViewManager.isBouncerInTransit(); + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java index c0971337a19f..9204c45ea1d5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java @@ -27,6 +27,7 @@ import android.view.ViewGroup; import androidx.annotation.VisibleForTesting; import com.android.internal.policy.SystemBarUtils; +import com.android.keyguard.BouncerPanelExpansionCalculator; import com.android.systemui.R; import com.android.systemui.animation.ShadeInterpolation; import com.android.systemui.statusbar.EmptyShadeView; @@ -431,7 +432,9 @@ public class StackScrollAlgorithm { } else if (ambientState.isExpansionChanging()) { // Adjust alpha for shade open & close. float expansion = ambientState.getExpansionFraction(); - viewState.alpha = ShadeInterpolation.getContentAlpha(expansion); + viewState.alpha = ambientState.isBouncerInTransit() + ? BouncerPanelExpansionCalculator.aboutToShowBouncerProgress(expansion) + : ShadeInterpolation.getContentAlpha(expansion); } if (ambientState.isShadeExpanded() && view.mustStayOnScreen() diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardLiftController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardLiftController.kt index 7db677ab6305..3e32b64ebe3a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardLiftController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardLiftController.kt @@ -71,7 +71,13 @@ class KeyguardLiftController @Inject constructor( isListening = false updateListeningState() keyguardUpdateMonitor.requestFaceAuth(true) - keyguardUpdateMonitor.requestActiveUnlock() + if (keyguardUpdateMonitor.mRequestActiveUnlockOnWakeup) { + keyguardUpdateMonitor.requestActiveUnlock("wake-unlock," + + " extra=KeyguardLiftController") + } else if (keyguardUpdateMonitor.mInitiateActiveUnlockOnWakeup) { + keyguardUpdateMonitor.initiateActiveUnlock("wake-initiate," + + " extra=KeyguardLiftController") + } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java index c1142edec77c..af62f1830a39 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java @@ -3210,7 +3210,7 @@ public class NotificationPanelViewController extends PanelViewController { @Override protected void startUnlockHintAnimation() { - if (mPowerManager.isPowerSaveMode()) { + if (mPowerManager.isPowerSaveMode() || mAmbientState.getDozeAmount() > 0f) { onUnlockHintStarted(); onUnlockHintFinished(); return; @@ -3336,6 +3336,12 @@ public class NotificationPanelViewController extends PanelViewController { .log(LockscreenUiEvent.LOCKSCREEN_LOCK_SHOW_HINT); startUnlockHintAnimation(); } + if (mUpdateMonitor.isFaceEnrolled() + && mUpdateMonitor.mRequestActiveUnlockOnUnlockIntent + && mKeyguardBypassController.canBypass()) { + mUpdateMonitor.requestActiveUnlock("unlock-intent," + + " extra=lockScreenEmptySpaceTap", true); + } } return true; case StatusBarState.SHADE_LOCKED: diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImpl.java index 56c74bf98e6b..24660b261c51 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImpl.java @@ -288,7 +288,7 @@ public class NotificationShadeWindowControllerImpl implements NotificationShadeW final boolean keyguardOrAod = state.mKeyguardShowing || (state.mDozing && mDozeParameters.getAlwaysOn()); if ((keyguardOrAod && !state.mBackdropShowing && !state.mLightRevealScrimOpaque) - || mKeyguardViewMediator.isAnimatingBetweenKeyguardAndSurfaceBehindOrWillBe()) { + || mKeyguardViewMediator.isAnimatingBetweenKeyguardAndSurfaceBehind()) { // Show the wallpaper if we're on keyguard/AOD and the wallpaper is not occluded by a // solid backdrop. Also, show it if we are currently animating between the // keyguard and the surface behind the keyguard - we want to use the wallpaper as a diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java index d492c57dfa0c..4ba8441fc9a6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java @@ -48,7 +48,6 @@ import android.view.animation.Interpolator; import com.android.internal.jank.InteractionJankMonitor; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.util.LatencyTracker; -import com.android.keyguard.BouncerPanelExpansionCalculator; import com.android.systemui.DejankUtils; import com.android.systemui.R; import com.android.systemui.animation.Interpolators; @@ -796,9 +795,7 @@ public abstract class PanelViewController { } mExpandedFraction = Math.min(1f, maxPanelHeight == 0 ? 0 : mExpandedHeight / maxPanelHeight); - mAmbientState.setExpansionFraction(mStatusBarKeyguardViewManager.bouncerIsInTransit() - ? BouncerPanelExpansionCalculator.aboutToShowBouncerProgress(mExpandedFraction) - : mExpandedFraction); + mAmbientState.setExpansionFraction(mExpandedFraction); onHeightUpdated(mExpandedHeight); updatePanelExpansionAndVisibility(); }); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java index cc2ff3fb4388..8c1ed19a8dcc 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -1074,7 +1074,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump } private float getInterpolatedFraction() { - if (mStatusBarKeyguardViewManager.bouncerIsInTransit()) { + if (mStatusBarKeyguardViewManager.isBouncerInTransit()) { return BouncerPanelExpansionCalculator .aboutToShowBouncerProgress(mPanelExpansionFraction); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java index ce1289e0885c..8016ea598b03 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -580,9 +580,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb } } - /** - * Stop showing any alternate auth methods - */ + @Override public void resetAlternateAuth(boolean forceUpdateScrim) { final boolean updateScrim = (mAlternateAuthInterceptor != null && mAlternateAuthInterceptor.hideAlternateAuthBouncer()) @@ -591,10 +589,12 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb } private void updateAlternateAuthShowing(boolean updateScrim) { + final boolean isShowingAltAuth = isShowingAlternateAuth(); if (mKeyguardMessageAreaController != null) { - mKeyguardMessageAreaController.setAltBouncerShowing(isShowingAlternateAuth()); + mKeyguardMessageAreaController.setAltBouncerShowing(isShowingAltAuth); } - mBypassController.setAltBouncerShowing(isShowingAlternateAuth()); + mBypassController.setAltBouncerShowing(isShowingAltAuth); + mKeyguardUpdateManager.setUdfpsBouncerShowing(isShowingAltAuth); if (updateScrim) { mCentralSurfaces.updateScrimController(); @@ -1378,7 +1378,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb /** * Returns if bouncer expansion is between 0 and 1 non-inclusive. */ - public boolean bouncerIsInTransit() { + public boolean isBouncerInTransit() { if (mBouncer == null) return false; return mBouncer.inTransit(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialogManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialogManager.java index 36e705a31a10..e7d9221ac861 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialogManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialogManager.java @@ -18,6 +18,7 @@ package com.android.systemui.statusbar.phone; import androidx.annotation.NonNull; +import com.android.keyguard.KeyguardViewController; import com.android.systemui.Dumpable; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dump.DumpManager; @@ -37,7 +38,7 @@ import javax.inject.Inject; */ @SysUISingleton public class SystemUIDialogManager implements Dumpable { - private final StatusBarKeyguardViewManager mKeyguardViewManager; + private final KeyguardViewController mKeyguardViewController; private final Set<SystemUIDialog> mDialogsShowing = new HashSet<>(); private final Set<Listener> mListeners = new HashSet<>(); @@ -45,9 +46,9 @@ public class SystemUIDialogManager implements Dumpable { @Inject public SystemUIDialogManager( DumpManager dumpManager, - StatusBarKeyguardViewManager statusBarKeyguardViewManager) { + KeyguardViewController keyguardViewController) { dumpManager.registerDumpable(this); - mKeyguardViewManager = statusBarKeyguardViewManager; + mKeyguardViewController = keyguardViewController; } /** @@ -86,7 +87,7 @@ public class SystemUIDialogManager implements Dumpable { private void updateDialogListeners() { if (shouldHideAffordance()) { - mKeyguardViewManager.resetAlternateAuth(true); + mKeyguardViewController.resetAlternateAuth(true); } for (Listener listener : mListeners) { diff --git a/packages/SystemUI/src/com/android/systemui/usb/UsbAudioWarningDialogMessage.java b/packages/SystemUI/src/com/android/systemui/usb/UsbAudioWarningDialogMessage.java new file mode 100644 index 000000000000..e06353b3aad3 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/usb/UsbAudioWarningDialogMessage.java @@ -0,0 +1,124 @@ +/* + * 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.systemui.usb; + +import static java.lang.annotation.RetentionPolicy.SOURCE; + +import android.annotation.IntDef; +import android.content.res.Resources; +import android.util.Log; + +import com.android.systemui.R; + +import java.lang.annotation.Retention; + +import javax.inject.Inject; + +/** + * USB Audio devices warning dialog messages help class. + */ +public class UsbAudioWarningDialogMessage { + private static final String TAG = "UsbAudioWarningDialogMessage"; + + @Retention(SOURCE) + @IntDef({TYPE_PERMISSION, TYPE_CONFIRM}) + public @interface DialogType {} + public static final int TYPE_PERMISSION = 0; + public static final int TYPE_CONFIRM = 1; + + private int mDialogType; + private UsbDialogHelper mDialogHelper; + + @Inject + public UsbAudioWarningDialogMessage() { + } + + /** + * Initialize USB audio warning dialog message type and helper class. + * @param type Dialog type for Activity. + * @param usbDialogHelper Helper class for getting USB permission and confirm dialogs + */ + public void init(@DialogType int type, UsbDialogHelper usbDialogHelper) { + mDialogType = type; + mDialogHelper = usbDialogHelper; + } + + boolean hasRecordPermission() { + return mDialogHelper.packageHasAudioRecordingPermission(); + } + + boolean isUsbAudioDevice() { + return mDialogHelper.isUsbDevice() && (mDialogHelper.deviceHasAudioCapture() + || (mDialogHelper.deviceHasAudioPlayback())); + } + + boolean hasAudioPlayback() { + return mDialogHelper.deviceHasAudioPlayback(); + } + + boolean hasAudioCapture() { + return mDialogHelper.deviceHasAudioCapture(); + } + + /** + * According to USB audio warning dialog matrix table to return warning message id. + * @return string resId for USB audio warning dialog message, otherwise {ID_NULL}. + * See usb_audio.md for USB audio Permission and Confirmation warning dialog resource + * string id matrix table. + */ + public int getMessageId() { + if (!mDialogHelper.isUsbDevice()) { + return getUsbAccessoryPromptId(); + } + + if (hasRecordPermission() && isUsbAudioDevice()) { + // case# 1, 2, 3 + return R.string.usb_audio_device_prompt; + } else if (!hasRecordPermission() && isUsbAudioDevice() && hasAudioPlayback() + && !hasAudioCapture()) { + // case# 5 + return R.string.usb_audio_device_prompt; + } + + if (!hasRecordPermission() && isUsbAudioDevice() && hasAudioCapture()) { + // case# 6,7 + return R.string.usb_audio_device_prompt_warn; + } + + Log.w(TAG, "Only shows title with empty content description!"); + return Resources.ID_NULL; + } + + /** + * Gets prompt dialog title. + * @return string id for USB prompt dialog title. + */ + public int getPromptTitleId() { + return (mDialogType == TYPE_PERMISSION) + ? R.string.usb_audio_device_permission_prompt_title + : R.string.usb_audio_device_confirm_prompt_title; + } + + /** + * Gets USB Accessory prompt message id. + * @return string id for USB Accessory prompt message. + */ + public int getUsbAccessoryPromptId() { + return (mDialogType == TYPE_PERMISSION) + ? R.string.usb_accessory_permission_prompt : R.string.usb_accessory_confirm_prompt; + } +} diff --git a/packages/SystemUI/src/com/android/systemui/usb/UsbConfirmActivity.java b/packages/SystemUI/src/com/android/systemui/usb/UsbConfirmActivity.java index f4558feb69aa..6e523d88a326 100644 --- a/packages/SystemUI/src/com/android/systemui/usb/UsbConfirmActivity.java +++ b/packages/SystemUI/src/com/android/systemui/usb/UsbConfirmActivity.java @@ -16,7 +16,10 @@ package com.android.systemui.usb; -import com.android.systemui.R; +import android.content.res.Resources; +import android.os.Bundle; + +import javax.inject.Inject; /** * Dialog shown to confirm the package to start when a USB device or accessory is attached and there @@ -24,23 +27,35 @@ import com.android.systemui.R; */ public class UsbConfirmActivity extends UsbDialogActivity { + private UsbAudioWarningDialogMessage mUsbConfirmMessageHandler; + + @Inject + public UsbConfirmActivity(UsbAudioWarningDialogMessage usbAudioWarningDialogMessage) { + mUsbConfirmMessageHandler = usbAudioWarningDialogMessage; + } + + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + mUsbConfirmMessageHandler.init(UsbAudioWarningDialogMessage.TYPE_CONFIRM, mDialogHelper); + } + @Override protected void onResume() { super.onResume(); - final int strId; - boolean useRecordWarning = false; - if (mDialogHelper.isUsbDevice()) { - useRecordWarning = mDialogHelper.deviceHasAudioCapture() - && !mDialogHelper.packageHasAudioRecordingPermission(); - strId = useRecordWarning - ? R.string.usb_device_confirm_prompt_warn - : R.string.usb_device_confirm_prompt; - } else { - // UsbAccessory case - strId = R.string.usb_accessory_confirm_prompt; - } - setAlertParams(strId); // Only show the "always use" checkbox if there is no USB/Record warning + final boolean useRecordWarning = mDialogHelper.isUsbDevice() + && (mDialogHelper.deviceHasAudioCapture() + && !mDialogHelper.packageHasAudioRecordingPermission()); + + final int titleId = mUsbConfirmMessageHandler.getPromptTitleId(); + final String title = getString(titleId, mDialogHelper.getAppName(), + mDialogHelper.getDeviceDescription()); + final int messageId = mUsbConfirmMessageHandler.getMessageId(); + String message = (messageId != Resources.ID_NULL) + ? getString(messageId, mDialogHelper.getAppName(), + mDialogHelper.getDeviceDescription()) : null; + setAlertParams(title, message); if (!useRecordWarning) { addAlwaysUseCheckbox(); } diff --git a/packages/SystemUI/src/com/android/systemui/usb/UsbDialogActivity.java b/packages/SystemUI/src/com/android/systemui/usb/UsbDialogActivity.java index 930bc338a918..55dec5fbe344 100644 --- a/packages/SystemUI/src/com/android/systemui/usb/UsbDialogActivity.java +++ b/packages/SystemUI/src/com/android/systemui/usb/UsbDialogActivity.java @@ -41,7 +41,7 @@ abstract class UsbDialogActivity extends AlertActivity private TextView mClearDefaultHint; @Override - protected final void onCreate(Bundle savedInstanceState) { + protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().addSystemFlags( WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS); @@ -87,11 +87,10 @@ abstract class UsbDialogActivity extends AlertActivity } } - void setAlertParams(int strId) { + void setAlertParams(String title, String message) { final AlertController.AlertParams ap = mAlertParams; - ap.mTitle = mDialogHelper.getAppName(); - ap.mMessage = getString(strId, mDialogHelper.getAppName(), - mDialogHelper.getDeviceDescription()); + ap.mTitle = title; + ap.mMessage = message; ap.mPositiveButtonText = getString(android.R.string.ok); ap.mNegativeButtonText = getString(android.R.string.cancel); ap.mPositiveButtonListener = this; diff --git a/packages/SystemUI/src/com/android/systemui/usb/UsbDialogHelper.java b/packages/SystemUI/src/com/android/systemui/usb/UsbDialogHelper.java index d63fb86ea6d4..3f061d3113be 100644 --- a/packages/SystemUI/src/com/android/systemui/usb/UsbDialogHelper.java +++ b/packages/SystemUI/src/com/android/systemui/usb/UsbDialogHelper.java @@ -134,6 +134,13 @@ public class UsbDialogHelper { } /** + * @return True if the intent contains a UsbDevice which can play audio. + */ + public boolean deviceHasAudioPlayback() { + return mDevice != null && mDevice.getHasAudioPlayback(); + } + + /** * @return True if the package has RECORD_AUDIO permission specified in its manifest. */ public boolean packageHasAudioRecordingPermission() { @@ -272,15 +279,15 @@ public class UsbDialogHelper { return desc; } - /** - * Whether the calling package can set as default handler of the USB device or accessory. - * In case of a UsbAccessory this is the case if the calling package has an intent filter for - * {@link UsbManager#ACTION_USB_ACCESSORY_ATTACHED} with a usb-accessory filter matching the - * attached accessory. In case of a UsbDevice this is the case if the calling package has an - * intent filter for {@link UsbManager#ACTION_USB_DEVICE_ATTACHED} with a usb-device filter - * matching the attached device. - * - * @return True if the package can be default for the USB device. + /** + * Whether the calling package can set as default handler of the USB device or accessory. + * In case of a UsbAccessory this is the case if the calling package has an intent filter for + * {@link UsbManager#ACTION_USB_ACCESSORY_ATTACHED} with a usb-accessory filter matching the + * attached accessory. In case of a UsbDevice this is the case if the calling package has an + * intent filter for {@link UsbManager#ACTION_USB_DEVICE_ATTACHED} with a usb-device filter + * matching the attached device. + * + * @return True if the package can be default for the USB device. */ public boolean canBeDefault() { return mCanBeDefault; diff --git a/packages/SystemUI/src/com/android/systemui/usb/UsbPermissionActivity.java b/packages/SystemUI/src/com/android/systemui/usb/UsbPermissionActivity.java index 38d634777177..9484d3a63801 100644 --- a/packages/SystemUI/src/com/android/systemui/usb/UsbPermissionActivity.java +++ b/packages/SystemUI/src/com/android/systemui/usb/UsbPermissionActivity.java @@ -16,7 +16,10 @@ package com.android.systemui.usb; -import com.android.systemui.R; +import android.content.res.Resources; +import android.os.Bundle; + +import javax.inject.Inject; /** * Dialog shown when a package requests access to a USB device or accessory. @@ -24,23 +27,36 @@ import com.android.systemui.R; public class UsbPermissionActivity extends UsbDialogActivity { private boolean mPermissionGranted = false; + private UsbAudioWarningDialogMessage mUsbPermissionMessageHandler; + + @Inject + public UsbPermissionActivity(UsbAudioWarningDialogMessage usbAudioWarningDialogMessage) { + mUsbPermissionMessageHandler = usbAudioWarningDialogMessage; + } + + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + mUsbPermissionMessageHandler.init(UsbAudioWarningDialogMessage.TYPE_PERMISSION, + mDialogHelper); + } @Override protected void onResume() { super.onResume(); - final int strId; - boolean useRecordWarning = false; - if (mDialogHelper.isUsbDevice()) { - useRecordWarning = mDialogHelper.deviceHasAudioCapture() - && !mDialogHelper.packageHasAudioRecordingPermission(); - strId = useRecordWarning - ? R.string.usb_device_permission_prompt_warn - : R.string.usb_device_permission_prompt; - } else { - // UsbAccessory case - strId = R.string.usb_accessory_permission_prompt; - } - setAlertParams(strId); + final boolean useRecordWarning = mDialogHelper.isUsbDevice() + && (mDialogHelper.deviceHasAudioCapture() + && !mDialogHelper.packageHasAudioRecordingPermission()); + + final int titleId = mUsbPermissionMessageHandler.getPromptTitleId(); + final String title = getString(titleId, mDialogHelper.getAppName(), + mDialogHelper.getDeviceDescription()); + final int messageId = mUsbPermissionMessageHandler.getMessageId(); + String message = (messageId != Resources.ID_NULL) + ? getString(messageId, mDialogHelper.getAppName(), + mDialogHelper.getDeviceDescription()) : null; + setAlertParams(title, message); + // Only show the "always use" checkbox if there is no USB/Record warning if (!useRecordWarning && mDialogHelper.canBeDefault()) { addAlwaysUseCheckbox(); diff --git a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletView.java b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletView.java index 9b2702ff7bf2..1243c4718229 100644 --- a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletView.java +++ b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletView.java @@ -215,6 +215,7 @@ public class WalletView extends FrameLayout implements WalletCardCarousel.OnCard logoView.setImageDrawable(mContext.getDrawable(R.drawable.ic_qs_plus)); mEmptyStateView.<TextView>requireViewById(R.id.empty_state_title).setText(label); mEmptyStateView.setOnClickListener(clickListener); + mAppButton.setOnClickListener(clickListener); } void showErrorMessage(@Nullable CharSequence message) { @@ -256,6 +257,11 @@ public class WalletView extends FrameLayout implements WalletCardCarousel.OnCard } @VisibleForTesting + Button getAppButton() { + return mAppButton; + } + + @VisibleForTesting TextView getErrorView() { return mErrorView; } diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardListenQueueTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardListenQueueTest.kt index cc606de1b0b9..b1e2012ecd40 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardListenQueueTest.kt +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardListenQueueTest.kt @@ -97,5 +97,6 @@ private fun faceModel(user: Int) = KeyguardFaceListenModel( primaryUser = false, scanningAllowedByStrongAuth = false, secureCameraLaunched = false, - switchingUser = false + switchingUser = false, + udfpsBouncerShowing = false ) diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerTest.java index 14c903c86b62..ba058c71a7f4 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerTest.java @@ -291,7 +291,9 @@ public class KeyguardSecurityContainerTest extends SysuiTestCase { @Test public void testTwoOrMoreUsersDoesAllowDropDown() { // GIVEN one user has been setup - when(mUserSwitcherController.getUsers()).thenReturn(buildUserRecords(2)); + ArrayList<UserRecord> records = buildUserRecords(2); + when(mUserSwitcherController.getCurrentUserRecord()).thenReturn(records.get(0)); + when(mUserSwitcherController.getUsers()).thenReturn(records); // WHEN UserSwitcherViewMode is initialized setupUserSwitcher(); diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java index 775addd9390b..86a4f5ad43b0 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java @@ -269,7 +269,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { mKeyguardUpdateMonitor.registerCallback(mTestCallback); mTestableLooper.processAllMessages(); - when(mAuthController.areAllAuthenticatorsRegistered()).thenReturn(true); + when(mAuthController.areAllFingerprintAuthenticatorsRegistered()).thenReturn(true); } @After @@ -499,7 +499,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { @Test public void test_doesNotTryToAuthenticateFingerprint_whenAuthenticatorsNotRegistered() { - when(mAuthController.areAllAuthenticatorsRegistered()).thenReturn(false); + when(mAuthController.areAllFingerprintAuthenticatorsRegistered()).thenReturn(false); mKeyguardUpdateMonitor.dispatchStartedGoingToSleep(0 /* why */); mTestableLooper.processAllMessages(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java index 4858ab5234f8..28da2f13eb69 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java @@ -50,6 +50,7 @@ import android.hardware.biometrics.BiometricAuthenticator; import android.hardware.biometrics.BiometricConstants; import android.hardware.biometrics.BiometricManager; import android.hardware.biometrics.BiometricPrompt; +import android.hardware.biometrics.BiometricStateListener; import android.hardware.biometrics.ComponentInfoInternal; import android.hardware.biometrics.IBiometricContextListener; import android.hardware.biometrics.IBiometricSysuiReceiver; @@ -60,7 +61,6 @@ import android.hardware.face.FaceManager; import android.hardware.fingerprint.FingerprintManager; import android.hardware.fingerprint.FingerprintSensorProperties; import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; -import android.hardware.fingerprint.FingerprintStateListener; import android.hardware.fingerprint.IFingerprintAuthenticatorsRegisteredCallback; import android.os.Bundle; import android.os.Handler; @@ -151,7 +151,7 @@ public class AuthControllerTest extends SysuiTestCase { @Captor ArgumentCaptor<IFingerprintAuthenticatorsRegisteredCallback> mAuthenticatorsRegisteredCaptor; @Captor - ArgumentCaptor<FingerprintStateListener> mFingerprintStateCaptor; + ArgumentCaptor<BiometricStateListener> mBiometricStateCaptor; @Captor ArgumentCaptor<StatusBarStateController.StateListener> mStatusBarStateListenerCaptor; @@ -226,7 +226,7 @@ public class AuthControllerTest extends SysuiTestCase { // Callback tests @Test - public void testRegistersFingerprintStateListener_afterAllAuthenticatorsAreRegistered() + public void testRegistersBiometricStateListener_afterAllAuthenticatorsAreRegistered() throws RemoteException { // This test is sensitive to prior FingerprintManager interactions. reset(mFingerprintManager); @@ -242,12 +242,12 @@ public class AuthControllerTest extends SysuiTestCase { mAuthenticatorsRegisteredCaptor.capture()); mTestableLooper.processAllMessages(); - verify(mFingerprintManager, never()).registerFingerprintStateListener(any()); + verify(mFingerprintManager, never()).registerBiometricStateListener(any()); mAuthenticatorsRegisteredCaptor.getValue().onAllAuthenticatorsRegistered(new ArrayList<>()); mTestableLooper.processAllMessages(); - verify(mFingerprintManager).registerFingerprintStateListener(any()); + verify(mFingerprintManager).registerBiometricStateListener(any()); } @Test @@ -269,11 +269,11 @@ public class AuthControllerTest extends SysuiTestCase { mAuthenticatorsRegisteredCaptor.getValue().onAllAuthenticatorsRegistered(new ArrayList<>()); mTestableLooper.processAllMessages(); - verify(mFingerprintManager).registerFingerprintStateListener( - mFingerprintStateCaptor.capture()); + verify(mFingerprintManager).registerBiometricStateListener( + mBiometricStateCaptor.capture()); // Enrollments changed for an unknown sensor. - mFingerprintStateCaptor.getValue().onEnrollmentsChanged(0 /* userId */, + mBiometricStateCaptor.getValue().onEnrollmentsChanged(0 /* userId */, 0xbeef /* sensorId */, true /* hasEnrollments */); mTestableLooper.processAllMessages(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/flags/FeatureFlagsDebugTest.kt b/packages/SystemUI/tests/src/com/android/systemui/flags/FeatureFlagsDebugTest.kt index 6626bbe69706..b43856aae4cf 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/flags/FeatureFlagsDebugTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/flags/FeatureFlagsDebugTest.kt @@ -24,7 +24,11 @@ import android.test.suitebuilder.annotation.SmallTest import com.android.internal.statusbar.IStatusBarService import com.android.systemui.SysuiTestCase import com.android.systemui.dump.DumpManager +import com.android.systemui.statusbar.commandline.Command +import com.android.systemui.statusbar.commandline.CommandRegistry import com.android.systemui.util.mockito.any +import com.android.systemui.util.mockito.argumentCaptor +import com.android.systemui.util.mockito.capture import com.android.systemui.util.mockito.eq import com.android.systemui.util.mockito.nullable import com.android.systemui.util.mockito.withArgCaptor @@ -37,10 +41,12 @@ import org.mockito.ArgumentMatchers.anyInt import org.mockito.Mock import org.mockito.Mockito.anyBoolean import org.mockito.Mockito.anyString +import org.mockito.Mockito.atLeastOnce import org.mockito.Mockito.inOrder import org.mockito.Mockito.times import org.mockito.Mockito.verify import org.mockito.Mockito.verifyNoMoreInteractions +import org.mockito.Mockito.verifyZeroInteractions import org.mockito.MockitoAnnotations import java.io.PrintWriter import java.io.Serializable @@ -56,16 +62,18 @@ import org.mockito.Mockito.`when` as whenever class FeatureFlagsDebugTest : SysuiTestCase() { private lateinit var mFeatureFlagsDebug: FeatureFlagsDebug - @Mock private lateinit var mFlagManager: FlagManager - @Mock private lateinit var mMockContext: Context - @Mock private lateinit var mSecureSettings: SecureSettings - @Mock private lateinit var mSystemProperties: SystemPropertiesHelper - @Mock private lateinit var mResources: Resources - @Mock private lateinit var mDumpManager: DumpManager - @Mock private lateinit var mBarService: IStatusBarService - private val mFlagMap = mutableMapOf<Int, Flag<*>>() - private lateinit var mBroadcastReceiver: BroadcastReceiver - private lateinit var mClearCacheAction: Consumer<Int> + @Mock private lateinit var flagManager: FlagManager + @Mock private lateinit var mockContext: Context + @Mock private lateinit var secureSettings: SecureSettings + @Mock private lateinit var systemProperties: SystemPropertiesHelper + @Mock private lateinit var resources: Resources + @Mock private lateinit var dumpManager: DumpManager + @Mock private lateinit var commandRegistry: CommandRegistry + @Mock private lateinit var barService: IStatusBarService + @Mock private lateinit var pw: PrintWriter + private val flagMap = mutableMapOf<Int, Flag<*>>() + private lateinit var broadcastReceiver: BroadcastReceiver + private lateinit var clearCacheAction: Consumer<Int> private val teamfoodableFlagA = BooleanFlag(500, false, true) private val teamfoodableFlagB = BooleanFlag(501, true, true) @@ -73,34 +81,35 @@ class FeatureFlagsDebugTest : SysuiTestCase() { @Before fun setup() { MockitoAnnotations.initMocks(this) - mFlagMap.put(teamfoodableFlagA.id, teamfoodableFlagA) - mFlagMap.put(teamfoodableFlagB.id, teamfoodableFlagB) + flagMap.put(teamfoodableFlagA.id, teamfoodableFlagA) + flagMap.put(teamfoodableFlagB.id, teamfoodableFlagB) mFeatureFlagsDebug = FeatureFlagsDebug( - mFlagManager, - mMockContext, - mSecureSettings, - mSystemProperties, - mResources, - mDumpManager, - mFlagMap, - mBarService + flagManager, + mockContext, + secureSettings, + systemProperties, + resources, + dumpManager, + flagMap, + commandRegistry, + barService ) - verify(mFlagManager).onSettingsChangedAction = any() - mBroadcastReceiver = withArgCaptor { - verify(mMockContext).registerReceiver(capture(), any(), nullable(), nullable(), + verify(flagManager).onSettingsChangedAction = any() + broadcastReceiver = withArgCaptor { + verify(mockContext).registerReceiver(capture(), any(), nullable(), nullable(), any()) } - mClearCacheAction = withArgCaptor { - verify(mFlagManager).clearCacheAction = capture() + clearCacheAction = withArgCaptor { + verify(flagManager).clearCacheAction = capture() } - whenever(mFlagManager.idToSettingsKey(any())).thenAnswer { "key-${it.arguments[0]}" } + whenever(flagManager.idToSettingsKey(any())).thenAnswer { "key-${it.arguments[0]}" } } @Test fun testReadBooleanFlag() { // Remember that the TEAMFOOD flag is id#1 and has special behavior. - whenever(mFlagManager.readFlagValue<Boolean>(eq(3), any())).thenReturn(true) - whenever(mFlagManager.readFlagValue<Boolean>(eq(4), any())).thenReturn(false) + whenever(flagManager.readFlagValue<Boolean>(eq(3), any())).thenReturn(true) + whenever(flagManager.readFlagValue<Boolean>(eq(4), any())).thenReturn(false) assertThat(mFeatureFlagsDebug.isEnabled(BooleanFlag(2, true))).isTrue() assertThat(mFeatureFlagsDebug.isEnabled(BooleanFlag(3, false))).isTrue() assertThat(mFeatureFlagsDebug.isEnabled(BooleanFlag(4, true))).isFalse() @@ -109,7 +118,7 @@ class FeatureFlagsDebugTest : SysuiTestCase() { @Test fun testTeamFoodFlag_False() { - whenever(mFlagManager.readFlagValue<Boolean>(eq(1), any())).thenReturn(false) + whenever(flagManager.readFlagValue<Boolean>(eq(1), any())).thenReturn(false) assertThat(mFeatureFlagsDebug.isEnabled(teamfoodableFlagA)).isFalse() assertThat(mFeatureFlagsDebug.isEnabled(teamfoodableFlagB)).isTrue() @@ -120,7 +129,7 @@ class FeatureFlagsDebugTest : SysuiTestCase() { @Test fun testTeamFoodFlag_True() { - whenever(mFlagManager.readFlagValue<Boolean>(eq(1), any())).thenReturn(true) + whenever(flagManager.readFlagValue<Boolean>(eq(1), any())).thenReturn(true) assertThat(mFeatureFlagsDebug.isEnabled(teamfoodableFlagA)).isTrue() assertThat(mFeatureFlagsDebug.isEnabled(teamfoodableFlagB)).isTrue() @@ -131,11 +140,11 @@ class FeatureFlagsDebugTest : SysuiTestCase() { @Test fun testTeamFoodFlag_Overridden() { - whenever(mFlagManager.readFlagValue<Boolean>(eq(teamfoodableFlagA.id), any())) + whenever(flagManager.readFlagValue<Boolean>(eq(teamfoodableFlagA.id), any())) .thenReturn(true) - whenever(mFlagManager.readFlagValue<Boolean>(eq(teamfoodableFlagB.id), any())) + whenever(flagManager.readFlagValue<Boolean>(eq(teamfoodableFlagB.id), any())) .thenReturn(false) - whenever(mFlagManager.readFlagValue<Boolean>(eq(1), any())).thenReturn(true) + whenever(flagManager.readFlagValue<Boolean>(eq(1), any())).thenReturn(true) assertThat(mFeatureFlagsDebug.isEnabled(teamfoodableFlagA)).isTrue() assertThat(mFeatureFlagsDebug.isEnabled(teamfoodableFlagB)).isFalse() @@ -146,14 +155,14 @@ class FeatureFlagsDebugTest : SysuiTestCase() { @Test fun testReadResourceBooleanFlag() { - whenever(mResources.getBoolean(1001)).thenReturn(false) - whenever(mResources.getBoolean(1002)).thenReturn(true) - whenever(mResources.getBoolean(1003)).thenReturn(false) - whenever(mResources.getBoolean(1004)).thenAnswer { throw NameNotFoundException() } - whenever(mResources.getBoolean(1005)).thenAnswer { throw NameNotFoundException() } + whenever(resources.getBoolean(1001)).thenReturn(false) + whenever(resources.getBoolean(1002)).thenReturn(true) + whenever(resources.getBoolean(1003)).thenReturn(false) + whenever(resources.getBoolean(1004)).thenAnswer { throw NameNotFoundException() } + whenever(resources.getBoolean(1005)).thenAnswer { throw NameNotFoundException() } - whenever(mFlagManager.readFlagValue<Boolean>(eq(3), any())).thenReturn(true) - whenever(mFlagManager.readFlagValue<Boolean>(eq(5), any())).thenReturn(false) + whenever(flagManager.readFlagValue<Boolean>(eq(3), any())).thenReturn(true) + whenever(flagManager.readFlagValue<Boolean>(eq(5), any())).thenReturn(false) assertThat(mFeatureFlagsDebug.isEnabled(ResourceBooleanFlag(1, 1001))).isFalse() assertThat(mFeatureFlagsDebug.isEnabled(ResourceBooleanFlag(2, 1002))).isTrue() @@ -171,7 +180,7 @@ class FeatureFlagsDebugTest : SysuiTestCase() { @Test fun testReadSysPropBooleanFlag() { - whenever(mSystemProperties.getBoolean(anyString(), anyBoolean())).thenAnswer { + whenever(systemProperties.getBoolean(anyString(), anyBoolean())).thenAnswer { if ("b".equals(it.getArgument<String?>(0))) { return@thenAnswer true } @@ -187,8 +196,8 @@ class FeatureFlagsDebugTest : SysuiTestCase() { @Test fun testReadStringFlag() { - whenever(mFlagManager.readFlagValue<String>(eq(3), any())).thenReturn("foo") - whenever(mFlagManager.readFlagValue<String>(eq(4), any())).thenReturn("bar") + whenever(flagManager.readFlagValue<String>(eq(3), any())).thenReturn("foo") + whenever(flagManager.readFlagValue<String>(eq(4), any())).thenReturn("bar") assertThat(mFeatureFlagsDebug.getString(StringFlag(1, "biz"))).isEqualTo("biz") assertThat(mFeatureFlagsDebug.getString(StringFlag(2, "baz"))).isEqualTo("baz") assertThat(mFeatureFlagsDebug.getString(StringFlag(3, "buz"))).isEqualTo("foo") @@ -197,16 +206,16 @@ class FeatureFlagsDebugTest : SysuiTestCase() { @Test fun testReadResourceStringFlag() { - whenever(mResources.getString(1001)).thenReturn("") - whenever(mResources.getString(1002)).thenReturn("resource2") - whenever(mResources.getString(1003)).thenReturn("resource3") - whenever(mResources.getString(1004)).thenReturn(null) - whenever(mResources.getString(1005)).thenAnswer { throw NameNotFoundException() } - whenever(mResources.getString(1006)).thenAnswer { throw NameNotFoundException() } + whenever(resources.getString(1001)).thenReturn("") + whenever(resources.getString(1002)).thenReturn("resource2") + whenever(resources.getString(1003)).thenReturn("resource3") + whenever(resources.getString(1004)).thenReturn(null) + whenever(resources.getString(1005)).thenAnswer { throw NameNotFoundException() } + whenever(resources.getString(1006)).thenAnswer { throw NameNotFoundException() } - whenever(mFlagManager.readFlagValue<String>(eq(3), any())).thenReturn("override3") - whenever(mFlagManager.readFlagValue<String>(eq(4), any())).thenReturn("override4") - whenever(mFlagManager.readFlagValue<String>(eq(6), any())).thenReturn("override6") + whenever(flagManager.readFlagValue<String>(eq(3), any())).thenReturn("override3") + whenever(flagManager.readFlagValue<String>(eq(4), any())).thenReturn("override4") + whenever(flagManager.readFlagValue<String>(eq(6), any())).thenReturn("override6") assertThat(mFeatureFlagsDebug.getString(ResourceStringFlag(1, 1001))).isEqualTo("") assertThat(mFeatureFlagsDebug.getString(ResourceStringFlag(2, 1002))).isEqualTo("resource2") @@ -232,16 +241,16 @@ class FeatureFlagsDebugTest : SysuiTestCase() { addFlag(StringFlag(3, "flag3")) addFlag(ResourceStringFlag(4, 1004)) - mBroadcastReceiver.onReceive(mMockContext, null) - mBroadcastReceiver.onReceive(mMockContext, Intent()) - mBroadcastReceiver.onReceive(mMockContext, Intent("invalid action")) - mBroadcastReceiver.onReceive(mMockContext, Intent(FlagManager.ACTION_SET_FLAG)) + broadcastReceiver.onReceive(mockContext, null) + broadcastReceiver.onReceive(mockContext, Intent()) + broadcastReceiver.onReceive(mockContext, Intent("invalid action")) + broadcastReceiver.onReceive(mockContext, Intent(FlagManager.ACTION_SET_FLAG)) setByBroadcast(0, false) // unknown id does nothing setByBroadcast(1, "string") // wrong type does nothing setByBroadcast(2, 123) // wrong type does nothing setByBroadcast(3, false) // wrong type does nothing setByBroadcast(4, 123) // wrong type does nothing - verifyNoMoreInteractions(mFlagManager, mSecureSettings) + verifyNoMoreInteractions(flagManager, secureSettings) } @Test @@ -249,15 +258,15 @@ class FeatureFlagsDebugTest : SysuiTestCase() { addFlag(BooleanFlag(1, false)) // trying to erase an id not in the map does noting - mBroadcastReceiver.onReceive( - mMockContext, + broadcastReceiver.onReceive( + mockContext, Intent(FlagManager.ACTION_SET_FLAG).putExtra(FlagManager.EXTRA_ID, 0) ) - verifyNoMoreInteractions(mFlagManager, mSecureSettings) + verifyNoMoreInteractions(flagManager, secureSettings) // valid id with no value puts empty string in the setting - mBroadcastReceiver.onReceive( - mMockContext, + broadcastReceiver.onReceive( + mockContext, Intent(FlagManager.ACTION_SET_FLAG).putExtra(FlagManager.EXTRA_ID, 1) ) verifyPutData(1, "", numReads = 0) @@ -298,48 +307,102 @@ class FeatureFlagsDebugTest : SysuiTestCase() { @Test fun testSetFlagClearsCache() { val flag1 = addFlag(StringFlag(1, "flag1")) - whenever(mFlagManager.readFlagValue<String>(eq(1), any())).thenReturn("original") + whenever(flagManager.readFlagValue<String>(eq(1), any())).thenReturn("original") // gets the flag & cache it assertThat(mFeatureFlagsDebug.getString(flag1)).isEqualTo("original") - verify(mFlagManager).readFlagValue(eq(1), eq(StringFlagSerializer)) + verify(flagManager).readFlagValue(eq(1), eq(StringFlagSerializer)) // hit the cache assertThat(mFeatureFlagsDebug.getString(flag1)).isEqualTo("original") - verifyNoMoreInteractions(mFlagManager) + verifyNoMoreInteractions(flagManager) // set the flag setByBroadcast(1, "new") verifyPutData(1, "{\"type\":\"string\",\"value\":\"new\"}", numReads = 2) - whenever(mFlagManager.readFlagValue<String>(eq(1), any())).thenReturn("new") + whenever(flagManager.readFlagValue<String>(eq(1), any())).thenReturn("new") assertThat(mFeatureFlagsDebug.getString(flag1)).isEqualTo("new") - verify(mFlagManager, times(3)).readFlagValue(eq(1), eq(StringFlagSerializer)) + verify(flagManager, times(3)).readFlagValue(eq(1), eq(StringFlagSerializer)) + } + + @Test + fun testRegisterCommand() { + verify(commandRegistry).registerCommand(anyString(), any()) + } + + @Test + fun testNoOpCommand() { + val cmd = captureCommand() + + cmd.execute(pw, ArrayList()) + verify(pw, atLeastOnce()).println() + verify(flagManager).readFlagValue<Boolean>(eq(1), any()) + verifyZeroInteractions(secureSettings) + } + + @Test + fun testReadFlagCommand() { + addFlag(BooleanFlag(1, false)) + val cmd = captureCommand() + cmd.execute(pw, listOf("1")) + verify(flagManager).readFlagValue<Boolean>(eq(1), any()) + } + + @Test + fun testSetFlagCommand() { + addFlag(BooleanFlag(1, false)) + val cmd = captureCommand() + cmd.execute(pw, listOf("1", "on")) + verifyPutData(1, "{\"type\":\"boolean\",\"value\":true}") + } + + @Test + fun testToggleFlagCommand() { + addFlag(BooleanFlag(1, true)) + val cmd = captureCommand() + cmd.execute(pw, listOf("1", "toggle")) + verifyPutData(1, "{\"type\":\"boolean\",\"value\":false}", 2) + } + + @Test + fun testEraseFlagCommand() { + addFlag(BooleanFlag(1, true)) + val cmd = captureCommand() + cmd.execute(pw, listOf("1", "erase")) + verify(secureSettings).putStringForUser(eq("key-1"), eq(""), anyInt()) } private fun verifyPutData(id: Int, data: String, numReads: Int = 1) { - inOrder(mFlagManager, mSecureSettings).apply { - verify(mFlagManager, times(numReads)).readFlagValue(eq(id), any<FlagSerializer<*>>()) - verify(mFlagManager).idToSettingsKey(eq(id)) - verify(mSecureSettings).putStringForUser(eq("key-$id"), eq(data), anyInt()) - verify(mFlagManager).dispatchListenersAndMaybeRestart(eq(id), any()) + inOrder(flagManager, secureSettings).apply { + verify(flagManager, times(numReads)).readFlagValue(eq(id), any<FlagSerializer<*>>()) + verify(flagManager).idToSettingsKey(eq(id)) + verify(secureSettings).putStringForUser(eq("key-$id"), eq(data), anyInt()) + verify(flagManager).dispatchListenersAndMaybeRestart(eq(id), any()) }.verifyNoMoreInteractions() - verifyNoMoreInteractions(mFlagManager, mSecureSettings) + verifyNoMoreInteractions(flagManager, secureSettings) } private fun setByBroadcast(id: Int, value: Serializable?) { val intent = Intent(FlagManager.ACTION_SET_FLAG) intent.putExtra(FlagManager.EXTRA_ID, id) intent.putExtra(FlagManager.EXTRA_VALUE, value) - mBroadcastReceiver.onReceive(mMockContext, intent) + broadcastReceiver.onReceive(mockContext, intent) } private fun <F : Flag<*>> addFlag(flag: F): F { - val old = mFlagMap.put(flag.id, flag) + val old = flagMap.put(flag.id, flag) check(old == null) { "Flag ${flag.id} already registered" } return flag } + private fun captureCommand(): Command { + val captor = argumentCaptor<Function0<Command>>() + verify(commandRegistry).registerCommand(anyString(), capture(captor)) + + return captor.value.invoke() + } + @Test fun testDump() { val flag1 = BooleanFlag(1, true) @@ -350,10 +413,10 @@ class FeatureFlagsDebugTest : SysuiTestCase() { val flag6 = ResourceStringFlag(6, 1006) val flag7 = ResourceStringFlag(7, 1007) - whenever(mResources.getBoolean(1002)).thenReturn(true) - whenever(mResources.getString(1006)).thenReturn("resource1006") - whenever(mResources.getString(1007)).thenReturn("resource1007") - whenever(mFlagManager.readFlagValue(eq(7), eq(StringFlagSerializer))) + whenever(resources.getBoolean(1002)).thenReturn(true) + whenever(resources.getString(1006)).thenReturn("resource1006") + whenever(resources.getString(1007)).thenReturn("resource1007") + whenever(flagManager.readFlagValue(eq(7), eq(StringFlagSerializer))) .thenReturn("override7") // WHEN the flags have been accessed diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/ColorSchemeTransitionTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/ColorSchemeTransitionTest.kt index 86527d9558fd..8f967ab5294f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/ColorSchemeTransitionTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/ColorSchemeTransitionTest.kt @@ -38,7 +38,6 @@ import org.mockito.junit.MockitoJUnit private const val DEFAULT_COLOR = Color.RED private const val TARGET_COLOR = Color.BLUE -private const val BG_COLOR = Color.GREEN @SmallTest @RunWith(AndroidTestingRunner::class) @@ -66,8 +65,7 @@ class ColorSchemeTransitionTest : SysuiTestCase() { transitionFactory = { default, extractColor, applyColor -> mockTransition } whenever(extractColor.invoke(colorScheme)).thenReturn(TARGET_COLOR) - colorSchemeTransition = ColorSchemeTransition(context, - BG_COLOR, mediaViewHolder, transitionFactory) + colorSchemeTransition = ColorSchemeTransition(context, mediaViewHolder, transitionFactory) colorTransition = object : ColorTransition(DEFAULT_COLOR, extractColor, applyColor) { override fun buildAnimator(): ValueAnimator { diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt index 74f1393ed457..33db99342586 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt @@ -90,7 +90,6 @@ import org.mockito.Mockito.verify import org.mockito.junit.MockitoJUnit private const val KEY = "TEST_KEY" -private const val BG_COLOR = Color.RED private const val PACKAGE = "PKG" private const val ARTIST = "ARTIST" private const val TITLE = "TITLE" @@ -171,8 +170,18 @@ public class MediaControlPanelTest : SysuiTestCase() { @Mock private lateinit var recommendationViewHolder: RecommendationViewHolder @Mock private lateinit var smartspaceAction: SmartspaceAction private lateinit var smartspaceData: SmartspaceMediaData - @Mock private lateinit var coverContainer: ViewGroup - private lateinit var coverItem: ImageView + @Mock private lateinit var coverContainer1: ViewGroup + @Mock private lateinit var coverContainer2: ViewGroup + @Mock private lateinit var coverContainer3: ViewGroup + private lateinit var coverItem1: ImageView + private lateinit var coverItem2: ImageView + private lateinit var coverItem3: ImageView + private lateinit var recTitle1: TextView + private lateinit var recTitle2: TextView + private lateinit var recTitle3: TextView + private lateinit var recSubtitle1: TextView + private lateinit var recSubtitle2: TextView + private lateinit var recSubtitle3: TextView @JvmField @Rule val mockito = MockitoJUnit.rule() @@ -237,7 +246,6 @@ public class MediaControlPanelTest : SysuiTestCase() { session.setActive(true) mediaData = MediaTestUtils.emptyMediaData.copy( - backgroundColor = BG_COLOR, artist = ARTIST, song = TITLE, packageName = PACKAGE, @@ -371,19 +379,30 @@ public class MediaControlPanelTest : SysuiTestCase() { * Initialize elements for the recommendation view holder */ private fun initRecommendationViewHolderMocks() { + recTitle1 = TextView(context) + recTitle2 = TextView(context) + recTitle3 = TextView(context) + recSubtitle1 = TextView(context) + recSubtitle2 = TextView(context) + recSubtitle3 = TextView(context) + whenever(recommendationViewHolder.recommendations).thenReturn(view) whenever(recommendationViewHolder.cardIcon).thenReturn(appIcon) - whenever(recommendationViewHolder.cardText).thenReturn(titleText) // Add a recommendation item - coverItem = ImageView(context).also { it.setId(R.id.media_cover1) } - whenever(coverContainer.id).thenReturn(R.id.media_cover1_container) - whenever(recommendationViewHolder.mediaCoverItems).thenReturn(listOf(coverItem)) - whenever(recommendationViewHolder.mediaCoverContainers).thenReturn(listOf(coverContainer)) - whenever(recommendationViewHolder.mediaCoverItemsResIds) - .thenReturn(listOf(R.id.media_cover1)) - whenever(recommendationViewHolder.mediaCoverContainersResIds) - .thenReturn(listOf(R.id.media_cover1_container)) + coverItem1 = ImageView(context).also { it.setId(R.id.media_cover1) } + coverItem2 = ImageView(context).also { it.setId(R.id.media_cover2) } + coverItem3 = ImageView(context).also { it.setId(R.id.media_cover3) } + + whenever(recommendationViewHolder.mediaCoverItems) + .thenReturn(listOf(coverItem1, coverItem2, coverItem3)) + whenever(recommendationViewHolder.mediaCoverContainers) + .thenReturn(listOf(coverContainer1, coverContainer2, coverContainer3)) + whenever(recommendationViewHolder.mediaTitles) + .thenReturn(listOf(recTitle1, recTitle2, recTitle3)) + whenever(recommendationViewHolder.mediaSubtitles).thenReturn( + listOf(recSubtitle1, recSubtitle2, recSubtitle3) + ) // Long press menu whenever(recommendationViewHolder.settings).thenReturn(settings) @@ -396,7 +415,10 @@ public class MediaControlPanelTest : SysuiTestCase() { // Needed for card and item action click val mockContext = mock(Context::class.java) whenever(view.context).thenReturn(mockContext) - whenever(coverContainer.context).thenReturn(mockContext) + whenever(coverContainer1.context).thenReturn(mockContext) + whenever(coverContainer2.context).thenReturn(mockContext) + whenever(coverContainer3.context).thenReturn(mockContext) + } @After @@ -678,9 +700,11 @@ public class MediaControlPanelTest : SysuiTestCase() { MediaAction(icon, null, "custom 0", bg), MediaAction(icon, Runnable {}, "custom 1", bg) ) - val state = mediaData.copy(actions = actions, + val state = mediaData.copy( + actions = actions, actionsToShowInCompact = listOf(1, 2), - semanticActions = null) + semanticActions = null + ) player.attachPlayer(viewHolder) player.bindPlayer(state, PACKAGE) @@ -729,11 +753,14 @@ public class MediaControlPanelTest : SysuiTestCase() { val icon = context.getDrawable(R.drawable.ic_media_play) val bg = context.getDrawable(R.drawable.ic_media_play_container) val semanticActions0 = MediaButton( - playOrPause = MediaAction(mockAvd0, Runnable {}, "play", null)) + playOrPause = MediaAction(mockAvd0, Runnable {}, "play", null) + ) val semanticActions1 = MediaButton( - playOrPause = MediaAction(mockAvd1, Runnable {}, "pause", null)) + playOrPause = MediaAction(mockAvd1, Runnable {}, "pause", null) + ) val semanticActions2 = MediaButton( - playOrPause = MediaAction(mockAvd2, Runnable {}, "loading", null)) + playOrPause = MediaAction(mockAvd2, Runnable {}, "loading", null) + ) val state0 = mediaData.copy(semanticActions = semanticActions0) val state1 = mediaData.copy(semanticActions = semanticActions1) val state2 = mediaData.copy(semanticActions = semanticActions2) @@ -773,8 +800,8 @@ public class MediaControlPanelTest : SysuiTestCase() { assertThat(actionPlayPause.getBackground()).isNull() verify(mockAvd0, times(1)) .registerAnimationCallback(any(Animatable2.AnimationCallback::class.java)) - verify(mockAvd1, times(1) - ).registerAnimationCallback(any(Animatable2.AnimationCallback::class.java)) + verify(mockAvd1, times(1)) + .registerAnimationCallback(any(Animatable2.AnimationCallback::class.java)) verify(mockAvd2, times(1)) .registerAnimationCallback(any(Animatable2.AnimationCallback::class.java)) verify(mockAvd0, times(1)) @@ -1224,12 +1251,70 @@ public class MediaControlPanelTest : SysuiTestCase() { player.attachRecommendation(recommendationViewHolder) player.bindRecommendation(smartspaceData) - verify(coverContainer).setOnClickListener(captor.capture()) + verify(coverContainer1).setOnClickListener(captor.capture()) captor.value.onClick(recommendationViewHolder.recommendations) verify(logger).logRecommendationItemTap(eq(PACKAGE), eq(instanceId), eq(0)) } + @Test + fun bindRecommendation_hasTitlesAndSubtitles() { + player.attachRecommendation(recommendationViewHolder) + + val title1 = "Title1" + val title2 = "Title2" + val title3 = "Title3" + val subtitle1 = "Subtitle1" + val subtitle2 = "Subtitle2" + val subtitle3 = "Subtitle3" + + val data = smartspaceData.copy( + recommendations = listOf( + SmartspaceAction.Builder("id1", title1) + .setSubtitle(subtitle1) + .setIcon(Icon.createWithResource(context, R.drawable.ic_1x_mobiledata)) + .setExtras(Bundle.EMPTY) + .build(), + SmartspaceAction.Builder("id2", title2) + .setSubtitle(subtitle2) + .setIcon(Icon.createWithResource(context, R.drawable.ic_alarm)) + .setExtras(Bundle.EMPTY) + .build(), + SmartspaceAction.Builder("id3", title3) + .setSubtitle(subtitle3) + .setIcon(Icon.createWithResource(context, R.drawable.ic_3g_mobiledata)) + .setExtras(Bundle.EMPTY) + .build() + ) + ) + player.bindRecommendation(data) + + assertThat(recTitle1.text).isEqualTo(title1) + assertThat(recTitle2.text).isEqualTo(title2) + assertThat(recTitle3.text).isEqualTo(title3) + assertThat(recSubtitle1.text).isEqualTo(subtitle1) + assertThat(recSubtitle2.text).isEqualTo(subtitle2) + assertThat(recSubtitle3.text).isEqualTo(subtitle3) + } + + @Test + fun bindRecommendation_noTitle_subtitleNotShown() { + player.attachRecommendation(recommendationViewHolder) + + val data = smartspaceData.copy( + recommendations = listOf( + SmartspaceAction.Builder("id1", "") + .setSubtitle("fake subtitle") + .setIcon(Icon.createWithResource(context, R.drawable.ic_1x_mobiledata)) + .setExtras(Bundle.EMPTY) + .build() + ) + ) + player.bindRecommendation(data) + + assertThat(recSubtitle1.text).isEqualTo("") + } + private fun getScrubbingChangeListener(): SeekBarViewModel.ScrubbingChangeListener = withArgCaptor { verify(seekBarViewModel).setScrubbingChangeListener(capture()) } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataCombineLatestTest.java b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataCombineLatestTest.java index eacec20cac12..3e335c5163a9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataCombineLatestTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataCombineLatestTest.java @@ -57,7 +57,6 @@ public class MediaDataCombineLatestTest extends SysuiTestCase { private static final String OLD_KEY = "TEST_KEY_OLD"; private static final String APP = "APP"; private static final String PACKAGE = "PKG"; - private static final int BG_COLOR = Color.RED; private static final String ARTIST = "ARTIST"; private static final String TITLE = "TITLE"; private static final String DEVICE_NAME = "DEVICE_NAME"; @@ -76,7 +75,7 @@ public class MediaDataCombineLatestTest extends SysuiTestCase { mManager.addListener(mListener); mMediaData = new MediaData( - USER_ID, true, BG_COLOR, APP, null, ARTIST, TITLE, null, + USER_ID, true, APP, null, ARTIST, TITLE, null, new ArrayList<>(), new ArrayList<>(), null, PACKAGE, null, null, null, true, null, MediaData.PLAYBACK_LOCAL, false, KEY, false, false, false, 0L, InstanceId.fakeInstanceId(-1), -1); diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt index 7ec31a7ae829..ca2fd6bf5a5b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt @@ -277,6 +277,49 @@ class MediaDataManagerTest : SysuiTestCase() { } @Test + fun testLoadMediaDataInBg_invalidTokenNoCrash() { + val bundle = Bundle() + // wrong data type + bundle.putParcelable(Notification.EXTRA_MEDIA_SESSION, Bundle()) + val rcn = SbnBuilder().run { + setPkg(SYSTEM_PACKAGE_NAME) + modifyNotification(context).also { + it.setSmallIcon(android.R.drawable.ic_media_pause) + it.addExtras(bundle) + it.setStyle(MediaStyle().apply { + setRemotePlaybackInfo("Remote device", 0, null) + }) + } + build() + } + + mediaDataManager.loadMediaDataInBg(KEY, rcn, null) + // no crash even though the data structure is incorrect + } + + @Test + fun testLoadMediaDataInBg_invalidMediaRemoteIntentNoCrash() { + val bundle = Bundle() + // wrong data type + bundle.putParcelable(Notification.EXTRA_MEDIA_REMOTE_INTENT, Bundle()) + val rcn = SbnBuilder().run { + setPkg(SYSTEM_PACKAGE_NAME) + modifyNotification(context).also { + it.setSmallIcon(android.R.drawable.ic_media_pause) + it.addExtras(bundle) + it.setStyle(MediaStyle().apply { + setMediaSession(session.sessionToken) + setRemotePlaybackInfo("Remote device", 0, null) + }) + } + build() + } + + mediaDataManager.loadMediaDataInBg(KEY, rcn, null) + // no crash even though the data structure is incorrect + } + + @Test fun testOnNotificationRemoved_callsListener() { addNotificationAndLoad() val data = mediaDataCaptor.value diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaTestUtils.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaTestUtils.kt index c7ef94eb6a64..ae58fe67da23 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaTestUtils.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaTestUtils.kt @@ -7,7 +7,6 @@ class MediaTestUtils { val emptyMediaData = MediaData( userId = 0, initialized = true, - backgroundColor = 0, app = null, appIcon = null, artist = null, diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java index 4fbdb7c512bd..a518b808688e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java @@ -190,7 +190,7 @@ public class QSFragmentTest extends SysuiBaseFragmentTest { QSFragment fragment = resumeAndGetFragment(); enableSplitShade(); setStatusBarState(StatusBarState.KEYGUARD); - when(mQSPanelController.bouncerInTransit()).thenReturn(false); + when(mQSPanelController.isBouncerInTransit()).thenReturn(false); int transitionPxAmount = 123; float transitionProgress = 0.5f; @@ -206,7 +206,7 @@ public class QSFragmentTest extends SysuiBaseFragmentTest { QSFragment fragment = resumeAndGetFragment(); enableSplitShade(); setStatusBarState(StatusBarState.KEYGUARD); - when(mQSPanelController.bouncerInTransit()).thenReturn(true); + when(mQSPanelController.isBouncerInTransit()).thenReturn(true); int transitionPxAmount = 123; float transitionProgress = 0.5f; diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.kt index 689de50d5b4a..69d3f8b313c9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.kt @@ -61,7 +61,7 @@ class QSPanelControllerTest : SysuiTestCase() { whenever(brightnessSliderFactory.create(any(), any())).thenReturn(brightnessSlider) whenever(brightnessControllerFactory.create(any())).thenReturn(brightnessController) whenever(qsPanel.resources).thenReturn(mContext.orCreateTestableResources.resources) - whenever(statusBarKeyguardViewManager.bouncerIsInTransit()).thenReturn(false) + whenever(statusBarKeyguardViewManager.isBouncerInTransit()).thenReturn(false) controller = QSPanelController( qsPanel, @@ -109,10 +109,10 @@ class QSPanelControllerTest : SysuiTestCase() { } @Test - fun testBouncerIsInTransit() { - whenever(statusBarKeyguardViewManager.bouncerIsInTransit()).thenReturn(true) - assertThat(controller.bouncerInTransit()).isEqualTo(true) - whenever(statusBarKeyguardViewManager.bouncerIsInTransit()).thenReturn(false) - assertThat(controller.bouncerInTransit()).isEqualTo(false) + fun testIsBouncerInTransit() { + whenever(statusBarKeyguardViewManager.isBouncerInTransit()).thenReturn(true) + assertThat(controller.isBouncerInTransit()).isEqualTo(true) + whenever(statusBarKeyguardViewManager.isBouncerInTransit()).thenReturn(false) + assertThat(controller.isBouncerInTransit()).isEqualTo(false) } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java index 03c22b32b8f6..1b1f4e41f200 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java @@ -32,6 +32,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; +import android.app.Notification; import android.content.Context; import android.content.ContextWrapper; import android.content.pm.ApplicationInfo; @@ -41,6 +42,7 @@ import android.graphics.Bitmap; import android.graphics.Color; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Icon; +import android.os.Bundle; import android.os.UserHandle; import android.service.notification.StatusBarNotification; @@ -170,4 +172,16 @@ public class StatusBarIconViewTest extends SysuiTestCase { mIconView.getIcon(largeIcon); // No crash? good } + + @Test + public void testContentDescForNotification_invalidAi_noCrash() { + Notification n = new Notification.Builder(mContext, "test") + .setSmallIcon(0) + .build(); + // should be ApplicationInfo + n.extras.putParcelable(Notification.EXTRA_BUILDER_APPLICATION_INFO, new Bundle()); + StatusBarIconView.contentDescForNotification(mContext, n); + + // no crash, good + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotificationEntryTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotificationEntryTest.java index 241451edf698..5804ad425267 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotificationEntryTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotificationEntryTest.java @@ -229,6 +229,41 @@ public class NotificationEntryTest extends SysuiTestCase { assertTrue(entry.isLastMessageFromReply()); } + @Test + public void notificationDataEntry_testIsLastMessageFromReply_invalidPerson_noCrash() { + Person.Builder person = new Person.Builder() + .setName("name") + .setKey("abc") + .setUri("uri") + .setBot(true); + + Bundle bundle = new Bundle(); + // should be Person.class + bundle.putParcelable(Notification.EXTRA_MESSAGING_PERSON, new Bundle()); + Bundle[] messagesBundle = new Bundle[]{new Notification.MessagingStyle.Message( + "text", 0, person.build()).toBundle()}; + bundle.putParcelableArray(Notification.EXTRA_MESSAGES, messagesBundle); + + Notification notification = new Notification.Builder(mContext, "test") + .addExtras(bundle) + .build(); + + NotificationEntry entry = new NotificationEntryBuilder() + .setPkg("pkg") + .setOpPkg("pkg") + .setTag("tag") + .setNotification(notification) + .setUser(mContext.getUser()) + .setOverrideGroupKey("") + .build(); + entry.setHasSentReply(); + + entry.isLastMessageFromReply(); + + // no crash, good + } + + private Notification.Action createContextualAction(String title) { return new Notification.Action.Builder( Icon.createWithResource(getContext(), android.R.drawable.sym_def_app_icon), diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationBigPictureTemplateViewWrapperTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationBigPictureTemplateViewWrapperTest.java new file mode 100644 index 000000000000..509ba4194e5e --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationBigPictureTemplateViewWrapperTest.java @@ -0,0 +1,76 @@ +/* + * 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.systemui.statusbar.notification.row.wrapper; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import android.app.Notification; +import android.content.Context; +import android.graphics.drawable.Icon; +import android.os.Bundle; +import android.testing.AndroidTestingRunner; +import android.testing.TestableLooper; +import android.testing.TestableLooper.RunWithLooper; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.test.filters.SmallTest; + +import com.android.systemui.SysuiTestCase; +import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; +import com.android.systemui.statusbar.notification.row.NotificationTestHelper; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(AndroidTestingRunner.class) +@SmallTest +@RunWithLooper +public class NotificationBigPictureTemplateViewWrapperTest extends SysuiTestCase { + + private View mView; + private ExpandableNotificationRow mRow; + + + @Before + public void setup() throws Exception { + allowTestableLooperAsMainThread(); + NotificationTestHelper helper = new NotificationTestHelper( + mContext, + mDependency, + TestableLooper.get(this)); + mView = LayoutInflater.from(mContext).inflate( + com.android.internal.R.layout.notification_template_material_big_picture, null); + mRow = helper.createRow(); + } + + @Test + public void invalidLargeIconBig_noCrash() { + NotificationViewWrapper wrapper = new NotificationBigPictureTemplateViewWrapper( + mContext, mView, mRow); + // should be Icon.class + mRow.getEntry().getSbn().getNotification().setSmallIcon( + Icon.createWithResource(mContext, 0)); + mRow.getEntry().getSbn().getNotification().extras.putParcelable( + Notification.EXTRA_LARGE_ICON_BIG, new Bundle()); + wrapper.onContentUpdated(mRow); + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java index 7a92b96f40db..077f6bfc5f31 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java @@ -64,6 +64,7 @@ import com.android.systemui.statusbar.notification.row.FooterView; import com.android.systemui.statusbar.phone.CentralSurfaces; import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.ShadeController; +import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import com.android.systemui.statusbar.phone.UnlockedScreenOffAnimationController; import org.junit.Assert; @@ -104,6 +105,7 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { @Mock private UnlockedScreenOffAnimationController mUnlockedScreenOffAnimationController; @Mock private NotificationShelf mNotificationShelf; @Mock private NotificationStackSizeCalculator mNotificationStackSizeCalculator; + @Mock private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; @Before @UiThreadTest @@ -111,7 +113,8 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { allowTestableLooperAsMainThread(); // Interact with real instance of AmbientState. - mAmbientState = new AmbientState(mContext, mNotificationSectionsManager, mBypassController); + mAmbientState = new AmbientState(mContext, mNotificationSectionsManager, mBypassController, + mStatusBarKeyguardViewManager); // Inject dependencies before initializing the layout mDependency.injectTestDependency(SysuiStatusBarStateController.class, mBarState); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithmTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithmTest.kt index 1da9bbcdb836..6b4dc5883f08 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithmTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithmTest.kt @@ -8,6 +8,7 @@ import com.android.systemui.statusbar.EmptyShadeView import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow import com.android.systemui.statusbar.notification.stack.StackScrollAlgorithm.BypassController import com.android.systemui.statusbar.notification.stack.StackScrollAlgorithm.SectionProvider +import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager import com.google.common.truth.Truth.assertThat import org.junit.Before import org.junit.Test @@ -21,10 +22,14 @@ class StackScrollAlgorithmTest : SysuiTestCase() { private val stackScrollAlgorithm = StackScrollAlgorithm(context, hostView) private val expandableViewState = ExpandableViewState() private val notificationRow = mock(ExpandableNotificationRow::class.java) + private val mStatusBarKeyguardViewManager = mock(StatusBarKeyguardViewManager::class.java) + private val ambientState = AmbientState( - context, - SectionProvider { _, _ -> false }, - BypassController { false }) + context, + SectionProvider { _, _ -> false }, + BypassController { false }, + mStatusBarKeyguardViewManager + ) @Before fun setUp() { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java index 09773d31de41..05fb1f5959ea 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java @@ -80,6 +80,7 @@ import com.android.keyguard.dagger.KeyguardQsUserSwitchComponent; import com.android.keyguard.dagger.KeyguardStatusBarViewComponent; import com.android.keyguard.dagger.KeyguardStatusViewComponent; import com.android.keyguard.dagger.KeyguardUserSwitcherComponent; +import com.android.systemui.DejankUtils; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.biometrics.AuthController; @@ -352,6 +353,7 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { mKeyguardStatusView = new KeyguardStatusView(mContext); mKeyguardStatusView.setId(R.id.keyguard_status_view); + DejankUtils.setImmediate(true); when(mAuthController.isUdfpsEnrolled(anyInt())).thenReturn(false); when(mHeadsUpCallback.getContext()).thenReturn(mContext); @@ -942,6 +944,29 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { } @Test + public void testUnlockHintAnimation_runs_whenNotInPowerSaveMode_andDozeAmountIsZero() { + when(mPowerManager.isPowerSaveMode()).thenReturn(false); + when(mAmbientState.getDozeAmount()).thenReturn(0f); + mNotificationPanelViewController.startUnlockHintAnimation(); + assertThat(mNotificationPanelViewController.mHintAnimationRunning).isTrue(); + } + + @Test + public void testUnlockHintAnimation_doesNotRun_inPowerSaveMode() { + when(mPowerManager.isPowerSaveMode()).thenReturn(true); + mNotificationPanelViewController.startUnlockHintAnimation(); + assertThat(mNotificationPanelViewController.mHintAnimationRunning).isFalse(); + } + + @Test + public void testUnlockHintAnimation_doesNotRun_whenDozeAmountNotZero() { + when(mPowerManager.isPowerSaveMode()).thenReturn(false); + when(mAmbientState.getDozeAmount()).thenReturn(0.5f); + mNotificationPanelViewController.startUnlockHintAnimation(); + assertThat(mNotificationPanelViewController.mHintAnimationRunning).isFalse(); + } + + @Test public void setKeyguardStatusBarAlpha_setsAlphaOnKeyguardStatusBarController() { float statusBarAlpha = 0.5f; diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java index 69d7932a81fb..ff2c05b04160 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java @@ -1238,7 +1238,7 @@ public class ScrimControllerTest extends SysuiTestCase { @Test public void expansionNotificationAlpha_shadeLocked_bouncerActive_usesBouncerInterpolator() { - when(mStatusBarKeyguardViewManager.bouncerIsInTransit()).thenReturn(true); + when(mStatusBarKeyguardViewManager.isBouncerInTransit()).thenReturn(true); mScrimController.transitionTo(ScrimState.SHADE_LOCKED); @@ -1254,7 +1254,7 @@ public class ScrimControllerTest extends SysuiTestCase { @Test public void expansionNotificationAlpha_shadeLocked_bouncerNotActive_usesShadeInterpolator() { - when(mStatusBarKeyguardViewManager.bouncerIsInTransit()).thenReturn(false); + when(mStatusBarKeyguardViewManager.isBouncerInTransit()).thenReturn(false); mScrimController.transitionTo(ScrimState.SHADE_LOCKED); @@ -1269,7 +1269,7 @@ public class ScrimControllerTest extends SysuiTestCase { @Test public void notificationAlpha_unnocclusionAnimating_bouncerActive_usesKeyguardNotifAlpha() { - when(mStatusBarKeyguardViewManager.bouncerIsInTransit()).thenReturn(true); + when(mStatusBarKeyguardViewManager.isBouncerInTransit()).thenReturn(true); mScrimController.transitionTo(ScrimState.KEYGUARD); mScrimController.setUnocclusionAnimationRunning(true); @@ -1290,7 +1290,7 @@ public class ScrimControllerTest extends SysuiTestCase { @Test public void notificationAlpha_unnocclusionAnimating_bouncerNotActive_usesKeyguardNotifAlpha() { - when(mStatusBarKeyguardViewManager.bouncerIsInTransit()).thenReturn(false); + when(mStatusBarKeyguardViewManager.isBouncerInTransit()).thenReturn(false); mScrimController.transitionTo(ScrimState.KEYGUARD); mScrimController.setUnocclusionAnimationRunning(true); @@ -1311,7 +1311,7 @@ public class ScrimControllerTest extends SysuiTestCase { @Test public void notificationAlpha_inKeyguardState_bouncerActive_usesInvertedBouncerInterpolator() { - when(mStatusBarKeyguardViewManager.bouncerIsInTransit()).thenReturn(true); + when(mStatusBarKeyguardViewManager.isBouncerInTransit()).thenReturn(true); mScrimController.transitionTo(ScrimState.KEYGUARD); @@ -1330,7 +1330,7 @@ public class ScrimControllerTest extends SysuiTestCase { @Test public void notificationAlpha_inKeyguardState_bouncerNotActive_usesInvertedShadeInterpolator() { - when(mStatusBarKeyguardViewManager.bouncerIsInTransit()).thenReturn(false); + when(mStatusBarKeyguardViewManager.isBouncerInTransit()).thenReturn(false); mScrimController.transitionTo(ScrimState.KEYGUARD); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java index 90cbf540004e..2b018727eb98 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java @@ -438,12 +438,12 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { } @Test - public void testBouncerIsInTransit() { + public void testIsBouncerInTransit() { when(mBouncer.inTransit()).thenReturn(true); - Truth.assertThat(mStatusBarKeyguardViewManager.bouncerIsInTransit()).isTrue(); + Truth.assertThat(mStatusBarKeyguardViewManager.isBouncerInTransit()).isTrue(); when(mBouncer.inTransit()).thenReturn(false); - Truth.assertThat(mStatusBarKeyguardViewManager.bouncerIsInTransit()).isFalse(); + Truth.assertThat(mStatusBarKeyguardViewManager.isBouncerInTransit()).isFalse(); mBouncer = null; - Truth.assertThat(mStatusBarKeyguardViewManager.bouncerIsInTransit()).isFalse(); + Truth.assertThat(mStatusBarKeyguardViewManager.isBouncerInTransit()).isFalse(); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/unfold/updates/DeviceFoldStateProviderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/unfold/updates/DeviceFoldStateProviderTest.kt index 7ac243452222..05a8f0a35e28 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/unfold/updates/DeviceFoldStateProviderTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/unfold/updates/DeviceFoldStateProviderTest.kt @@ -78,6 +78,9 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { @Before fun setUp() { MockitoAnnotations.initMocks(this) + overrideResource( + com.android.internal.R.integer.config_unfoldTransitionHalfFoldedTimeout, + HALF_OPENED_TIMEOUT_MILLIS.toInt()) deviceStates = FoldableTestUtils.findDeviceStates(context) foldStateProvider = @@ -319,4 +322,8 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { private fun sendHingeAngleEvent(angle: Int) { hingeAngleCaptor.value.accept(angle.toFloat()) } + + companion object { + private const val HALF_OPENED_TIMEOUT_MILLIS = 300L + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/usb/UsbPermissionActivityTest.kt b/packages/SystemUI/tests/src/com/android/systemui/usb/UsbPermissionActivityTest.kt index 3d554880ed58..b30c20db642d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/usb/UsbPermissionActivityTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/usb/UsbPermissionActivityTest.kt @@ -21,11 +21,16 @@ import android.hardware.usb.IUsbSerialReader import android.hardware.usb.UsbAccessory import android.hardware.usb.UsbManager import android.testing.AndroidTestingRunner +import android.testing.TestableLooper import android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS import androidx.test.filters.SmallTest import androidx.test.rule.ActivityTestRule +import androidx.test.runner.intercepting.SingleActivityFactory import com.android.systemui.SysuiTestCase import com.google.common.truth.Truth.assertThat + +import javax.inject.Inject + import org.junit.After import org.junit.Before import org.junit.Rule @@ -37,14 +42,26 @@ import org.junit.runner.RunWith */ @RunWith(AndroidTestingRunner::class) @SmallTest +@TestableLooper.RunWithLooper class UsbPermissionActivityTest : SysuiTestCase() { - class UsbPermissionActivityTestable : UsbPermissionActivity() + private var mMessage: UsbAudioWarningDialogMessage = UsbAudioWarningDialogMessage() + + open class UsbPermissionActivityTestable @Inject constructor ( + val message: UsbAudioWarningDialogMessage + ) + : UsbPermissionActivity(UsbAudioWarningDialogMessage()) @Rule @JvmField var activityRule = ActivityTestRule<UsbPermissionActivityTestable>( - UsbPermissionActivityTestable::class.java, false, false) + object : SingleActivityFactory<UsbPermissionActivityTestable>( + UsbPermissionActivityTestable::class.java + ) { + override fun create(intent: Intent?): UsbPermissionActivityTestable { + return UsbPermissionActivityTestable(mMessage) + } + }, false, false) private val activityIntent = Intent(mContext, UsbPermissionActivityTestable::class.java) .apply { @@ -72,6 +89,7 @@ class UsbPermissionActivityTest : SysuiTestCase() { @Before fun setUp() { + UsbPermissionActivityTestable(mMessage) activityRule.launchActivity(activityIntent) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/wallet/ui/WalletScreenControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/wallet/ui/WalletScreenControllerTest.java index 01769e52c8d3..b1950eac9846 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/wallet/ui/WalletScreenControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/wallet/ui/WalletScreenControllerTest.java @@ -20,6 +20,7 @@ import static android.view.View.GONE; import static android.view.View.VISIBLE; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -323,6 +324,7 @@ public class WalletScreenControllerTest extends SysuiTestCase { assertEquals(GONE, mWalletView.getCardCarousel().getVisibility()); assertEquals(VISIBLE, mWalletView.getEmptyStateView().getVisibility()); assertEquals(GONE, mWalletView.getErrorView().getVisibility()); + assertTrue(mWalletView.getAppButton().hasOnClickListeners()); } @Test diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java index bc4b2a6f5247..5acae4859ee8 100644 --- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java +++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java @@ -154,7 +154,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku private static final String TAG = "AppWidgetServiceImpl"; private static final boolean DEBUG = false; - private static final boolean DEBUG_PROVIDER_INFO_CACHE = true; + static final boolean DEBUG_PROVIDER_INFO_CACHE = true; private static final String OLD_KEYGUARD_HOST_PACKAGE = "android"; private static final String NEW_KEYGUARD_HOST_PACKAGE = "com.android.keyguard"; @@ -2001,6 +2001,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku } } + @GuardedBy("mLock") private void scheduleNotifyProviderChangedLocked(Widget widget) { long requestId = UPDATE_COUNTER.incrementAndGet(); if (widget != null) { @@ -2330,6 +2331,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku sendBroadcastAsUser(intent, widget.provider.id.getProfile()); } + @GuardedBy("mLock") private void registerForBroadcastsLocked(Provider provider, int[] appWidgetIds) { AppWidgetProviderInfo info = provider.getInfoLocked(mContext); if (info.updatePeriodMillis > 0) { @@ -3433,6 +3435,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku * * @return whether any providers were updated */ + @GuardedBy("mLock") private boolean updateProvidersForPackageLocked(String packageName, int userId, Set<ProviderId> removedProviders) { boolean providersUpdated = false; @@ -4218,6 +4221,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku /** * Adds all pending updates in {@param outUpdates} keys by the update time. */ + @GuardedBy("mLock") public void getPendingUpdatesForIdLocked(Context context, int appWidgetId, LongSparseArray<PendingHostUpdate> outUpdates) { long updateSequenceNo = lastWidgetUpdateSequenceNo; diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetXmlUtil.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetXmlUtil.java index 297575ca168f..6a5dcc8c5945 100644 --- a/services/appwidget/java/com/android/server/appwidget/AppWidgetXmlUtil.java +++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetXmlUtil.java @@ -22,6 +22,7 @@ import android.appwidget.AppWidgetProviderInfo; import android.content.ComponentName; import android.os.Build; import android.text.TextUtils; +import android.util.Slog; import android.util.TypedXmlPullParser; import android.util.TypedXmlSerializer; @@ -33,6 +34,8 @@ import java.util.Objects; */ public class AppWidgetXmlUtil { + private static final String TAG = "AppWidgetXmlUtil"; + private static final String ATTR_MIN_WIDTH = "min_width"; private static final String ATTR_MIN_HEIGHT = "min_height"; private static final String ATTR_MIN_RESIZE_WIDTH = "min_resize_width"; @@ -77,7 +80,11 @@ public class AppWidgetXmlUtil { if (info.configure != null) { out.attribute(null, ATTR_CONFIGURE, info.configure.flattenToShortString()); } - out.attribute(null, ATTR_LABEL, info.label); + if (info.label != null) { + out.attribute(null, ATTR_LABEL, info.label); + } else if (AppWidgetServiceImpl.DEBUG_PROVIDER_INFO_CACHE) { + Slog.e(TAG, "Label is empty in " + info.provider); + } out.attributeInt(null, ATTR_ICON, info.icon); out.attributeInt(null, ATTR_PREVIEW_IMAGE, info.previewImage); out.attributeInt(null, ATTR_PREVIEW_LAYOUT, info.previewLayout); diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java index ac0944be9739..b4c107c1a2c1 100644 --- a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java +++ b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java @@ -671,6 +671,9 @@ public class CompanionDeviceManagerService extends SystemService { association = AssociationInfo.builder(association) .setNotifyOnDeviceNearby(active) .build(); + // Do not need to call {@link BleCompanionDeviceScanner#restartScan()} since it will + // trigger {@link BleCompanionDeviceScanner#restartScan(int, AssociationInfo)} when + // an application sets/unsets the mNotifyOnDeviceNearby flag. mAssociationStore.updateAssociation(association); // TODO(b/218615198): correctly handle the case when the device is currently present. diff --git a/services/companion/java/com/android/server/companion/presence/BleCompanionDeviceScanner.java b/services/companion/java/com/android/server/companion/presence/BleCompanionDeviceScanner.java index 33301b180619..ad09f7cd3dde 100644 --- a/services/companion/java/com/android/server/companion/presence/BleCompanionDeviceScanner.java +++ b/services/companion/java/com/android/server/companion/presence/BleCompanionDeviceScanner.java @@ -194,6 +194,8 @@ class BleCompanionDeviceScanner implements AssociationStore.OnChangeListener { // Collect MAC addresses from all associations. final Set<String> macAddresses = new HashSet<>(); for (AssociationInfo association : mAssociationStore.getAssociations()) { + if (!association.isNotifyOnDeviceNearby()) continue; + // Beware that BT stack does not consider low-case MAC addresses valid, while // MacAddress.toString() return a low-case String. final String macAddress = association.getDeviceMacAddressAsString(); diff --git a/services/core/java/com/android/server/BinaryTransparencyService.java b/services/core/java/com/android/server/BinaryTransparencyService.java index 1f8ef8226c32..877ee8218ea6 100644 --- a/services/core/java/com/android/server/BinaryTransparencyService.java +++ b/services/core/java/com/android/server/BinaryTransparencyService.java @@ -441,6 +441,7 @@ public class BinaryTransparencyService extends SystemService { final JobInfo jobInfo = new JobInfo.Builder(COMPUTE_APEX_MODULE_SHA256_JOB_ID, new ComponentName(context, UpdateMeasurementsJobService.class)) .setRequiresDeviceIdle(true) + .setRequiresCharging(true) .build(); if (jobScheduler.schedule(jobInfo) != JobScheduler.RESULT_SUCCESS) { Slog.e(TAG, "Failed to schedule job to update binary measurements."); diff --git a/services/core/java/com/android/server/VcnManagementService.java b/services/core/java/com/android/server/VcnManagementService.java index 210532a88a8c..eefeee3918b3 100644 --- a/services/core/java/com/android/server/VcnManagementService.java +++ b/services/core/java/com/android/server/VcnManagementService.java @@ -87,6 +87,7 @@ import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Collections; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -172,7 +173,7 @@ public class VcnManagementService extends IVcnManagementService.Stub { @NonNull private final VcnNetworkProvider mNetworkProvider; @NonNull private final TelephonySubscriptionTrackerCallback mTelephonySubscriptionTrackerCb; @NonNull private final TelephonySubscriptionTracker mTelephonySubscriptionTracker; - @NonNull private final BroadcastReceiver mPkgChangeReceiver; + @NonNull private final BroadcastReceiver mVcnBroadcastReceiver; @NonNull private final TrackingNetworkCallback mTrackingNetworkCallback = new TrackingNetworkCallback(); @@ -217,28 +218,17 @@ public class VcnManagementService extends IVcnManagementService.Stub { mConfigDiskRwHelper = mDeps.newPersistableBundleLockingReadWriteHelper(VCN_CONFIG_FILE); - mPkgChangeReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - final String action = intent.getAction(); - - if (Intent.ACTION_PACKAGE_ADDED.equals(action) - || Intent.ACTION_PACKAGE_REPLACED.equals(action) - || Intent.ACTION_PACKAGE_REMOVED.equals(action)) { - mTelephonySubscriptionTracker.handleSubscriptionsChanged(); - } else { - Log.wtf(TAG, "received unexpected intent: " + action); - } - } - }; + mVcnBroadcastReceiver = new VcnBroadcastReceiver(); final IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED); intentFilter.addAction(Intent.ACTION_PACKAGE_REPLACED); intentFilter.addAction(Intent.ACTION_PACKAGE_REMOVED); + intentFilter.addAction(Intent.ACTION_PACKAGE_DATA_CLEARED); + intentFilter.addAction(Intent.ACTION_PACKAGE_FULLY_REMOVED); intentFilter.addDataScheme("package"); mContext.registerReceiver( - mPkgChangeReceiver, intentFilter, null /* broadcastPermission */, mHandler); + mVcnBroadcastReceiver, intentFilter, null /* broadcastPermission */, mHandler); // Run on handler to ensure I/O does not block system server startup mHandler.post(() -> { @@ -443,6 +433,53 @@ public class VcnManagementService extends IVcnManagementService.Stub { return Objects.equals(subGrp, snapshot.getActiveDataSubscriptionGroup()); } + private class VcnBroadcastReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + final String action = intent.getAction(); + + switch (action) { + case Intent.ACTION_PACKAGE_ADDED: // Fallthrough + case Intent.ACTION_PACKAGE_REPLACED: // Fallthrough + case Intent.ACTION_PACKAGE_REMOVED: + // Reevaluate subscriptions + mTelephonySubscriptionTracker.handleSubscriptionsChanged(); + + break; + case Intent.ACTION_PACKAGE_FULLY_REMOVED: + case Intent.ACTION_PACKAGE_DATA_CLEARED: + final String pkgName = intent.getData().getSchemeSpecificPart(); + + if (pkgName == null || pkgName.isEmpty()) { + logWtf("Package name was empty or null for intent with action" + action); + return; + } + + // Clear configs for the packages that had data cleared, or removed. + synchronized (mLock) { + final List<ParcelUuid> toRemove = new ArrayList<>(); + for (Entry<ParcelUuid, VcnConfig> entry : mConfigs.entrySet()) { + if (pkgName.equals(entry.getValue().getProvisioningPackageName())) { + toRemove.add(entry.getKey()); + } + } + + for (ParcelUuid subGrp : toRemove) { + stopAndClearVcnConfigInternalLocked(subGrp); + } + + if (!toRemove.isEmpty()) { + writeConfigsToDiskLocked(); + } + } + + break; + default: + Slog.wtf(TAG, "received unexpected intent: " + action); + } + } + } + private class VcnSubscriptionTrackerCallback implements TelephonySubscriptionTrackerCallback { /** * Handles subscription group changes, as notified by {@link TelephonySubscriptionTracker} @@ -504,6 +541,7 @@ public class VcnManagementService extends IVcnManagementService.Stub { final Map<ParcelUuid, Set<Integer>> currSubGrpMappings = getSubGroupToSubIdMappings(mLastSnapshot); if (!currSubGrpMappings.equals(oldSubGrpMappings)) { + garbageCollectAndWriteVcnConfigsLocked(); notifyAllPolicyListenersLocked(); } } @@ -645,6 +683,39 @@ public class VcnManagementService extends IVcnManagementService.Stub { }); } + private void enforceCarrierPrivilegeOrProvisioningPackage( + @NonNull ParcelUuid subscriptionGroup, @NonNull String pkg) { + // Only apps running in the primary (system) user are allowed to configure the VCN. This is + // in line with Telephony's behavior with regards to binding to a Carrier App provided + // CarrierConfigService. + enforcePrimaryUser(); + + if (isProvisioningPackageForConfig(subscriptionGroup, pkg)) { + return; + } + + // Must NOT be called from cleared binder identity, since this checks user calling identity + enforceCallingUserAndCarrierPrivilege(subscriptionGroup, pkg); + } + + private boolean isProvisioningPackageForConfig( + @NonNull ParcelUuid subscriptionGroup, @NonNull String pkg) { + // Try-finally to return early if matching owned subscription found. + final long identity = Binder.clearCallingIdentity(); + try { + synchronized (mLock) { + final VcnConfig config = mConfigs.get(subscriptionGroup); + if (config != null && pkg.equals(config.getProvisioningPackageName())) { + return true; + } + } + } finally { + Binder.restoreCallingIdentity(identity); + } + + return false; + } + /** * Clears the VcnManagementService for a given subscription group. * @@ -658,31 +729,56 @@ public class VcnManagementService extends IVcnManagementService.Stub { mContext.getSystemService(AppOpsManager.class) .checkPackage(mDeps.getBinderCallingUid(), opPkgName); - enforceCallingUserAndCarrierPrivilege(subscriptionGroup, opPkgName); + enforceCarrierPrivilegeOrProvisioningPackage(subscriptionGroup, opPkgName); Binder.withCleanCallingIdentity(() -> { synchronized (mLock) { - mConfigs.remove(subscriptionGroup); - final boolean vcnExists = mVcns.containsKey(subscriptionGroup); + stopAndClearVcnConfigInternalLocked(subscriptionGroup); + writeConfigsToDiskLocked(); + } + }); + } - stopVcnLocked(subscriptionGroup); + private void stopAndClearVcnConfigInternalLocked(@NonNull ParcelUuid subscriptionGroup) { + mConfigs.remove(subscriptionGroup); + final boolean vcnExists = mVcns.containsKey(subscriptionGroup); - if (vcnExists) { - // TODO(b/181789060): invoke asynchronously after Vcn notifies through - // VcnCallback - notifyAllPermissionedStatusCallbacksLocked( - subscriptionGroup, VCN_STATUS_CODE_NOT_CONFIGURED); - } + stopVcnLocked(subscriptionGroup); - writeConfigsToDiskLocked(); + if (vcnExists) { + // TODO(b/181789060): invoke asynchronously after Vcn notifies through + // VcnCallback + notifyAllPermissionedStatusCallbacksLocked( + subscriptionGroup, VCN_STATUS_CODE_NOT_CONFIGURED); + } + } + + private void garbageCollectAndWriteVcnConfigsLocked() { + final SubscriptionManager subMgr = mContext.getSystemService(SubscriptionManager.class); + + boolean shouldWrite = false; + + final Iterator<ParcelUuid> configsIterator = mConfigs.keySet().iterator(); + while (configsIterator.hasNext()) { + final ParcelUuid subGrp = configsIterator.next(); + + final List<SubscriptionInfo> subscriptions = subMgr.getSubscriptionsInGroup(subGrp); + if (subscriptions == null || subscriptions.isEmpty()) { + // Trim subGrps with no more subscriptions; must have moved to another subGrp + configsIterator.remove(); + shouldWrite = true; } - }); + } + + if (shouldWrite) { + writeConfigsToDiskLocked(); + } } /** * Retrieves the list of subscription groups with configured VcnConfigs * - * <p>Limited to subscription groups for which the caller is carrier privileged. + * <p>Limited to subscription groups for which the caller had configured. * * <p>Implements the IVcnManagementService Binder interface. */ @@ -698,7 +794,8 @@ public class VcnManagementService extends IVcnManagementService.Stub { final List<ParcelUuid> result = new ArrayList<>(); synchronized (mLock) { for (ParcelUuid subGrp : mConfigs.keySet()) { - if (mLastSnapshot.packageHasPermissionsForSubscriptionGroup(subGrp, opPkgName)) { + if (mLastSnapshot.packageHasPermissionsForSubscriptionGroup(subGrp, opPkgName) + || isProvisioningPackageForConfig(subGrp, opPkgName)) { result.add(subGrp); } } diff --git a/services/core/java/com/android/server/am/AppRestrictionController.java b/services/core/java/com/android/server/am/AppRestrictionController.java index c7e646ace0d9..d70404fb6a65 100644 --- a/services/core/java/com/android/server/am/AppRestrictionController.java +++ b/services/core/java/com/android/server/am/AppRestrictionController.java @@ -1095,6 +1095,14 @@ public final class AppRestrictionController { DEVICE_CONFIG_SUBNAMESPACE_PREFIX + "restriction_exempted_packages"; /** + * Whether or not to show the notification for abusive apps, i.e. when the system + * detects it's draining significant amount of battery in the background. + * {@code true} - we'll show the prompt to user, {@code false} - we'll not show it. + */ + static final String KEY_BG_PROMPT_ABUSIVE_APPS_TO_BG_RESTRICTED = + DEVICE_CONFIG_SUBNAMESPACE_PREFIX + "prompt_abusive_apps_to_bg_restricted"; + + /** * Default value to {@link #mBgAutoRestrictedBucket}. */ static final boolean DEFAULT_BG_AUTO_RESTRICTED_BUCKET_ON_BG_RESTRICTION = false; @@ -1119,6 +1127,11 @@ public final class AppRestrictionController { */ final boolean mDefaultBgPromptFgsWithNotiToBgRestricted; + /** + * Default value to {@link #mBgPromptAbusiveAppsToBgRestricted}. + */ + final boolean mDefaultBgPromptAbusiveAppToBgRestricted; + volatile boolean mBgAutoRestrictedBucket; volatile boolean mRestrictedBucketEnabled; @@ -1144,10 +1157,17 @@ public final class AppRestrictionController { */ volatile boolean mBgPromptFgsWithNotiOnLongRunning; + /** + * @see #KEY_BG_PROMPT_ABUSIVE_APPS_TO_BG_RESTRICTED. + */ + volatile boolean mBgPromptAbusiveAppsToBgRestricted; + ConstantsObserver(Handler handler, Context context) { super(handler); mDefaultBgPromptFgsWithNotiToBgRestricted = context.getResources().getBoolean( com.android.internal.R.bool.config_bg_prompt_fgs_with_noti_to_bg_restricted); + mDefaultBgPromptAbusiveAppToBgRestricted = context.getResources().getBoolean( + com.android.internal.R.bool.config_bg_prompt_abusive_apps_to_bg_restricted); } @Override @@ -1172,6 +1192,9 @@ public final class AppRestrictionController { case KEY_BG_PROMPT_FGS_WITH_NOTIFICATION_ON_LONG_RUNNING: updateBgPromptFgsWithNotiOnLongRunning(); break; + case KEY_BG_PROMPT_ABUSIVE_APPS_TO_BG_RESTRICTED: + updateBgPromptAbusiveAppToBgRestricted(); + break; case KEY_BG_RESTRICTION_EXEMPTED_PACKAGES: updateBgRestrictionExemptedPackages(); break; @@ -1209,6 +1232,7 @@ public final class AppRestrictionController { updateBgLongFgsNotificationMinimalInterval(); updateBgPromptFgsWithNotiToBgRestricted(); updateBgPromptFgsWithNotiOnLongRunning(); + updateBgPromptAbusiveAppToBgRestricted(); updateBgRestrictionExemptedPackages(); } @@ -1251,6 +1275,13 @@ public final class AppRestrictionController { DEFAULT_BG_PROMPT_FGS_WITH_NOTIFICATION_ON_LONG_RUNNING); } + private void updateBgPromptAbusiveAppToBgRestricted() { + mBgPromptAbusiveAppsToBgRestricted = DeviceConfig.getBoolean( + DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + KEY_BG_PROMPT_ABUSIVE_APPS_TO_BG_RESTRICTED, + mDefaultBgPromptAbusiveAppToBgRestricted); + } + private void updateBgRestrictionExemptedPackages() { final String settings = DeviceConfig.getString( DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, @@ -1290,6 +1321,10 @@ public final class AppRestrictionController { pw.print('='); pw.println(mBgPromptFgsWithNotiToBgRestricted); pw.print(prefix); + pw.print(KEY_BG_PROMPT_ABUSIVE_APPS_TO_BG_RESTRICTED); + pw.print('='); + pw.println(mBgPromptAbusiveAppsToBgRestricted); + pw.print(prefix); pw.print(KEY_BG_RESTRICTION_EXEMPTED_PACKAGES); pw.print('='); pw.println(mBgRestrictionExemptedPackages.toString()); @@ -2278,9 +2313,16 @@ public final class AppRestrictionController { } void postRequestBgRestrictedIfNecessary(String packageName, int uid) { + if (!mBgController.mConstantsObserver.mBgPromptAbusiveAppsToBgRestricted) { + if (DEBUG_BG_RESTRICTION_CONTROLLER) { + Slog.i(TAG, "Not requesting bg-restriction due to config"); + } + return; + } + final Intent intent = new Intent(Settings.ACTION_VIEW_ADVANCED_POWER_USAGE_DETAIL); intent.setData(Uri.fromParts(PACKAGE_SCHEME, packageName, null)); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); final PendingIntent pendingIntent = PendingIntent.getActivityAsUser(mContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE, null, @@ -2344,7 +2386,7 @@ public final class AppRestrictionController { } else { final Intent intent = new Intent(Settings.ACTION_VIEW_ADVANCED_POWER_USAGE_DETAIL); intent.setData(Uri.fromParts(PACKAGE_SCHEME, packageName, null)); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); pendingIntent = PendingIntent.getActivityAsUser(mContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE, null, UserHandle.of(UserHandle.getUserId(uid))); diff --git a/services/core/java/com/android/server/biometrics/sensors/BiometricStateCallback.java b/services/core/java/com/android/server/biometrics/sensors/BiometricStateCallback.java new file mode 100644 index 000000000000..1b24aa896652 --- /dev/null +++ b/services/core/java/com/android/server/biometrics/sensors/BiometricStateCallback.java @@ -0,0 +1,146 @@ +/* + * 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.biometrics.sensors; + +import static android.hardware.biometrics.BiometricStateListener.STATE_AUTH_OTHER; +import static android.hardware.biometrics.BiometricStateListener.STATE_BP_AUTH; +import static android.hardware.biometrics.BiometricStateListener.STATE_ENROLLING; +import static android.hardware.biometrics.BiometricStateListener.STATE_IDLE; +import static android.hardware.biometrics.BiometricStateListener.STATE_KEYGUARD_AUTH; + +import android.annotation.NonNull; +import android.hardware.biometrics.BiometricStateListener; +import android.hardware.biometrics.IBiometricStateListener; +import android.os.RemoteException; +import android.util.Slog; + +import com.android.server.biometrics.Utils; + +import java.util.concurrent.CopyOnWriteArrayList; + +/** + * A callback for receiving notifications about biometric sensor state changes. + */ +public class BiometricStateCallback implements ClientMonitorCallback { + + private static final String TAG = "BiometricStateCallback"; + + @NonNull + private final CopyOnWriteArrayList<IBiometricStateListener> + mBiometricStateListeners = new CopyOnWriteArrayList<>(); + + private @BiometricStateListener.State int mBiometricState; + + public BiometricStateCallback() { + mBiometricState = STATE_IDLE; + } + + public int getBiometricState() { + return mBiometricState; + } + + @Override + public void onClientStarted(@NonNull BaseClientMonitor client) { + final int previousBiometricState = mBiometricState; + + if (client instanceof AuthenticationClient) { + final AuthenticationClient<?> authClient = (AuthenticationClient<?>) client; + if (authClient.isKeyguard()) { + mBiometricState = STATE_KEYGUARD_AUTH; + } else if (authClient.isBiometricPrompt()) { + mBiometricState = STATE_BP_AUTH; + } else { + mBiometricState = STATE_AUTH_OTHER; + } + } else if (client instanceof EnrollClient) { + mBiometricState = STATE_ENROLLING; + } else { + Slog.w(TAG, "Other authentication client: " + Utils.getClientName(client)); + mBiometricState = STATE_IDLE; + } + + Slog.d(TAG, "State updated from " + previousBiometricState + " to " + mBiometricState + + ", client " + client); + notifyBiometricStateListeners(mBiometricState); + } + + @Override + public void onClientFinished(@NonNull BaseClientMonitor client, boolean success) { + mBiometricState = STATE_IDLE; + Slog.d(TAG, "Client finished, state updated to " + mBiometricState + ", client " + + client); + + if (client instanceof EnrollmentModifier) { + EnrollmentModifier enrollmentModifier = (EnrollmentModifier) client; + final boolean enrollmentStateChanged = enrollmentModifier.hasEnrollmentStateChanged(); + Slog.d(TAG, "Enrollment state changed: " + enrollmentStateChanged); + if (enrollmentStateChanged) { + notifyAllEnrollmentStateChanged(client.getTargetUserId(), + client.getSensorId(), + enrollmentModifier.hasEnrollments()); + } + } + + notifyBiometricStateListeners(mBiometricState); + } + + private void notifyBiometricStateListeners(@BiometricStateListener.State int newState) { + for (IBiometricStateListener listener : mBiometricStateListeners) { + try { + listener.onStateChanged(newState); + } catch (RemoteException e) { + Slog.e(TAG, "Remote exception in biometric state change", e); + } + } + } + + /** + * This should be invoked when: + * 1) Enrolled --> None-enrolled + * 2) None-enrolled --> enrolled + * 3) HAL becomes ready + * 4) Listener is registered + */ + public void notifyAllEnrollmentStateChanged(int userId, int sensorId, + boolean hasEnrollments) { + for (IBiometricStateListener listener : mBiometricStateListeners) { + notifyEnrollmentStateChanged(listener, userId, sensorId, hasEnrollments); + } + } + + /** + * Notifies the listener of enrollment state changes. + */ + public void notifyEnrollmentStateChanged(@NonNull IBiometricStateListener listener, + int userId, int sensorId, boolean hasEnrollments) { + try { + listener.onEnrollmentsChanged(userId, sensorId, hasEnrollments); + } catch (RemoteException e) { + Slog.e(TAG, "Remote exception", e); + } + } + + /** + * Enables clients to register a BiometricStateListener. For example, this is used to forward + * fingerprint sensor state changes to SideFpsEventHandler. + * + * @param listener + */ + public void registerBiometricStateListener(@NonNull IBiometricStateListener listener) { + mBiometricStateListeners.add(listener); + } +} diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java index 5727ffc468df..97efc7813230 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java @@ -42,6 +42,7 @@ import android.hardware.biometrics.BiometricsProtoEnums; import android.hardware.biometrics.IBiometricSensorReceiver; import android.hardware.biometrics.IBiometricService; import android.hardware.biometrics.IBiometricServiceLockoutResetCallback; +import android.hardware.biometrics.IBiometricStateListener; import android.hardware.biometrics.IInvalidationCallback; import android.hardware.biometrics.ITestSession; import android.hardware.biometrics.ITestSessionCallback; @@ -55,7 +56,6 @@ import android.hardware.fingerprint.IFingerprintAuthenticatorsRegisteredCallback import android.hardware.fingerprint.IFingerprintClientActiveCallback; import android.hardware.fingerprint.IFingerprintService; import android.hardware.fingerprint.IFingerprintServiceReceiver; -import android.hardware.fingerprint.IFingerprintStateListener; import android.hardware.fingerprint.ISidefpsController; import android.hardware.fingerprint.IUdfpsOverlayController; import android.os.Binder; @@ -84,6 +84,7 @@ import com.android.server.ServiceThread; import com.android.server.SystemService; import com.android.server.biometrics.Utils; import com.android.server.biometrics.log.BiometricContext; +import com.android.server.biometrics.sensors.BiometricStateCallback; import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter; import com.android.server.biometrics.sensors.LockoutResetDispatcher; import com.android.server.biometrics.sensors.LockoutTracker; @@ -114,7 +115,7 @@ public class FingerprintService extends SystemService { private final LockPatternUtils mLockPatternUtils; private final FingerprintServiceWrapper mServiceWrapper; @NonNull private final List<ServiceProvider> mServiceProviders; - @NonNull private final FingerprintStateCallback mFingerprintStateCallback; + @NonNull private final BiometricStateCallback mBiometricStateCallback; @NonNull private final Handler mHandler; @GuardedBy("mLock") @@ -125,20 +126,20 @@ public class FingerprintService extends SystemService { @NonNull private final List<FingerprintSensorPropertiesInternal> mSensorProps; /** - * Registers FingerprintStateListener in list stored by FingerprintService - * @param listener new FingerprintStateListener being added + * Registers BiometricStateListener in list stored by FingerprintService + * @param listener new BiometricStateListener being added */ - public void registerFingerprintStateListener(@NonNull IFingerprintStateListener listener) { - mFingerprintStateCallback.registerFingerprintStateListener(listener); + public void registerBiometricStateListener(@NonNull IBiometricStateListener listener) { + mBiometricStateCallback.registerBiometricStateListener(listener); broadcastCurrentEnrollmentState(listener); } /** * @param listener if non-null, notifies only this listener. if null, notifies all listeners - * in {@link FingerprintStateCallback}. This is slightly ugly, but reduces + * in {@link BiometricStateCallback}. This is slightly ugly, but reduces * redundant code. */ - private void broadcastCurrentEnrollmentState(@Nullable IFingerprintStateListener listener) { + private void broadcastCurrentEnrollmentState(@Nullable IBiometricStateListener listener) { final UserManager um = UserManager.get(getContext()); synchronized (mLock) { // Update the new listener with current state of all sensors @@ -151,10 +152,10 @@ public class FingerprintService extends SystemService { // Defer this work and allow the loop to release the lock sooner mHandler.post(() -> { if (listener != null) { - mFingerprintStateCallback.notifyFingerprintEnrollmentStateChanged( + mBiometricStateCallback.notifyEnrollmentStateChanged( listener, userInfo.id, prop.sensorId, enrolled); } else { - mFingerprintStateCallback.notifyAllFingerprintEnrollmentStateChanged( + mBiometricStateCallback.notifyAllEnrollmentStateChanged( userInfo.id, prop.sensorId, enrolled); } }); @@ -651,7 +652,7 @@ public class FingerprintService extends SystemService { pw.println("Dumping for sensorId: " + props.sensorId + ", provider: " + provider.getClass().getSimpleName()); pw.println("Fps state: " - + mFingerprintStateCallback.getFingerprintState()); + + mBiometricStateCallback.getBiometricState()); provider.dumpInternal(props.sensorId, pw); pw.println(); } @@ -847,12 +848,12 @@ public class FingerprintService extends SystemService { Fingerprint21UdfpsMock.CONFIG_ENABLE_TEST_UDFPS, 0 /* default */, UserHandle.USER_CURRENT) != 0) { fingerprint21 = Fingerprint21UdfpsMock.newInstance(getContext(), - mFingerprintStateCallback, hidlSensor, + mBiometricStateCallback, hidlSensor, mLockoutResetDispatcher, mGestureAvailabilityDispatcher, BiometricContext.getInstance(getContext())); } else { fingerprint21 = Fingerprint21.newInstance(getContext(), - mFingerprintStateCallback, hidlSensor, mHandler, + mBiometricStateCallback, hidlSensor, mHandler, mLockoutResetDispatcher, mGestureAvailabilityDispatcher); } mServiceProviders.add(fingerprint21); @@ -875,7 +876,7 @@ public class FingerprintService extends SystemService { try { final SensorProps[] props = fp.getSensorProps(); final FingerprintProvider provider = - new FingerprintProvider(getContext(), mFingerprintStateCallback, props, + new FingerprintProvider(getContext(), mBiometricStateCallback, props, instance, mLockoutResetDispatcher, mGestureAvailabilityDispatcher, BiometricContext.getInstance(getContext())); @@ -1015,8 +1016,8 @@ public class FingerprintService extends SystemService { } @Override - public void registerFingerprintStateListener(@NonNull IFingerprintStateListener listener) { - FingerprintService.this.registerFingerprintStateListener(listener); + public void registerBiometricStateListener(@NonNull IBiometricStateListener listener) { + FingerprintService.this.registerBiometricStateListener(listener); } } @@ -1028,7 +1029,7 @@ public class FingerprintService extends SystemService { mLockoutResetDispatcher = new LockoutResetDispatcher(context); mLockPatternUtils = new LockPatternUtils(context); mServiceProviders = new ArrayList<>(); - mFingerprintStateCallback = new FingerprintStateCallback(); + mBiometricStateCallback = new BiometricStateCallback(); mAuthenticatorsRegisteredCallbacks = new RemoteCallbackList<>(); mSensorProps = new ArrayList<>(); mHandler = new Handler(Looper.getMainLooper()); diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintStateCallback.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintStateCallback.java deleted file mode 100644 index 04fd534adb3b..000000000000 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintStateCallback.java +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Copyright (C) 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.server.biometrics.sensors.fingerprint; - -import static android.hardware.fingerprint.FingerprintStateListener.STATE_AUTH_OTHER; -import static android.hardware.fingerprint.FingerprintStateListener.STATE_BP_AUTH; -import static android.hardware.fingerprint.FingerprintStateListener.STATE_ENROLLING; -import static android.hardware.fingerprint.FingerprintStateListener.STATE_IDLE; -import static android.hardware.fingerprint.FingerprintStateListener.STATE_KEYGUARD_AUTH; - -import android.annotation.NonNull; -import android.hardware.fingerprint.FingerprintStateListener; -import android.hardware.fingerprint.IFingerprintStateListener; -import android.os.RemoteException; -import android.util.Slog; - -import com.android.server.biometrics.Utils; -import com.android.server.biometrics.sensors.AuthenticationClient; -import com.android.server.biometrics.sensors.BaseClientMonitor; -import com.android.server.biometrics.sensors.ClientMonitorCallback; -import com.android.server.biometrics.sensors.EnrollClient; -import com.android.server.biometrics.sensors.EnrollmentModifier; - -import java.util.concurrent.CopyOnWriteArrayList; - -/** - * A callback for receiving notifications about changes in fingerprint state. - */ -public class FingerprintStateCallback implements ClientMonitorCallback { - - @NonNull private final CopyOnWriteArrayList<IFingerprintStateListener> - mFingerprintStateListeners = new CopyOnWriteArrayList<>(); - - private @FingerprintStateListener.State int mFingerprintState; - - public FingerprintStateCallback() { - mFingerprintState = STATE_IDLE; - } - - public int getFingerprintState() { - return mFingerprintState; - } - - @Override - public void onClientStarted(@NonNull BaseClientMonitor client) { - final int previousFingerprintState = mFingerprintState; - - if (client instanceof AuthenticationClient) { - final AuthenticationClient<?> authClient = (AuthenticationClient<?>) client; - if (authClient.isKeyguard()) { - mFingerprintState = STATE_KEYGUARD_AUTH; - } else if (authClient.isBiometricPrompt()) { - mFingerprintState = STATE_BP_AUTH; - } else { - mFingerprintState = STATE_AUTH_OTHER; - } - } else if (client instanceof EnrollClient) { - mFingerprintState = STATE_ENROLLING; - } else { - Slog.w(FingerprintService.TAG, - "Other authentication client: " + Utils.getClientName(client)); - mFingerprintState = STATE_IDLE; - } - - Slog.d(FingerprintService.TAG, "Fps state updated from " + previousFingerprintState - + " to " + mFingerprintState + ", client " + client); - notifyFingerprintStateListeners(mFingerprintState); - } - - @Override - public void onClientFinished(@NonNull BaseClientMonitor client, boolean success) { - mFingerprintState = STATE_IDLE; - Slog.d(FingerprintService.TAG, - "Client finished, fps state updated to " + mFingerprintState + ", client " - + client); - - if (client instanceof EnrollmentModifier) { - EnrollmentModifier enrollmentModifier = (EnrollmentModifier) client; - final boolean enrollmentStateChanged = enrollmentModifier.hasEnrollmentStateChanged(); - Slog.d(FingerprintService.TAG, "Enrollment state changed: " + enrollmentStateChanged); - if (enrollmentStateChanged) { - notifyAllFingerprintEnrollmentStateChanged(client.getTargetUserId(), - client.getSensorId(), - enrollmentModifier.hasEnrollments()); - } - } - - notifyFingerprintStateListeners(mFingerprintState); - } - - private void notifyFingerprintStateListeners(@FingerprintStateListener.State int newState) { - for (IFingerprintStateListener listener : mFingerprintStateListeners) { - try { - listener.onStateChanged(newState); - } catch (RemoteException e) { - Slog.e(FingerprintService.TAG, "Remote exception in fingerprint state change", e); - } - } - } - - /** - * This should be invoked when: - * 1) Enrolled --> None-enrolled - * 2) None-enrolled --> enrolled - * 3) HAL becomes ready - * 4) Listener is registered - */ - void notifyAllFingerprintEnrollmentStateChanged(int userId, int sensorId, - boolean hasEnrollments) { - for (IFingerprintStateListener listener : mFingerprintStateListeners) { - notifyFingerprintEnrollmentStateChanged(listener, userId, sensorId, hasEnrollments); - } - } - - /** - * Notifies the listener of enrollment state changes. - */ - void notifyFingerprintEnrollmentStateChanged(@NonNull IFingerprintStateListener listener, - int userId, int sensorId, boolean hasEnrollments) { - try { - listener.onEnrollmentsChanged(userId, sensorId, hasEnrollments); - } catch (RemoteException e) { - Slog.e(FingerprintService.TAG, "Remote exception", e); - } - } - - /** - * Enables clients to register a FingerprintStateListener. Used by FingerprintService to forward - * updates in fingerprint sensor state to the SideFpNsEventHandler - * - * @param listener - */ - public void registerFingerprintStateListener(@NonNull IFingerprintStateListener listener) { - mFingerprintStateListeners.add(listener); - } -} diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/BiometricTestSessionImpl.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/BiometricTestSessionImpl.java index 0528cd489ae5..ba7202fec93b 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/BiometricTestSessionImpl.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/BiometricTestSessionImpl.java @@ -32,8 +32,8 @@ import android.util.Slog; import com.android.server.biometrics.HardwareAuthTokenUtils; import com.android.server.biometrics.Utils; import com.android.server.biometrics.sensors.BaseClientMonitor; +import com.android.server.biometrics.sensors.BiometricStateCallback; import com.android.server.biometrics.sensors.ClientMonitorCallback; -import com.android.server.biometrics.sensors.fingerprint.FingerprintStateCallback; import com.android.server.biometrics.sensors.fingerprint.FingerprintUtils; import java.util.HashSet; @@ -52,7 +52,7 @@ class BiometricTestSessionImpl extends ITestSession.Stub { @NonNull private final Context mContext; private final int mSensorId; @NonNull private final ITestSessionCallback mCallback; - @NonNull private final FingerprintStateCallback mFingerprintStateCallback; + @NonNull private final BiometricStateCallback mBiometricStateCallback; @NonNull private final FingerprintProvider mProvider; @NonNull private final Sensor mSensor; @NonNull private final Set<Integer> mEnrollmentIds; @@ -118,13 +118,13 @@ class BiometricTestSessionImpl extends ITestSession.Stub { BiometricTestSessionImpl(@NonNull Context context, int sensorId, @NonNull ITestSessionCallback callback, - @NonNull FingerprintStateCallback fingerprintStateCallback, + @NonNull BiometricStateCallback biometricStateCallback, @NonNull FingerprintProvider provider, @NonNull Sensor sensor) { mContext = context; mSensorId = sensorId; mCallback = callback; - mFingerprintStateCallback = fingerprintStateCallback; + mBiometricStateCallback = biometricStateCallback; mProvider = provider; mSensor = sensor; mEnrollmentIds = new HashSet<>(); diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java index 1fac8a8ce5c9..7d5b77c2d711 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java @@ -58,13 +58,13 @@ import com.android.server.biometrics.log.BiometricContext; import com.android.server.biometrics.log.BiometricLogger; import com.android.server.biometrics.sensors.AuthenticationClient; import com.android.server.biometrics.sensors.BaseClientMonitor; +import com.android.server.biometrics.sensors.BiometricStateCallback; import com.android.server.biometrics.sensors.ClientMonitorCallback; import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter; import com.android.server.biometrics.sensors.ClientMonitorCompositeCallback; import com.android.server.biometrics.sensors.InvalidationRequesterClient; import com.android.server.biometrics.sensors.LockoutResetDispatcher; import com.android.server.biometrics.sensors.PerformanceTracker; -import com.android.server.biometrics.sensors.fingerprint.FingerprintStateCallback; import com.android.server.biometrics.sensors.fingerprint.FingerprintUtils; import com.android.server.biometrics.sensors.fingerprint.GestureAvailabilityDispatcher; import com.android.server.biometrics.sensors.fingerprint.ServiceProvider; @@ -91,7 +91,7 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi private boolean mTestHalEnabled; @NonNull private final Context mContext; - @NonNull private final FingerprintStateCallback mFingerprintStateCallback; + @NonNull private final BiometricStateCallback mBiometricStateCallback; @NonNull private final String mHalInstanceName; @NonNull @VisibleForTesting final SparseArray<Sensor> mSensors; // Map of sensors that this HAL supports @@ -141,13 +141,13 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi } public FingerprintProvider(@NonNull Context context, - @NonNull FingerprintStateCallback fingerprintStateCallback, + @NonNull BiometricStateCallback biometricStateCallback, @NonNull SensorProps[] props, @NonNull String halInstanceName, @NonNull LockoutResetDispatcher lockoutResetDispatcher, @NonNull GestureAvailabilityDispatcher gestureAvailabilityDispatcher, @NonNull BiometricContext biometricContext) { mContext = context; - mFingerprintStateCallback = fingerprintStateCallback; + mBiometricStateCallback = biometricStateCallback; mHalInstanceName = halInstanceName; mSensors = new SparseArray<>(); mHandler = new Handler(Looper.getMainLooper()); @@ -389,13 +389,13 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi @Override public void onClientStarted(@NonNull BaseClientMonitor clientMonitor) { - mFingerprintStateCallback.onClientStarted(clientMonitor); + mBiometricStateCallback.onClientStarted(clientMonitor); } @Override public void onClientFinished(@NonNull BaseClientMonitor clientMonitor, boolean success) { - mFingerprintStateCallback.onClientFinished(clientMonitor, success); + mBiometricStateCallback.onClientFinished(clientMonitor, success); if (success) { scheduleLoadAuthenticatorIdsForUser(sensorId, userId); scheduleInvalidationRequest(sensorId, userId); @@ -425,7 +425,7 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi createLogger(BiometricsProtoEnums.ACTION_AUTHENTICATE, statsClient), mBiometricContext, mUdfpsOverlayController, isStrongBiometric); - scheduleForSensor(sensorId, client, mFingerprintStateCallback); + scheduleForSensor(sensorId, client, mBiometricStateCallback); }); return id; @@ -447,7 +447,7 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi mTaskStackListener, mSensors.get(sensorId).getLockoutCache(), mUdfpsOverlayController, mSidefpsController, allowBackgroundAuthentication, mSensors.get(sensorId).getSensorProperties()); - scheduleForSensor(sensorId, client, mFingerprintStateCallback); + scheduleForSensor(sensorId, client, mBiometricStateCallback); }); } @@ -509,7 +509,7 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi BiometricsProtoEnums.CLIENT_UNKNOWN), mBiometricContext, mSensors.get(sensorId).getAuthenticatorIds()); - scheduleForSensor(sensorId, client, mFingerprintStateCallback); + scheduleForSensor(sensorId, client, mBiometricStateCallback); }); } @@ -528,7 +528,7 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi enrolledList, FingerprintUtils.getInstance(sensorId), mSensors.get(sensorId).getAuthenticatorIds()); scheduleForSensor(sensorId, client, new ClientMonitorCompositeCallback(callback, - mFingerprintStateCallback)); + mBiometricStateCallback)); }); } @@ -680,7 +680,7 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi @Override public ITestSession createTestSession(int sensorId, @NonNull ITestSessionCallback callback, @NonNull String opPackageName) { - return mSensors.get(sensorId).createTestSession(callback, mFingerprintStateCallback); + return mSensors.get(sensorId).createTestSession(callback, mBiometricStateCallback); } @Override diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java index 024d611732c1..1dcf4e9528d2 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java @@ -55,6 +55,7 @@ import com.android.server.biometrics.sensors.AcquisitionClient; import com.android.server.biometrics.sensors.AuthenticationConsumer; import com.android.server.biometrics.sensors.BaseClientMonitor; import com.android.server.biometrics.sensors.BiometricScheduler; +import com.android.server.biometrics.sensors.BiometricStateCallback; import com.android.server.biometrics.sensors.EnumerateConsumer; import com.android.server.biometrics.sensors.ErrorConsumer; import com.android.server.biometrics.sensors.LockoutCache; @@ -64,7 +65,6 @@ import com.android.server.biometrics.sensors.RemovalConsumer; import com.android.server.biometrics.sensors.StartUserClient; import com.android.server.biometrics.sensors.StopUserClient; import com.android.server.biometrics.sensors.UserAwareBiometricScheduler; -import com.android.server.biometrics.sensors.fingerprint.FingerprintStateCallback; import com.android.server.biometrics.sensors.fingerprint.FingerprintUtils; import com.android.server.biometrics.sensors.fingerprint.GestureAvailabilityDispatcher; @@ -527,9 +527,9 @@ public class Sensor { } @NonNull ITestSession createTestSession(@NonNull ITestSessionCallback callback, - @NonNull FingerprintStateCallback fingerprintStateCallback) { + @NonNull BiometricStateCallback biometricStateCallback) { return new BiometricTestSessionImpl(mContext, mSensorProperties.sensorId, callback, - fingerprintStateCallback, mProvider, this); + biometricStateCallback, mProvider, this); } @NonNull BiometricScheduler getScheduler() { diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/BiometricTestSessionImpl.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/BiometricTestSessionImpl.java index 033855f822a4..a58bb8981cf6 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/BiometricTestSessionImpl.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/BiometricTestSessionImpl.java @@ -31,8 +31,8 @@ import android.util.Slog; import com.android.server.biometrics.Utils; import com.android.server.biometrics.sensors.BaseClientMonitor; +import com.android.server.biometrics.sensors.BiometricStateCallback; import com.android.server.biometrics.sensors.ClientMonitorCallback; -import com.android.server.biometrics.sensors.fingerprint.FingerprintStateCallback; import com.android.server.biometrics.sensors.fingerprint.FingerprintUtils; import java.util.ArrayList; @@ -53,7 +53,7 @@ public class BiometricTestSessionImpl extends ITestSession.Stub { @NonNull private final Context mContext; private final int mSensorId; @NonNull private final ITestSessionCallback mCallback; - @NonNull private final FingerprintStateCallback mFingerprintStateCallback; + @NonNull private final BiometricStateCallback mBiometricStateCallback; @NonNull private final Fingerprint21 mFingerprint21; @NonNull private final Fingerprint21.HalResultController mHalResultController; @NonNull private final Set<Integer> mEnrollmentIds; @@ -119,14 +119,14 @@ public class BiometricTestSessionImpl extends ITestSession.Stub { BiometricTestSessionImpl(@NonNull Context context, int sensorId, @NonNull ITestSessionCallback callback, - @NonNull FingerprintStateCallback fingerprintStateCallback, + @NonNull BiometricStateCallback biometricStateCallback, @NonNull Fingerprint21 fingerprint21, @NonNull Fingerprint21.HalResultController halResultController) { mContext = context; mSensorId = sensorId; mCallback = callback; mFingerprint21 = fingerprint21; - mFingerprintStateCallback = fingerprintStateCallback; + mBiometricStateCallback = biometricStateCallback; mHalResultController = halResultController; mEnrollmentIds = new HashSet<>(); mRandom = new Random(); diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java index 1d2a3655021c..52dbe2460e1c 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java @@ -64,6 +64,7 @@ import com.android.server.biometrics.sensors.AuthenticationClient; import com.android.server.biometrics.sensors.AuthenticationConsumer; import com.android.server.biometrics.sensors.BaseClientMonitor; import com.android.server.biometrics.sensors.BiometricScheduler; +import com.android.server.biometrics.sensors.BiometricStateCallback; import com.android.server.biometrics.sensors.ClientMonitorCallback; import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter; import com.android.server.biometrics.sensors.ClientMonitorCompositeCallback; @@ -73,7 +74,6 @@ import com.android.server.biometrics.sensors.LockoutResetDispatcher; import com.android.server.biometrics.sensors.LockoutTracker; import com.android.server.biometrics.sensors.PerformanceTracker; import com.android.server.biometrics.sensors.RemovalConsumer; -import com.android.server.biometrics.sensors.fingerprint.FingerprintStateCallback; import com.android.server.biometrics.sensors.fingerprint.FingerprintUtils; import com.android.server.biometrics.sensors.fingerprint.GestureAvailabilityDispatcher; import com.android.server.biometrics.sensors.fingerprint.ServiceProvider; @@ -105,7 +105,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider private boolean mTestHalEnabled; final Context mContext; - @NonNull private final FingerprintStateCallback mFingerprintStateCallback; + @NonNull private final BiometricStateCallback mBiometricStateCallback; private final ActivityTaskManager mActivityTaskManager; @NonNull private final FingerprintSensorPropertiesInternal mSensorProperties; private final BiometricScheduler mScheduler; @@ -323,7 +323,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider @VisibleForTesting Fingerprint21(@NonNull Context context, - @NonNull FingerprintStateCallback fingerprintStateCallback, + @NonNull BiometricStateCallback biometricStateCallback, @NonNull FingerprintSensorPropertiesInternal sensorProps, @NonNull BiometricScheduler scheduler, @NonNull Handler handler, @@ -331,7 +331,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider @NonNull HalResultController controller, @NonNull BiometricContext biometricContext) { mContext = context; - mFingerprintStateCallback = fingerprintStateCallback; + mBiometricStateCallback = biometricStateCallback; mBiometricContext = biometricContext; mSensorProperties = sensorProps; @@ -362,7 +362,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider } public static Fingerprint21 newInstance(@NonNull Context context, - @NonNull FingerprintStateCallback fingerprintStateCallback, + @NonNull BiometricStateCallback biometricStateCallback, @NonNull FingerprintSensorPropertiesInternal sensorProps, @NonNull Handler handler, @NonNull LockoutResetDispatcher lockoutResetDispatcher, @@ -373,7 +373,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider gestureAvailabilityDispatcher); final HalResultController controller = new HalResultController(sensorProps.sensorId, context, handler, scheduler); - return new Fingerprint21(context, fingerprintStateCallback, sensorProps, scheduler, handler, + return new Fingerprint21(context, biometricStateCallback, sensorProps, scheduler, handler, lockoutResetDispatcher, controller, BiometricContext.getInstance(context)); } @@ -604,13 +604,13 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider mScheduler.scheduleClientMonitor(client, new ClientMonitorCallback() { @Override public void onClientStarted(@NonNull BaseClientMonitor clientMonitor) { - mFingerprintStateCallback.onClientStarted(clientMonitor); + mBiometricStateCallback.onClientStarted(clientMonitor); } @Override public void onClientFinished(@NonNull BaseClientMonitor clientMonitor, boolean success) { - mFingerprintStateCallback.onClientFinished(clientMonitor, success); + mBiometricStateCallback.onClientFinished(clientMonitor, success); if (success) { // Update authenticatorIds scheduleUpdateActiveUserWithoutHandler(clientMonitor.getTargetUserId(), @@ -642,7 +642,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider createLogger(BiometricsProtoEnums.ACTION_AUTHENTICATE, statsClient), mBiometricContext, mUdfpsOverlayController, isStrongBiometric); - mScheduler.scheduleClientMonitor(client, mFingerprintStateCallback); + mScheduler.scheduleClientMonitor(client, mBiometricStateCallback); }); return id; @@ -666,7 +666,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider mTaskStackListener, mLockoutTracker, mUdfpsOverlayController, mSidefpsController, allowBackgroundAuthentication, mSensorProperties); - mScheduler.scheduleClientMonitor(client, mFingerprintStateCallback); + mScheduler.scheduleClientMonitor(client, mBiometricStateCallback); }); } @@ -708,7 +708,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider createLogger(BiometricsProtoEnums.ACTION_REMOVE, BiometricsProtoEnums.CLIENT_UNKNOWN), mBiometricContext, mAuthenticatorIds); - mScheduler.scheduleClientMonitor(client, mFingerprintStateCallback); + mScheduler.scheduleClientMonitor(client, mBiometricStateCallback); }); } @@ -728,7 +728,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider createLogger(BiometricsProtoEnums.ACTION_REMOVE, BiometricsProtoEnums.CLIENT_UNKNOWN), mBiometricContext, mAuthenticatorIds); - mScheduler.scheduleClientMonitor(client, mFingerprintStateCallback); + mScheduler.scheduleClientMonitor(client, mBiometricStateCallback); }); } @@ -754,7 +754,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider public void scheduleInternalCleanup(int sensorId, int userId, @Nullable ClientMonitorCallback callback) { scheduleInternalCleanup(userId, new ClientMonitorCompositeCallback(callback, - mFingerprintStateCallback)); + mBiometricStateCallback)); } private BiometricLogger createLogger(int statsAction, int statsClient) { @@ -967,6 +967,6 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider public ITestSession createTestSession(int sensorId, @NonNull ITestSessionCallback callback, @NonNull String opPackageName) { return new BiometricTestSessionImpl(mContext, mSensorProperties.sensorId, callback, - mFingerprintStateCallback, this, mHalResultController); + mBiometricStateCallback, this, mHalResultController); } } diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21UdfpsMock.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21UdfpsMock.java index a4e343e786c1..485a674dda92 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21UdfpsMock.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21UdfpsMock.java @@ -41,9 +41,9 @@ import com.android.server.biometrics.log.BiometricContext; import com.android.server.biometrics.sensors.AuthenticationConsumer; import com.android.server.biometrics.sensors.BaseClientMonitor; import com.android.server.biometrics.sensors.BiometricScheduler; +import com.android.server.biometrics.sensors.BiometricStateCallback; import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter; import com.android.server.biometrics.sensors.LockoutResetDispatcher; -import com.android.server.biometrics.sensors.fingerprint.FingerprintStateCallback; import com.android.server.biometrics.sensors.fingerprint.GestureAvailabilityDispatcher; import java.util.ArrayList; @@ -245,7 +245,7 @@ public class Fingerprint21UdfpsMock extends Fingerprint21 implements TrustManage } public static Fingerprint21UdfpsMock newInstance(@NonNull Context context, - @NonNull FingerprintStateCallback fingerprintStateCallback, + @NonNull BiometricStateCallback biometricStateCallback, @NonNull FingerprintSensorPropertiesInternal sensorProps, @NonNull LockoutResetDispatcher lockoutResetDispatcher, @NonNull GestureAvailabilityDispatcher gestureAvailabilityDispatcher, @@ -257,7 +257,7 @@ public class Fingerprint21UdfpsMock extends Fingerprint21 implements TrustManage new TestableBiometricScheduler(TAG, handler, gestureAvailabilityDispatcher); final MockHalResultController controller = new MockHalResultController(sensorProps.sensorId, context, handler, scheduler); - return new Fingerprint21UdfpsMock(context, fingerprintStateCallback, sensorProps, scheduler, + return new Fingerprint21UdfpsMock(context, biometricStateCallback, sensorProps, scheduler, handler, lockoutResetDispatcher, controller, biometricContext); } @@ -382,14 +382,14 @@ public class Fingerprint21UdfpsMock extends Fingerprint21 implements TrustManage } private Fingerprint21UdfpsMock(@NonNull Context context, - @NonNull FingerprintStateCallback fingerprintStateCallback, + @NonNull BiometricStateCallback biometricStateCallback, @NonNull FingerprintSensorPropertiesInternal sensorProps, @NonNull TestableBiometricScheduler scheduler, @NonNull Handler handler, @NonNull LockoutResetDispatcher lockoutResetDispatcher, @NonNull MockHalResultController controller, @NonNull BiometricContext biometricContext) { - super(context, fingerprintStateCallback, sensorProps, scheduler, handler, + super(context, biometricStateCallback, sensorProps, scheduler, handler, lockoutResetDispatcher, controller, biometricContext); mScheduler = scheduler; mScheduler.init(this); diff --git a/services/core/java/com/android/server/location/gnss/hal/GnssNative.java b/services/core/java/com/android/server/location/gnss/hal/GnssNative.java index af87677ecb66..1fa56bc3e055 100644 --- a/services/core/java/com/android/server/location/gnss/hal/GnssNative.java +++ b/services/core/java/com/android/server/location/gnss/hal/GnssNative.java @@ -47,6 +47,7 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.util.List; import java.util.Objects; +import java.util.concurrent.TimeUnit; /** * Entry point for most GNSS HAL commands and callbacks. @@ -1271,7 +1272,8 @@ public class GnssNative { @NativeEntryPoint boolean isInEmergencySession() { return Binder.withCleanCallingIdentity( - () -> mEmergencyHelper.isInEmergency(mConfiguration.getEsExtensionSec())); + () -> mEmergencyHelper.isInEmergency( + TimeUnit.SECONDS.toMillis(mConfiguration.getEsExtensionSec()))); } /** diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 8ed145c8d1b1..3eee572e82f3 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -5827,7 +5827,7 @@ public class NotificationManagerService extends SystemService { // Add summary final ApplicationInfo appInfo = adjustedSbn.getNotification().extras.getParcelable( - Notification.EXTRA_BUILDER_APPLICATION_INFO); + Notification.EXTRA_BUILDER_APPLICATION_INFO, ApplicationInfo.class); final Bundle extras = new Bundle(); extras.putParcelable(Notification.EXTRA_BUILDER_APPLICATION_INFO, appInfo); final String channelId = notificationRecord.getChannel().getId(); diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java index 77d37dc377a2..bbdb7ebfe887 100644 --- a/services/core/java/com/android/server/pm/InstallPackageHelper.java +++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java @@ -266,8 +266,11 @@ final class InstallPackageHelper { // Prune unused SharedUserSetting if (mPm.mSettings.checkAndPruneSharedUserLPw(requestSharedUserSetting, false)) { // Set the app ID in removed info for UID_REMOVED broadcasts - reconciledPkg.mInstallResult.mRemovedInfo.mRemovedAppId = - requestSharedUserSetting.mAppId; + if (reconciledPkg.mInstallResult != null + && reconciledPkg.mInstallResult.mRemovedInfo != null) { + reconciledPkg.mInstallResult.mRemovedInfo.mRemovedAppId = + requestSharedUserSetting.mAppId; + } } } } diff --git a/services/core/java/com/android/server/pm/resolution/ComponentResolver.java b/services/core/java/com/android/server/pm/resolution/ComponentResolver.java index 9aa53f18d0aa..7baec6217e2e 100644 --- a/services/core/java/com/android/server/pm/resolution/ComponentResolver.java +++ b/services/core/java/com/android/server/pm/resolution/ComponentResolver.java @@ -79,7 +79,8 @@ import java.util.Set; import java.util.function.Function; /** Resolves all Android component types [activities, services, providers and receivers]. */ -public class ComponentResolver extends ComponentResolverLocked implements Snappable { +public class ComponentResolver extends ComponentResolverLocked implements + Snappable<ComponentResolverApi> { private static final boolean DEBUG = false; private static final String TAG = "PackageManager"; private static final boolean DEBUG_FILTERS = false; @@ -166,11 +167,13 @@ public class ComponentResolver extends ComponentResolverLocked implements Snappa mProvidersByAuthority = new ArrayMap<>(); mDeferProtectedFilters = true; - mSnapshot = new SnapshotCache<ComponentResolverApi>(this, this) { + mSnapshot = new SnapshotCache<>(this, this) { @Override public ComponentResolverApi createSnapshot() { - return new ComponentResolverSnapshot(ComponentResolver.this, - userNeedsBadgingCache); + synchronized (mLock) { + return new ComponentResolverSnapshot(ComponentResolver.this, + userNeedsBadgingCache); + } }}; } diff --git a/services/core/java/com/android/server/policy/SideFpsEventHandler.java b/services/core/java/com/android/server/policy/SideFpsEventHandler.java index f36869859170..41d02727d9eb 100644 --- a/services/core/java/com/android/server/policy/SideFpsEventHandler.java +++ b/services/core/java/com/android/server/policy/SideFpsEventHandler.java @@ -16,9 +16,9 @@ package com.android.server.policy; -import static android.hardware.fingerprint.FingerprintStateListener.STATE_BP_AUTH; -import static android.hardware.fingerprint.FingerprintStateListener.STATE_ENROLLING; -import static android.hardware.fingerprint.FingerprintStateListener.STATE_IDLE; +import static android.hardware.biometrics.BiometricStateListener.STATE_BP_AUTH; +import static android.hardware.biometrics.BiometricStateListener.STATE_ENROLLING; +import static android.hardware.biometrics.BiometricStateListener.STATE_IDLE; import android.annotation.NonNull; import android.annotation.Nullable; @@ -30,9 +30,9 @@ import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManager; +import android.hardware.biometrics.BiometricStateListener; import android.hardware.fingerprint.FingerprintManager; import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; -import android.hardware.fingerprint.FingerprintStateListener; import android.hardware.fingerprint.IFingerprintAuthenticatorsRegisteredCallback; import android.os.Handler; import android.os.PowerManager; @@ -67,7 +67,7 @@ public class SideFpsEventHandler { } }; - private @FingerprintStateListener.State int mFingerprintState; + private @BiometricStateListener.State int mBiometricState; SideFpsEventHandler(Context context, Handler handler, PowerManager powerManager) { this(context, handler, powerManager, () -> new AlertDialog.Builder(context)); @@ -80,7 +80,7 @@ public class SideFpsEventHandler { mHandler = handler; mPowerManager = powerManager; mDialogSupplier = dialogSupplier; - mFingerprintState = STATE_IDLE; + mBiometricState = STATE_IDLE; mSideFpsEventHandlerReady = new AtomicBoolean(false); // ensure dialog is dismissed if screen goes off for unrelated reasons @@ -108,7 +108,7 @@ public class SideFpsEventHandler { return false; } - switch (mFingerprintState) { + switch (mBiometricState) { case STATE_ENROLLING: case STATE_BP_AUTH: mHandler.post(() -> { @@ -116,7 +116,7 @@ public class SideFpsEventHandler { mDialog.dismiss(); } mDialog = showConfirmDialog(mDialogSupplier.get(), - mPowerManager, eventTime, mFingerprintState, mDialogDismissListener); + mPowerManager, eventTime, mBiometricState, mDialogDismissListener); }); return true; default: @@ -127,9 +127,9 @@ public class SideFpsEventHandler { @NonNull private static Dialog showConfirmDialog(@NonNull AlertDialog.Builder dialogBuilder, @NonNull PowerManager powerManager, long eventTime, - @FingerprintStateListener.State int fingerprintState, + @BiometricStateListener.State int biometricState, @NonNull DialogInterface.OnDismissListener dismissListener) { - final boolean enrolling = fingerprintState == STATE_ENROLLING; + final boolean enrolling = biometricState == STATE_ENROLLING; final int title = enrolling ? R.string.fp_power_button_enrollment_title : R.string.fp_power_button_bp_title; final int message = enrolling ? R.string.fp_power_button_enrollment_message @@ -165,8 +165,8 @@ public class SideFpsEventHandler { /** * Awaits notification from PhoneWindowManager that fingerprint service is ready * to send updates about power button fps sensor state. Then configures a - * FingerprintStateListener to receive and record updates to fps state, and - * registers the FingerprintStateListener in FingerprintManager. + * BiometricStateListener to receive and record updates to fps state, and + * registers the BiometricStateListener in FingerprintManager. */ public void onFingerprintSensorReady() { final PackageManager pm = mContext.getPackageManager(); @@ -182,13 +182,14 @@ public class SideFpsEventHandler { public void onAllAuthenticatorsRegistered( List<FingerprintSensorPropertiesInternal> sensors) { if (fingerprintManager.isPowerbuttonFps()) { - fingerprintManager.registerFingerprintStateListener( - new FingerprintStateListener() { - @Nullable private Runnable mStateRunnable = null; + fingerprintManager.registerBiometricStateListener( + new BiometricStateListener() { + @Nullable + private Runnable mStateRunnable = null; @Override public void onStateChanged( - @FingerprintStateListener.State int newState) { + @BiometricStateListener.State int newState) { if (mStateRunnable != null) { mHandler.removeCallbacks(mStateRunnable); mStateRunnable = null; @@ -198,11 +199,11 @@ public class SideFpsEventHandler { // arrive in any order (success auth & power). Add a // damper when moving to idle in case auth is first if (newState == STATE_IDLE) { - mStateRunnable = () -> mFingerprintState = newState; + mStateRunnable = () -> mBiometricState = newState; mHandler.postDelayed(mStateRunnable, DEBOUNCE_DELAY_MILLIS); } else { - mFingerprintState = newState; + mBiometricState = newState; } } }); diff --git a/services/core/java/com/android/server/wm/BLASTSync.md b/services/core/java/com/android/server/wm/BLASTSync.md index 2f39d6db385e..dbb28d4d5ae3 100644 --- a/services/core/java/com/android/server/wm/BLASTSync.md +++ b/services/core/java/com/android/server/wm/BLASTSync.md @@ -106,3 +106,88 @@ to the client via ClientTransaction), we haven't even incremented the seqId yet, at the same time as the state? We solve this by pushing all client communication through a handler thread that has to acquire the lock. This ensures we uphold requirement 2. += Transaction ordering = + +Applying transactions from different process, and in to different server side transaction queues +raises various questions about transaction ordering. There are two tricky questions in this +domain that we address here: + 1. The ordering of Transactions from a single BLASTBufferQueue wrt to eachother + 2. The ordering of non synced WM updates to syncable state, wrt a BLASTSyncEngine + transaction + +== Ordering of Transactions in a single BBQ == + +We can see if sync is never involved, there are never any real questions about ordering. +Even using one-way setTransactionState, the calls are from a single thread to a single +interface on another, and will be ordered. When we hand out transactions for sync +is where issues can start to arise. Obviously if we apply another transaction +immediately after handing out the sync transaction it could arrive first, and this would +cause an ordering issue. It's also possible that the sync transaction arrives before the +transaction applied before it (since setTransactionState is one way from BBQ). Even if +the transactions are applied in the right order, it's possible for them to be +commited out of sync, as the BBQ and SyncConsumer may be using different apply tokens +resulting in the transaction being placed in different server side queues. + +To solve these issues, we use a scheme involving "barrier transactions". We show how +this scheme handles every permutation of (Sync, NotSync). + +1. NotSync, NotSync: This is the trivial case. As long as both buffers are submitted from + the same thread, they will arrive in SF in order, and SF will place them in the same + queue (since there is a shared apply token), which it will process in order. +2. Sync, NotSync: For sync transactions we register a commit callback, and require it to + be fired before applying the next transaction. Since the commit callback is only + fired when the transaction has latched on the server side, any transaction applied + later, must occur later. +3. Sync, Sync: Ordering of consecutive sync transactions is delegated to the sync + consumer +4. NotSync, Sync: This is the trickiest case, as we don't want to set a commit callback + on not sync transactions (as this would incur an unacceptable performance overhead). + Further complicating matters, we want to apply them with one-way binder, since + this is the hot path for all graphical updates. To solve this we use a + "setBufferHasBarrier" system. Sync transactions (before they are handed out) + are tagged with a barrier, referring to the frame number of the last + non sync transaction. SurfaceFlinger will ensure the correct ordering + by stalling transactions in the queue until barriers are fulfilled. This barrier + primitive is dangerous, because it could result in deadlocking, but its ok in + this scenario since only BBQ uses its apply token. + +We can see from this that all frames are in order. + +== Ordering of WM updates to syncable state == + +A second interesting question, is about the ordering of WM updates to syncable-state. In +the WM we frequently write code like + getPendingTransaction/getSyncTransaction().show(mSurfaceControl). +In normal operation, getSyncTransaction and getPendingTransaction both refer to the same +transaction which is the displaycontent pendingtransaction, applied by the WindowManager. +During sync, each syncing container will instead use its mSyncTransaction, which will +eventually be merged to be applied by the WindowManager. We can see that we have a congruent +"problem" to BLASTBufferQueue transaction ordering. Namely, earlier state updates which were +given to SysUI could end up being applied later than state updates which were made later but +directly applied by the WM. We can break this down in to two cases: +=== getPendingTransaction() and getSyncTransaction() ordering === +It's possible for code like this to occur: +getSyncTransaction().OP1 +getPendingTransaction().OP2 +applyPendingTransaction +applySyncTransaction + +in this case the change in OP2 was made later, but occurs first. We define this case as +intended behavior, and say there is no ordering guarantee between the pending +and sync transactions. This means the pending transaction is only useful in +some marginal cases and should probably be considered a deprecated primitive. +=== getSyncTransaction() and getSyncTransaction() ordering === +However, we take great care to ensure usage of getSyncTransaction() reflects +the ordering the developer would expect. BLASTSyncEngine will register +a commit callback on all transactions it hands out. In the interval between +receiving this commit callback and sending out the transaction, we may have other +data enter getSyncTransaction. If we returned the pending transaction +(as we do in normal time), then we could create ordering issues, since the pending +transactions ordering is undefined. Instead we continue to return the sync transaction +during this interval. If no second sync has started by the time we receive +the commit callback, then we directly apply this left over data in the sync transaction +guaranteed it will be ordered correctly, and return to using the pending +transaction. If a second sync has started, then we just allow the data +to persist in the mSyncTransaction, potentially to be overwritten +by the new sync. It will eventually apply with SysUI's apply token and +ordering will be maintained. diff --git a/services/core/java/com/android/server/wm/BLASTSyncEngine.java b/services/core/java/com/android/server/wm/BLASTSyncEngine.java index 6e205be5b574..3f300bce54c4 100644 --- a/services/core/java/com/android/server/wm/BLASTSyncEngine.java +++ b/services/core/java/com/android/server/wm/BLASTSyncEngine.java @@ -19,6 +19,7 @@ package com.android.server.wm; import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER; import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_SYNC_ENGINE; +import static com.android.server.wm.WindowManagerService.H.WINDOW_STATE_BLAST_SYNC_TIMEOUT; import android.annotation.NonNull; import android.os.Trace; @@ -147,6 +148,33 @@ class BLASTSyncEngine { for (WindowContainer wc : mRootMembers) { wc.finishSync(merged, false /* cancel */); } + + final ArraySet<WindowContainer> wcAwaitingCommit = new ArraySet<>(); + for (WindowContainer wc : mRootMembers) { + wc.waitForSyncTransactionCommit(wcAwaitingCommit); + } + final Runnable callback = new Runnable() { + // Can run a second time if the action completes after the timeout. + boolean ran = false; + public void run() { + synchronized (mWm.mGlobalLock) { + if (ran) { + return; + } + mWm.mH.removeCallbacks(this); + ran = true; + SurfaceControl.Transaction t = new SurfaceControl.Transaction(); + for (WindowContainer wc : wcAwaitingCommit) { + wc.onSyncTransactionCommitted(t); + } + t.apply(); + wcAwaitingCommit.clear(); + } + } + }; + merged.addTransactionCommittedListener((r) -> { r.run(); }, callback::run); + mWm.mH.postDelayed(callback, WINDOW_STATE_BLAST_SYNC_TIMEOUT); + Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "onTransactionReady"); mListener.onTransactionReady(mSyncId, merged); Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER); diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index 4dbcea1e4751..f5af2b4e29fa 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -236,6 +236,8 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< */ private boolean mCommittedReparentToAnimationLeash; + private int mSyncTransactionCommitCallbackDepth = 0; + /** Interface for {@link #isAnimating} to check which cases for the container is animating. */ public interface AnimationFlags { /** @@ -2688,6 +2690,9 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< * {@link #getPendingTransaction()} */ public Transaction getSyncTransaction() { + if (mSyncTransactionCommitCallbackDepth > 0) { + return mSyncTransaction; + } if (mSyncState != SYNC_STATE_NONE) { return mSyncTransaction; } @@ -3909,4 +3914,29 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< p.updateOverlayInsetsState(originalChange); } } + + void waitForSyncTransactionCommit(ArraySet<WindowContainer> wcAwaitingCommit) { + if (wcAwaitingCommit.contains(this)) { + return; + } + mSyncTransactionCommitCallbackDepth++; + wcAwaitingCommit.add(this); + + for (int i = mChildren.size() - 1; i >= 0; --i) { + mChildren.get(i).waitForSyncTransactionCommit(wcAwaitingCommit); + } + } + + void onSyncTransactionCommitted(SurfaceControl.Transaction t) { + mSyncTransactionCommitCallbackDepth--; + if (mSyncTransactionCommitCallbackDepth > 0) { + return; + } + if (mSyncState != SYNC_STATE_NONE) { + return; + } + + t.merge(mSyncTransaction); + } + } diff --git a/services/tests/mockingservicestests/src/com/android/server/am/BackgroundRestrictionTest.java b/services/tests/mockingservicestests/src/com/android/server/am/BackgroundRestrictionTest.java index c0b4f0fe5812..ac542935fa0a 100644 --- a/services/tests/mockingservicestests/src/com/android/server/am/BackgroundRestrictionTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/am/BackgroundRestrictionTest.java @@ -585,6 +585,7 @@ public final class BackgroundRestrictionTest { DeviceConfigSession<Float> bgCurrentDrainRestrictedBucketThreshold = null; DeviceConfigSession<Float> bgCurrentDrainBgRestrictedThreshold = null; DeviceConfigSession<Boolean> bgPromptFgsWithNotiToBgRestricted = null; + DeviceConfigSession<Boolean> bgPromptAbusiveAppToBgRestricted = null; DeviceConfigSession<Long> bgNotificationMinInterval = null; DeviceConfigSession<Integer> bgBatteryExemptionTypes = null; DeviceConfigSession<Boolean> bgCurrentDrainDecoupleThresholds = null; @@ -642,6 +643,14 @@ public final class BackgroundRestrictionTest { R.bool.config_bg_prompt_fgs_with_noti_to_bg_restricted)); bgPromptFgsWithNotiToBgRestricted.set(true); + bgPromptAbusiveAppToBgRestricted = new DeviceConfigSession<>( + DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + ConstantsObserver.KEY_BG_PROMPT_ABUSIVE_APPS_TO_BG_RESTRICTED, + DeviceConfig::getBoolean, + mContext.getResources().getBoolean( + R.bool.config_bg_prompt_abusive_apps_to_bg_restricted)); + bgPromptAbusiveAppToBgRestricted.set(true); + bgNotificationMinInterval = new DeviceConfigSession<>( DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, ConstantsObserver.KEY_BG_ABUSIVE_NOTIFICATION_MINIMAL_INTERVAL, @@ -1055,6 +1064,7 @@ public final class BackgroundRestrictionTest { closeIfNotNull(bgCurrentDrainRestrictedBucketThreshold); closeIfNotNull(bgCurrentDrainBgRestrictedThreshold); closeIfNotNull(bgPromptFgsWithNotiToBgRestricted); + closeIfNotNull(bgPromptAbusiveAppToBgRestricted); closeIfNotNull(bgNotificationMinInterval); closeIfNotNull(bgBatteryExemptionTypes); closeIfNotNull(bgCurrentDrainDecoupleThresholds); @@ -1613,6 +1623,7 @@ public final class BackgroundRestrictionTest { DeviceConfigSession<String> bgPermissionsInMonitor = null; DeviceConfigSession<Boolean> bgCurrentDrainHighThresholdByBgLocation = null; DeviceConfigSession<Boolean> bgCurrentDrainDecoupleThresholds = null; + DeviceConfigSession<Boolean> bgPromptAbusiveAppToBgRestricted = null; mBgRestrictionController.addAppBackgroundRestrictionListener(listener); @@ -1751,6 +1762,14 @@ public final class BackgroundRestrictionTest { AppBatteryPolicy.DEFAULT_BG_CURRENT_DRAIN_DECOUPLE_THRESHOLD); bgCurrentDrainDecoupleThresholds.set(true); + bgPromptAbusiveAppToBgRestricted = new DeviceConfigSession<>( + DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + ConstantsObserver.KEY_BG_PROMPT_ABUSIVE_APPS_TO_BG_RESTRICTED, + DeviceConfig::getBoolean, + mContext.getResources().getBoolean( + R.bool.config_bg_prompt_abusive_apps_to_bg_restricted)); + bgPromptAbusiveAppToBgRestricted.set(true); + mCurrentTimeMillis = 10_000L; doReturn(mCurrentTimeMillis - windowMs).when(stats).getStatsStartTimestamp(); doReturn(mCurrentTimeMillis).when(stats).getStatsEndTimestamp(); @@ -2168,6 +2187,7 @@ public final class BackgroundRestrictionTest { closeIfNotNull(bgBatteryExemptionTypes); closeIfNotNull(bgPermissionMonitorEnabled); closeIfNotNull(bgPermissionsInMonitor); + closeIfNotNull(bgPromptAbusiveAppToBgRestricted); closeIfNotNull(bgCurrentDrainHighThresholdByBgLocation); closeIfNotNull(bgCurrentDrainDecoupleThresholds); } diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/FingerprintStateCallbackTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/BiometricStateCallbackTest.java index 38e8dfa45262..5f88c99b1d1e 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/FingerprintStateCallbackTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/BiometricStateCallbackTest.java @@ -24,12 +24,13 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import android.hardware.fingerprint.FingerprintStateListener; +import android.hardware.biometrics.BiometricStateListener; import android.platform.test.annotations.Presubmit; import androidx.test.filters.SmallTest; import com.android.server.biometrics.sensors.AuthenticationClient; +import com.android.server.biometrics.sensors.BiometricStateCallback; import com.android.server.biometrics.sensors.EnrollClient; import org.junit.Before; @@ -39,19 +40,19 @@ import org.mockito.MockitoAnnotations; @Presubmit @SmallTest -public class FingerprintStateCallbackTest { +public class BiometricStateCallbackTest { - private FingerprintStateCallback mCallback; + private BiometricStateCallback mCallback; @Mock - FingerprintStateListener mFingerprintStateListener; + BiometricStateListener mBiometricStateListener; @Before public void setup() { MockitoAnnotations.initMocks(this); - mCallback = new FingerprintStateCallback(); - mCallback.registerFingerprintStateListener(mFingerprintStateListener); + mCallback = new BiometricStateCallback(); + mCallback.registerBiometricStateListener(mBiometricStateListener); } @Test @@ -86,10 +87,10 @@ public class FingerprintStateCallbackTest { mCallback.onClientFinished(client, true /* success */); if (expectCallback) { - verify(mFingerprintStateListener).onEnrollmentsChanged(eq(userId), eq(sensorId), + verify(mBiometricStateListener).onEnrollmentsChanged(eq(userId), eq(sensorId), eq(expectedCallbackValue)); } else { - verify(mFingerprintStateListener, never()).onEnrollmentsChanged(anyInt(), anyInt(), + verify(mBiometricStateListener, never()).onEnrollmentsChanged(anyInt(), anyInt(), anyBoolean()); } } @@ -98,7 +99,7 @@ public class FingerprintStateCallbackTest { public void testAuthentication_enrollmentCallbackNeverNotified() { AuthenticationClient<?> client = mock(AuthenticationClient.class); mCallback.onClientFinished(client, true /* success */); - verify(mFingerprintStateListener, never()).onEnrollmentsChanged(anyInt(), anyInt(), + verify(mBiometricStateListener, never()).onEnrollmentsChanged(anyInt(), anyInt(), anyBoolean()); } } diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProviderTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProviderTest.java index 5a1a02eb39c8..c6ddf27f96b2 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProviderTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProviderTest.java @@ -42,9 +42,9 @@ import androidx.test.filters.SmallTest; import com.android.server.biometrics.log.BiometricContext; import com.android.server.biometrics.sensors.BiometricScheduler; +import com.android.server.biometrics.sensors.BiometricStateCallback; import com.android.server.biometrics.sensors.HalClientMonitor; import com.android.server.biometrics.sensors.LockoutResetDispatcher; -import com.android.server.biometrics.sensors.fingerprint.FingerprintStateCallback; import com.android.server.biometrics.sensors.fingerprint.GestureAvailabilityDispatcher; import org.junit.Before; @@ -71,7 +71,7 @@ public class FingerprintProviderTest { @Mock private GestureAvailabilityDispatcher mGestureAvailabilityDispatcher; @Mock - private FingerprintStateCallback mFingerprintStateCallback; + private BiometricStateCallback mBiometricStateCallback; @Mock private BiometricContext mBiometricContext; @@ -107,7 +107,7 @@ public class FingerprintProviderTest { mLockoutResetDispatcher = new LockoutResetDispatcher(mContext); mFingerprintProvider = new TestableFingerprintProvider(mDaemon, mContext, - mFingerprintStateCallback, mSensorProps, TAG, mLockoutResetDispatcher, + mBiometricStateCallback, mSensorProps, TAG, mLockoutResetDispatcher, mGestureAvailabilityDispatcher, mBiometricContext); } @@ -156,13 +156,13 @@ public class FingerprintProviderTest { TestableFingerprintProvider(@NonNull IFingerprint daemon, @NonNull Context context, - @NonNull FingerprintStateCallback fingerprintStateCallback, + @NonNull BiometricStateCallback biometricStateCallback, @NonNull SensorProps[] props, @NonNull String halInstanceName, @NonNull LockoutResetDispatcher lockoutResetDispatcher, @NonNull GestureAvailabilityDispatcher gestureAvailabilityDispatcher, @NonNull BiometricContext biometricContext) { - super(context, fingerprintStateCallback, props, halInstanceName, lockoutResetDispatcher, + super(context, biometricStateCallback, props, halInstanceName, lockoutResetDispatcher, gestureAvailabilityDispatcher, biometricContext); mDaemon = daemon; } diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21Test.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21Test.java index 529f994f2773..b32b89aaefb0 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21Test.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21Test.java @@ -41,8 +41,8 @@ import androidx.test.filters.SmallTest; import com.android.internal.R; import com.android.server.biometrics.log.BiometricContext; import com.android.server.biometrics.sensors.BiometricScheduler; +import com.android.server.biometrics.sensors.BiometricStateCallback; import com.android.server.biometrics.sensors.LockoutResetDispatcher; -import com.android.server.biometrics.sensors.fingerprint.FingerprintStateCallback; import org.junit.Before; import org.junit.Test; @@ -70,7 +70,7 @@ public class Fingerprint21Test { @Mock private BiometricScheduler mScheduler; @Mock - private FingerprintStateCallback mFingerprintStateCallback; + private BiometricStateCallback mBiometricStateCallback; @Mock private BiometricContext mBiometricContext; @@ -102,7 +102,7 @@ public class Fingerprint21Test { componentInfo, FingerprintSensorProperties.TYPE_UNKNOWN, resetLockoutRequiresHardwareAuthToken); - mFingerprint21 = new TestableFingerprint21(mContext, mFingerprintStateCallback, sensorProps, + mFingerprint21 = new TestableFingerprint21(mContext, mBiometricStateCallback, sensorProps, mScheduler, new Handler(Looper.getMainLooper()), mLockoutResetDispatcher, mHalResultController, mBiometricContext); } @@ -125,13 +125,13 @@ public class Fingerprint21Test { private static class TestableFingerprint21 extends Fingerprint21 { TestableFingerprint21(@NonNull Context context, - @NonNull FingerprintStateCallback fingerprintStateCallback, + @NonNull BiometricStateCallback biometricStateCallback, @NonNull FingerprintSensorPropertiesInternal sensorProps, @NonNull BiometricScheduler scheduler, @NonNull Handler handler, @NonNull LockoutResetDispatcher lockoutResetDispatcher, @NonNull HalResultController controller, @NonNull BiometricContext biometricContext) { - super(context, fingerprintStateCallback, sensorProps, scheduler, handler, + super(context, biometricStateCallback, sensorProps, scheduler, handler, lockoutResetDispatcher, controller, biometricContext); } diff --git a/services/tests/servicestests/src/com/android/server/policy/SideFpsEventHandlerTest.java b/services/tests/servicestests/src/com/android/server/policy/SideFpsEventHandlerTest.java index 41c7e31147a5..371861f74871 100644 --- a/services/tests/servicestests/src/com/android/server/policy/SideFpsEventHandlerTest.java +++ b/services/tests/servicestests/src/com/android/server/policy/SideFpsEventHandlerTest.java @@ -26,9 +26,9 @@ import static org.mockito.Mockito.when; import android.app.AlertDialog; import android.content.pm.PackageManager; +import android.hardware.biometrics.BiometricStateListener; import android.hardware.fingerprint.FingerprintManager; import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; -import android.hardware.fingerprint.FingerprintStateListener; import android.hardware.fingerprint.IFingerprintAuthenticatorsRegisteredCallback; import android.os.Handler; import android.os.PowerManager; @@ -61,11 +61,11 @@ import java.util.List; public class SideFpsEventHandlerTest { private static final List<Integer> sAllStates = List.of( - FingerprintStateListener.STATE_IDLE, - FingerprintStateListener.STATE_ENROLLING, - FingerprintStateListener.STATE_KEYGUARD_AUTH, - FingerprintStateListener.STATE_BP_AUTH, - FingerprintStateListener.STATE_AUTH_OTHER); + BiometricStateListener.STATE_IDLE, + BiometricStateListener.STATE_ENROLLING, + BiometricStateListener.STATE_KEYGUARD_AUTH, + BiometricStateListener.STATE_BP_AUTH, + BiometricStateListener.STATE_AUTH_OTHER); @Rule public TestableContext mContext = @@ -83,7 +83,7 @@ public class SideFpsEventHandlerTest { private TestLooper mLooper = new TestLooper(); private SideFpsEventHandler mEventHandler; - private FingerprintStateListener mFingerprintStateListener; + private BiometricStateListener mBiometricStateListener; @Before public void setup() { @@ -116,7 +116,7 @@ public class SideFpsEventHandlerTest { setupWithSensor(false /* hasSfps */, true /* initialized */); for (int state : sAllStates) { - setFingerprintState(state); + setBiometricState(state); assertThat(mEventHandler.onSinglePressDetected(200L)).isFalse(); mLooper.dispatchAll(); @@ -129,7 +129,7 @@ public class SideFpsEventHandlerTest { setupWithSensor(true /* hasSfps */, false /* initialized */); for (int state : sAllStates) { - setFingerprintState(state); + setBiometricState(state); assertThat(mEventHandler.onSinglePressDetected(400L)).isFalse(); mLooper.dispatchAll(); @@ -141,10 +141,10 @@ public class SideFpsEventHandlerTest { public void ignoresWhenIdleOrUnknown() throws Exception { setupWithSensor(true /* hasSfps */, true /* initialized */); - setFingerprintState(FingerprintStateListener.STATE_IDLE); + setBiometricState(BiometricStateListener.STATE_IDLE); assertThat(mEventHandler.onSinglePressDetected(80000L)).isFalse(); - setFingerprintState(FingerprintStateListener.STATE_AUTH_OTHER); + setBiometricState(BiometricStateListener.STATE_AUTH_OTHER); assertThat(mEventHandler.onSinglePressDetected(90000L)).isFalse(); mLooper.dispatchAll(); @@ -155,7 +155,7 @@ public class SideFpsEventHandlerTest { public void ignoresOnKeyguard() throws Exception { setupWithSensor(true /* hasSfps */, true /* initialized */); - setFingerprintState(FingerprintStateListener.STATE_KEYGUARD_AUTH); + setBiometricState(BiometricStateListener.STATE_KEYGUARD_AUTH); assertThat(mEventHandler.onSinglePressDetected(80000L)).isFalse(); mLooper.dispatchAll(); @@ -166,7 +166,7 @@ public class SideFpsEventHandlerTest { public void promptsWhenBPisActive() throws Exception { setupWithSensor(true /* hasSfps */, true /* initialized */); - setFingerprintState(FingerprintStateListener.STATE_BP_AUTH); + setBiometricState(BiometricStateListener.STATE_BP_AUTH); assertThat(mEventHandler.onSinglePressDetected(80000L)).isTrue(); mLooper.dispatchAll(); @@ -177,16 +177,16 @@ public class SideFpsEventHandlerTest { public void promptsWhenEnrolling() throws Exception { setupWithSensor(true /* hasSfps */, true /* initialized */); - setFingerprintState(FingerprintStateListener.STATE_ENROLLING); + setBiometricState(BiometricStateListener.STATE_ENROLLING); assertThat(mEventHandler.onSinglePressDetected(80000L)).isTrue(); mLooper.dispatchAll(); verify(mAlertDialog).show(); } - private void setFingerprintState(@FingerprintStateListener.State int newState) { - if (mFingerprintStateListener != null) { - mFingerprintStateListener.onStateChanged(newState); + private void setBiometricState(@BiometricStateListener.State int newState) { + if (mBiometricStateListener != null) { + mBiometricStateListener.onStateChanged(newState); mLooper.dispatchAll(); } } @@ -204,10 +204,10 @@ public class SideFpsEventHandlerTest { fpCallbackCaptor.getValue().onAllAuthenticatorsRegistered( List.of(mock(FingerprintSensorPropertiesInternal.class))); if (hasSfps) { - ArgumentCaptor<FingerprintStateListener> captor = ArgumentCaptor.forClass( - FingerprintStateListener.class); - verify(mFingerprintManager).registerFingerprintStateListener(captor.capture()); - mFingerprintStateListener = captor.getValue(); + ArgumentCaptor<BiometricStateListener> captor = ArgumentCaptor.forClass( + BiometricStateListener.class); + verify(mFingerprintManager).registerBiometricStateListener(captor.capture()); + mBiometricStateListener = captor.getValue(); } } } diff --git a/tests/utils/hostutils/src/com/android/internal/util/test/SystemPreparer.java b/tests/utils/hostutils/src/com/android/internal/util/test/SystemPreparer.java index 525a78486efc..c25ce71207ae 100644 --- a/tests/utils/hostutils/src/com/android/internal/util/test/SystemPreparer.java +++ b/tests/utils/hostutils/src/com/android/internal/util/test/SystemPreparer.java @@ -21,7 +21,6 @@ import static org.junit.Assert.assertTrue; import com.android.tradefed.device.DeviceNotAvailableException; import com.android.tradefed.device.ITestDevice; -import com.android.tradefed.log.LogUtil; import org.junit.Assert; import org.junit.ClassRule; @@ -369,7 +368,9 @@ public class SystemPreparer extends ExternalResource { device.executeShellCommand("disable-verity"); device.reboot(); } - device.executeShellCommand("remount"); + device.enableAdbRoot(); + device.remountSystemWritable(); + device.remountVendorWritable(); device.waitForDeviceAvailable(); } diff --git a/tests/vcn/java/com/android/server/VcnManagementServiceTest.java b/tests/vcn/java/com/android/server/VcnManagementServiceTest.java index bb98bc0bab53..54b3c400af4f 100644 --- a/tests/vcn/java/com/android/server/VcnManagementServiceTest.java +++ b/tests/vcn/java/com/android/server/VcnManagementServiceTest.java @@ -65,6 +65,7 @@ import android.net.Network; import android.net.NetworkCapabilities; import android.net.NetworkRequest; import android.net.TelephonyNetworkSpecifier; +import android.net.Uri; import android.net.vcn.IVcnStatusCallback; import android.net.vcn.IVcnUnderlyingNetworkPolicyListener; import android.net.vcn.VcnConfig; @@ -114,18 +115,24 @@ import java.util.UUID; public class VcnManagementServiceTest { private static final String TEST_PACKAGE_NAME = VcnManagementServiceTest.class.getPackage().getName(); + private static final String TEST_PACKAGE_NAME_2 = "TEST_PKG_2"; private static final String TEST_CB_PACKAGE_NAME = VcnManagementServiceTest.class.getPackage().getName() + ".callback"; private static final ParcelUuid TEST_UUID_1 = new ParcelUuid(new UUID(0, 0)); private static final ParcelUuid TEST_UUID_2 = new ParcelUuid(new UUID(1, 1)); + private static final ParcelUuid TEST_UUID_3 = new ParcelUuid(new UUID(2, 2)); private static final VcnConfig TEST_VCN_CONFIG; + private static final VcnConfig TEST_VCN_CONFIG_PKG_2; private static final int TEST_UID = Process.FIRST_APPLICATION_UID; static { final Context mockConfigContext = mock(Context.class); - doReturn(TEST_PACKAGE_NAME).when(mockConfigContext).getOpPackageName(); + doReturn(TEST_PACKAGE_NAME).when(mockConfigContext).getOpPackageName(); TEST_VCN_CONFIG = VcnConfigTest.buildTestConfig(mockConfigContext); + + doReturn(TEST_PACKAGE_NAME_2).when(mockConfigContext).getOpPackageName(); + TEST_VCN_CONFIG_PKG_2 = VcnConfigTest.buildTestConfig(mockConfigContext); } private static final Map<ParcelUuid, VcnConfig> TEST_VCN_CONFIG_MAP = @@ -246,18 +253,24 @@ public class VcnManagementServiceTest { eq(android.Manifest.permission.NETWORK_FACTORY), any()); } + private void setupMockedCarrierPrivilege(boolean isPrivileged) { + setupMockedCarrierPrivilege(isPrivileged, TEST_PACKAGE_NAME); + } + + private void setupMockedCarrierPrivilege(boolean isPrivileged, String pkg) { doReturn(Collections.singletonList(TEST_SUBSCRIPTION_INFO)) .when(mSubMgr) .getSubscriptionsInGroup(any()); doReturn(mTelMgr) .when(mTelMgr) .createForSubscriptionId(eq(TEST_SUBSCRIPTION_INFO.getSubscriptionId())); - doReturn(isPrivileged - ? CARRIER_PRIVILEGE_STATUS_HAS_ACCESS - : CARRIER_PRIVILEGE_STATUS_NO_ACCESS) + doReturn( + isPrivileged + ? CARRIER_PRIVILEGE_STATUS_HAS_ACCESS + : CARRIER_PRIVILEGE_STATUS_NO_ACCESS) .when(mTelMgr) - .checkCarrierPrivilegesForPackage(eq(TEST_PACKAGE_NAME)); + .checkCarrierPrivilegesForPackage(eq(pkg)); } @Test @@ -414,7 +427,13 @@ public class VcnManagementServiceTest { private BroadcastReceiver getPackageChangeReceiver() { final ArgumentCaptor<BroadcastReceiver> captor = ArgumentCaptor.forClass(BroadcastReceiver.class); - verify(mMockContext).registerReceiver(captor.capture(), any(), any(), any()); + verify(mMockContext).registerReceiver(captor.capture(), argThat(filter -> { + return filter.hasAction(Intent.ACTION_PACKAGE_ADDED) + && filter.hasAction(Intent.ACTION_PACKAGE_REPLACED) + && filter.hasAction(Intent.ACTION_PACKAGE_REMOVED) + && filter.hasAction(Intent.ACTION_PACKAGE_DATA_CLEARED) + && filter.hasAction(Intent.ACTION_PACKAGE_FULLY_REMOVED); + }), any(), any()); return captor.getValue(); } @@ -539,6 +558,44 @@ public class VcnManagementServiceTest { } @Test + public void testPackageChangeListener_packageDataCleared() throws Exception { + triggerSubscriptionTrackerCbAndGetSnapshot(TEST_UUID_1, Collections.singleton(TEST_UUID_1)); + final Vcn vcn = mVcnMgmtSvc.getAllVcns().get(TEST_UUID_1); + + final BroadcastReceiver receiver = getPackageChangeReceiver(); + assertEquals(TEST_VCN_CONFIG_MAP, mVcnMgmtSvc.getConfigs()); + + final Intent intent = new Intent(Intent.ACTION_PACKAGE_DATA_CLEARED); + intent.setData(Uri.parse("package:" + TEST_PACKAGE_NAME)); + intent.putExtra(Intent.EXTRA_USER_HANDLE, UserHandle.getUserId(TEST_UID)); + + receiver.onReceive(mMockContext, intent); + mTestLooper.dispatchAll(); + verify(vcn).teardownAsynchronously(); + assertTrue(mVcnMgmtSvc.getConfigs().isEmpty()); + verify(mConfigReadWriteHelper).writeToDisk(any(PersistableBundle.class)); + } + + @Test + public void testPackageChangeListener_packageFullyRemoved() throws Exception { + triggerSubscriptionTrackerCbAndGetSnapshot(TEST_UUID_1, Collections.singleton(TEST_UUID_1)); + final Vcn vcn = mVcnMgmtSvc.getAllVcns().get(TEST_UUID_1); + + final BroadcastReceiver receiver = getPackageChangeReceiver(); + assertEquals(TEST_VCN_CONFIG_MAP, mVcnMgmtSvc.getConfigs()); + + final Intent intent = new Intent(Intent.ACTION_PACKAGE_FULLY_REMOVED); + intent.setData(Uri.parse("package:" + TEST_PACKAGE_NAME)); + intent.putExtra(Intent.EXTRA_USER_HANDLE, UserHandle.getUserId(TEST_UID)); + + receiver.onReceive(mMockContext, intent); + mTestLooper.dispatchAll(); + verify(vcn).teardownAsynchronously(); + assertTrue(mVcnMgmtSvc.getConfigs().isEmpty()); + verify(mConfigReadWriteHelper).writeToDisk(any(PersistableBundle.class)); + } + + @Test public void testSetVcnConfigRequiresNonSystemServer() throws Exception { doReturn(Process.SYSTEM_UID).when(mMockDeps).getBinderCallingUid(); @@ -578,7 +635,7 @@ public class VcnManagementServiceTest { @Test public void testSetVcnConfigMismatchedPackages() throws Exception { try { - mVcnMgmtSvc.setVcnConfig(TEST_UUID_1, TEST_VCN_CONFIG, "IncorrectPackage"); + mVcnMgmtSvc.setVcnConfig(TEST_UUID_1, TEST_VCN_CONFIG, TEST_PACKAGE_NAME_2); fail("Expected exception due to mismatched packages in config and method call"); } catch (IllegalArgumentException expected) { verify(mMockPolicyListener, never()).onPolicyChanged(); @@ -678,11 +735,12 @@ public class VcnManagementServiceTest { } @Test - public void testClearVcnConfigRequiresCarrierPrivileges() throws Exception { + public void testClearVcnConfigRequiresCarrierPrivilegesOrProvisioningPackage() + throws Exception { setupMockedCarrierPrivilege(false); try { - mVcnMgmtSvc.clearVcnConfig(TEST_UUID_1, TEST_PACKAGE_NAME); + mVcnMgmtSvc.clearVcnConfig(TEST_UUID_1, TEST_PACKAGE_NAME_2); fail("Expected security exception for missing carrier privileges"); } catch (SecurityException expected) { } @@ -691,20 +749,32 @@ public class VcnManagementServiceTest { @Test public void testClearVcnConfigMismatchedPackages() throws Exception { try { - mVcnMgmtSvc.clearVcnConfig(TEST_UUID_1, "IncorrectPackage"); + mVcnMgmtSvc.clearVcnConfig(TEST_UUID_1, TEST_PACKAGE_NAME_2); fail("Expected security exception due to mismatched packages"); } catch (SecurityException expected) { } } @Test - public void testClearVcnConfig() throws Exception { + public void testClearVcnConfig_callerIsProvisioningPackage() throws Exception { + // Lose carrier privileges to test that provisioning package is sufficient. + setupMockedCarrierPrivilege(false); + mVcnMgmtSvc.clearVcnConfig(TEST_UUID_1, TEST_PACKAGE_NAME); assertTrue(mVcnMgmtSvc.getConfigs().isEmpty()); verify(mConfigReadWriteHelper).writeToDisk(any(PersistableBundle.class)); } @Test + public void testClearVcnConfig_callerIsCarrierPrivileged() throws Exception { + setupMockedCarrierPrivilege(true, TEST_PACKAGE_NAME_2); + + mVcnMgmtSvc.clearVcnConfig(TEST_UUID_1, TEST_PACKAGE_NAME_2); + assertTrue(mVcnMgmtSvc.getConfigs().isEmpty()); + verify(mConfigReadWriteHelper).writeToDisk(any(PersistableBundle.class)); + } + + @Test public void testClearVcnConfigNotifiesStatusCallback() throws Exception { setupSubscriptionAndStartVcn(TEST_SUBSCRIPTION_ID, TEST_UUID_2, true /* isActive */); mVcnMgmtSvc.registerVcnStatusCallback(TEST_UUID_2, mMockStatusCallback, TEST_PACKAGE_NAME); @@ -755,11 +825,12 @@ public class VcnManagementServiceTest { @Test public void testGetConfiguredSubscriptionGroupsMismatchedPackages() throws Exception { - final String badPackage = "IncorrectPackage"; - doThrow(new SecurityException()).when(mAppOpsMgr).checkPackage(TEST_UID, badPackage); + doThrow(new SecurityException()) + .when(mAppOpsMgr) + .checkPackage(TEST_UID, TEST_PACKAGE_NAME_2); try { - mVcnMgmtSvc.getConfiguredSubscriptionGroups(badPackage); + mVcnMgmtSvc.getConfiguredSubscriptionGroups(TEST_PACKAGE_NAME_2); fail("Expected security exception due to mismatched packages"); } catch (SecurityException expected) { } @@ -767,14 +838,16 @@ public class VcnManagementServiceTest { @Test public void testGetConfiguredSubscriptionGroups() throws Exception { + setupMockedCarrierPrivilege(true, TEST_PACKAGE_NAME_2); mVcnMgmtSvc.setVcnConfig(TEST_UUID_2, TEST_VCN_CONFIG, TEST_PACKAGE_NAME); + mVcnMgmtSvc.setVcnConfig(TEST_UUID_3, TEST_VCN_CONFIG_PKG_2, TEST_PACKAGE_NAME_2); - // Assert that if both UUID 1 and 2 are provisioned, the caller only gets ones that they are - // privileged for. + // Assert that if UUIDs 1, 2 and 3 are provisioned, the caller only gets ones that they are + // privileged for, or are the provisioning package of. triggerSubscriptionTrackerCbAndGetSnapshot(TEST_UUID_1, Collections.singleton(TEST_UUID_1)); final List<ParcelUuid> subGrps = mVcnMgmtSvc.getConfiguredSubscriptionGroups(TEST_PACKAGE_NAME); - assertEquals(Collections.singletonList(TEST_UUID_1), subGrps); + assertEquals(Arrays.asList(new ParcelUuid[] {TEST_UUID_1, TEST_UUID_2}), subGrps); } @Test |