diff options
235 files changed, 2946 insertions, 1477 deletions
diff --git a/apex/jobscheduler/service/java/com/android/server/DeviceIdleController.java b/apex/jobscheduler/service/java/com/android/server/DeviceIdleController.java index 9eb7bb7149ef..84d05c8b4144 100644 --- a/apex/jobscheduler/service/java/com/android/server/DeviceIdleController.java +++ b/apex/jobscheduler/service/java/com/android/server/DeviceIdleController.java @@ -2918,6 +2918,13 @@ public class DeviceIdleController extends SystemService reasonCode, reason).sendToTarget(); } reportTempWhitelistChangedLocked(uid, true); + } else { + // The uid is already temp allowlisted, only need to update AMS for temp allowlist + // duration. + if (mLocalActivityManager != null) { + mLocalActivityManager.updateDeviceIdleTempAllowlist(null, uid, true, + duration, tempAllowListType, reasonCode, reason, callingUid); + } } } if (informWhitelistChanged) { diff --git a/core/api/current.txt b/core/api/current.txt index 8ba8c1a7ab4c..4df648cb7009 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -35275,7 +35275,6 @@ package android.provider { field public static final String EXTRA_INPUT_METHOD_ID = "input_method_id"; field public static final String EXTRA_NOTIFICATION_LISTENER_COMPONENT_NAME = "android.provider.extra.NOTIFICATION_LISTENER_COMPONENT_NAME"; field public static final String EXTRA_SETTINGS_LARGE_SCREEN_DEEP_LINK_INTENT_URI = "android.provider.extra.SETTINGS_LARGE_SCREEN_DEEP_LINK_INTENT_URI"; - field public static final String EXTRA_SETTINGS_LARGE_SCREEN_DEEP_LINK_PENDING_INTENT = "android.provider.extra.SETTINGS_LARGE_SCREEN_DEEP_LINK_PENDING_INTENT"; field public static final String EXTRA_SETTINGS_LARGE_SCREEN_HIGHLIGHT_MENU_KEY = "android.provider.extra.SETTINGS_LARGE_SCREEN_HIGHLIGHT_MENU_KEY"; field public static final String EXTRA_SUB_ID = "android.provider.extra.SUB_ID"; field public static final String EXTRA_WIFI_NETWORK_LIST = "android.provider.extra.WIFI_NETWORK_LIST"; diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index 4376d225e676..f53c5b6c9748 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -771,6 +771,11 @@ public class ActivityManager { return procState >= PROCESS_STATE_TRANSIENT_BACKGROUND; } + /** @hide Should this process state be considered in the cache? */ + public static final boolean isProcStateCached(int procState) { + return procState >= PROCESS_STATE_CACHED_ACTIVITY; + } + /** @hide Is this a foreground service type? */ public static boolean isForegroundService(int procState) { return procState == PROCESS_STATE_FOREGROUND_SERVICE; diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java index d5f51adc2297..70bb132c7668 100644 --- a/core/java/android/app/ActivityManagerInternal.java +++ b/core/java/android/app/ActivityManagerInternal.java @@ -156,6 +156,7 @@ public abstract class ActivityManagerInternal { /** * Update information about which app IDs are on the temp allowlist. * @param appids the updated list of appIds in temp allowlist. + * If null, it is to update only changingUid. * @param changingUid uid to add or remove to temp allowlist. * @param adding true to add to temp allowlist, false to remove from temp allowlist. * @param durationMs when adding is true, the duration to be in temp allowlist. @@ -165,7 +166,7 @@ public abstract class ActivityManagerInternal { * @param callingUid the callingUid that setup this temp allowlist, only valid when param adding * is true. */ - public abstract void updateDeviceIdleTempAllowlist(int[] appids, int changingUid, + public abstract void updateDeviceIdleTempAllowlist(@Nullable int[] appids, int changingUid, boolean adding, long durationMs, @TempAllowListType int type, @ReasonCode int reasonCode, @Nullable String reason, int callingUid); diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 719025f9e215..61b1abe25ca2 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -6506,25 +6506,34 @@ public class Notification implements Parcelable if (mContext.getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.N && !styleDisplaysCustomViewInline()) { - if (mN.contentView == null) { - mN.contentView = createContentView(); + RemoteViews newContentView = mN.contentView; + RemoteViews newBigContentView = mN.bigContentView; + RemoteViews newHeadsUpContentView = mN.headsUpContentView; + if (newContentView == null) { + newContentView = createContentView(); mN.extras.putInt(EXTRA_REBUILD_CONTENT_VIEW_ACTION_COUNT, - mN.contentView.getSequenceNumber()); + newContentView.getSequenceNumber()); } - if (mN.bigContentView == null) { - mN.bigContentView = createBigContentView(); - if (mN.bigContentView != null) { + if (newBigContentView == null) { + newBigContentView = createBigContentView(); + if (newBigContentView != null) { mN.extras.putInt(EXTRA_REBUILD_BIG_CONTENT_VIEW_ACTION_COUNT, - mN.bigContentView.getSequenceNumber()); + newBigContentView.getSequenceNumber()); } } - if (mN.headsUpContentView == null) { - mN.headsUpContentView = createHeadsUpContentView(); - if (mN.headsUpContentView != null) { + if (newHeadsUpContentView == null) { + newHeadsUpContentView = createHeadsUpContentView(); + if (newHeadsUpContentView != null) { mN.extras.putInt(EXTRA_REBUILD_HEADS_UP_CONTENT_VIEW_ACTION_COUNT, - mN.headsUpContentView.getSequenceNumber()); + newHeadsUpContentView.getSequenceNumber()); } } + // Don't set any of the content views until after they have all been generated, + // to avoid the generated .contentView triggering the logic which skips generating + // the .bigContentView. + mN.contentView = newContentView; + mN.bigContentView = newBigContentView; + mN.headsUpContentView = newHeadsUpContentView; } if ((mN.defaults & DEFAULT_LIGHTS) != 0) { diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index 08e95a267d7f..c3ec09466de6 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -5935,6 +5935,10 @@ public abstract class Context { * more general access to the URI's content provider then this check will * always fail. * + * <strong>Note:</strong> On SDK Version {@link android.os.Build.VERSION_CODES#S}, + * calling this method from a secondary-user's context will incorrectly return + * {@link PackageManager#PERMISSION_DENIED} for all {code uris}. + * * @param uris The list of URIs that is being checked. * @param pid The process ID being checked against. Must be > 0. * @param uid The user ID being checked against. A uid of 0 is the root diff --git a/core/java/android/hardware/camera2/CameraExtensionCharacteristics.java b/core/java/android/hardware/camera2/CameraExtensionCharacteristics.java index 5cfba3d945cd..395c655ddf7c 100644 --- a/core/java/android/hardware/camera2/CameraExtensionCharacteristics.java +++ b/core/java/android/hardware/camera2/CameraExtensionCharacteristics.java @@ -263,12 +263,12 @@ public final class CameraExtensionCharacteristics { @Override public void onServiceConnected(ComponentName component, IBinder binder) { mProxy = ICameraExtensionsProxyService.Stub.asInterface(binder); - mInitFuture.setStatus(true); try { mSupportsAdvancedExtensions = mProxy.advancedExtensionsSupported(); } catch (RemoteException e) { Log.e(TAG, "Remote IPC failed!"); } + mInitFuture.setStatus(true); } }; ctx.bindService(intent, Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT | diff --git a/core/java/android/os/BatteryUsageStats.java b/core/java/android/os/BatteryUsageStats.java index f48375246616..0f94cbef3886 100644 --- a/core/java/android/os/BatteryUsageStats.java +++ b/core/java/android/os/BatteryUsageStats.java @@ -271,6 +271,16 @@ public final class BatteryUsageStats implements Parcelable { } /** + * Returns the names of custom power components in order, so the first name in the array + * corresponds to the custom componentId + * {@link BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID}. + */ + @NonNull + public String[] getCustomPowerComponentNames() { + return mCustomPowerComponentNames; + } + + /** * Returns an iterator for {@link android.os.BatteryStats.HistoryItem}'s. */ @NonNull diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java index 3aa0bcb6abee..4dae7c7c96d5 100644 --- a/core/java/android/os/PowerManager.java +++ b/core/java/android/os/PowerManager.java @@ -548,6 +548,7 @@ public final class PowerManager { WAKE_REASON_HDMI, WAKE_REASON_DISPLAY_GROUP_ADDED, WAKE_REASON_DISPLAY_GROUP_TURNED_ON, + WAKE_REASON_UNFOLD_DEVICE }) @Retention(RetentionPolicy.SOURCE) public @interface WakeReason{} @@ -647,6 +648,12 @@ public final class PowerManager { public static final int WAKE_REASON_DISPLAY_GROUP_TURNED_ON = 11; /** + * Wake up reason code: Waking the device due to unfolding of a foldable device. + * @hide + */ + public static final int WAKE_REASON_UNFOLD_DEVICE = 12; + + /** * Convert the wake reason to a string for debugging purposes. * @hide */ @@ -664,6 +671,7 @@ public final class PowerManager { case WAKE_REASON_LID: return "WAKE_REASON_LID"; case WAKE_REASON_DISPLAY_GROUP_ADDED: return "WAKE_REASON_DISPLAY_GROUP_ADDED"; case WAKE_REASON_DISPLAY_GROUP_TURNED_ON: return "WAKE_REASON_DISPLAY_GROUP_TURNED_ON"; + case WAKE_REASON_UNFOLD_DEVICE: return "WAKE_REASON_UNFOLD_DEVICE"; default: return Integer.toString(wakeReason); } } diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 1bdfdc211062..7472cca7fbd6 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -35,7 +35,6 @@ import android.app.Application; import android.app.AutomaticZenRule; import android.app.NotificationChannel; import android.app.NotificationManager; -import android.app.PendingIntent; import android.app.SearchManager; import android.app.WallpaperManager; import android.compat.annotation.UnsupportedAppUsage; @@ -2244,6 +2243,21 @@ public final class Settings { public static final String ACTION_TETHER_SETTINGS = "android.settings.TETHER_SETTINGS"; /** + * Activity Action: Show screen that lets user configure wifi tethering. + * <p> + * In some cases, a matching Activity may not exist, so ensure you safeguard against this. + * <p> + * Input: Nothing + * <p> + * Output: Nothing + * + * @hide + */ + @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) + public static final String ACTION_WIFI_TETHER_SETTING = + "com.android.settings.WIFI_TETHER_SETTINGS"; + + /** * Broadcast to trigger notification of asking user to enable MMS. * Need to specify {@link #EXTRA_ENABLE_MMS_DATA_REQUEST_REASON} and {@link #EXTRA_SUB_ID}. * @@ -16961,9 +16975,6 @@ public final class Settings { * * Input: {@link #EXTRA_SETTINGS_LARGE_SCREEN_HIGHLIGHT_MENU_KEY} must be included to * specify a key that indicates the menu item which will be highlighted on settings home menu. - * - * Input: {@link #EXTRA_SETTINGS_LARGE_SCREEN_DEEP_LINK_PENDING_INTENT} is optional. Apps - * can use the {@link PendingIntent} extra to launch into its private {@link Activity}. * <p> * Output: Nothing. */ @@ -16991,15 +17002,6 @@ public final class Settings { "android.provider.extra.SETTINGS_LARGE_SCREEN_HIGHLIGHT_MENU_KEY"; /** - * Activity Extra: Apps can use the {@link PendingIntent} extra to launch into its private - * {@link Activity}. - * <p> - * This is an optional extra field to {@link #ACTION_SETTINGS_LARGE_SCREEN_DEEP_LINK}. - */ - public static final String EXTRA_SETTINGS_LARGE_SCREEN_DEEP_LINK_PENDING_INTENT = - "android.provider.extra.SETTINGS_LARGE_SCREEN_DEEP_LINK_PENDING_INTENT"; - - /** * Performs a strict and comprehensive check of whether a calling package is allowed to * write/modify system settings, as the condition differs for pre-M, M+, and * privileged/preinstalled apps. If the provided uid does not match the diff --git a/core/java/android/speech/RecognitionService.java b/core/java/android/speech/RecognitionService.java index 362ea8c87f7f..5e647a4531bc 100644 --- a/core/java/android/speech/RecognitionService.java +++ b/core/java/android/speech/RecognitionService.java @@ -115,7 +115,7 @@ public abstract class RecognitionService extends Service { @NonNull AttributionSource attributionSource) { try { if (mCurrentCallback == null) { - boolean preflightPermissionCheckPassed = checkPermissionForPreflight( + boolean preflightPermissionCheckPassed = checkPermissionForPreflightNotHardDenied( attributionSource); if (preflightPermissionCheckPassed) { if (DBG) { @@ -470,10 +470,11 @@ public abstract class RecognitionService extends Service { return mStartedDataDelivery; } - private boolean checkPermissionForPreflight(AttributionSource attributionSource) { - return PermissionChecker.checkPermissionForPreflight(RecognitionService.this, - Manifest.permission.RECORD_AUDIO, attributionSource) - == PermissionChecker.PERMISSION_GRANTED; + private boolean checkPermissionForPreflightNotHardDenied(AttributionSource attributionSource) { + int result = PermissionChecker.checkPermissionForPreflight(RecognitionService.this, + Manifest.permission.RECORD_AUDIO, attributionSource); + return result == PermissionChecker.PERMISSION_GRANTED + || result == PermissionChecker.PERMISSION_SOFT_DENIED; } void finishDataDelivery() { diff --git a/core/java/android/view/IWindowSession.aidl b/core/java/android/view/IWindowSession.aidl index a6abed020959..9da50889e43f 100644 --- a/core/java/android/view/IWindowSession.aidl +++ b/core/java/android/view/IWindowSession.aidl @@ -175,6 +175,11 @@ interface IWindowSession { float touchX, float touchY, float thumbCenterX, float thumbCenterY, in ClipData data); /** + * Drops the content of the current drag operation for accessibility + */ + boolean dropForAccessibility(IWindow window, int x, int y); + + /** * Report the result of a drop action targeted to the given window. * consumed is 'true' when the drop was accepted by a valid recipient, * 'false' otherwise. diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 1ecdb900316d..afdb755179a6 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -3515,6 +3515,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * 1 PFLAG4_ALLOW_CLICK_WHEN_DISABLED * 1 PFLAG4_DETACHED * 1 PFLAG4_HAS_TRANSLATION_TRANSIENT_STATE + * 1 PFLAG4_DRAG_A11Y_STARTED * |-------|-------|-------|-------| */ @@ -3586,6 +3587,11 @@ public class View implements Drawable.Callback, KeyEvent.Callback, */ private static final int PFLAG4_HAS_TRANSLATION_TRANSIENT_STATE = 0x000004000; + /** + * Indicates that the view has started a drag with {@link AccessibilityAction#ACTION_DRAG_START} + */ + private static final int PFLAG4_DRAG_A11Y_STARTED = 0x000008000; + /* End of masks for mPrivateFlags4 */ /** @hide */ @@ -10384,8 +10390,17 @@ public class View implements Drawable.Callback, KeyEvent.Callback, if (mTouchDelegate != null) { info.setTouchDelegateInfo(mTouchDelegate.getTouchDelegateInfo()); } + + if (startedSystemDragForAccessibility()) { + info.addAction(AccessibilityAction.ACTION_DRAG_CANCEL); + } + + if (canAcceptAccessibilityDrop()) { + info.addAction(AccessibilityAction.ACTION_DRAG_DROP); + } } + /** * Adds extra data to an {@link AccessibilityNodeInfo} based on an explicit request for the * additional data. @@ -14222,9 +14237,45 @@ public class View implements Drawable.Callback, KeyEvent.Callback, return true; } } + + if (action == R.id.accessibilityActionDragDrop) { + if (!canAcceptAccessibilityDrop()) { + return false; + } + try { + if (mAttachInfo != null && mAttachInfo.mSession != null) { + final int[] location = new int[2]; + getLocationInWindow(location); + final int centerX = location[0] + getWidth() / 2; + final int centerY = location[1] + getHeight() / 2; + return mAttachInfo.mSession.dropForAccessibility(mAttachInfo.mWindow, + centerX, centerY); + } + } catch (RemoteException e) { + Log.e(VIEW_LOG_TAG, "Unable to drop for accessibility", e); + } + return false; + } else if (action == R.id.accessibilityActionDragCancel) { + if (!startedSystemDragForAccessibility()) { + return false; + } + if (mAttachInfo != null && mAttachInfo.mDragToken != null) { + cancelDragAndDrop(); + return true; + } + return false; + } return false; } + private boolean canAcceptAccessibilityDrop() { + if (!canAcceptDrag()) { + return false; + } + ListenerInfo li = mListenerInfo; + return (li != null) && (li.mOnDragListener != null || li.mOnReceiveContentListener != null); + } + private boolean traverseAtGranularity(int granularity, boolean forward, boolean extendSelection) { CharSequence text = getIterableTextForAccessibility(); @@ -26664,6 +26715,37 @@ public class View implements Drawable.Callback, KeyEvent.Callback, data.prepareToLeaveProcess((flags & View.DRAG_FLAG_GLOBAL) != 0); } + Rect bounds = new Rect(); + getBoundsOnScreen(bounds, true); + + Point lastTouchPoint = new Point(); + mAttachInfo.mViewRootImpl.getLastTouchPoint(lastTouchPoint); + final ViewRootImpl root = mAttachInfo.mViewRootImpl; + + // Skip surface logic since shadows and animation are not required during the a11y drag + final boolean a11yEnabled = AccessibilityManager.getInstance(mContext).isEnabled(); + if (a11yEnabled && (flags & View.DRAG_FLAG_ACCESSIBILITY_ACTION) != 0) { + try { + IBinder token = mAttachInfo.mSession.performDrag( + mAttachInfo.mWindow, flags, null, + mAttachInfo.mViewRootImpl.getLastTouchSource(), + 0f, 0f, 0f, 0f, data); + if (ViewDebug.DEBUG_DRAG) { + Log.d(VIEW_LOG_TAG, "startDragAndDrop via a11y action returned " + token); + } + if (token != null) { + root.setLocalDragState(myLocalState); + mAttachInfo.mDragToken = token; + mAttachInfo.mViewRootImpl.setDragStartedViewForAccessibility(this); + setAccessibilityDragStarted(true); + } + return token != null; + } catch (Exception e) { + Log.e(VIEW_LOG_TAG, "Unable to initiate a11y drag", e); + return false; + } + } + Point shadowSize = new Point(); Point shadowTouchPoint = new Point(); shadowBuilder.onProvideShadowMetrics(shadowSize, shadowTouchPoint); @@ -26688,7 +26770,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, + " shadowX=" + shadowTouchPoint.x + " shadowY=" + shadowTouchPoint.y); } - final ViewRootImpl root = mAttachInfo.mViewRootImpl; final SurfaceSession session = new SurfaceSession(); final SurfaceControl surfaceControl = new SurfaceControl.Builder(session) .setName("drag surface") @@ -26711,12 +26792,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback, surface.unlockCanvasAndPost(canvas); } - // repurpose 'shadowSize' for the last touch point - root.getLastTouchPoint(shadowSize); - - token = mAttachInfo.mSession.performDrag( - mAttachInfo.mWindow, flags, surfaceControl, root.getLastTouchSource(), - shadowSize.x, shadowSize.y, shadowTouchPoint.x, shadowTouchPoint.y, data); + token = mAttachInfo.mSession.performDrag(mAttachInfo.mWindow, flags, surfaceControl, + root.getLastTouchSource(), lastTouchPoint.x, lastTouchPoint.y, + shadowTouchPoint.x, shadowTouchPoint.y, data); if (ViewDebug.DEBUG_DRAG) { Log.d(VIEW_LOG_TAG, "performDrag returned " + token); } @@ -26728,6 +26806,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback, mAttachInfo.mDragToken = token; // Cache the local state object for delivery with DragEvents root.setLocalDragState(myLocalState); + if (a11yEnabled) { + // Set for AccessibilityEvents + mAttachInfo.mViewRootImpl.setDragStartedViewForAccessibility(this); + } } return token != null; } catch (Exception e) { @@ -26741,6 +26823,24 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } } + void setAccessibilityDragStarted(boolean started) { + int pflags4 = mPrivateFlags4; + if (started) { + pflags4 |= PFLAG4_DRAG_A11Y_STARTED; + } else { + pflags4 &= ~PFLAG4_DRAG_A11Y_STARTED; + } + + if (pflags4 != mPrivateFlags4) { + mPrivateFlags4 = pflags4; + sendWindowContentChangedAccessibilityEvent(CONTENT_CHANGE_TYPE_UNDEFINED); + } + } + + private boolean startedSystemDragForAccessibility() { + return (mPrivateFlags4 & PFLAG4_DRAG_A11Y_STARTED) != 0; + } + /** * Cancels an ongoing drag and drop operation. * <p> @@ -26958,6 +27058,12 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } switch (event.mAction) { + case DragEvent.ACTION_DRAG_STARTED: { + if (result && li.mOnDragListener != null) { + sendWindowContentChangedAccessibilityEvent( + AccessibilityEvent.CONTENT_CHANGE_TYPE_UNDEFINED); + } + } break; case DragEvent.ACTION_DRAG_ENTERED: { mPrivateFlags2 |= View.PFLAG2_DRAG_HOVERED; refreshDrawableState(); @@ -26966,7 +27072,15 @@ public class View implements Drawable.Callback, KeyEvent.Callback, mPrivateFlags2 &= ~View.PFLAG2_DRAG_HOVERED; refreshDrawableState(); } break; + case DragEvent.ACTION_DROP: { + if (result && (li.mOnDragListener != null | li.mOnReceiveContentListener != null)) { + sendWindowContentChangedAccessibilityEvent( + AccessibilityEvent.CONTENT_CHANGE_TYPE_DRAG_DROPPED); + } + } break; case DragEvent.ACTION_DRAG_ENDED: { + sendWindowContentChangedAccessibilityEvent( + AccessibilityEvent.CONTENT_CHANGE_TYPE_UNDEFINED); mPrivateFlags2 &= ~View.DRAG_MASK; refreshDrawableState(); } break; @@ -26979,6 +27093,15 @@ public class View implements Drawable.Callback, KeyEvent.Callback, return (mPrivateFlags2 & PFLAG2_DRAG_CAN_ACCEPT) != 0; } + void sendWindowContentChangedAccessibilityEvent(int changeType) { + if (AccessibilityManager.getInstance(mContext).isEnabled()) { + AccessibilityEvent event = AccessibilityEvent.obtain(); + event.setEventType(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED); + event.setContentChangeTypes(changeType); + sendAccessibilityEventUnchecked(event); + } + } + /** * This needs to be a better API (NOT ON VIEW) before it is exposed. If * it is ever exposed at all. diff --git a/core/java/android/view/ViewParent.java b/core/java/android/view/ViewParent.java index 775c15e77d5d..49f5229d3c09 100644 --- a/core/java/android/view/ViewParent.java +++ b/core/java/android/view/ViewParent.java @@ -412,6 +412,9 @@ public interface ViewParent { * <li>{@link AccessibilityEvent#CONTENT_CHANGE_TYPE_SUBTREE} * <li>{@link AccessibilityEvent#CONTENT_CHANGE_TYPE_TEXT} * <li>{@link AccessibilityEvent#CONTENT_CHANGE_TYPE_UNDEFINED} + * <li>{@link AccessibilityEvent#CONTENT_CHANGE_TYPE_DRAG_STARTED} + * <li>{@link AccessibilityEvent#CONTENT_CHANGE_TYPE_DRAG_CANCELLED} + * <li>{@link AccessibilityEvent#CONTENT_CHANGE_TYPE_DRAG_DROPPED} * </ul> */ public void notifySubtreeAccessibilityStateChanged( diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index e38b8838586a..20888f75b55f 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -651,6 +651,7 @@ public final class ViewRootImpl implements ViewParent, /* Drag/drop */ ClipDescription mDragDescription; View mCurrentDragView; + View mStartedDragViewForA11y; volatile Object mLocalDragState; final PointF mDragPoint = new PointF(); final PointF mLastTouchPoint = new PointF(); @@ -7584,6 +7585,11 @@ public final class ViewRootImpl implements ViewParent, if (what == DragEvent.ACTION_DRAG_STARTED) { mCurrentDragView = null; // Start the current-recipient tracking mDragDescription = event.mClipDescription; + if (mStartedDragViewForA11y != null) { + // Send a drag started a11y event + mStartedDragViewForA11y.sendWindowContentChangedAccessibilityEvent( + AccessibilityEvent.CONTENT_CHANGE_TYPE_DRAG_STARTED); + } } else { if (what == DragEvent.ACTION_DRAG_ENDED) { mDragDescription = null; @@ -7658,6 +7664,16 @@ public final class ViewRootImpl implements ViewParent, // When the drag operation ends, reset drag-related state if (what == DragEvent.ACTION_DRAG_ENDED) { + if (mStartedDragViewForA11y != null) { + // If the drag failed, send a cancelled event from the source. Otherwise, + // the View that accepted the drop sends CONTENT_CHANGE_TYPE_DRAG_DROPPED + if (!event.getResult()) { + mStartedDragViewForA11y.sendWindowContentChangedAccessibilityEvent( + AccessibilityEvent.CONTENT_CHANGE_TYPE_DRAG_CANCELLED); + } + mStartedDragViewForA11y.setAccessibilityDragStarted(false); + } + mStartedDragViewForA11y = null; mCurrentDragView = null; setLocalDragState(null); mAttachInfo.mDragToken = null; @@ -7737,6 +7753,13 @@ public final class ViewRootImpl implements ViewParent, mCurrentDragView = newDragTarget; } + /** Sets the view that started drag and drop for the purpose of sending AccessibilityEvents */ + void setDragStartedViewForAccessibility(View view) { + if (mStartedDragViewForA11y == null) { + mStartedDragViewForA11y = view; + } + } + private AudioManager getAudioManager() { if (mView == null) { throw new IllegalStateException("getAudioManager called when there is no mView"); diff --git a/core/java/android/view/WindowlessWindowManager.java b/core/java/android/view/WindowlessWindowManager.java index c413a9ba7a27..ffb7efa67243 100644 --- a/core/java/android/view/WindowlessWindowManager.java +++ b/core/java/android/view/WindowlessWindowManager.java @@ -498,4 +498,9 @@ public class WindowlessWindowManager implements IWindowSession { public void generateDisplayHash(IWindow window, Rect boundsInWindow, String hashAlgorithm, RemoteCallback callback) { } + + @Override + public boolean dropForAccessibility(IWindow window, int x, int y) { + return false; + } } diff --git a/core/java/android/view/animation/Animation.java b/core/java/android/view/animation/Animation.java index b1d618eff40a..b296d6f6a052 100644 --- a/core/java/android/view/animation/Animation.java +++ b/core/java/android/view/animation/Animation.java @@ -19,6 +19,7 @@ package android.view.animation; import android.annotation.AnimRes; import android.annotation.ColorInt; import android.annotation.InterpolatorRes; +import android.app.ActivityThread; import android.compat.annotation.UnsupportedAppUsage; import android.content.Context; import android.content.res.TypedArray; @@ -258,8 +259,6 @@ public abstract class Animation implements Cloneable { setZAdjustment(a.getInt(com.android.internal.R.styleable.Animation_zAdjustment, ZORDER_NORMAL)); - setBackgroundColor(a.getInt(com.android.internal.R.styleable.Animation_background, 0)); - setDetachWallpaper( a.getBoolean(com.android.internal.R.styleable.Animation_detachWallpaper, false)); setShowWallpaper( @@ -271,6 +270,15 @@ public abstract class Animation implements Cloneable { a.recycle(); + Context uiContext = ActivityThread.currentActivityThread().getSystemUiContext(); + TypedArray uiStyledAttrs = uiContext + .obtainStyledAttributes(attrs, com.android.internal.R.styleable.Animation); + + setBackgroundColor( + uiStyledAttrs.getColor(com.android.internal.R.styleable.Animation_background, 0)); + + uiStyledAttrs.recycle(); + if (resID > 0) { setInterpolator(context, resID); } @@ -632,16 +640,15 @@ public abstract class Animation implements Cloneable { } /** - * Set background behind animation. + * Set background behind an animation. * - * @param bg The background color. If 0, no background. Currently must - * be black, with any desired alpha level. + * @param bg The background color. If 0, no background. * * @deprecated None of window animations are running with background color. */ @Deprecated public void setBackgroundColor(@ColorInt int bg) { - // The background color is not needed any more, do nothing. + mBackgroundColor = bg; } /** @@ -803,7 +810,7 @@ public abstract class Animation implements Cloneable { @Deprecated @ColorInt public int getBackgroundColor() { - return 0; + return mBackgroundColor; } /** diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 7e286f042384..a817119a735f 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -8618,7 +8618,7 @@ public class BatteryStatsImpl extends BatteryStats { * inactive so can be dropped. */ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) - public boolean reset(long uptimeUs, long realtimeUs) { + public boolean reset(long uptimeUs, long realtimeUs, int resetReason) { boolean active = false; mOnBatteryBackgroundTimeBase.init(uptimeUs, realtimeUs); @@ -8688,7 +8688,11 @@ public class BatteryStatsImpl extends BatteryStats { resetIfNotNull(mBluetoothControllerActivity, false, realtimeUs); resetIfNotNull(mModemControllerActivity, false, realtimeUs); - MeasuredEnergyStats.resetIfNotNull(mUidMeasuredEnergyStats); + if (resetReason == RESET_REASON_MEASURED_ENERGY_BUCKETS_CHANGE) { + mUidMeasuredEnergyStats = null; + } else { + MeasuredEnergyStats.resetIfNotNull(mUidMeasuredEnergyStats); + } resetIfNotNull(mUserCpuTime, false, realtimeUs); resetIfNotNull(mSystemCpuTime, false, realtimeUs); @@ -11371,7 +11375,7 @@ public class BatteryStatsImpl extends BatteryStats { mNumConnectivityChange = 0; for (int i=0; i<mUidStats.size(); i++) { - if (mUidStats.valueAt(i).reset(uptimeUs, elapsedRealtimeUs)) { + if (mUidStats.valueAt(i).reset(uptimeUs, elapsedRealtimeUs, resetReason)) { mUidStats.valueAt(i).detachFromTimeBase(); mUidStats.remove(mUidStats.keyAt(i)); i--; diff --git a/core/java/com/android/internal/os/BatteryUsageStatsProvider.java b/core/java/com/android/internal/os/BatteryUsageStatsProvider.java index 00385793b62b..980aec196079 100644 --- a/core/java/com/android/internal/os/BatteryUsageStatsProvider.java +++ b/core/java/com/android/internal/os/BatteryUsageStatsProvider.java @@ -29,6 +29,7 @@ import android.util.SparseArray; import com.android.internal.annotations.VisibleForTesting; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Map; @@ -234,8 +235,9 @@ public class BatteryUsageStatsProvider { final boolean includePowerModels = (query.getFlags() & BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_INCLUDE_POWER_MODELS) != 0; + final String[] customEnergyConsumerNames = mStats.getCustomEnergyConsumerNames(); final BatteryUsageStats.Builder builder = new BatteryUsageStats.Builder( - mStats.getCustomEnergyConsumerNames(), includePowerModels); + customEnergyConsumerNames, includePowerModels); if (mBatteryUsageStatsStore == null) { Log.e(TAG, "BatteryUsageStatsStore is unavailable"); return builder.build(); @@ -247,7 +249,14 @@ public class BatteryUsageStatsProvider { final BatteryUsageStats snapshot = mBatteryUsageStatsStore.loadBatteryUsageStats(timestamp); if (snapshot != null) { - builder.add(snapshot); + if (Arrays.equals(snapshot.getCustomPowerComponentNames(), + customEnergyConsumerNames)) { + builder.add(snapshot); + } else { + Log.w(TAG, "Ignoring older BatteryUsageStats snapshot, which has different " + + "custom power components: " + + Arrays.toString(snapshot.getCustomPowerComponentNames())); + } } } } diff --git a/core/java/com/android/internal/os/CustomMeasuredPowerCalculator.java b/core/java/com/android/internal/os/CustomMeasuredPowerCalculator.java index 9b51a8ef6410..bb307a0d29d8 100644 --- a/core/java/com/android/internal/os/CustomMeasuredPowerCalculator.java +++ b/core/java/com/android/internal/os/CustomMeasuredPowerCalculator.java @@ -21,13 +21,18 @@ import android.os.BatteryStats; import android.os.BatteryUsageStats; import android.os.BatteryUsageStatsQuery; import android.os.UidBatteryConsumer; +import android.util.Slog; import android.util.SparseArray; +import java.util.Arrays; + /** * Calculates the amount of power consumed by custom energy consumers (i.e. consumers of type * {@link android.hardware.power.stats.EnergyConsumerType#OTHER}). */ public class CustomMeasuredPowerCalculator extends PowerCalculator { + private static final String TAG = "CustomMeasuredPowerCalc"; + public CustomMeasuredPowerCalculator(PowerProfile powerProfile) { } @@ -76,9 +81,9 @@ public class CustomMeasuredPowerCalculator extends PowerCalculator { if (totalPowerMah == null) { newTotalPowerMah = new double[customMeasuredPowerMah.length]; } else if (totalPowerMah.length != customMeasuredPowerMah.length) { - newTotalPowerMah = new double[customMeasuredPowerMah.length]; - System.arraycopy(totalPowerMah, 0, newTotalPowerMah, 0, - customMeasuredPowerMah.length); + Slog.wtf(TAG, "Number of custom energy components is not the same for all apps: " + + totalPowerMah.length + ", " + customMeasuredPowerMah.length); + newTotalPowerMah = Arrays.copyOf(totalPowerMah, customMeasuredPowerMah.length); } else { newTotalPowerMah = totalPowerMah; } diff --git a/core/res/res/anim-ldrtl/cross_profile_apps_thumbnail_enter.xml b/core/res/res/anim-ldrtl/cross_profile_apps_thumbnail_enter.xml index 5add19bba51b..aa3800061bd3 100644 --- a/core/res/res/anim-ldrtl/cross_profile_apps_thumbnail_enter.xml +++ b/core/res/res/anim-ldrtl/cross_profile_apps_thumbnail_enter.xml @@ -18,19 +18,9 @@ --> <!-- This should be kept in sync with task_open_enter.xml --> <set xmlns:android="http://schemas.android.com/apk/res/android" - android:hasRoundedCorners="true" android:shareInterpolator="false" - android:zAdjustment="top"> - - <alpha - android:fromAlpha="1" - android:toAlpha="1.0" - android:fillEnabled="true" - android:fillBefore="true" - android:fillAfter="true" - android:interpolator="@interpolator/linear" - android:startOffset="67" - android:duration="217"/> + android:zAdjustment="top" + android:hasRoundedCorners="true"> <translate android:fromXDelta="-105%" @@ -38,36 +28,9 @@ android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:interpolator="@interpolator/aggressive_ease" - android:startOffset="50" - android:duration="383"/> - - <scale - android:fromXScale="1.0526" - android:toXScale="1" - android:fromYScale="1.0526" - android:toYScale="1" - android:pivotX="50%" - android:pivotY="50%" - android:fillEnabled="true" - android:fillBefore="true" - android:fillAfter="true" - android:interpolator="@interpolator/fast_out_slow_in" - android:duration="283"/> - - <scale - android:fromXScale="0.95" - android:toXScale="1" - android:fromYScale="0.95" - android:toYScale="1" - android:pivotX="50%" - android:pivotY="50%" - android:fillEnabled="true" - android:fillBefore="true" - android:fillAfter="true" - android:interpolator="@interpolator/fast_out_slow_in" - android:startOffset="283" - android:duration="317"/> + android:interpolator="@interpolator/fast_out_extra_slow_in" + android:startOffset="0" + android:duration="500"/> <!-- To keep the thumbnail around longer and fade out the thumbnail --> <alpha android:fromAlpha="1.0" android:toAlpha="0" diff --git a/core/res/res/anim-ldrtl/task_close_enter.xml b/core/res/res/anim-ldrtl/task_close_enter.xml index e00141a8c155..5ace46d4c621 100644 --- a/core/res/res/anim-ldrtl/task_close_enter.xml +++ b/core/res/res/anim-ldrtl/task_close_enter.xml @@ -14,20 +14,9 @@ ~ limitations under the License --> <set xmlns:android="http://schemas.android.com/apk/res/android" - android:shareInterpolator="false" - android:zAdjustment="top" - android:hasRoundedCorners="true" - android:showWallpaper="true"> - - <alpha - android:fromAlpha="1" - android:toAlpha="1.0" - android:fillEnabled="true" - android:fillBefore="true" - android:fillAfter="true" - android:interpolator="@interpolator/linear" - android:startOffset="67" - android:duration="217"/> + android:shareInterpolator="false" + android:zAdjustment="top" + android:hasRoundedCorners="true"> <translate android:fromXDelta="105%" @@ -35,34 +24,7 @@ android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:interpolator="@interpolator/aggressive_ease" - android:startOffset="50" - android:duration="383"/> - - <scale - android:fromXScale="1.0526" - android:toXScale="1" - android:fromYScale="1.0526" - android:toYScale="1" - android:pivotX="50%" - android:pivotY="50%" - android:fillEnabled="true" - android:fillBefore="true" - android:fillAfter="true" - android:interpolator="@interpolator/fast_out_slow_in" - android:duration="283"/> - - <scale - android:fromXScale="0.95" - android:toXScale="1" - android:fromYScale="0.95" - android:toYScale="1" - android:pivotX="50%" - android:pivotY="50%" - android:fillEnabled="true" - android:fillBefore="true" - android:fillAfter="true" - android:interpolator="@interpolator/fast_out_slow_in" - android:startOffset="283" - android:duration="317"/> + android:interpolator="@interpolator/fast_out_extra_slow_in" + android:startOffset="0" + android:duration="500"/> </set>
\ No newline at end of file diff --git a/core/res/res/anim-ldrtl/task_close_exit.xml b/core/res/res/anim-ldrtl/task_close_exit.xml index 71a44ae7d2fc..76fbdffd1760 100644 --- a/core/res/res/anim-ldrtl/task_close_exit.xml +++ b/core/res/res/anim-ldrtl/task_close_exit.xml @@ -15,19 +15,8 @@ --> <set xmlns:android="http://schemas.android.com/apk/res/android" - android:shareInterpolator="false" - android:hasRoundedCorners="true" - android:showWallpaper="true"> - - <alpha - android:fromAlpha="1.0" - android:toAlpha="1" - android:fillEnabled="true" - android:fillBefore="true" - android:fillAfter="true" - android:interpolator="@interpolator/linear" - android:startOffset="67" - android:duration="283"/> + android:shareInterpolator="false" + android:hasRoundedCorners="true"> <translate android:fromXDelta="0" @@ -35,22 +24,9 @@ android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:interpolator="@interpolator/aggressive_ease" - android:startOffset="50" - android:duration="383"/> - - <scale - android:fromXScale="1.0" - android:toXScale="0.95" - android:fromYScale="1.0" - android:toYScale="0.95" - android:fillEnabled="true" - android:fillBefore="true" - android:fillAfter="true" - android:pivotX="50%" - android:pivotY="50%" - android:interpolator="@interpolator/fast_out_slow_in" - android:duration="283"/> + android:interpolator="@interpolator/fast_out_extra_slow_in" + android:startOffset="0" + android:duration="500"/> <!-- This is needed to keep the animation running while task_open_enter completes --> <alpha diff --git a/core/res/res/anim-ldrtl/task_open_enter.xml b/core/res/res/anim-ldrtl/task_open_enter.xml index 7815f7d661d0..52c74a6c4482 100644 --- a/core/res/res/anim-ldrtl/task_open_enter.xml +++ b/core/res/res/anim-ldrtl/task_open_enter.xml @@ -16,20 +16,9 @@ <!-- This should in sync with task_open_enter_cross_profile_apps.xml --> <!-- This should in sync with cross_profile_apps_thumbnail_enter.xml --> <set xmlns:android="http://schemas.android.com/apk/res/android" - android:shareInterpolator="false" - android:zAdjustment="top" - android:hasRoundedCorners="true" - android:showWallpaper="true"> - - <alpha - android:fromAlpha="1" - android:toAlpha="1.0" - android:fillEnabled="true" - android:fillBefore="true" - android:fillAfter="true" - android:interpolator="@interpolator/linear" - android:startOffset="67" - android:duration="217"/> + android:shareInterpolator="false" + android:zAdjustment="top" + android:hasRoundedCorners="true"> <translate android:fromXDelta="-105%" @@ -37,34 +26,7 @@ android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:interpolator="@interpolator/aggressive_ease" - android:startOffset="50" - android:duration="383"/> - - <scale - android:fromXScale="1.0526" - android:toXScale="1" - android:fromYScale="1.0526" - android:toYScale="1" - android:pivotX="50%" - android:pivotY="50%" - android:fillEnabled="true" - android:fillBefore="true" - android:fillAfter="true" - android:interpolator="@interpolator/fast_out_slow_in" - android:duration="283"/> - - <scale - android:fromXScale="0.95" - android:toXScale="1" - android:fromYScale="0.95" - android:toYScale="1" - android:pivotX="50%" - android:pivotY="50%" - android:fillEnabled="true" - android:fillBefore="true" - android:fillAfter="true" - android:interpolator="@interpolator/fast_out_slow_in" - android:startOffset="283" - android:duration="317"/> -</set>
\ No newline at end of file + android:interpolator="@interpolator/fast_out_extra_slow_in" + android:startOffset="0" + android:duration="500"/> +</set> diff --git a/core/res/res/anim-ldrtl/task_open_enter_cross_profile_apps.xml b/core/res/res/anim-ldrtl/task_open_enter_cross_profile_apps.xml index 5fccd6df14a5..90ec0715f8b0 100644 --- a/core/res/res/anim-ldrtl/task_open_enter_cross_profile_apps.xml +++ b/core/res/res/anim-ldrtl/task_open_enter_cross_profile_apps.xml @@ -16,20 +16,9 @@ --> <!-- This should in sync with task_open_enter.xml --> <set xmlns:android="http://schemas.android.com/apk/res/android" - android:shareInterpolator="false" - android:zAdjustment="top" - android:hasRoundedCorners="true" - android:showWallpaper="true"> - - <alpha - android:fromAlpha="1" - android:toAlpha="1.0" - android:fillEnabled="true" - android:fillBefore="true" - android:fillAfter="true" - android:interpolator="@interpolator/linear" - android:startOffset="67" - android:duration="217"/> + android:shareInterpolator="false" + android:zAdjustment="top" + android:hasRoundedCorners="true"> <translate android:fromXDelta="-105%" @@ -37,36 +26,9 @@ android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:interpolator="@interpolator/aggressive_ease" - android:startOffset="50" - android:duration="383"/> - - <scale - android:fromXScale="1.0526" - android:toXScale="1" - android:fromYScale="1.0526" - android:toYScale="1" - android:pivotX="50%" - android:pivotY="50%" - android:fillEnabled="true" - android:fillBefore="true" - android:fillAfter="true" - android:interpolator="@interpolator/fast_out_slow_in" - android:duration="283"/> - - <scale - android:fromXScale="0.95" - android:toXScale="1" - android:fromYScale="0.95" - android:toYScale="1" - android:pivotX="50%" - android:pivotY="50%" - android:fillEnabled="true" - android:fillBefore="true" - android:fillAfter="true" - android:interpolator="@interpolator/fast_out_slow_in" - android:startOffset="283" - android:duration="317"/> + android:interpolator="@interpolator/fast_out_extra_slow_in" + android:startOffset="0" + android:duration="500"/> <!-- To keep the transition around longer for the thumbnail, should be kept in sync with cross_profile_apps_thumbmail.xml --> @@ -75,4 +37,4 @@ android:toAlpha="1.0" android:startOffset="717" android:duration="200"/> -</set>
\ No newline at end of file +</set> diff --git a/core/res/res/anim-ldrtl/task_open_exit.xml b/core/res/res/anim-ldrtl/task_open_exit.xml index 025e1bdc05c9..beb6fca5632a 100644 --- a/core/res/res/anim-ldrtl/task_open_exit.xml +++ b/core/res/res/anim-ldrtl/task_open_exit.xml @@ -15,19 +15,8 @@ --> <set xmlns:android="http://schemas.android.com/apk/res/android" - android:shareInterpolator="false" - android:hasRoundedCorners="true" - android:showWallpaper="true"> - - <alpha - android:fromAlpha="1.0" - android:toAlpha="1" - android:fillEnabled="true" - android:fillBefore="true" - android:fillAfter="true" - android:interpolator="@interpolator/linear" - android:startOffset="67" - android:duration="283"/> + android:shareInterpolator="false" + android:hasRoundedCorners="true"> <translate android:fromXDelta="0" @@ -35,22 +24,9 @@ android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:interpolator="@interpolator/aggressive_ease" - android:startOffset="50" - android:duration="383"/> - - <scale - android:fromXScale="1.0" - android:toXScale="0.95" - android:fromYScale="1.0" - android:toYScale="0.95" - android:fillEnabled="true" - android:fillBefore="true" - android:fillAfter="true" - android:pivotX="50%" - android:pivotY="50%" - android:interpolator="@interpolator/fast_out_slow_in" - android:duration="283"/> + android:interpolator="@interpolator/fast_out_extra_slow_in" + android:startOffset="0" + android:duration="500"/> <!-- This is needed to keep the animation running while task_open_enter completes --> <alpha diff --git a/core/res/res/anim/cross_profile_apps_thumbnail_enter.xml b/core/res/res/anim/cross_profile_apps_thumbnail_enter.xml index 2cfeecf4685d..f6d7b7229677 100644 --- a/core/res/res/anim/cross_profile_apps_thumbnail_enter.xml +++ b/core/res/res/anim/cross_profile_apps_thumbnail_enter.xml @@ -19,18 +19,8 @@ <!-- This should be kept in sync with task_open_enter.xml --> <set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false" - android:hasRoundedCorners="true" - android:zAdjustment="top"> - - <alpha - android:fromAlpha="1" - android:toAlpha="1.0" - android:fillEnabled="true" - android:fillBefore="true" - android:fillAfter="true" - android:interpolator="@interpolator/linear" - android:startOffset="67" - android:duration="217"/> + android:zAdjustment="top" + android:hasRoundedCorners="true"> <translate android:fromXDelta="105%" @@ -38,36 +28,9 @@ android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:interpolator="@interpolator/aggressive_ease" - android:startOffset="50" - android:duration="383"/> - - <scale - android:fromXScale="1.0526" - android:toXScale="1" - android:fromYScale="1.0526" - android:toYScale="1" - android:pivotX="50%" - android:pivotY="50%" - android:fillEnabled="true" - android:fillBefore="true" - android:fillAfter="true" - android:interpolator="@interpolator/fast_out_slow_in" - android:duration="283"/> - - <scale - android:fromXScale="0.95" - android:toXScale="1" - android:fromYScale="0.95" - android:toYScale="1" - android:pivotX="50%" - android:pivotY="50%" - android:fillEnabled="true" - android:fillBefore="true" - android:fillAfter="true" - android:interpolator="@interpolator/fast_out_slow_in" - android:startOffset="283" - android:duration="317"/> + android:interpolator="@interpolator/fast_out_extra_slow_in" + android:startOffset="0" + android:duration="500"/> <!-- To keep the thumbnail around longer and fade out the thumbnail --> <alpha android:fromAlpha="1.0" android:toAlpha="0" diff --git a/core/res/res/anim/task_close_enter.xml b/core/res/res/anim/task_close_enter.xml index 487ff5c748d3..52017b1091bc 100644 --- a/core/res/res/anim/task_close_enter.xml +++ b/core/res/res/anim/task_close_enter.xml @@ -16,20 +16,9 @@ */ --> <set xmlns:android="http://schemas.android.com/apk/res/android" - android:shareInterpolator="false" - android:zAdjustment="top" - android:hasRoundedCorners="true" - android:showWallpaper="true"> - - <alpha - android:fromAlpha="1" - android:toAlpha="1.0" - android:fillEnabled="true" - android:fillBefore="true" - android:fillAfter="true" - android:interpolator="@interpolator/linear" - android:startOffset="67" - android:duration="217"/> + android:shareInterpolator="false" + android:zAdjustment="top" + android:hasRoundedCorners="true"> <translate android:fromXDelta="-105%" @@ -37,34 +26,7 @@ android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:interpolator="@interpolator/aggressive_ease" - android:startOffset="50" - android:duration="383"/> - - <scale - android:fromXScale="1.0526" - android:toXScale="1" - android:fromYScale="1.0526" - android:toYScale="1" - android:pivotX="50%" - android:pivotY="50%" - android:fillEnabled="true" - android:fillBefore="true" - android:fillAfter="true" - android:interpolator="@interpolator/fast_out_slow_in" - android:duration="283"/> - - <scale - android:fromXScale="0.95" - android:toXScale="1" - android:fromYScale="0.95" - android:toYScale="1" - android:pivotX="50%" - android:pivotY="50%" - android:fillEnabled="true" - android:fillBefore="true" - android:fillAfter="true" - android:interpolator="@interpolator/fast_out_slow_in" - android:startOffset="283" - android:duration="317"/> + android:interpolator="@interpolator/fast_out_extra_slow_in" + android:startOffset="0" + android:duration="500"/> </set>
\ No newline at end of file diff --git a/core/res/res/anim/task_close_exit.xml b/core/res/res/anim/task_close_exit.xml index afc3256cb617..736f3f2083e5 100644 --- a/core/res/res/anim/task_close_exit.xml +++ b/core/res/res/anim/task_close_exit.xml @@ -17,19 +17,8 @@ --> <set xmlns:android="http://schemas.android.com/apk/res/android" - android:shareInterpolator="false" - android:hasRoundedCorners="true" - android:showWallpaper="true"> - - <alpha - android:fromAlpha="1.0" - android:toAlpha="1" - android:fillEnabled="true" - android:fillBefore="true" - android:fillAfter="true" - android:interpolator="@interpolator/linear" - android:startOffset="67" - android:duration="283"/> + android:shareInterpolator="false" + android:hasRoundedCorners="true"> <translate android:fromXDelta="0" @@ -37,22 +26,9 @@ android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:interpolator="@interpolator/aggressive_ease" - android:startOffset="50" - android:duration="383"/> - - <scale - android:fromXScale="1.0" - android:toXScale="0.95" - android:fromYScale="1.0" - android:toYScale="0.95" - android:fillEnabled="true" - android:fillBefore="true" - android:fillAfter="true" - android:pivotX="50%" - android:pivotY="50%" - android:interpolator="@interpolator/fast_out_slow_in" - android:duration="283"/> + android:interpolator="@interpolator/fast_out_extra_slow_in" + android:startOffset="0" + android:duration="500"/> <!-- This is needed to keep the animation running while task_open_enter completes --> <alpha diff --git a/core/res/res/anim/task_open_enter.xml b/core/res/res/anim/task_open_enter.xml index 0aafc1c0b91c..3c934382bb75 100644 --- a/core/res/res/anim/task_open_enter.xml +++ b/core/res/res/anim/task_open_enter.xml @@ -15,23 +15,12 @@ ** limitations under the License. */ --> -<!-- This should in sync with task_open_enter_cross_profile_apps.xml --> -<!-- This should in sync with cross_profile_apps_thumbnail_enter.xml --> +<!-- This should be kept in sync with task_open_enter_cross_profile_apps.xml --> +<!-- This should be kept in sync with cross_profile_apps_thumbnail_enter.xml --> <set xmlns:android="http://schemas.android.com/apk/res/android" - android:shareInterpolator="false" - android:zAdjustment="top" - android:hasRoundedCorners="true" - android:showWallpaper="true"> - - <alpha - android:fromAlpha="1" - android:toAlpha="1.0" - android:fillEnabled="true" - android:fillBefore="true" - android:fillAfter="true" - android:interpolator="@interpolator/linear" - android:startOffset="67" - android:duration="217"/> + android:shareInterpolator="false" + android:zAdjustment="top" + android:hasRoundedCorners="true"> <translate android:fromXDelta="105%" @@ -39,34 +28,7 @@ android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:interpolator="@interpolator/aggressive_ease" - android:startOffset="50" - android:duration="383"/> - - <scale - android:fromXScale="1.0526" - android:toXScale="1" - android:fromYScale="1.0526" - android:toYScale="1" - android:pivotX="50%" - android:pivotY="50%" - android:fillEnabled="true" - android:fillBefore="true" - android:fillAfter="true" - android:interpolator="@interpolator/fast_out_slow_in" - android:duration="283"/> - - <scale - android:fromXScale="0.95" - android:toXScale="1" - android:fromYScale="0.95" - android:toYScale="1" - android:pivotX="50%" - android:pivotY="50%" - android:fillEnabled="true" - android:fillBefore="true" - android:fillAfter="true" - android:interpolator="@interpolator/fast_out_slow_in" - android:startOffset="283" - android:duration="317"/> + android:interpolator="@interpolator/fast_out_extra_slow_in" + android:startOffset="0" + android:duration="500"/> </set>
\ No newline at end of file diff --git a/core/res/res/anim/task_open_enter_cross_profile_apps.xml b/core/res/res/anim/task_open_enter_cross_profile_apps.xml index 702f7ba162aa..16249d15e1b7 100644 --- a/core/res/res/anim/task_open_enter_cross_profile_apps.xml +++ b/core/res/res/anim/task_open_enter_cross_profile_apps.xml @@ -18,20 +18,9 @@ --> <!-- This should in sync with task_open_enter.xml --> <set xmlns:android="http://schemas.android.com/apk/res/android" - android:shareInterpolator="false" - android:zAdjustment="top" - android:hasRoundedCorners="true" - android:showWallpaper="true"> - - <alpha - android:fromAlpha="1" - android:toAlpha="1.0" - android:fillEnabled="true" - android:fillBefore="true" - android:fillAfter="true" - android:interpolator="@interpolator/linear" - android:startOffset="67" - android:duration="217"/> + android:shareInterpolator="false" + android:zAdjustment="top" + android:hasRoundedCorners="true"> <translate android:fromXDelta="105%" @@ -39,36 +28,9 @@ android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:interpolator="@interpolator/aggressive_ease" - android:startOffset="50" - android:duration="383"/> - - <scale - android:fromXScale="1.0526" - android:toXScale="1" - android:fromYScale="1.0526" - android:toYScale="1" - android:pivotX="50%" - android:pivotY="50%" - android:fillEnabled="true" - android:fillBefore="true" - android:fillAfter="true" - android:interpolator="@interpolator/fast_out_slow_in" - android:duration="283"/> - - <scale - android:fromXScale="0.95" - android:toXScale="1" - android:fromYScale="0.95" - android:toYScale="1" - android:pivotX="50%" - android:pivotY="50%" - android:fillEnabled="true" - android:fillBefore="true" - android:fillAfter="true" - android:interpolator="@interpolator/fast_out_slow_in" - android:startOffset="283" - android:duration="317"/> + android:interpolator="@interpolator/fast_out_extra_slow_in" + android:startOffset="0" + android:duration="500"/> <!-- To keep the transition around longer for the thumbnail, should be kept in sync with cross_profile_apps_thumbmail.xml --> diff --git a/core/res/res/anim/task_open_exit.xml b/core/res/res/anim/task_open_exit.xml index 691317d2e6e0..d1703170e16f 100644 --- a/core/res/res/anim/task_open_exit.xml +++ b/core/res/res/anim/task_open_exit.xml @@ -17,19 +17,8 @@ --> <set xmlns:android="http://schemas.android.com/apk/res/android" - android:shareInterpolator="false" - android:hasRoundedCorners="true" - android:showWallpaper="true"> - - <alpha - android:fromAlpha="1.0" - android:toAlpha="1" - android:fillEnabled="true" - android:fillBefore="true" - android:fillAfter="true" - android:interpolator="@interpolator/linear" - android:startOffset="67" - android:duration="283"/> + android:shareInterpolator="false" + android:hasRoundedCorners="true"> <translate android:fromXDelta="0" @@ -37,22 +26,9 @@ android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:interpolator="@interpolator/aggressive_ease" - android:startOffset="50" - android:duration="383"/> - - <scale - android:fromXScale="1.0" - android:toXScale="0.95" - android:fromYScale="1.0" - android:toYScale="0.95" - android:fillEnabled="true" - android:fillBefore="true" - android:fillAfter="true" - android:pivotX="50%" - android:pivotY="50%" - android:interpolator="@interpolator/fast_out_slow_in" - android:duration="283"/> + android:interpolator="@interpolator/fast_out_extra_slow_in" + android:startOffset="0" + android:duration="500"/> <!-- This is needed to keep the animation running while task_open_enter completes --> <alpha diff --git a/core/res/res/color/overview_background.xml b/core/res/res/color/overview_background.xml new file mode 100644 index 000000000000..45c6c256d67a --- /dev/null +++ b/core/res/res/color/overview_background.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ 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. + --> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:color="@android:color/system_neutral2_500" android:lStar="87" /> +</selector>
\ No newline at end of file diff --git a/core/res/res/color/overview_background_dark.xml b/core/res/res/color/overview_background_dark.xml new file mode 100644 index 000000000000..84f4fdff4e1a --- /dev/null +++ b/core/res/res/color/overview_background_dark.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ 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. + --> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:color="@android:color/system_neutral2_500" android:lStar="35" /> +</selector>
\ No newline at end of file diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml index 917a80c63b77..8aafa0a6ac70 100644 --- a/core/res/res/values-as/strings.xml +++ b/core/res/res/values-as/strings.xml @@ -34,7 +34,7 @@ <string name="defaultMsisdnAlphaTag" msgid="2285034592902077488">"MSISDN1"</string> <string name="mmiError" msgid="2862759606579822246">"সংযোগৰ সমস্যা বা MMI ক\'ড মান্য নহয়।"</string> <string name="mmiFdnError" msgid="3975490266767565852">"কেৱল ফিক্সড ডায়েলিং নম্বৰৰ বাবে কার্য সীমাবদ্ধ কৰা হৈছে।"</string> - <string name="mmiErrorWhileRoaming" msgid="1204173664713870114">"আপুনি ৰ\'মিঙত থকাৰ সময়ত কল ফৰৱাৰ্ডিঙৰ ছেটিংসমূহ সলনি কৰিব নোৱাৰি।"</string> + <string name="mmiErrorWhileRoaming" msgid="1204173664713870114">"আপুনি ৰ\'মিঙত থকাৰ সময়ত কল ফৰৱাৰ্ডিঙৰ ছেটিং সলনি কৰিব নোৱাৰি।"</string> <string name="serviceEnabled" msgid="7549025003394765639">"সেৱা সক্ষম কৰা হ’ল।"</string> <string name="serviceEnabledFor" msgid="1463104778656711613">"সেৱা সক্ষম কৰা হ’ল:"</string> <string name="serviceDisabled" msgid="641878791205871379">"সেৱা অক্ষম কৰা হ’ল।"</string> @@ -124,7 +124,7 @@ <string name="roamingTextSearching" msgid="5323235489657753486">"সেৱাৰ বাবে অনুসন্ধান কৰি থকা হৈছে"</string> <string name="wfcRegErrorTitle" msgid="3193072971584858020">"ৱাই-ফাই কলিং ছেট আপ কৰিব পৰা নগ\'ল"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="468830943567116703">"ৱাই-ফাইৰ জৰিয়তে কল কৰিবলৈ আৰু বাৰ্তা পঠাবলৈ, প্ৰথমে আপোনাৰ বাহকক আপোনাৰ ডিভাইচটো ছেট আপ কৰিব দিবলৈ কওক। তাৰ পিচত, ছেটিংসমূহলৈ গৈ আকৌ ৱাই-ফাই কলিং অন কৰক। (ত্ৰুটি ক\'ড: <xliff:g id="CODE">%1$s</xliff:g>)"</item> + <item msgid="468830943567116703">"ৱাই-ফাইৰ জৰিয়তে কল কৰিবলৈ আৰু বাৰ্তা পঠাবলৈ, প্ৰথমে আপোনাৰ বাহকক আপোনাৰ ডিভাইচটো ছেট আপ কৰিবলৈ কওক। তাৰ পাছত, ছেটিঙলৈ গৈ আকৌ ৱাই-ফাই কলিং অন কৰক। (ত্ৰুটি ক\'ড: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="4795145070505729156">"আপোনাৰ বাহকৰ ওচৰত ৱাই-ফাই কলিং সুবিধা পঞ্জীয়ন কৰাত সমস্যাৰ উদ্ভৱ হৈছে: <xliff:g id="CODE">%1$s</xliff:g>"</item> @@ -218,7 +218,7 @@ <string name="silent_mode" msgid="8796112363642579333">"নিঃশব্দ ম\'ড"</string> <string name="turn_on_radio" msgid="2961717788170634233">"ৱায়াৰলেছ অন কৰক"</string> <string name="turn_off_radio" msgid="7222573978109933360">"ৱায়াৰলেছ অফ কৰক"</string> - <string name="screen_lock" msgid="2072642720826409809">"স্ক্ৰীণ লক"</string> + <string name="screen_lock" msgid="2072642720826409809">"স্ক্ৰীন লক"</string> <string name="power_off" msgid="4111692782492232778">"পাৱাৰ অফ"</string> <string name="silent_mode_silent" msgid="5079789070221150912">"ৰিংগাৰ অফ আছে"</string> <string name="silent_mode_vibrate" msgid="8821830448369552678">"ৰিংগাৰ কম্পন অৱস্থাত আছে"</string> @@ -268,7 +268,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="6911684460146916206">"এয়াৰপ্লেইন ম\'ড"</string> <string name="global_actions_airplane_mode_on_status" msgid="5508025516695361936">"এয়াৰপ্লেইন ম\'ড অন কৰা আছে"</string> <string name="global_actions_airplane_mode_off_status" msgid="8522219771500505475">"এয়াৰপ্লেইন ম\'ড অফ কৰা আছে"</string> - <string name="global_action_settings" msgid="4671878836947494217">"ছেটিংসমূহ"</string> + <string name="global_action_settings" msgid="4671878836947494217">"ছেটিং"</string> <string name="global_action_assist" msgid="2517047220311505805">"সহায়"</string> <string name="global_action_voice_assist" msgid="6655788068555086695">"কণ্ঠধ্বনিৰে সহায়"</string> <string name="global_action_lockdown" msgid="2475471405907902963">"লকডাউন"</string> @@ -400,8 +400,8 @@ <string name="permdesc_foregroundService" msgid="8720071450020922795">"এপটোক অগ্ৰভূমি সেৱাসমূহ ব্যৱহাৰ কৰিবলৈ অনুমতি দিয়ে।"</string> <string name="permlab_getPackageSize" msgid="375391550792886641">"এপৰ সঞ্চয়াগাৰৰ খালী ঠাই হিচাপ কৰক"</string> <string name="permdesc_getPackageSize" msgid="742743530909966782">"এপটোক ইয়াৰ ক\'ড, ডেটা আৰু কেশ্বৰ আকাৰ বিচাৰি উলিয়াবলৈ অনুমতি দিয়ে"</string> - <string name="permlab_writeSettings" msgid="8057285063719277394">"ছিষ্টেম ছেটিংসমূহ সংশোধন কৰক"</string> - <string name="permdesc_writeSettings" msgid="8293047411196067188">"এপটোক ছিষ্টেমৰ ছেটিংসমূহৰ ডেটা সংশোধন কৰিবলৈ অনুমতি দিয়ে৷ ক্ষতিকাৰক এপসমূহে আপোনাৰ ছিষ্টেম কনফিগাৰেশ্বনক ক্ষতিগ্ৰস্ত কৰিব পাৰে৷"</string> + <string name="permlab_writeSettings" msgid="8057285063719277394">"ছিষ্টেম ছেটিংহ সংশোধন কৰক"</string> + <string name="permdesc_writeSettings" msgid="8293047411196067188">"এপ্টোক ছিষ্টেমৰ ছেটিঙৰ ডেটা সংশোধন কৰিবলৈ অনুমতি দিয়ে৷ ক্ষতিকাৰক এপ্সমূহে আপোনাৰ ছিষ্টেম কনফিগাৰেশ্বনক ক্ষতিগ্ৰস্ত কৰিব পাৰে৷"</string> <string name="permlab_receiveBootCompleted" msgid="6643339400247325379">"আৰম্ভ হোৱাৰ সময়ত চলাওক"</string> <string name="permdesc_receiveBootCompleted" product="tablet" msgid="5565659082718177484">"ছিষ্টেমে বুট কৰা কাৰ্য সমাপ্ত কৰাৰ লগে লগে এপটোক নিজে নিজে আৰম্ভ হ\'বলৈ অনুমতি দিয়ে। ইয়াৰ ফলত ফ\'নটো ষ্টাৰ্ট হওতে বেছি সময়ৰ প্ৰয়োজন হ\'ব পাৰে, আৰু এপটো সদায় চলি থকাৰ কাৰণে ফ\'নটো সামগ্ৰিকভাৱে লেহেমীয়া হ\'ব পাৰে।"</string> <string name="permdesc_receiveBootCompleted" product="tv" msgid="4900842256047614307">"ছিষ্টেমে বুটিং সমাপ্ত কৰাৰ লগে লগে এই এপ্টোক নিজে নিজে আৰম্ভ হ’বলৈ অনুমতি দিয়ে। এই কাৰ্যৰ বাবে আপোনাৰ Android TV ডিভাইচটো আৰম্ভ হ’বলৈ দীঘলীয়া সময়ৰ প্ৰয়োজন হ’ব পাৰে আৰু সকলো সময়তে চলি থাকি এপ্টোক সামগ্ৰিকভাৱে ডিভাইচটো লেহেমীয়া কৰিবলৈ দিয়ে।"</string> @@ -442,8 +442,8 @@ <string name="permdesc_accessCoarseLocation" msgid="778521847873199160">"এই এপ্টো ব্যৱহাৰ হৈ থকা অৱস্থাত ই অৱস্থান সেৱাসমূহৰ পৰা আপোনাৰ আনুমানিক অৱস্থান লাভ কৰিব পাৰে। এপ্টোৱে অৱস্থান লাভ কৰিবলৈ হ’লে আপোনাৰ ডিভাইচৰ অৱস্থান সেৱাসমূহ অন কৰি ৰাখিবই লাগিব।"</string> <string name="permlab_accessBackgroundLocation" msgid="1721164702777366138">"নেপথ্যত চলি থকা সময়ত অৱস্থানৰ এক্সেছ"</string> <string name="permdesc_accessBackgroundLocation" msgid="8264885066095638105">"এই এপ্টোৱে যিকোনো সময়তে অৱস্থান এক্সেছ কৰিব পাৰে, আনকি এপ্টো ব্যৱহাৰ হৈ নথকা অৱস্থাতো।"</string> - <string name="permlab_modifyAudioSettings" msgid="6129039778010031815">"আপোনাৰ অডিঅ\' ছেটিংসমূহ সলনি কৰক"</string> - <string name="permdesc_modifyAudioSettings" msgid="8687227609663124921">"এপটোক ভলিউমৰ দৰে গ্ল\'বেল অডিঅ\' ছেটিংসমূহ যাৰ স্পীকাৰক আউটপুটৰ বাবে ব্যৱহাৰ হয় তাক সলনি কৰিবলৈ অনুমতি দিয়ে৷"</string> + <string name="permlab_modifyAudioSettings" msgid="6129039778010031815">"আপোনাৰ অডিঅ\' ছেটিং সলনি কৰক"</string> + <string name="permdesc_modifyAudioSettings" msgid="8687227609663124921">"এপ্টোক ভলিউমৰ দৰে গ্ল\'বেল অডিঅ\' ছেটিং আৰু আউটপুটৰ বাবে কোনটো স্পীকাৰ ব্যৱহাৰ হয় তাক সলনি কৰিবলৈ অনুমতি দিয়ে৷"</string> <string name="permlab_recordAudio" msgid="1208457423054219147">"অডিঅ\' ৰেকর্ড কৰক"</string> <string name="permdesc_recordAudio" msgid="5857246765327514062">"এই এপ্টোৱে ইয়াক ব্যৱহাৰ কৰি থাকোঁতে মাইক্ৰ’ফ’ন ব্যৱহাৰ কৰি অডিঅ’ ৰেকর্ড কৰিব পাৰে।"</string> <string name="permlab_recordBackgroundAudio" msgid="5891032812308878254">"নেপথ্যত অডিঅ’ ৰেকৰ্ড কৰক"</string> @@ -519,7 +519,7 @@ <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="191079868596433554">"আপোনাৰ টেবলেটৰ লগতে মাল্টিকাষ্ট ঠিকনাবোৰ ও ব্যৱহাৰ কৰি এপক ৱাই-ফাই নেটৱর্কত থকা সকলো ডিভাইচলৈ পঠোৱা পেকেট প্ৰাপ্ত কৰিবলৈ অনুমতি দিয়ে। এই কার্যই ন\'ন মাল্টিকাষ্ট ম\'ডতকৈ বেটাৰিৰ অধিক চ্চাৰ্জ ব্যৱহাৰ কৰে।"</string> <string name="permdesc_changeWifiMulticastState" product="tv" msgid="1336952358450652595">"কেৱল আপোনাৰ Android TV ডিভাইচটোৱেই নহয়, মাল্টিকাষ্ট ঠিকনাবোৰ ব্যৱহাৰ কৰি এটা ৱাই-ফাই নেটৱর্কত থকা সকলো ডিভাইচলৈ পঠোৱা পেকেটবোৰ লাভ কৰিবলৈ এপ্টোক অনুমতি দিয়ে। এই কার্যই ন’ন-মাল্টিকাষ্ট ম’ডতকৈ অধিক পাৱাৰ ব্যৱহাৰ কৰে।"</string> <string name="permdesc_changeWifiMulticastState" product="default" msgid="8296627590220222740">"আপোনাৰ ফ\'নৰ লগতে মাল্টিকাষ্ট ঠিকনাবোৰ ও ব্যৱহাৰ কৰি এপক ৱাই-ফাই নেটৱর্কত থকা সকলো ডিভাইচলৈ পঠোৱা পেকেট প্ৰাপ্ত কৰিবলৈ অনুমতি দিয়ে। এই কার্যই ন\'ন মাল্টিকাষ্ট ম\'ডতকৈ বেটাৰিৰ অধিক চ্চাৰ্জ ব্যৱহাৰ কৰে।"</string> - <string name="permlab_bluetoothAdmin" msgid="6490373569441946064">"ব্লুটুথ ছেটিংসমূহ ব্যৱহাৰ কৰক"</string> + <string name="permlab_bluetoothAdmin" msgid="6490373569441946064">"ব্লুটুথ ছেটিং এক্সেছ কৰক"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="5370837055438574863">"স্থানীয় ব্লুটুথ টে\'বলেট কনফিগাৰ কৰিবলৈ আৰু দূৰৱৰ্তী ডিভাইচসমূহৰ সৈতে যোৰা লগাবলৈ আৰু বিচাৰি উলিয়াবলৈ এপটোক অনুমতি দিয়ে।"</string> <string name="permdesc_bluetoothAdmin" product="tv" msgid="1623992984547014588">"এপ্টোক আপোনাৰ Android TV ডিভাইচটোত ব্লুটুথ কনফিগাৰ কৰিবলৈ আৰু ৰিম’ট ডিভাইচসমূহ বিচাৰি উলিয়াবলৈ আৰু পেয়াৰ কৰিবলৈ অনুমতি দিয়ে।"</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="7381341743021234863">"স্থানীয় ব্লুটুথ ফ\'ন কনফিগাৰ কৰিবলৈ আৰু দূৰৱৰ্তী ডিভাইচসমূহৰ সৈতে যোৰা লগাবলৈ আৰু বিচাৰি উলিয়াবলৈ এপটোক অনুমতি দিয়ে।"</string> @@ -547,7 +547,7 @@ <string name="permdesc_nfc" msgid="8352737680695296741">"এপটোক নিয়েৰ ফিল্ড কমিউনিকেশ্বন (NFC) টেগ, কাৰ্ড আৰু ৰিডাৰসমূহৰ সৈতে যোগাযোগ কৰিবলৈ অনুমতি দিয়ে।"</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"আপোনাৰ স্ক্ৰীন লক অক্ষম কৰক"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"এপটোক কী ল\'ক আৰু জড়িত হোৱা যিকোনো পাছৱৰ্ডৰ সুৰক্ষা অক্ষম কৰিব দিয়ে৷ উদাহৰণস্বৰূপে, কোনো অন্তৰ্গামী ফ\'ন কল উঠোৱাৰ সময়ত ফ\'নটোৱে কী-লকটো অক্ষম কৰে, তাৰ পিছত কল শেষ হ\'লেই কী লকটো পুনৰ সক্ষম কৰে৷"</string> - <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"স্ক্ৰীণ লকৰ জটিলতাৰ অনুৰোধ"</string> + <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"স্ক্ৰীন লকৰ জটিলতাৰ অনুৰোধ"</string> <string name="permdesc_requestPasswordComplexity" msgid="1130556896836258567">"এপ্টোক স্ক্ৰীন লকৰ জটিলতাৰ স্তৰ (উচ্চ, মধ্যম, নিম্ন বা একেবাৰে নাই)ৰ বিষয়ে জানিবলৈ অনুমতি দিয়ে, যিয়ে স্ক্ৰীন লকৰ সম্ভাব্য দৈৰ্ঘ্য বা স্ক্ৰীন লকৰ প্ৰকাৰ দৰ্শায়। লগতে এপ্টোৱে ব্যৱহাৰকাৰীক স্ক্ৰীন লকটো এটা নিৰ্দিষ্ট স্তৰলৈ আপডে’ট কৰিবলৈ পৰামৰ্শ দিব পাৰে যিটো ব্যৱহাৰকাৰীয়ে অৱজ্ঞা কৰি পৰৱর্তী পৃষ্ঠালৈ যাব পাৰে। মনত ৰাখিব যে স্ক্ৰীন লকটো সাধাৰণ পাঠ হিচাপে ষ্ট\'ৰ কৰা নহয়; সেয়েহে, এপ্টোৱে সঠিক পাছৱৰ্ডটো জানিব নোৱাৰে।"</string> <string name="permlab_useBiometric" msgid="6314741124749633786">"বায়োমেট্ৰিক হাৰ্ডৱেৰ ব্য়ৱহাৰ কৰক"</string> <string name="permdesc_useBiometric" msgid="7502858732677143410">"বিশ্বাসযোগ্য়তা প্ৰমাণীকৰণৰ বাবে এপক বায়োমেট্ৰিক হাৰ্ডৱেৰ ব্য়ৱহাৰ কৰিবলৈ অনুমতি দিয়ে"</string> @@ -640,7 +640,7 @@ <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"আপোনাৰ মূৰটো অলপ কমকৈ হেলনীয়া কৰক।"</string> <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"আপোনাৰ মূৰটো সামান্য কমকৈ ঘূৰাওক।"</string> <string name="face_acquired_obscured" msgid="4917643294953326639">"আপোনাৰ মুখখন ঢাকি ৰখা বস্তুবোৰ আঁতৰাওক।"</string> - <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"ক’লা বাৰডালকে ধৰি আপোনাৰ স্ক্রীণৰ ওপৰৰ অংশ চাফা কৰক"</string> + <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"ক’লা বাৰডালকে ধৰি আপোনাৰ স্ক্রীনৰ ওপৰৰ অংশ চাফা কৰক"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"মুখমণ্ডল সত্যাপন কৰিব পৰা নগ’ল। হাৰ্ডৱেৰ নাই।"</string> @@ -664,8 +664,8 @@ </string-array> <string name="face_error_vendor_unknown" msgid="7387005932083302070">"কিবা ভুল হ’ল। পুনৰ চেষ্টা কৰক।"</string> <string name="face_icon_content_description" msgid="465030547475916280">"মুখমণ্ডলৰ আইকন"</string> - <string name="permlab_readSyncSettings" msgid="6250532864893156277">"ছিংকৰ ছেটিংসমূহ পঢ়ক"</string> - <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"একাউণ্টৰ ছিংক ছেটিংবোৰ পঢ়িবলৈ এপক অনুমতি দিয়ে। যেনে, People এপ কোনো একাউণ্টত ছিংক কৰা হৈছে নে নাই সেয়া নির্ধাৰণ কৰিব পাৰে।"</string> + <string name="permlab_readSyncSettings" msgid="6250532864893156277">"ছিংকৰ ছেটিং পঢ়ক"</string> + <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"একাউণ্টৰ ছিংক ছেটিংবোৰ পঢ়িবলৈ এপক অনুমতি দিয়ে। যেনে, People এপ্টো কোনো একাউণ্টৰ সৈতে ছিংক কৰা হৈছে নে নাই সেয়া নির্ধাৰণ কৰিব পাৰে।"</string> <string name="permlab_writeSyncSettings" msgid="6583154300780427399">"ছিংকক অন আৰু অফ ট\'গল কৰক"</string> <string name="permdesc_writeSyncSettings" msgid="6029151549667182687">"এপটোক কোনো একাউণ্টৰ ছিংক সম্পৰ্কীয় ছেটিংসমূহ সংশোধন কৰিবলৈ অনুমতি দিয়ে৷ উদাহৰণস্বৰূপে, এই কাৰ্যক কোনো একাউণ্টৰ জৰিয়তে People এপটোৰ ছিংক সক্ষম কৰিবলৈ ব্যৱহাৰ কৰিব পাৰি৷"</string> <string name="permlab_readSyncStats" msgid="3747407238320105332">"ছিংকৰ পৰিসংখ্যা পঢ়ক"</string> @@ -727,9 +727,9 @@ <string name="policylab_limitPassword" msgid="4851829918814422199">"পাছৱর্ডৰ নিয়ম ছেট কৰক"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"স্ক্ৰীন লক পাছৱৰ্ড আৰু পিনত অনুমোদিত দৈৰ্ঘ্য আৰু বৰ্ণবোৰ নিয়ন্ত্ৰণ কৰক।।"</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"স্ক্ৰীন আনলক কৰা প্ৰয়াসবোৰ নিৰীক্ষণ কৰক"</string> - <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"স্ক্ৰীণ আনলক কৰোতে লিখা অশুদ্ধ পাছৱৰ্ডৰ হিচাপ ৰাখক, আৰু যদিহে অত্যধিকবাৰ অশুদ্ধ পাছৱৰ্ড লিখা হয় তেন্তে টে\'বলেটটো লক কৰক বা টে\'বলেটটোৰ সকলো ডেটা মোহাৰক।"</string> - <string name="policydesc_watchLogin" product="tv" msgid="2140588224468517507">"স্ক্ৰীণ আনলক কৰোঁতে দিয়া ভুল পাছৱৰ্ডবোৰৰ সংখ্যা নিৰীক্ষণ কৰক আৰু যদিহে অত্যধিকবাৰ ভুল পাছৱৰ্ড দিয়া হয় তেন্তে Android TV ডিভাইচটো লক কৰক অথবা আপোনাৰ Android TV ডিভাইচৰ সকলো ডেটা মচক।"</string> - <string name="policydesc_watchLogin" product="default" msgid="4885030206253600299">"স্ক্ৰীণ আনলক কৰোতে লিখা অশুদ্ধ পাছৱৰ্ডৰ হিচাপ ৰাখক, আৰু যদিহে অত্যধিকবাৰ অশুদ্ধ পাছৱৰ্ড লিখা হয় তেন্তে ফ\'নটো লক কৰক বা ফ\'নটোৰ সকলো ডেটা মোহাৰক।"</string> + <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"স্ক্ৰীন আনলক কৰোঁতে টাইপ কৰা অশুদ্ধ পাছৱৰ্ডৰ সংখ্যা নিৰীক্ষণ কৰক আৰু যদিহে অত্যাধিকবাৰ অশুদ্ধ পাছৱৰ্ড টাইপ কৰা হয়, তেন্তে টেবলেটটো লক কৰক বা টেবলেটটোৰ আটাইখিনি ডেটা মচক।"</string> + <string name="policydesc_watchLogin" product="tv" msgid="2140588224468517507">"স্ক্ৰীন আনলক কৰোঁতে টাইপ কৰা ভুল পাছৱৰ্ডবোৰৰ সংখ্যা নিৰীক্ষণ কৰক আৰু যদিহে অত্যাধিকবাৰ ভুল পাছৱৰ্ড টাইপ কৰা হয়, তেন্তে Android TV ডিভাইচটো লক কৰক অথবা আপোনাৰ Android TV ডিভাইচৰ আটাইখিনি ডেটা মচক।"</string> + <string name="policydesc_watchLogin" product="default" msgid="4885030206253600299">"স্ক্ৰীন আনলক কৰোঁতে টাইপ কৰা অশুদ্ধ পাছৱৰ্ডৰ সংখ্যা নিৰীক্ষণ কৰক আৰু যদিহে অত্যাধিকবাৰ অশুদ্ধ পাছৱৰ্ড টাইপ কৰা হয়, তেন্তে ফ\'নটো লক কৰক বা ফ\'নটোৰ আটাইখিনি ডেটা মচক।"</string> <string name="policydesc_watchLogin_secondaryUser" product="tablet" msgid="2049038943004297474">"স্ক্ৰীন আনলক কৰোঁতে টাইপ কৰা অশুদ্ধ পাছৱৰ্ডৰ সংখ্যা নিৰীক্ষণ কৰক আৰু যদিহে অত্যধিকবাৰ অশুদ্ধ পাছৱৰ্ড টাইপ কৰা হয়, তেন্তে টেবলেটটো লক কৰক বা এই ব্যৱহাৰকাৰীৰ আটাইখিনি ডেটা মচক।"</string> <string name="policydesc_watchLogin_secondaryUser" product="tv" msgid="8965224107449407052">"স্ক্ৰীনখন আনলক কৰোঁতে টাইপ কৰা ভুল পাছৱৰ্ডবোৰৰ সংখ্যা নিৰীক্ষণ কৰক আৰু যদিহে অত্যধিকবাৰ ভুল পাছৱৰ্ড টাইপ কৰা হয়, তেন্তে Android TV ডিভাইচটো লক কৰক অথবা এই ব্যৱহাৰকাৰীৰ আটাইখিনি ডেটা মচক।"</string> <string name="policydesc_watchLogin_secondaryUser" product="default" msgid="9177645136475155924">"স্ক্ৰীনখন আনলক কৰোঁতে টাইপ কৰা ভুল পাছৱৰ্ডবোৰৰ সংখ্যা নিৰীক্ষণ কৰক আৰু যদিহে অত্যধিকবাৰ ভুল পাছৱৰ্ড টাইপ কৰা হয়, তেন্তে ফ\'নটো লক কৰক অথবা এই ব্যৱহাৰকাৰীৰ আটাইখিনি ডেটা মচক।"</string> @@ -754,7 +754,7 @@ <string name="policylab_disableCamera" msgid="5749486347810162018">"কেমেৰাবোৰ অক্ষম কৰক"</string> <string name="policydesc_disableCamera" msgid="3204405908799676104">"সকলো ডিভাইচৰ কেমেৰাবোৰ ব্যৱহাৰ কৰাত বাধা দিয়ক।"</string> <string name="policylab_disableKeyguardFeatures" msgid="5071855750149949741">"স্ক্ৰীন লকৰ কিছুমান সুবিধা অক্ষম কৰক"</string> - <string name="policydesc_disableKeyguardFeatures" msgid="6641673177041195957">"স্ক্ৰীণ লকৰ কিছুমান সুবিধা ব্যৱহাৰ হোৱাত বাধা দিয়ক।"</string> + <string name="policydesc_disableKeyguardFeatures" msgid="6641673177041195957">"স্ক্ৰীন লকৰ কিছুমান সুবিধা ব্যৱহাৰ হোৱাত বাধা দিয়ক।"</string> <string-array name="phoneTypes"> <item msgid="8996339953292723951">"ঘৰ"</item> <item msgid="7740243458912727194">"ম’বাইল"</item> @@ -1212,7 +1212,7 @@ <string name="whichImageCaptureApplicationLabel" msgid="6505433734824988277">"প্ৰতিচ্ছবি তোলক"</string> <string name="alwaysUse" msgid="3153558199076112903">"এই কার্যৰ বাবে পূর্বনির্ধাৰিত ধৰণে ব্যৱহাৰ কৰক।"</string> <string name="use_a_different_app" msgid="4987790276170972776">"এটা পৃথক এপ্ ব্যৱহাৰ কৰক"</string> - <string name="clearDefaultHintMsg" msgid="1325866337702524936">"ছিষ্টেমৰ ছেটিংসমূহ > এপসমূহ > ডাউনল’ড কৰা সমল-লৈ গৈ ডিফ\'ল্ট মচক৷"</string> + <string name="clearDefaultHintMsg" msgid="1325866337702524936">"ছিষ্টেমৰ ছেটিং > এপ্ > ডাউনল’ড কৰা সমল-লৈ গৈ ডিফ\'ল্ট মচক৷"</string> <string name="chooseActivity" msgid="8563390197659779956">"কোনো কার্য বাছনি কৰক"</string> <string name="chooseUsbActivity" msgid="2096269989990986612">"ইউএছবি ডিভাইচৰ বাবে এটা এপ্ বাছনি কৰক"</string> <string name="noApplications" msgid="1186909265235544019">"কোনো এপে এই কাৰ্য কৰিব নোৱাৰে।"</string> @@ -1240,7 +1240,7 @@ <string name="launch_warning_original" msgid="3332206576800169626">"<xliff:g id="APP_NAME">%1$s</xliff:g>ক পূৰ্বতে লঞ্চ কৰা হৈছিল৷"</string> <string name="screen_compat_mode_scale" msgid="8627359598437527726">"স্কেল"</string> <string name="screen_compat_mode_show" msgid="5080361367584709857">"সদায় দেখুৱাওক"</string> - <string name="screen_compat_mode_hint" msgid="4032272159093750908">"ছিষ্টেমৰ ছেটিংসমূহ > এপসমূহ > ডাউনল’ড কৰা সমল-লৈ গৈ ইয়াক আকৌ সক্ষম কৰক।"</string> + <string name="screen_compat_mode_hint" msgid="4032272159093750908">"ছিষ্টেমৰ ছেটিং > এপ্ > ডাউনল’ড কৰা সমল-লৈ গৈ ইয়াক আকৌ সক্ষম কৰক।"</string> <string name="unsupported_display_size_message" msgid="7265211375269394699">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ বর্তমানৰ ডিছপ্লে’ৰ আকাৰ ছেটিং ব্যৱহাৰ কৰিব নোৱাৰে আৰু ই সঠিকভাৱে নচলিবও পাৰে।"</string> <string name="unsupported_display_size_show" msgid="980129850974919375">"সদায় দেখুৱাওক"</string> <string name="unsupported_compile_sdk_message" msgid="7326293500707890537">"<xliff:g id="APP_NAME">%1$s</xliff:g>ক এটা খাপ নোখোৱা Android OS সংস্কৰণৰ বাবে তৈয়াৰ কৰা হৈছিল, যাৰ ফলত ই অস্বাভাৱিকধৰণে আচৰণ কৰিব পাৰে। এপটোৰ শেহতীয়া সংস্কৰণ উপলব্ধ হ\'ব পাৰে।"</string> @@ -1337,7 +1337,7 @@ <string name="sms_short_code_confirm_allow" msgid="920477594325526691">"পঠিয়াওক"</string> <string name="sms_short_code_confirm_deny" msgid="1356917469323768230">"বাতিল কৰক"</string> <string name="sms_short_code_remember_choice" msgid="1374526438647744862">"মোৰ পচন্দ মনত ৰাখিব"</string> - <string name="sms_short_code_remember_undo_instruction" msgid="2620984439143080410">"আপুনি ইয়াক পিছত ছেটিং > এপ্-ত সলনি কৰিব পাৰে"</string> + <string name="sms_short_code_remember_undo_instruction" msgid="2620984439143080410">"আপুনি ইয়াক পিছত ছেটিং > এপত সলনি কৰিব পাৰে"</string> <string name="sms_short_code_confirm_always_allow" msgid="2223014893129755950">"যিকোনো সময়ত অনুমতি দিয়ক"</string> <string name="sms_short_code_confirm_never_allow" msgid="2688828813521652079">"কেতিয়াও অনুমতি নিদিব"</string> <string name="sim_removed_title" msgid="5387212933992546283">"ছিম কাৰ্ড আঁতৰোৱা হ’ল"</string> @@ -1402,7 +1402,7 @@ <string name="alert_windows_notification_channel_group_name" msgid="6063891141815714246">"অন্য এপৰ ওপৰত দেখুৱায়"</string> <string name="alert_windows_notification_channel_name" msgid="3437528564303192620">"<xliff:g id="NAME">%s</xliff:g> অন্য এপসমূহৰ ওপৰত প্ৰদৰ্শিত হৈ আছে"</string> <string name="alert_windows_notification_title" msgid="6331662751095228536">"<xliff:g id="NAME">%s</xliff:g>এ অইন এপবোৰৰ ওপৰত প্ৰদৰ্শিত হৈ আছে"</string> - <string name="alert_windows_notification_message" msgid="6538171456970725333">"আপুনি যদি <xliff:g id="NAME">%s</xliff:g>এ এই সুবিধাটো ব্যৱহাৰ কৰাটো নিবিচাৰে তেন্তে টিপি ছেটিংসমূহ খোলক আৰু ইয়াক অফ কৰক।"</string> + <string name="alert_windows_notification_message" msgid="6538171456970725333">"আপুনি যদি <xliff:g id="NAME">%s</xliff:g>এ এই সুবিধাটো ব্যৱহাৰ কৰাটো নিবিচাৰে তেন্তে ছেটিং খুলিবলৈ টিপক আৰু ইয়াক অফ কৰক।"</string> <string name="alert_windows_notification_turn_off_action" msgid="7805857234839123780">"অফ কৰক"</string> <string name="ext_media_checking_notification_title" msgid="8299199995416510094">"<xliff:g id="NAME">%s</xliff:g> পৰীক্ষা কৰি থকা হৈছে…"</string> <string name="ext_media_checking_notification_message" msgid="2231566971425375542">"বৰ্তমানৰ সমলৰ সমীক্ষা কৰি থকা হৈছে"</string> @@ -1504,7 +1504,7 @@ <string name="vpn_lockdown_connected" msgid="2853127976590658469">"সদা-সক্ৰিয় ভিপিএন সংযোগ কৰা হ’ল"</string> <string name="vpn_lockdown_disconnected" msgid="5573611651300764955">"সদা-সক্ৰিয় ভিপিএনৰ লগত সংযোগ বিচ্ছিন্ন কৰা হৈছে"</string> <string name="vpn_lockdown_error" msgid="4453048646854247947">"সদা-সক্ৰিয় ভিপিএনৰ লগত সংযোগ কৰিব পৰা নাই"</string> - <string name="vpn_lockdown_config" msgid="8331697329868252169">"নেটৱৰ্ক বা ভিপিএন ছেটিংসমূহ সলনি কৰক"</string> + <string name="vpn_lockdown_config" msgid="8331697329868252169">"নেটৱৰ্ক বা VPN ছেটিং সলনি কৰক"</string> <string name="upload_file" msgid="8651942222301634271">"ফাইল বাছনি কৰক"</string> <string name="no_file_chosen" msgid="4146295695162318057">"কোনো ফাইল বাছনি কৰা হোৱা নাই"</string> <string name="reset" msgid="3865826612628171429">"ৰিছেট কৰক"</string> @@ -1692,10 +1692,10 @@ <string name="accessibility_shortcut_warning_dialog_title" msgid="4017995837692622933">"দিব্যাংগসকলৰ সুবিধাৰ শ্বৰ্টকাট ব্যৱহাৰ কৰেনে?"</string> <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"শ্বৰ্টকাটটো অন হৈ থকাৰ সময়ত দুয়োটা ভলিউম বুটাম ৩ ছেকেণ্ডৰ বাবে হেঁচি ধৰি ৰাখিলে এটা সাধ্য সুবিধা আৰম্ভ হ’ব।"</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"সাধ্য সুবিধাসমূহৰ বাবে শ্বৰ্টকাট অন কৰিবনে?"</string> - <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"দুয়োটা ভলিউম কী কিছুসময়ৰ বাবে ধৰি থাকিলে সাধ্য-সুবিধাসমূহ অন কৰে। এইটোৱে আপোনাৰ ডিভাইচটোৱে কাম কৰাৰ ধৰণ সলনি কৰিব পাৰে।\n\nবর্তমানৰ সুবিধাসমূহ:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nআপুনি ছেটিংসমূহ > সাধ্য-সুবিধাত কিছুমান নিৰ্দিষ্ট সুবিধা সলনি কৰিব পাৰে।"</string> + <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"দুয়োটা ভলিউম কী কিছুসময়ৰ বাবে ধৰি থাকিলে সাধ্য-সুবিধাসমূহ অন কৰে। এইটোৱে আপোনাৰ ডিভাইচটোৱে কাম কৰাৰ ধৰণ সলনি কৰিব পাৰে।\n\nবর্তমানৰ সুবিধাসমূহ:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nআপুনি ছেটিং > সাধ্য-সুবিধাত কিছুমান নিৰ্দিষ্ট সুবিধা সলনি কৰিব পাৰে।"</string> <string name="accessibility_shortcut_multiple_service_list" msgid="2128323171922023762">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"<xliff:g id="SERVICE">%1$s</xliff:g>ৰ শ্বৰ্টকাট অন কৰিবনে?"</string> - <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"দুয়োটা ভলিউম কী কিছুসময়ৰ বাবে ধৰি থাকিলে এটা সাধ্য- সুবিধা <xliff:g id="SERVICE">%1$s</xliff:g> অন কৰে। এইটোৱে আপোনাৰ ডিভাইচটোৱে কাম কৰাৰ ধৰণ সলনি কৰিব পাৰে।\n\nআপুনি ছেটিংসমূহ > সাধ্য-সুবিধাসমূহত এই শ্বৰ্টকাটটো অন্য এটা সুবিধালৈ সলনি কৰিব পাৰে।"</string> + <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"দুয়োটা ভলিউম কী কিছুসময়ৰ বাবে ধৰি থাকিলে এটা সাধ্য- সুবিধা <xliff:g id="SERVICE">%1$s</xliff:g> অন কৰে। এইটোৱে আপোনাৰ ডিভাইচটোৱে কাম কৰাৰ ধৰণ সলনি কৰিব পাৰে।\n\nআপুনি ছেটিং > সাধ্য-সুবিধাসমূহত এই শ্বৰ্টকাটটো অন্য এটা সুবিধালৈ সলনি কৰিব পাৰে।"</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"অন কৰক"</string> <string name="accessibility_shortcut_off" msgid="3651336255403648739">"অন নকৰিব"</string> <string name="accessibility_shortcut_menu_item_status_on" msgid="6608392117189732543">"অন কৰা আছে"</string> @@ -1703,8 +1703,8 @@ <string name="accessibility_enable_service_title" msgid="3931558336268541484">"<xliff:g id="SERVICE">%1$s</xliff:g>ক আপোনাৰ ডিভাইচটোৰ সম্পূর্ণ নিয়ন্ত্ৰণ দিবনে?"</string> <string name="accessibility_enable_service_encryption_warning" msgid="8603532708618236909">"যদি আপুনি <xliff:g id="SERVICE">%1$s</xliff:g> অন কৰে, তেন্তে আপোনাৰ ডিভাইচটোৱে ডেটা এনক্ৰিপশ্বনৰ গুণগত মান উন্নত কৰিবলৈ স্ক্ৰীন লক ব্যৱহাৰ নকৰে।"</string> <string name="accessibility_service_warning_description" msgid="291674995220940133">"আপোনাক সাধ্য সুবিধাৰ প্ৰয়োজনসমূহৰ জৰিয়তে সহায় কৰা এপ্সমূহৰ বাবে সম্পূর্ণ নিয়ন্ত্ৰণৰ সুবিধাটো সঠিক যদিও অধিকাংশ এপৰ বাবে এয়া সঠিক নহয়।"</string> - <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"চাওক আৰু স্ক্ৰীণ নিয়ন্ত্ৰণ কৰক"</string> - <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"ই স্ক্ৰীণৰ সকলো সমল পঢ়িব পাৰে আৰু অন্য এপ্সমূহৰ ওপৰত সমল প্ৰদর্শন কৰিব পাৰে।"</string> + <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"চাওক আৰু স্ক্ৰীন নিয়ন্ত্ৰণ কৰক"</string> + <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"ই স্ক্ৰীনত থকা আটাইখিনি সমল পঢ়িব পাৰে আৰু অন্য এপ্সমূহৰ ওপৰত সমল প্ৰদর্শন কৰিব পাৰে।"</string> <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"কার্যসমূহ চাওক আৰু কৰক"</string> <string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"ই আপুনি কোনো এপ্ বা হার্ডৱেৰ ছেন্সৰৰ সৈতে কৰা ভাব-বিনিময় আৰু আপোনাৰ হৈ অন্য কোনো লোকে এপৰ সৈতে কৰা ভাব-বিনিময় ট্ৰেক কৰিব পাৰে।"</string> <string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"অনুমতি দিয়ক"</string> @@ -1854,7 +1854,7 @@ <item quantity="other"> <xliff:g id="COUNT">%d</xliff:g> ছেকেণ্ডত আকৌ চেষ্টা কৰক</item> </plurals> <string name="restr_pin_try_later" msgid="5897719962541636727">"পিছত আকৌ চেষ্টা কৰক"</string> - <string name="immersive_cling_title" msgid="2307034298721541791">"স্ক্ৰীণ পূৰ্ণৰূপত চাই আছে"</string> + <string name="immersive_cling_title" msgid="2307034298721541791">"স্ক্ৰীন পূৰ্ণৰূপত চাই আছে"</string> <string name="immersive_cling_description" msgid="7092737175345204832">"বাহিৰ হ\'বলৈ ওপৰৰপৰা তললৈ ছোৱাইপ কৰক।"</string> <string name="immersive_cling_positive" msgid="7047498036346489883">"বুজি পালোঁ"</string> <string name="done_label" msgid="7283767013231718521">"সম্পন্ন কৰা হ’ল"</string> @@ -2087,7 +2087,7 @@ <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"অসুবিধা নিদিব সলনি হৈছে"</string> <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"কি কি অৱৰোধ কৰা হৈছে জানিবলৈ টিপক।"</string> <string name="notification_app_name_system" msgid="3045196791746735601">"ছিষ্টেম"</string> - <string name="notification_app_name_settings" msgid="9088548800899952531">"ছেটিংসমূহ"</string> + <string name="notification_app_name_settings" msgid="9088548800899952531">"ছেটিং"</string> <string name="notification_appops_camera_active" msgid="8177643089272352083">"কেমেৰা"</string> <string name="notification_appops_microphone_active" msgid="581333393214739332">"মাইক্ৰ\'ফ\'ন"</string> <string name="notification_appops_overlay_active" msgid="5571732753262836481">"আপোনাৰ স্ক্ৰীনত থকা অন্য় এপৰ ওপৰত প্ৰদৰ্শিত হৈ আছে"</string> @@ -2141,7 +2141,7 @@ <string name="accessibility_system_action_back_label" msgid="4205361367345537608">"উভতি যাওক"</string> <string name="accessibility_system_action_recents_label" msgid="4782875610281649728">"শেহতীয়া এপ্সমূহ"</string> <string name="accessibility_system_action_notifications_label" msgid="6083767351772162010">"জাননীসমূহ"</string> - <string name="accessibility_system_action_quick_settings_label" msgid="4583900123506773783">"ক্ষিপ্ৰ ছেটিংসমূহ"</string> + <string name="accessibility_system_action_quick_settings_label" msgid="4583900123506773783">"ক্ষিপ্ৰ ছেটিং"</string> <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"পাৱাৰ ডায়লগ"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"লক স্ক্ৰীন"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"স্ক্ৰীণশ্বট"</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index a35c39e1f5b6..7bc5905f5136 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -325,7 +325,7 @@ <string name="permgrouplab_phone" msgid="570318944091926620">"Telèfon"</string> <string name="permgroupdesc_phone" msgid="270048070781478204">"fer i gestionar trucades telefòniques"</string> <string name="permgrouplab_sensors" msgid="9134046949784064495">"Sensors corporals"</string> - <string name="permgroupdesc_sensors" msgid="2610631290633747752">"accedir a les dades del sensor sobre els signes vitals"</string> + <string name="permgroupdesc_sensors" msgid="2610631290633747752">"accedir a les dades del sensor sobre les constants vitals"</string> <string name="capability_title_canRetrieveWindowContent" msgid="7554282892101587296">"Recuperar el contingut de la finestra"</string> <string name="capability_desc_canRetrieveWindowContent" msgid="6195610527625237661">"Inspecciona el contingut d\'una finestra amb què estàs interaccionant."</string> <string name="capability_title_canRequestTouchExploration" msgid="327598364696316213">"Activar Exploració tàctil"</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index c653c31ac9cc..afc064461f9e 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -1058,7 +1058,7 @@ </plurals> <string name="last_month" msgid="1528906781083518683">"El mes pasado"</string> <string name="older" msgid="1645159827884647400">"Anterior"</string> - <string name="preposition_for_date" msgid="2780767868832729599">"el <xliff:g id="DATE">%s</xliff:g>"</string> + <string name="preposition_for_date" msgid="2780767868832729599">"<xliff:g id="DATE">%s</xliff:g>"</string> <string name="preposition_for_time" msgid="4336835286453822053">"a las <xliff:g id="TIME">%s</xliff:g>"</string> <string name="preposition_for_year" msgid="3149809685340130039">"en <xliff:g id="YEAR">%s</xliff:g>"</string> <string name="day" msgid="8394717255950176156">"día"</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index 221c20ef7f6f..d674a5d94a43 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -601,7 +601,7 @@ <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Aucune empreinte digitale enregistrée."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Cet appareil ne possède pas de capteur d\'empreintes digitales."</string> <string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"Le capteur a été désactivé temporairement."</string> - <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"Impossible utiliser capteur empreinte digitale. Consultez un fournisseur de services de réparation"</string> + <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"Impossible d\'utiliser le capteur d\'empreintes digitales. Consultez un fournisseur de services de réparation"</string> <string name="fingerprint_name_template" msgid="8941662088160289778">"Doigt <xliff:g id="FINGERID">%d</xliff:g>"</string> <string name="fingerprint_app_setting_name" msgid="4253767877095495844">"Utiliser l\'empreinte digitale"</string> <string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"Utiliser l\'empreinte digitale ou le verrouillage de l\'écran"</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 304bd1552ed5..6cde84781e7e 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -747,10 +747,10 @@ <string name="policydesc_wipeData_secondaryUser" product="default" msgid="2788325512167208654">"इस फ़ोन पर मौजूद इस उपयोगकर्ता का डेटा बिना चेतावनी के मिटा दें."</string> <string name="policylab_setGlobalProxy" msgid="215332221188670221">"डिवाइस वैश्विक प्रॉक्सी सेट करें"</string> <string name="policydesc_setGlobalProxy" msgid="7149665222705519604">"नीति चालू होने के दौरान इस्तेमाल करने के लिए डिवाइस ग्लोबल प्रॉक्सी सेट करें. केवल डिवाइस का मालिक ही ग्लोबल प्रॉक्सी सेट कर सकता है."</string> - <string name="policylab_expirePassword" msgid="6015404400532459169">"स्क्रीन लॉक पासवर्ड समाप्ति सेट करें"</string> + <string name="policylab_expirePassword" msgid="6015404400532459169">"स्क्रीन लॉक पासवर्ड के खत्म होने की अवधि सेट करें"</string> <string name="policydesc_expirePassword" msgid="9136524319325960675">"यह बदलें कि स्क्रीन लॉक पासवर्ड, पिन या पैटर्न को कितने समय में बदला जाना चाहिए."</string> <string name="policylab_encryptedStorage" msgid="9012936958126670110">"मेमोरी को सुरक्षित करने का तरीका सेट करें"</string> - <string name="policydesc_encryptedStorage" msgid="1102516950740375617">"संग्रहित ऐप्स डेटा को एन्क्रिप्ट किया जाना आवश्यक है."</string> + <string name="policydesc_encryptedStorage" msgid="1102516950740375617">"स्टोर किए गए ऐप डेटा को एन्क्रिप्ट किया जाना ज़रूरी है."</string> <string name="policylab_disableCamera" msgid="5749486347810162018">"कैमरों को अक्षम करें"</string> <string name="policydesc_disableCamera" msgid="3204405908799676104">"सभी डिवाइस कैमरों का उपयोग रोकें."</string> <string name="policylab_disableKeyguardFeatures" msgid="5071855750149949741">"स्क्रीन लॉक की कुछ सुविधाएं बंद करना"</string> diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml index 62639a3b8667..94989805353a 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -916,7 +916,7 @@ <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="3118353451602377380">"Құпия сөзді <xliff:g id="NUMBER_0">%1$d</xliff:g> рет қате тердіңіз. \n\n <xliff:g id="NUMBER_1">%2$d</xliff:g> секундтан кейін қайталаңыз."</string> <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="2874278239714821984">"PIN кодын <xliff:g id="NUMBER_0">%1$d</xliff:g> рет қате тердіңіз. \n\n <xliff:g id="NUMBER_1">%2$d</xliff:g> секундтан кейін қайталаңыз."</string> <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="3069635524964070596">"Бекітпесін ашу өрнегін <xliff:g id="NUMBER_0">%1$d</xliff:g> рет қате салдыңыз. Тағы <xliff:g id="NUMBER_1">%2$d</xliff:g> сәтсіз әрекеттен кейін сізден Google жүйесіне кіріп планшет бекітпесін ашу сұралады.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> секундтан кейін әрекетті қайталаңыз."</string> - <string name="lockscreen_failed_attempts_almost_glogin" product="tv" msgid="6399092175942158529">"Құлыпты ашу өрнегін <xliff:g id="NUMBER_0">%1$d</xliff:g> рет дұрыс сызбадыңыз. Енді тағы <xliff:g id="NUMBER_1">%2$d</xliff:g> рет қателессеңіз, Android TV құрылғыңыздың құлпын ашу үшін Google есептік жазбаңызға кіру керек болады.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> секундтан кейін қайталап көріңіз."</string> + <string name="lockscreen_failed_attempts_almost_glogin" product="tv" msgid="6399092175942158529">"Құлыпты ашу өрнегін <xliff:g id="NUMBER_0">%1$d</xliff:g> рет дұрыс сызбадыңыз. Енді тағы <xliff:g id="NUMBER_1">%2$d</xliff:g> рет қателессеңіз, Android TV құрылғыңыздың құлпын ашу үшін Google аккаунтыңызға кіру керек болады.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> секундтан кейін қайталап көріңіз."</string> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="5691623136957148335">"Бекітпесін ашу өрнегін <xliff:g id="NUMBER_0">%1$d</xliff:g> рет қате салдыңыз. Тағы <xliff:g id="NUMBER_1">%2$d</xliff:g> сәтсіз әрекеттен кейін сізден Google жүйесіне кіріп телефон бекітпесін ашу сұралады.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> секундтан кейін әрекетті қайталаңыз."</string> <string name="lockscreen_failed_attempts_almost_at_wipe" product="tablet" msgid="7914445759242151426">"Планшеттің бекітпесін ашуға <xliff:g id="NUMBER_0">%1$d</xliff:g> рет қате әрекеттендіңіз. <xliff:g id="NUMBER_1">%2$d</xliff:g> сәтсіз әрекеттен кейін, телефон зауыттың бастапқы параметрлеріне қайта реттеледі және пайдаланушы деректері жоғалады."</string> <string name="lockscreen_failed_attempts_almost_at_wipe" product="tv" msgid="4275591249631864248">"Android TV құрылғыңыздың құлпын <xliff:g id="NUMBER_0">%1$d</xliff:g> рет дұрыс ашпадыңыз. Енді тағы <xliff:g id="NUMBER_1">%2$d</xliff:g> рет қателессеңіз, Android TV құрылғыңыздың зауыттық әдепкі параметрлері қайтарылады және одан барлық пайдаланушы деректері өшіп қалады."</string> @@ -928,7 +928,7 @@ <string name="lockscreen_forgot_pattern_button_text" msgid="8362442730606839031">"Кескінді ұмытып қалдыңыз ба?"</string> <string name="lockscreen_glogin_forgot_pattern" msgid="9218940117797602518">"Аккаунттың бекітпесін ашу"</string> <string name="lockscreen_glogin_too_many_attempts" msgid="3775904917743034195">"Тым көп кескін әрекеттері"</string> - <string name="lockscreen_glogin_instructions" msgid="4695162942525531700">"Ашу үшін Google есептік жазбаңызбен кіріңіз."</string> + <string name="lockscreen_glogin_instructions" msgid="4695162942525531700">"Ашу үшін Google аккаунтыңызбен кіріңіз."</string> <string name="lockscreen_glogin_username_hint" msgid="6916101478673157045">"Пайдаланушы атауы (эл. пошта)"</string> <string name="lockscreen_glogin_password_hint" msgid="3031027901286812848">"Құпия сөз"</string> <string name="lockscreen_glogin_submit_button" msgid="3590556636347843733">"Кіру"</string> @@ -1332,8 +1332,8 @@ <string name="sms_control_yes" msgid="4858845109269524622">"Рұқсат беру"</string> <string name="sms_control_no" msgid="4845717880040355570">"Өшіру"</string> <string name="sms_short_code_confirm_message" msgid="1385416688897538724">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> қолданбасы <b><xliff:g id="DEST_ADDRESS">%2$s</xliff:g></b> мекенжайына хабар жіберуді қалайды."</string> - <string name="sms_short_code_details" msgid="2723725738333388351">"Бұл мобильді есептік жазбаңызда "<b>"өзгерістер"</b>" тудыруы мүмкін."</string> - <string name="sms_premium_short_code_details" msgid="1400296309866638111"><b>"Бұл мобильді есептік жазбаңызда өзгерістерді тудырады."</b></string> + <string name="sms_short_code_details" msgid="2723725738333388351">"Бұл мобильді аккаунтыңызда "<b>"өзгерістер"</b>" тудыруы мүмкін."</string> + <string name="sms_premium_short_code_details" msgid="1400296309866638111"><b>"Бұл мобильді аккаунтыңызда өзгерістерді тудырады."</b></string> <string name="sms_short_code_confirm_allow" msgid="920477594325526691">"Жіберу"</string> <string name="sms_short_code_confirm_deny" msgid="1356917469323768230">"Бас тарту"</string> <string name="sms_short_code_remember_choice" msgid="1374526438647744862">"Менің таңдауым есте сақталсын"</string> @@ -1477,7 +1477,7 @@ <string name="ime_action_default" msgid="8265027027659800121">"Орындау"</string> <string name="dial_number_using" msgid="6060769078933953531">"Нөмірді\n <xliff:g id="NUMBER">%s</xliff:g> қолданып теріңіз"</string> <string name="create_contact_using" msgid="6200708808003692594">"Байланысты\n <xliff:g id="NUMBER">%s</xliff:g> нөмірі арқылы орнату"</string> - <string name="grant_credentials_permission_message_header" msgid="5365733888842570481">"Келесі бір немесе бірнеше қолданба қазір және болашақта есептік жазбаңызға қатынасуға рұқсатты сұрап жатыр."</string> + <string name="grant_credentials_permission_message_header" msgid="5365733888842570481">"Келесі бір немесе бірнеше қолданба қазір және болашақта аккаунтыңызға қатынасуға рұқсатты сұрап жатыр."</string> <string name="grant_credentials_permission_message_footer" msgid="1886710210516246461">"Бұл өтініштің орындалуын қалайсыз ба?"</string> <string name="grant_permissions_header_text" msgid="3420736827804657201">"Кіру өтініші"</string> <string name="allow" msgid="6195617008611933762">"Рұқсат беру"</string> @@ -1684,7 +1684,7 @@ <string name="kg_failed_attempts_now_wiping" product="tv" msgid="5045460916106267585">"Android TV құрылғыңыздың құлпын <xliff:g id="NUMBER">%d</xliff:g> рет дұрыс ашпадыңыз. Енді Android TV құрылғыңыздың зауыттық әдепкі параметрлері қайтарылады."</string> <string name="kg_failed_attempts_now_wiping" product="default" msgid="5043730590446071189">"Телефонды ашуға <xliff:g id="NUMBER">%d</xliff:g> рет қате әрекеттендіңіз. Телефон бастапқы зауыттық параметрлеріне қайта реттеледі."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="7086799295109717623">"Бекітпені ашу кескінін <xliff:g id="NUMBER_0">%1$d</xliff:g> рет қате сыздыңыз. After <xliff:g id="NUMBER_1">%2$d</xliff:g> сәтсіз әрекеттен кейін планшетіңізді аккаунт арқылы ашу өтінішін аласыз.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> секундтан кейін қайта әрекеттеніңіз."</string> - <string name="kg_failed_attempts_almost_at_login" product="tv" msgid="4670840383567106114">"Құлыпты ашу өрнегін <xliff:g id="NUMBER_0">%1$d</xliff:g> рет дұрыс сызбадыңыз. Енді тағы <xliff:g id="NUMBER_1">%2$d</xliff:g> рет қателессеңіз, Android TV құрылғыңыздың құлпын ашу үшін есептік жазбаңызға кіру керек болады.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> секундтан кейін қайталап көріңіз."</string> + <string name="kg_failed_attempts_almost_at_login" product="tv" msgid="4670840383567106114">"Құлыпты ашу өрнегін <xliff:g id="NUMBER_0">%1$d</xliff:g> рет дұрыс сызбадыңыз. Енді тағы <xliff:g id="NUMBER_1">%2$d</xliff:g> рет қателессеңіз, Android TV құрылғыңыздың құлпын ашу үшін аккаунтыңызға кіру керек болады.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> секундтан кейін қайталап көріңіз."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="5270861875006378092">"Бекітпені ашу кескінін <xliff:g id="NUMBER_0">%1$d</xliff:g> рет қате сыздыңыз. <xliff:g id="NUMBER_1">%2$d</xliff:g> сәтсіз әрекеттен кейін телефоныңызды аккаунт арқылы ашу өтінішін аласыз. \n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> секундтан кейін қайта әрекеттеніңіз."</string> <string name="kg_text_message_separator" product="default" msgid="4503708889934976866">" — "</string> <string name="kg_reordering_delete_drop_target_text" msgid="2034358143731750914">"Жою"</string> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index bff48b9a8a37..a2aa0ce5b42f 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -321,7 +321,7 @@ <string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"piekļūt jūsu fiziskajām aktivitātēm"</string> <string name="permgrouplab_camera" msgid="9090413408963547706">"Kamera"</string> <string name="permgroupdesc_camera" msgid="7585150538459320326">"uzņemt attēlus un ierakstīt videoklipus"</string> - <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Tuvējās ierīces"</string> + <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Tuvumā esošas ierīces"</string> <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"tuvumā esošu ierīču meklēšana un savienojuma izveide ar tām"</string> <string name="permgrouplab_calllog" msgid="7926834372073550288">"Zvanu žurnāli"</string> <string name="permgroupdesc_calllog" msgid="2026996642917801803">"lasīt un rakstīt tālruņa zvanu žurnālu"</string> @@ -542,7 +542,7 @@ <string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Ļauj lietotnei piekļūt pārī savienotām Bluetooth ierīcēm."</string> <string name="permlab_bluetooth_advertise" msgid="2781147747928853177">"reklamēšana tuvumā esošās Bluetooth ierīcēs"</string> <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"Atļauj lietotnei veikt reklamēšanu tuvumā esošās Bluetooth ierīcēs"</string> - <string name="permlab_uwb_ranging" msgid="8141915781475770665">"novietojuma noteikšana starp tuvu esošām ultraplatjoslas ierīcēm"</string> + <string name="permlab_uwb_ranging" msgid="8141915781475770665">"novietojums starp tuvējām ultraplatjoslas ierīcēm"</string> <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"Atļaut lietotnei noteikt relatīvo atrašanās vietu starp tuvumā esošām ultraplatjoslas ierīcēm"</string> <string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Informācija par vēlamo NFC maksājumu pakalpojumu"</string> <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Ļauj lietotnei iegūt informāciju par vēlamo NFC maksājumu pakalpojumu, piemēram, par reģistrētajiem lietojumprogrammu ID un maršruta galamērķi."</string> diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml index 2acc13d8becb..a5e2cbc0e4be 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -850,7 +850,7 @@ <string name="orgTypeOther" msgid="5450675258408005553">"മറ്റുള്ളവ"</string> <string name="orgTypeCustom" msgid="1126322047677329218">"ഇഷ്ടാനുസൃതം"</string> <string name="relationTypeCustom" msgid="282938315217441351">"ഇഷ്ടാനുസൃതം"</string> - <string name="relationTypeAssistant" msgid="4057605157116589315">"Assistant"</string> + <string name="relationTypeAssistant" msgid="4057605157116589315">"അസിസ്റ്റന്റ്"</string> <string name="relationTypeBrother" msgid="7141662427379247820">"സഹോദരന്"</string> <string name="relationTypeChild" msgid="9076258911292693601">"കുട്ടി"</string> <string name="relationTypeDomesticPartner" msgid="7825306887697559238">"ഗാര്ഹിക പങ്കാളി"</string> @@ -2010,7 +2010,7 @@ <string name="app_category_image" msgid="7307840291864213007">"ഫോട്ടോകളും ചിത്രങ്ങളും"</string> <string name="app_category_social" msgid="2278269325488344054">"സാമൂഹിക ആപ്സുകളും ആശയവിനിമയവും"</string> <string name="app_category_news" msgid="1172762719574964544">"വാർത്തകളും മാസികകളും"</string> - <string name="app_category_maps" msgid="6395725487922533156">"Maps & Navigation"</string> + <string name="app_category_maps" msgid="6395725487922533156">"മാപ്പുകളും നാവിഗേഷനും"</string> <string name="app_category_productivity" msgid="1844422703029557883">"ഉല്പ്പാദനക്ഷമത"</string> <string name="app_category_accessibility" msgid="6643521607848547683">"ഉപയോഗസഹായി"</string> <string name="device_storage_monitor_notification_channel" msgid="5164244565844470758">"ഉപകരണ സ്റ്റോറേജ്"</string> diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml index 23c37b7c6580..eeb2b5760297 100644 --- a/core/res/res/values-mr/strings.xml +++ b/core/res/res/values-mr/strings.xml @@ -408,7 +408,7 @@ <string name="permdesc_receiveBootCompleted" product="default" msgid="7912677044558690092">"जसे सिस्टम बूट करणे समाप्त करते तसे अॅप ला स्वतः सुरू करण्यास अनुमती देते. यामुळे फोन सुरू करण्यास वेळ लागू शकतो आणि नेहमी सुरू राहून एकंदर फोनला धीमे करण्यास अॅप ला अनुमती देते."</string> <string name="permlab_broadcastSticky" msgid="4552241916400572230">"रोचक प्रसारण पाठवा"</string> <string name="permdesc_broadcastSticky" product="tablet" msgid="5058486069846384013">"रोचक प्रसारणे पाठविण्यासाठी अॅप ला अनुमती देते, जे प्रसारण समाप्त झाल्यानंतर देखील तसेच राहते. अत्याधिक वापरामुळे बरीच मेमरी वापरली जाऊन तो टॅब्लेटला धीमा किंवा अस्थिर करू शकतो."</string> - <string name="permdesc_broadcastSticky" product="tv" msgid="2338185920171000650">"चिकट प्रसारणे पाठविण्यासाठी ॲपला अनुमती देते, जे प्रसारण समाप्त झाल्यानंतर देखील तसेच राहते. अत्याधिक वापरामुळे बरीच मेमरी वापरली जाऊन तो तुमच्या Android TV डिव्हाइसला धीमा किंवा अस्थिर करू शकतो."</string> + <string name="permdesc_broadcastSticky" product="tv" msgid="2338185920171000650">"रोचक प्रसारणे पाठविण्यासाठी अॅपला अनुमती देते, जे प्रसारण समाप्त झाल्यानंतर देखील तसेच राहते. अत्याधिक वापरामुळे बरीच मेमरी वापरली जाऊन तो तुमच्या Android TV डिव्हाइसला धिमा किंवा अस्थिर करू शकतो."</string> <string name="permdesc_broadcastSticky" product="default" msgid="134529339678913453">"रोचक प्रसारणे पाठविण्यासाठी अॅप ला अनुमती देते, जे प्रसारण समाप्त झाल्यानंतर देखील तसेच राहते. अत्याधिक वापरामुळे बरीच मेमरी वापरली जाऊन तो फोनला धीमा किंवा अस्थिर करू शकतो."</string> <string name="permlab_readContacts" msgid="8776395111787429099">"तुमचे संपर्क वाचा"</string> <string name="permdesc_readContacts" product="tablet" msgid="6430093481659992692">"तुमच्या टॅबलेटवर स्टोअर केलेल्या तुमच्या संपर्कांविषयीचा डेटा वाचण्याची ॲपला अनुमती देते. अॅप्सना संपर्क तयार केलेल्या तुमच्या टॅबलेटवरील खात्याचा अॅक्सेसदेखील असेल. यामध्ये तुम्ही इंस्टॉल केलेल्या ॲप्सने तयार केलेल्या खात्यांचा समावेश असू शकतात. ही परवानगी ॲप्सना तुमचा संपर्क डेटा सेव्ह करण्याची अनुमती देते आणि दुर्भावनापूर्ण ॲप्स तुम्हाला न कळवता संपर्क डेटा शेअर करू शकतात."</string> @@ -985,7 +985,7 @@ <string name="js_dialog_before_unload_negative_button" msgid="3873765747622415310">"या पेजवर रहा"</string> <string name="js_dialog_before_unload" msgid="7213364985774778744">"<xliff:g id="MESSAGE">%s</xliff:g>\n\nआपल्याला खात्री आहे की तुम्ही या पृष्ठावरून नेव्हिगेट करू इच्छिता?"</string> <string name="save_password_label" msgid="9161712335355510035">"पुष्टी करा"</string> - <string name="double_tap_toast" msgid="7065519579174882778">"टीप: झूम कमी करण्यासाठी आणि वाढवण्यासाठी दोनदा-टॅप करा."</string> + <string name="double_tap_toast" msgid="7065519579174882778">"टीप: झूम कमी करण्यासाठी आणि वाढवण्यासाठी दोनदा टॅप करा."</string> <string name="autofill_this_form" msgid="3187132440451621492">"स्वयं-भरण"</string> <string name="setup_autofill" msgid="5431369130866618567">"स्वयं-भरण सेट करा"</string> <string name="autofill_window_title" msgid="4379134104008111961">"<xliff:g id="SERVICENAME">%1$s</xliff:g> सह ऑटोफील करा"</string> diff --git a/core/res/res/values-night/colors.xml b/core/res/res/values-night/colors.xml index 2e4578c39430..783fabe20a6d 100644 --- a/core/res/res/values-night/colors.xml +++ b/core/res/res/values-night/colors.xml @@ -33,4 +33,6 @@ <color name="call_notification_answer_color">#5DBA80</color> <color name="personal_apps_suspension_notification_color">#8AB4F8</color> + + <color name="overview_background">@color/overview_background_dark</color> </resources> diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index cdaf2543ee66..da3164a523ab 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -2039,7 +2039,7 @@ <string name="autofill_update_title_with_2types" msgid="1797514386321086273">"Atualizar <xliff:g id="TYPE_0">%1$s</xliff:g> e <xliff:g id="TYPE_1">%2$s</xliff:g> em "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string> <string name="autofill_update_title_with_3types" msgid="1312232153076212291">"Atualizar estes itens em "<b>"<xliff:g id="LABEL">%4$s</xliff:g>"</b>": <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> e <xliff:g id="TYPE_2">%3$s</xliff:g>?"</string> <string name="autofill_save_yes" msgid="8035743017382012850">"Salvar"</string> - <string name="autofill_save_no" msgid="9212826374207023544">"Não, obrigado"</string> + <string name="autofill_save_no" msgid="9212826374207023544">"Agora não"</string> <string name="autofill_save_notnow" msgid="2853932672029024195">"Agora não"</string> <string name="autofill_save_never" msgid="6821841919831402526">"Nunca"</string> <string name="autofill_update_yes" msgid="4608662968996874445">"Atualizar"</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index cdaf2543ee66..da3164a523ab 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -2039,7 +2039,7 @@ <string name="autofill_update_title_with_2types" msgid="1797514386321086273">"Atualizar <xliff:g id="TYPE_0">%1$s</xliff:g> e <xliff:g id="TYPE_1">%2$s</xliff:g> em "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string> <string name="autofill_update_title_with_3types" msgid="1312232153076212291">"Atualizar estes itens em "<b>"<xliff:g id="LABEL">%4$s</xliff:g>"</b>": <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> e <xliff:g id="TYPE_2">%3$s</xliff:g>?"</string> <string name="autofill_save_yes" msgid="8035743017382012850">"Salvar"</string> - <string name="autofill_save_no" msgid="9212826374207023544">"Não, obrigado"</string> + <string name="autofill_save_no" msgid="9212826374207023544">"Agora não"</string> <string name="autofill_save_notnow" msgid="2853932672029024195">"Agora não"</string> <string name="autofill_save_never" msgid="6821841919831402526">"Nunca"</string> <string name="autofill_update_yes" msgid="4608662968996874445">"Atualizar"</string> diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml index 13de370990a5..1baaa1f3607d 100644 --- a/core/res/res/values-ta/strings.xml +++ b/core/res/res/values-ta/strings.xml @@ -2110,7 +2110,7 @@ <string name="battery_saver_charged_notification_summary" product="default" msgid="5544457317418624367">"மொபைலில் போதுமான சார்ஜ் உள்ளது. அம்சங்கள் இனி தடையின்றி இயங்கும்."</string> <string name="battery_saver_charged_notification_summary" product="tablet" msgid="4426317048139996888">"டேப்லெட்டில் போதுமான சார்ஜ் உள்ளது. அம்சங்கள் இனி தடையின்றி இயங்கும்."</string> <string name="battery_saver_charged_notification_summary" product="device" msgid="1031562417867646649">"சாதனத்தில் போதுமான சார்ஜ் உள்ளது. அம்சங்கள் இனி தடையின்றி இயங்கும்."</string> - <string name="mime_type_folder" msgid="2203536499348787650">"கோப்புறை"</string> + <string name="mime_type_folder" msgid="2203536499348787650">"ஃபோல்டர்"</string> <string name="mime_type_apk" msgid="3168784749499623902">"Android ஆப்ஸ்"</string> <string name="mime_type_generic" msgid="4606589110116560228">"ஃபைல்"</string> <string name="mime_type_generic_ext" msgid="9220220924380909486">"<xliff:g id="EXTENSION">%1$s</xliff:g> ஃபைல்"</string> diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index b1af678cb706..680fbd2b7a24 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -79,8 +79,8 @@ <string name="CLIRPermanent" msgid="166443681876381118">"మీరు కాలర్ ID సెట్టింగ్ను మార్చలేరు."</string> <string name="RestrictedOnDataTitle" msgid="1500576417268169774">"మొబైల్ డేటా సేవ లేదు"</string> <string name="RestrictedOnEmergencyTitle" msgid="2852916906106191866">"అత్యవసర కాలింగ్ అందుబాటులో లేదు"</string> - <string name="RestrictedOnNormalTitle" msgid="7009474589746551737">"వాయిస్ సేవ లేదు"</string> - <string name="RestrictedOnAllVoiceTitle" msgid="3982069078579103087">"వాయిస్ సేవ లేదా అత్యవసర కాలింగ్ లేదు"</string> + <string name="RestrictedOnNormalTitle" msgid="7009474589746551737">"వాయిస్ సర్వీస్ లేదు"</string> + <string name="RestrictedOnAllVoiceTitle" msgid="3982069078579103087">"వాయిస్ సర్వీస్ లేదా ఎమర్జెన్సీ కాలింగ్ లేదు"</string> <string name="RestrictedStateContent" msgid="7693575344608618926">"మీ క్యారియర్ తాత్కాలికంగా ఆఫ్ చేయబడింది"</string> <string name="RestrictedStateContentMsimTemplate" msgid="5228235722511044687">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> కోసం మీ క్యారియర్ తాత్కాలికంగా ఆఫ్ చేశారు"</string> <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"మొబైల్ నెట్వర్క్ అందుబాటులో లేదు"</string> @@ -306,7 +306,7 @@ <string name="permgroupdesc_contacts" msgid="9163927941244182567">"మీ కాంటాక్ట్లను యాక్సెస్ చేయడానికి"</string> <string name="permgrouplab_location" msgid="1858277002233964394">"లొకేషన్"</string> <string name="permgroupdesc_location" msgid="1995955142118450685">"ఈ పరికర లొకేషన్ను యాక్సెస్ చేయడానికి"</string> - <string name="permgrouplab_calendar" msgid="6426860926123033230">"క్యాలెండర్"</string> + <string name="permgrouplab_calendar" msgid="6426860926123033230">"Calendar"</string> <string name="permgroupdesc_calendar" msgid="6762751063361489379">"మీ క్యాలెండర్ను యాక్సెస్ చేయడానికి"</string> <string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string> <string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS మెసేజ్లను పంపడం మరియు వీక్షించడం"</string> @@ -453,9 +453,9 @@ <string name="permlab_activityRecognition" msgid="1782303296053990884">"భౌతిక కార్యాకలాపాన్ని గుర్తించండి"</string> <string name="permdesc_activityRecognition" msgid="8667484762991357519">"ఈ యాప్ మీ భౌతిక కార్యాకలాపాన్ని గుర్తించగలదు."</string> <string name="permlab_camera" msgid="6320282492904119413">"చిత్రాలు మరియు వీడియోలు తీయడం"</string> - <string name="permdesc_camera" msgid="5240801376168647151">"యాప్ ఉపయోగంలో ఉన్నపుడు కెమెరాను ఉపయోగించి ఈ యాప్ ఎప్పుడైనా ఫోటోలను తీయగలదు, వీడియోలను రికార్డ్ చేయగలదు."</string> + <string name="permdesc_camera" msgid="5240801376168647151">"యాప్ ఉపయోగంలో ఉన్నపుడు కెమెరాను ఉపయోగించి ఎప్పుడు కావాలంటే అప్పుడు ఈ యాప్ ఫోటోలు తీయగలదు, వీడియోలు రికార్డ్ చేయగలదు."</string> <string name="permlab_backgroundCamera" msgid="7549917926079731681">"బ్యాక్గ్రౌండ్లో ఫోటోలు, వీడియోలను తీయగలదు"</string> - <string name="permdesc_backgroundCamera" msgid="1615291686191138250">"కెమెరాను ఉపయోగించి ఈ యాప్ ఎప్పుడైనా ఫోటోలను తీయగలదు, వీడియోలను రికార్డ్ చేయగలదు."</string> + <string name="permdesc_backgroundCamera" msgid="1615291686191138250">"ఈ యాప్, కెమెరాను ఉపయోగించి ఎప్పుడు కావాలంటే అప్పుడు ఫోటోలు తీయగలదు, వీడియోలు రికార్డ్ చేయగలదు."</string> <string name="permlab_systemCamera" msgid="3642917457796210580">"ఫోటోలు, వీడియోలు తీయడానికి సిస్టమ్ కెమెరాలకు యాప్, లేదా సేవా యాక్సెస్ను అనుమతించండి"</string> <string name="permdesc_systemCamera" msgid="5938360914419175986">"ఈ విశేష లేదా సిస్టమ్ యాప్ ఎప్పుడైనా సిస్టమ్ కెమెరాను ఉపయోగించి ఫోటోలు తీయగలదు, వీడియోలను రికార్డ్ చేయగలదు. యాప్కు android.permission.CAMERA అనుమతి ఇవ్వడం కూడా అవసరం"</string> <string name="permlab_cameraOpenCloseListener" msgid="5548732769068109315">"కెమెరా పరికరాలు తెరుచుకుంటున్నప్పుడు లేదా మూసుకుంటున్నప్పుడు కాల్బ్యాక్లను స్వీకరించడానికి యాప్ను లేదా సర్వీస్ను అనుమతించండి."</string> @@ -817,7 +817,7 @@ <string name="phoneTypeTtyTdd" msgid="532038552105328779">"TTY TDD"</string> <string name="phoneTypeWorkMobile" msgid="7522314392003565121">"కార్యాలయ మొబైల్"</string> <string name="phoneTypeWorkPager" msgid="3748332310638505234">"కార్యాలయ పేజర్"</string> - <string name="phoneTypeAssistant" msgid="757550783842231039">"అసిస్టెంట్"</string> + <string name="phoneTypeAssistant" msgid="757550783842231039">"Assistant"</string> <string name="phoneTypeMms" msgid="1799747455131365989">"MMS"</string> <string name="eventTypeCustom" msgid="3257367158986466481">"అనుకూలం"</string> <string name="eventTypeBirthday" msgid="7770026752793912283">"పుట్టినరోజు"</string> @@ -850,7 +850,7 @@ <string name="orgTypeOther" msgid="5450675258408005553">"ఇతరం"</string> <string name="orgTypeCustom" msgid="1126322047677329218">"అనుకూలం"</string> <string name="relationTypeCustom" msgid="282938315217441351">"అనుకూలం"</string> - <string name="relationTypeAssistant" msgid="4057605157116589315">"అసిస్టెంట్"</string> + <string name="relationTypeAssistant" msgid="4057605157116589315">"Assistant"</string> <string name="relationTypeBrother" msgid="7141662427379247820">"సోదరుడు"</string> <string name="relationTypeChild" msgid="9076258911292693601">"బిడ్డ"</string> <string name="relationTypeDomesticPartner" msgid="7825306887697559238">"జీవిత భాగస్వామి"</string> @@ -1046,7 +1046,7 @@ <string name="searchview_description_query" msgid="7430242366971716338">"ప్రశ్నను వెతకండి"</string> <string name="searchview_description_clear" msgid="1989371719192982900">"ప్రశ్నను క్లియర్ చేయి"</string> <string name="searchview_description_submit" msgid="6771060386117334686">"ప్రశ్నని సమర్పించండి"</string> - <string name="searchview_description_voice" msgid="42360159504884679">"వాయిస్ శోధన"</string> + <string name="searchview_description_voice" msgid="42360159504884679">"వాయిస్ సెర్చ్"</string> <string name="enable_explore_by_touch_warning_title" msgid="5095399706284943314">"తాకడం ద్వారా విశ్లేషణను ప్రారంభించాలా?"</string> <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="1037295476738940824">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> తాకడం ద్వారా విశ్లేషణను ప్రారంభించాలనుకుంటోంది. తాకడం ద్వారా విశ్లేషణను ఆన్ చేసినప్పుడు, మీరు మీ వేలి కింద ఉన్నవాటి యొక్క వివరణలను వినవచ్చు లేదా చూడవచ్చు లేదా టాబ్లెట్తో పరస్పర చర్య చేయడానికి సంజ్ఞలు చేయవచ్చు."</string> <string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> తాకడం ద్వారా విశ్లేషణను ప్రారంభించాలనుకుంటోంది. తాకడం ద్వారా విశ్లేషణ ఆన్ చేయబడినప్పుడు, మీరు మీ వేలి కింద ఉన్నవాటి యొక్క వివరణలను వినవచ్చు లేదా చూడవచ్చు లేదా ఫోన్తో పరస్పర చర్య చేయడానికి సంజ్ఞలు చేయవచ్చు."</string> @@ -1877,7 +1877,7 @@ <string name="confirm_battery_saver" msgid="5247976246208245754">"సరే"</string> <string name="battery_saver_description_with_learn_more" msgid="5444908404021316250">"బ్యాటరీ సేవర్ ముదురు రంగు రూపాన్ని ఆన్ చేసి, బ్యాక్గ్రౌండ్ యాక్టివిటీ, కొన్ని విజువల్ ఎఫెక్ట్లు, నిర్దిష్ట ఫీచర్లు, ఇంకా కొన్ని నెట్వర్క్ కనెక్షన్లను పరిమితం చేస్తుంది లేదా ఆఫ్ చేస్తుంది."</string> <string name="battery_saver_description" msgid="8518809702138617167">"బ్యాటరీ సేవర్ ముదురు రంగు రూపాన్ని ఆన్ చేసి, బ్యాక్గ్రౌండ్ యాక్టివిటీ, కొన్ని విజువల్ ఎఫెక్ట్లు, నిర్దిష్ట ఫీచర్లు, ఇంకా కొన్ని నెట్వర్క్ కనెక్షన్లను పరిమితం చేస్తుంది లేదా ఆఫ్ చేస్తుంది."</string> - <string name="data_saver_description" msgid="4995164271550590517">"డేటా వినియోగాన్ని తగ్గించడంలో డేటా సేవర్ సహాయకరంగా ఉంటుంది. బ్యాక్గ్రౌండ్లో కొన్ని యాప్లు డేటాను పంపకుండా లేదా స్వీకరించకుండా నిరోధిస్తుంది. మీరు ప్రస్తుతం ఉపయోగిస్తోన్న యాప్, డేటాను యాక్సెస్ చేయగలదు. కానీ తక్కువ సార్లు మాత్రమే అలా చేయవచ్చు. ఉదాహరణకు, మీరు నొక్కే వరకు ఫోటోలు ప్రదర్శించబడవు."</string> + <string name="data_saver_description" msgid="4995164271550590517">"డేటా వినియోగాన్ని తగ్గించడంలో డేటా సేవర్ సహాయకరంగా ఉంటుంది. బ్యాక్గ్రౌండ్లో కొన్ని యాప్లు డేటాను పంపకుండా లేదా స్వీకరించకుండా నిరోధిస్తుంది. మీరు ప్రస్తుతం ఉపయోగిస్తోన్న యాప్, డేటాను యాక్సెస్ చేయగలదు. కానీ తక్కువ సార్లు మాత్రమే అలా చేయవచ్చు. ఉదాహరణకు, మీరు నొక్కే వరకు ఇమేజ్లు ప్రదర్శించబడవు."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"డేటా సేవర్ను ఆన్ చేయాలా?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"ఆన్ చేయి"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273"> @@ -2007,7 +2007,7 @@ <string name="app_category_game" msgid="4534216074910244790">"గేమ్లు"</string> <string name="app_category_audio" msgid="8296029904794676222">"సంగీతం & ఆడియో"</string> <string name="app_category_video" msgid="2590183854839565814">"చలనచిత్రాలు & వీడియో"</string> - <string name="app_category_image" msgid="7307840291864213007">"ఫోటోలు & చిత్రాలు"</string> + <string name="app_category_image" msgid="7307840291864213007">"ఫోటోలు, ఇమేజ్లు"</string> <string name="app_category_social" msgid="2278269325488344054">"సామాజికం & కమ్యూనికేషన్"</string> <string name="app_category_news" msgid="1172762719574964544">"వార్తలు & వార్తాపత్రికలు"</string> <string name="app_category_maps" msgid="6395725487922533156">"Maps & నావిగేషన్"</string> @@ -2290,7 +2290,7 @@ <string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"సెట్టింగ్లలో ఆన్ చేయండి"</string> <string name="dismiss_action" msgid="1728820550388704784">"విస్మరించు"</string> <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"పరికరం మైక్రోఫోన్ను అన్బ్లాక్ చేయండి"</string> - <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"పరికరం కెమెరాను అన్బ్లాక్ చేయండి"</string> + <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"పరికరంలోని కెమెరాను అన్బ్లాక్ చేయండి"</string> <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"<b><xliff:g id="APP">%s</xliff:g></b> యాప్, ఇతర యాప్లు, సర్వీస్ల కోసం"</string> <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"అన్బ్లాక్ చేయండి"</string> <string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"సెన్సార్ గోప్యత"</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index b70cee045838..85e3110d2d30 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -1757,7 +1757,7 @@ <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"Виберіть функції для кнопки спеціальних можливостей"</string> <string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"Виберіть функції для комбінації з клавішами гучності"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"Сервіс <xliff:g id="SERVICE_NAME">%s</xliff:g> вимкнено"</string> - <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"Редагувати засоби"</string> + <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"Змінити"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"Готово"</string> <string name="disable_accessibility_shortcut" msgid="5806091378745232383">"Вимкнути ярлик"</string> <string name="leave_accessibility_shortcut_on" msgid="6543362062336990814">"Використовувати ярлик"</string> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 50a322f78599..15ec82c380b7 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -1073,7 +1073,7 @@ <string name="weeks" msgid="3516247214269821391">"tuần"</string> <string name="year" msgid="5182610307741238982">"năm"</string> <string name="years" msgid="5797714729103773425">"năm"</string> - <string name="now_string_shortest" msgid="3684914126941650330">"ngay lúc này"</string> + <string name="now_string_shortest" msgid="3684914126941650330">"vừa xong"</string> <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135"> <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ph</item> <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ph</item> diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 0a6b02d499e5..9d90dd480203 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -6822,9 +6822,8 @@ content for the duration of the animation. --> <enum name="bottom" value="-1" /> </attr> - <!-- Special background behind animation. Only for use with window - animations. Can only be a color, and only black. If 0, the - default, there is no background. --> + <!-- Special background behind animation. Only for use with task animations. + If 0, the default, there is no background. --> <attr name="background" /> <!-- Special option for window animations: if this window is on top of a wallpaper, don't animate the wallpaper with it. --> @@ -7737,7 +7736,7 @@ <!-- Name of a method on the Context used to inflate the menu that will be called when the item is clicked. - {@deprecated Menu actually traverses the Context hierarchy looking for the + {@deprecated Menu actually traverses the Context hierarchy looking for the relevant method, which is fragile (an intermediate ContextWrapper adding a same-named method would change behavior) and restricts bytecode optimizers such as R8. Instead, use MenuItem.setOnMenuItemClickListener.} --> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index e3e5f841725f..cbe0eef6408b 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -654,6 +654,11 @@ --> </integer-array> + <!-- When entering this device state (defined in device_state_configuration.xml), + we should wake the device. -1 to disable the feature (do not wake on any device-state + transition). --> + <integer name="config_deviceStateOnWhichToWakeUp">-1</integer> + <!-- Indicate the display area rect for foldable devices in folded state. --> <string name="config_foldedArea"></string> @@ -4856,8 +4861,8 @@ <item name="config_fixedOrientationLetterboxAspectRatio" format="float" type="dimen">0.0</item> <!-- Corners radius for activity presented the letterbox mode. Values < 0 will be ignored and - corners of the activity won't be rounded. --> - <integer name="config_letterboxActivityCornersRadius">0</integer> + min between device bottom corner radii will be used instead. --> + <integer name="config_letterboxActivityCornersRadius">-1</integer> <!-- Blur radius for the Option 3 in R.integer.config_letterboxBackgroundType. Values < 0 are ignored and 0 is used. --> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index b6c76596d131..fbc629e2dc81 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -3846,6 +3846,7 @@ <!-- For Foldables --> <java-symbol type="array" name="config_foldedDeviceStates" /> + <java-symbol type="integer" name="config_deviceStateOnWhichToWakeUp" /> <java-symbol type="string" name="config_foldedArea" /> <java-symbol type="bool" name="config_supportsConcurrentInternalDisplays" /> <java-symbol type="bool" name="config_unfoldTransitionEnabled" /> @@ -4443,6 +4444,8 @@ <java-symbol type="integer" name="config_customizedMaxCachedProcesses" /> + <java-symbol type="color" name="overview_background"/> + <java-symbol type="string" name="config_secondaryBuiltInDisplayCutout" /> <java-symbol type="string" name="config_secondaryBuiltInDisplayCutoutRectApproximation" /> <java-symbol type="bool" name="config_fillSecondaryBuiltInDisplayCutout" /> diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java index b7dc1c59c90c..d4799a8f5fd3 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java @@ -592,7 +592,7 @@ public class BatteryStatsNoteTest extends TestCase { public void testUpdateDisplayMeasuredEnergyStatsLocked() { final MockClocks clocks = new MockClocks(); // holds realtime and uptime in ms final MockBatteryStatsImpl bi = new MockBatteryStatsImpl(clocks); - bi.initMeasuredEnergyStats(); + bi.initMeasuredEnergyStats(new String[]{"FOO", "BAR"}); clocks.realtime = 0; int screen = Display.STATE_OFF; @@ -677,7 +677,7 @@ public class BatteryStatsNoteTest extends TestCase { public void testUpdateCustomMeasuredEnergyStatsLocked_neverCalled() { final MockClocks clocks = new MockClocks(); // holds realtime and uptime in ms final MockBatteryStatsImpl bi = new MockBatteryStatsImpl(clocks); - bi.initMeasuredEnergyStats(); + bi.initMeasuredEnergyStats(new String[]{"FOO", "BAR"}); bi.setOnBatteryInternal(true); final int uid1 = 11500; @@ -691,7 +691,7 @@ public class BatteryStatsNoteTest extends TestCase { public void testUpdateCustomMeasuredEnergyStatsLocked() { final MockClocks clocks = new MockClocks(); // holds realtime and uptime in ms final MockBatteryStatsImpl bi = new MockBatteryStatsImpl(clocks); - bi.initMeasuredEnergyStats(); + bi.initMeasuredEnergyStats(new String[]{"FOO", "BAR"}); final int bucketA = 0; // Custom bucket 0 final int bucketB = 1; // Custom bucket 1 diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java index b851f0ad3414..0135fe84909a 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java @@ -403,7 +403,7 @@ public class BatteryStatsSensorTest extends TestCase { assertNotNull(sensor.getSensorBackgroundTime()); // Reset the stats. Since the sensor is still running, we should still see the timer - bi.getUidStatsLocked(UID).reset(clocks.uptime * 1000, clocks.realtime * 1000); + bi.getUidStatsLocked(UID).reset(clocks.uptime * 1000, clocks.realtime * 1000, 0); sensor = uid.getSensorStats().get(SENSOR_ID); assertNotNull(sensor); @@ -413,7 +413,7 @@ public class BatteryStatsSensorTest extends TestCase { bi.noteStopSensorLocked(UID, SENSOR_ID); // Now the sensor timer has stopped so this reset should also take out the sensor. - bi.getUidStatsLocked(UID).reset(clocks.uptime * 1000, clocks.realtime * 1000); + bi.getUidStatsLocked(UID).reset(clocks.uptime * 1000, clocks.realtime * 1000, 0); sensor = uid.getSensorStats().get(SENSOR_ID); assertNull(sensor); @@ -465,7 +465,7 @@ public class BatteryStatsSensorTest extends TestCase { // Reset the stats. Since the sensor is still running, we should still see the timer // but still with 0 times. - bi.getUidStatsLocked(UID).reset(clocks.uptime * 1000, clocks.realtime * 1000); + bi.getUidStatsLocked(UID).reset(clocks.uptime * 1000, clocks.realtime * 1000, 0); assertEquals(0, timer.getTotalTimeLocked(1000*clocks.realtime, which)); assertEquals(0, timer.getTotalDurationMsLocked(clocks.realtime)); assertEquals(0, bgTimer.getTotalTimeLocked(1000*clocks.realtime, which)); @@ -504,7 +504,7 @@ public class BatteryStatsSensorTest extends TestCase { // Reset the stats. Since the sensor is still running, we should still see the timer // but with 0 times. - bi.getUidStatsLocked(UID).reset(clocks.uptime * 1000, clocks.realtime * 1000); + bi.getUidStatsLocked(UID).reset(clocks.uptime * 1000, clocks.realtime * 1000, 0); assertEquals(0, timer.getTotalTimeLocked(1000*clocks.realtime, which)); assertEquals(0, timer.getTotalDurationMsLocked(clocks.realtime)); assertEquals(0, bgTimer.getTotalTimeLocked(1000*clocks.realtime, which)); diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsProviderTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsProviderTest.java index 0147cdb186f3..74b6dbe76a16 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsProviderTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsProviderTest.java @@ -18,6 +18,9 @@ package com.android.internal.os; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + import android.app.ActivityManager; import android.content.Context; import android.os.BatteryConsumer; @@ -263,6 +266,39 @@ public class BatteryUsageStatsProviderTest { .of(180.0); } + @Test + public void testAggregateBatteryStats_incompatibleSnapshot() { + Context context = InstrumentationRegistry.getContext(); + MockBatteryStatsImpl batteryStats = mStatsRule.getBatteryStats(); + batteryStats.initMeasuredEnergyStats(new String[]{"FOO", "BAR"}); + + BatteryUsageStatsStore batteryUsageStatsStore = mock(BatteryUsageStatsStore.class); + + when(batteryUsageStatsStore.listBatteryUsageStatsTimestamps()) + .thenReturn(new long[]{1000, 2000}); + + when(batteryUsageStatsStore.loadBatteryUsageStats(1000)).thenReturn( + new BatteryUsageStats.Builder(batteryStats.getCustomEnergyConsumerNames()) + .setStatsDuration(1234).build()); + + // Add a snapshot, with a different set of custom power components. It should + // be skipped by the aggregation. + when(batteryUsageStatsStore.loadBatteryUsageStats(2000)).thenReturn( + new BatteryUsageStats.Builder(new String[]{"different"}) + .setStatsDuration(4321).build()); + + BatteryUsageStatsProvider provider = new BatteryUsageStatsProvider(context, + batteryStats, batteryUsageStatsStore); + + BatteryUsageStatsQuery query = new BatteryUsageStatsQuery.Builder() + .aggregateSnapshots(0, 3000) + .build(); + final BatteryUsageStats stats = provider.getBatteryUsageStats(query); + assertThat(stats.getCustomPowerComponentNames()) + .isEqualTo(batteryStats.getCustomEnergyConsumerNames()); + assertThat(stats.getStatsDuration()).isEqualTo(1234); + } + private static class TestHandler extends Handler { TestHandler() { super(Looper.getMainLooper()); diff --git a/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java b/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java index 99d576d259ec..cee1a0352a7e 100644 --- a/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java +++ b/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java @@ -57,11 +57,10 @@ public class MockBatteryStatsImpl extends BatteryStatsImpl { this(new MockClocks()); } - public void initMeasuredEnergyStats() { + public void initMeasuredEnergyStats(String[] customBucketNames) { final boolean[] supportedStandardBuckets = new boolean[MeasuredEnergyStats.NUMBER_STANDARD_POWER_BUCKETS]; Arrays.fill(supportedStandardBuckets, true); - final String[] customBucketNames = {"FOO", "BAR"}; mGlobalMeasuredEnergyStats = new MeasuredEnergyStats(supportedStandardBuckets, customBucketNames); } diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskFragmentAnimationAdapter.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskFragmentAnimationAdapter.java index 65bd9f330e37..06f6228623d8 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskFragmentAnimationAdapter.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskFragmentAnimationAdapter.java @@ -16,6 +16,7 @@ package androidx.window.extensions.embedding; +import android.graphics.Point; import android.graphics.Rect; import android.view.Choreographer; import android.view.RemoteAnimationTarget; @@ -24,6 +25,7 @@ import android.view.animation.Animation; import android.view.animation.Transformation; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; /** * Wrapper to handle the TaskFragment animation update in one {@link SurfaceControl.Transaction}. @@ -33,6 +35,7 @@ class TaskFragmentAnimationAdapter { private final RemoteAnimationTarget mTarget; private final SurfaceControl mLeash; private final boolean mSizeChanged; + private final Point mPosition; private final Transformation mTransformation = new Transformation(); private final float[] mMatrix = new float[9]; private final float[] mVecs = new float[4]; @@ -41,7 +44,7 @@ class TaskFragmentAnimationAdapter { TaskFragmentAnimationAdapter(@NonNull Animation animation, @NonNull RemoteAnimationTarget target) { - this(animation, target, target.leash, false /* sizeChanged */); + this(animation, target, target.leash, false /* sizeChanged */, null /* position */); } /** @@ -49,11 +52,14 @@ class TaskFragmentAnimationAdapter { */ TaskFragmentAnimationAdapter(@NonNull Animation animation, @NonNull RemoteAnimationTarget target, @NonNull SurfaceControl leash, - boolean sizeChanged) { + boolean sizeChanged, @Nullable Point position) { mAnimation = animation; mTarget = target; mLeash = leash; mSizeChanged = sizeChanged; + mPosition = position != null + ? position + : new Point(target.localBounds.left, target.localBounds.top); } /** Called on frame update. */ @@ -65,8 +71,7 @@ class TaskFragmentAnimationAdapter { currentPlayTime = Math.min(currentPlayTime, mAnimation.getDuration()); mAnimation.getTransformation(currentPlayTime, mTransformation); - mTransformation.getMatrix().postTranslate( - mTarget.localBounds.left, mTarget.localBounds.top); + mTransformation.getMatrix().postTranslate(mPosition.x, mPosition.y); t.setMatrix(mLeash, mTransformation.getMatrix(), mMatrix); t.setAlpha(mLeash, mTransformation.getAlpha()); t.setFrameTimelineVsync(Choreographer.getInstance().getVsyncId()); diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskFragmentAnimationRunner.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskFragmentAnimationRunner.java index bb37fff297a7..3980d077a7dd 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskFragmentAnimationRunner.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskFragmentAnimationRunner.java @@ -23,6 +23,7 @@ import static android.view.WindowManager.TRANSIT_OLD_TASK_FRAGMENT_OPEN; import android.animation.Animator; import android.animation.ValueAnimator; +import android.graphics.Point; import android.os.Handler; import android.os.Looper; import android.os.RemoteException; @@ -193,10 +194,12 @@ class TaskFragmentAnimationRunner extends IRemoteAnimationRunner.Stub { if (target.startBounds != null) { final Animation[] animations = mAnimationSpec.createChangeBoundsChangeAnimations(target); + // The snapshot surface will always be at (0, 0) of its parent. adapters.add(new TaskFragmentAnimationAdapter(animations[0], target, - target.startLeash, false /* sizeChanged */)); + target.startLeash, false /* sizeChanged */, new Point(0, 0))); + // The end surface will have size change for scaling. adapters.add(new TaskFragmentAnimationAdapter(animations[1], target, - target.leash, true /* sizeChanged */)); + target.leash, true /* sizeChanged */, null /* position */)); continue; } diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskFragmentAnimationSpec.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskFragmentAnimationSpec.java index 71295900cd06..1e64782b161f 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskFragmentAnimationSpec.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskFragmentAnimationSpec.java @@ -32,6 +32,7 @@ import android.view.animation.AnimationSet; import android.view.animation.AnimationUtils; import android.view.animation.ClipRectAnimation; import android.view.animation.Interpolator; +import android.view.animation.LinearInterpolator; import android.view.animation.ScaleAnimation; import android.view.animation.TranslateAnimation; @@ -46,12 +47,13 @@ class TaskFragmentAnimationSpec { private static final String TAG = "TaskFragAnimationSpec"; private static final int CHANGE_ANIMATION_DURATION = 517; - private static final int CHANGE_ANIMATION_FADE_DURATION = 82; - private static final int CHANGE_ANIMATION_FADE_OFFSET = 67; + private static final int CHANGE_ANIMATION_FADE_DURATION = 80; + private static final int CHANGE_ANIMATION_FADE_OFFSET = 30; private final Context mContext; private final TransitionAnimation mTransitionAnimation; private final Interpolator mFastOutExtraSlowInInterpolator; + private final LinearInterpolator mLinearInterpolator; private float mTransitionAnimationScaleSetting; TaskFragmentAnimationSpec(@NonNull Handler handler) { @@ -61,6 +63,7 @@ class TaskFragmentAnimationSpec { AttributeCache.init(mContext); mFastOutExtraSlowInInterpolator = AnimationUtils.loadInterpolator( mContext, android.R.interpolator.fast_out_extra_slow_in); + mLinearInterpolator = new LinearInterpolator(); // The transition animation should be adjusted based on the developer option. final ContentResolver resolver = mContext.getContentResolver(); @@ -129,14 +132,15 @@ class TaskFragmentAnimationSpec { float startScaleY = 1.f / scaleY; // The start leash will be fade out. - final AnimationSet startSet = new AnimationSet(true /* shareInterpolator */); - startSet.setInterpolator(mFastOutExtraSlowInInterpolator); + final AnimationSet startSet = new AnimationSet(false /* shareInterpolator */); final Animation startAlpha = new AlphaAnimation(1f, 0f); + startAlpha.setInterpolator(mLinearInterpolator); startAlpha.setDuration(CHANGE_ANIMATION_FADE_DURATION); startAlpha.setStartOffset(CHANGE_ANIMATION_FADE_OFFSET); startSet.addAnimation(startAlpha); final Animation startScale = new ScaleAnimation(startScaleX, startScaleX, startScaleY, startScaleY); + startScale.setInterpolator(mFastOutExtraSlowInInterpolator); startScale.setDuration(CHANGE_ANIMATION_DURATION); startSet.addAnimation(startScale); startSet.initialize(startBounds.width(), startBounds.height(), endBounds.width(), diff --git a/libs/WindowManager/Shell/res/values-as/strings.xml b/libs/WindowManager/Shell/res/values-as/strings.xml index 1ace3cdacb46..325838581659 100644 --- a/libs/WindowManager/Shell/res/values-as/strings.xml +++ b/libs/WindowManager/Shell/res/values-as/strings.xml @@ -19,10 +19,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="pip_phone_close" msgid="5783752637260411309">"বন্ধ কৰক"</string> <string name="pip_phone_expand" msgid="2579292903468287504">"বিস্তাৰ কৰক"</string> - <string name="pip_phone_settings" msgid="5468987116750491918">"ছেটিংসমূহ"</string> + <string name="pip_phone_settings" msgid="5468987116750491918">"ছেটিং"</string> <string name="pip_menu_title" msgid="5393619322111827096">"মেনু"</string> <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> চিত্ৰৰ ভিতৰৰ চিত্ৰত আছে"</string> - <string name="pip_notification_message" msgid="8854051911700302620">"আপুনি যদি <xliff:g id="NAME">%s</xliff:g> সুবিধাটো ব্যৱহাৰ কৰিব নোখোজে, তেন্তে ছেটিংসমূহ খুলিবলৈ টিপক আৰু তালৈ গৈ ইয়াক অফ কৰক।"</string> + <string name="pip_notification_message" msgid="8854051911700302620">"আপুনি যদি <xliff:g id="NAME">%s</xliff:g> সুবিধাটো ব্যৱহাৰ কৰিব নোখোজে, তেন্তে ছেটিং খুলিবলৈ টিপক আৰু তালৈ গৈ ইয়াক অফ কৰক।"</string> <string name="pip_play" msgid="3496151081459417097">"প্লে কৰক"</string> <string name="pip_pause" msgid="690688849510295232">"পজ কৰক"</string> <string name="pip_skip_to_next" msgid="8403429188794867653">"পৰৱৰ্তী মিডিয়ালৈ যাওক"</string> @@ -31,25 +31,25 @@ <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"লুকুৱাওক"</string> <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"দেখুৱাওক"</string> <string name="dock_forced_resizable" msgid="1749750436092293116">"এপ্টোৱে বিভাজিত স্ক্ৰীনৰ সৈতে কাম নকৰিব পাৰে।"</string> - <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"এপটোৱে বিভাজিত স্ক্ৰীণ সমৰ্থন নকৰে।"</string> + <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"এপ্টোৱে বিভাজিত স্ক্ৰীন সমৰ্থন নকৰে।"</string> <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"গৌণ ডিছপ্লেত এপে সঠিকভাৱে কাম নকৰিব পাৰে।"</string> <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"গৌণ ডিছপ্লেত এপ্ লঞ্চ কৰিব নোৱাৰি।"</string> - <string name="accessibility_divider" msgid="703810061635792791">"স্প্লিট স্ক্ৰীণৰ বিভাজক"</string> - <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"বাওঁফালৰ স্ক্ৰীণখন সম্পূৰ্ণ স্ক্ৰীণ কৰক"</string> + <string name="accessibility_divider" msgid="703810061635792791">"স্প্লিট স্ক্ৰীনৰ বিভাজক"</string> + <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"বাওঁফালৰ স্ক্ৰীনখন সম্পূৰ্ণ স্ক্ৰীন কৰক"</string> <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"বাওঁফালৰ স্ক্ৰীণখন ৭০% কৰক"</string> <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"বাওঁফালৰ স্ক্ৰীণখন ৫০% কৰক"</string> <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"বাওঁফালৰ স্ক্ৰীণখন ৩০% কৰক"</string> - <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"সোঁফালৰ স্ক্ৰীণখন সম্পূৰ্ণ স্ক্ৰীণ কৰক"</string> - <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"শীৰ্ষ স্ক্ৰীণখন সম্পূৰ্ণ স্ক্ৰীণ কৰক"</string> + <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"সোঁফালৰ স্ক্ৰীনখন সম্পূৰ্ণ স্ক্ৰীন কৰক"</string> + <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"শীৰ্ষ স্ক্ৰীনখন সম্পূৰ্ণ স্ক্ৰীন কৰক"</string> <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"শীর্ষ স্ক্ৰীণখন ৭০% কৰক"</string> <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"শীর্ষ স্ক্ৰীণখন ৫০% কৰক"</string> <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"শীর্ষ স্ক্ৰীণখন ৩০% কৰক"</string> - <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"তলৰ স্ক্ৰীণখন সম্পূৰ্ণ স্ক্ৰীণ কৰক"</string> + <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"তলৰ স্ক্ৰীনখন সম্পূৰ্ণ স্ক্ৰীন কৰক"</string> <string name="one_handed_tutorial_title" msgid="4583241688067426350">"এখন হাতেৰে ব্যৱহাৰ কৰা ম’ড ব্যৱহাৰ কৰা"</string> <string name="one_handed_tutorial_description" msgid="3486582858591353067">"বাহিৰ হ’বলৈ স্ক্ৰীনখনৰ একেবাৰে তলৰ পৰা ওপৰলৈ ছোৱাইপ কৰক অথবা এপ্টোৰ ওপৰত যিকোনো ঠাইত টিপক"</string> <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"এখন হাতেৰে ব্যৱহাৰ কৰা ম\'ডটো আৰম্ভ কৰক"</string> <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"এখন হাতেৰে ব্যৱহাৰ কৰা ম\'ডটোৰ পৰা বাহিৰ হওক"</string> - <string name="bubbles_settings_button_description" msgid="1301286017420516912">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ bubblesৰ ছেটিংসমূহ"</string> + <string name="bubbles_settings_button_description" msgid="1301286017420516912">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ bubblesৰ ছেটিং"</string> <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"অভাৰফ্ল’"</string> <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"ষ্টেকত পুনৰ যোগ দিয়ক"</string> <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="APP_NAME">%2$s</xliff:g>ৰ পৰা <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> @@ -58,7 +58,7 @@ <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"শীৰ্ষৰ সোঁফালে নিয়ক"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"বুটামটো বাওঁফালে নিয়ক"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"তলৰ সোঁফালে নিয়ক"</string> - <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ছেটিংসমূহ"</string> + <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ছেটিং"</string> <string name="bubble_dismiss_text" msgid="8816558050659478158">"বাবল অগ্ৰাহ্য কৰক"</string> <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"বাৰ্তালাপ বাবল নকৰিব"</string> <string name="bubbles_user_education_title" msgid="2112319053732691899">"Bubbles ব্যৱহাৰ কৰি চাট কৰক"</string> diff --git a/libs/WindowManager/Shell/res/values-as/strings_tv.xml b/libs/WindowManager/Shell/res/values-as/strings_tv.xml index 6c223f45d9b3..170b2dbd458c 100644 --- a/libs/WindowManager/Shell/res/values-as/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-as/strings_tv.xml @@ -20,5 +20,5 @@ <string name="notification_channel_tv_pip" msgid="2576686079160402435">"চিত্ৰৰ ভিতৰত চিত্ৰ"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(শিৰোনামবিহীন কাৰ্যক্ৰম)"</string> <string name="pip_close" msgid="9135220303720555525">"পিপ বন্ধ কৰক"</string> - <string name="pip_fullscreen" msgid="7278047353591302554">"সম্পূৰ্ণ স্ক্ৰীণ"</string> + <string name="pip_fullscreen" msgid="7278047353591302554">"সম্পূৰ্ণ স্ক্ৰীন"</string> </resources> diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/DismissView.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/DismissView.kt index 0a1cd2246339..74672a336161 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/DismissView.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/DismissView.kt @@ -28,37 +28,40 @@ import androidx.dynamicanimation.animation.SpringForce.STIFFNESS_LOW import com.android.wm.shell.R import com.android.wm.shell.animation.PhysicsAnimator import com.android.wm.shell.common.DismissCircleView +import android.view.WindowInsets +import android.view.WindowManager /* * View that handles interactions between DismissCircleView and BubbleStackView. */ class DismissView(context: Context) : FrameLayout(context) { - var circle = DismissCircleView(context).apply { - val targetSize: Int = context.resources.getDimensionPixelSize(R.dimen.dismiss_circle_size) - val newParams = LayoutParams(targetSize, targetSize) - newParams.gravity = Gravity.BOTTOM or Gravity.CENTER_HORIZONTAL - setLayoutParams(newParams) - setTranslationY( - resources.getDimensionPixelSize(R.dimen.floating_dismiss_gradient_height).toFloat()) - } - + var circle = DismissCircleView(context) var isShowing = false + private val animator = PhysicsAnimator.getInstance(circle) private val spring = PhysicsAnimator.SpringConfig(STIFFNESS_LOW, DAMPING_RATIO_LOW_BOUNCY) private val DISMISS_SCRIM_FADE_MS = 200 + private var wm: WindowManager = + context.getSystemService(Context.WINDOW_SERVICE) as WindowManager init { setLayoutParams(LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, resources.getDimensionPixelSize(R.dimen.floating_dismiss_gradient_height), Gravity.BOTTOM)) - setPadding(0, 0, 0, resources.getDimensionPixelSize(R.dimen.floating_dismiss_bottom_margin)) + updatePadding() setClipToPadding(false) setClipChildren(false) setVisibility(View.INVISIBLE) setBackgroundResource( R.drawable.floating_dismiss_gradient_transition) - addView(circle) + + val targetSize: Int = resources.getDimensionPixelSize(R.dimen.dismiss_circle_size) + addView(circle, LayoutParams(targetSize, targetSize, + Gravity.BOTTOM or Gravity.CENTER_HORIZONTAL)) + // start with circle offscreen so it's animated up + circle.setTranslationY(resources.getDimensionPixelSize( + R.dimen.floating_dismiss_gradient_height).toFloat()) } /** @@ -91,9 +94,21 @@ class DismissView(context: Context) : FrameLayout(context) { } fun updateResources() { - val targetSize: Int = context.resources.getDimensionPixelSize(R.dimen.dismiss_circle_size) + updatePadding() + layoutParams.height = resources.getDimensionPixelSize( + R.dimen.floating_dismiss_gradient_height) + + val targetSize: Int = resources.getDimensionPixelSize(R.dimen.dismiss_circle_size) circle.layoutParams.width = targetSize circle.layoutParams.height = targetSize circle.requestLayout() } + + private fun updatePadding() { + val insets: WindowInsets = wm.getCurrentWindowMetrics().getWindowInsets() + val navInset = insets.getInsetsIgnoringVisibility( + WindowInsets.Type.navigationBars()) + setPadding(0, 0, 0, navInset.bottom + + resources.getDimensionPixelSize(R.dimen.floating_dismiss_bottom_margin)) + } }
\ No newline at end of file diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerView.java index f9ba97f8f9b1..6ea806bd3799 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerView.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerView.java @@ -25,6 +25,7 @@ import android.graphics.Rect; import android.util.AttributeSet; import android.util.Property; import android.view.GestureDetector; +import android.view.InsetsController; import android.view.InsetsSource; import android.view.InsetsState; import android.view.MotionEvent; @@ -34,7 +35,6 @@ import android.view.View; import android.view.ViewConfiguration; import android.view.ViewGroup; import android.view.WindowManager; -import android.view.animation.Interpolator; import android.widget.FrameLayout; import androidx.annotation.NonNull; @@ -51,12 +51,6 @@ public class DividerView extends FrameLayout implements View.OnTouchListener { public static final long TOUCH_ANIMATION_DURATION = 150; public static final long TOUCH_RELEASE_ANIMATION_DURATION = 200; - // TODO(b/191269755): use the value defined in InsetsController. - private static final Interpolator RESIZE_INTERPOLATOR = Interpolators.LINEAR; - - // TODO(b/191269755): use the value defined in InsetsController. - private static final int ANIMATION_DURATION_RESIZE = 300; - /** The task bar expanded height. Used to determine whether to insets divider bounds or not. */ private float mExpandedTaskBarHeight; @@ -142,8 +136,8 @@ public class DividerView extends FrameLayout implements View.OnTouchListener { if (animate) { ObjectAnimator animator = ObjectAnimator.ofInt(this, DIVIDER_HEIGHT_PROPERTY, mDividerBounds.height(), mTempRect.height()); - animator.setInterpolator(RESIZE_INTERPOLATOR); - animator.setDuration(ANIMATION_DURATION_RESIZE); + animator.setInterpolator(InsetsController.RESIZE_INTERPOLATOR); + animator.setDuration(InsetsController.ANIMATION_DURATION_RESIZE); animator.start(); } else { DIVIDER_HEIGHT_PROPERTY.set(this, mTempRect.height()); @@ -226,16 +220,6 @@ public class DividerView extends FrameLayout implements View.OnTouchListener { private void setTouching() { setSlippery(false); mHandle.setTouching(true, true); - if (isLandscape()) { - mBackground.animate().scaleX(1.4f); - } else { - mBackground.animate().scaleY(1.4f); - } - mBackground.animate() - .setInterpolator(Interpolators.TOUCH_RESPONSE) - .setDuration(TOUCH_ANIMATION_DURATION) - .translationZ(mTouchElevation) - .start(); // Lift handle as well so it doesn't get behind the background, even though it doesn't // cast shadow. mHandle.animate() @@ -248,13 +232,6 @@ public class DividerView extends FrameLayout implements View.OnTouchListener { private void releaseTouching() { setSlippery(true); mHandle.setTouching(false, true); - mBackground.animate() - .setInterpolator(Interpolators.FAST_OUT_SLOW_IN) - .setDuration(TOUCH_RELEASE_ANIMATION_DURATION) - .translationZ(0) - .scaleX(1f) - .scaleY(1f) - .start(); mHandle.animate() .setInterpolator(Interpolators.FAST_OUT_SLOW_IN) .setDuration(TOUCH_RELEASE_ANIMATION_DURATION) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipDismissTargetHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipDismissTargetHandler.java index 82092ac5ac3e..0fbdf90fd9d5 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipDismissTargetHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipDismissTargetHandler.java @@ -20,6 +20,7 @@ import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_M import android.content.Context; import android.content.res.Resources; +import android.graphics.Insets; import android.graphics.PixelFormat; import android.graphics.Point; import android.graphics.Rect; @@ -30,6 +31,7 @@ import android.view.SurfaceControl; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; +import android.view.WindowInsets; import android.view.WindowManager; import android.widget.FrameLayout; @@ -93,6 +95,7 @@ public class PipDismissTargetHandler implements ViewTreeObserver.OnPreDrawListen private int mTargetSize; private int mDismissAreaHeight; private float mMagneticFieldRadiusPercent = 1f; + private WindowInsets mWindowInsets; private SurfaceControl mTaskLeash; private boolean mHasDismissTargetSurface; @@ -123,6 +126,13 @@ public class PipDismissTargetHandler implements ViewTreeObserver.OnPreDrawListen mContext.getDrawable(R.drawable.floating_dismiss_gradient_transition)); mTargetViewContainer.setClipChildren(false); mTargetViewContainer.addView(mTargetView); + mTargetViewContainer.setOnApplyWindowInsetsListener((view, windowInsets) -> { + if (!windowInsets.equals(mWindowInsets)) { + mWindowInsets = windowInsets; + updateMagneticTargetSize(); + } + return windowInsets; + }); mMagnetizedPip = mMotionHelper.getMagnetizedPip(); mMagneticTarget = mMagnetizedPip.addTarget(mTargetView, 0); @@ -201,10 +211,13 @@ public class PipDismissTargetHandler implements ViewTreeObserver.OnPreDrawListen final Resources res = mContext.getResources(); mTargetSize = res.getDimensionPixelSize(R.dimen.dismiss_circle_size); mDismissAreaHeight = res.getDimensionPixelSize(R.dimen.floating_dismiss_gradient_height); + final WindowInsets insets = mWindowManager.getCurrentWindowMetrics().getWindowInsets(); + final Insets navInset = insets.getInsetsIgnoringVisibility( + WindowInsets.Type.navigationBars()); final FrameLayout.LayoutParams newParams = new FrameLayout.LayoutParams(mTargetSize, mTargetSize); newParams.gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM; - newParams.bottomMargin = mContext.getResources().getDimensionPixelSize( + newParams.bottomMargin = navInset.bottom + mContext.getResources().getDimensionPixelSize( R.dimen.floating_dismiss_bottom_margin); mTargetView.setLayoutParams(newParams); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java index 4ba6acaba025..b673d48f3d15 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java @@ -141,8 +141,9 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler { static boolean isRotationSeamless(@NonNull TransitionInfo info, DisplayController displayController) { ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, - "Display is rotating, check if it should be seamless."); + "Display is changing, check if it should be seamless."); boolean checkedDisplayLayout = false; + boolean hasTask = false; for (int i = info.getChanges().size() - 1; i >= 0; --i) { final TransitionInfo.Change change = info.getChanges().get(i); @@ -166,6 +167,7 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler { return false; } } else if (change.getTaskInfo() != null) { + hasTask = true; // We only enable seamless rotation if all the visible task windows requested it. if (change.getRotationAnimation() != ROTATION_ANIMATION_SEAMLESS) { ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, @@ -209,8 +211,12 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler { } } - ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " Rotation IS seamless."); - return true; + // ROTATION_ANIMATION_SEAMLESS can only be requested by task. + if (hasTask) { + ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " Rotation IS seamless."); + return true; + } + return false; } /** @@ -280,7 +286,6 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler { final TransitionInfo.Change change = info.getChanges().get(i); if (info.getType() == TRANSIT_CHANGE && change.getMode() == TRANSIT_CHANGE - && (change.getEndRotation() != change.getStartRotation()) && (change.getFlags() & FLAG_IS_DISPLAY) != 0) { boolean isSeamless = isRotationSeamless(info, mDisplayController); final int anim = getRotationAnimation(info); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/ScreenRotationAnimation.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/ScreenRotationAnimation.java index ada2ed27c114..13c670a1ab1e 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/ScreenRotationAnimation.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/ScreenRotationAnimation.java @@ -186,11 +186,11 @@ class ScreenRotationAnimation { t.setAlpha(mBackColorSurface, 1); t.show(mBackColorSurface); + t.setLayer(mAnimLeash, SCREEN_FREEZE_LAYER_BASE); t.setPosition(mAnimLeash, 0, 0); t.setAlpha(mAnimLeash, 1); t.show(mAnimLeash); - t.setLayer(mScreenshotLayer, SCREEN_FREEZE_LAYER_BASE); t.setBuffer(mScreenshotLayer, buffer); t.setColorSpace(mScreenshotLayer, screenshotBuffer.getColorSpace()); t.show(mScreenshotLayer); diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java index b0f0d71c2638..e39171343bb9 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java @@ -583,6 +583,13 @@ public class ShellTransitionTests { .setRotate(ROTATION_ANIMATION_SEAMLESS).build()) .build(); assertFalse(DefaultTransitionHandler.isRotationSeamless(seamlessButAlert, displays)); + + // Not seamless if there is no changed task. + final TransitionInfo noTask = new TransitionInfoBuilder(TRANSIT_CHANGE) + .addChange(new ChangeBuilder(TRANSIT_CHANGE).setFlags(FLAG_IS_DISPLAY) + .setRotate().build()) + .build(); + assertFalse(DefaultTransitionHandler.isRotationSeamless(noTask, displays)); } class TransitionInfoBuilder { diff --git a/packages/PrintSpooler/res/values-ru/strings.xml b/packages/PrintSpooler/res/values-ru/strings.xml index 9e2f4799424c..c471ab188eb5 100644 --- a/packages/PrintSpooler/res/values-ru/strings.xml +++ b/packages/PrintSpooler/res/values-ru/strings.xml @@ -24,7 +24,7 @@ <string name="label_paper_size" msgid="908654383827777759">"Размер бумаги"</string> <string name="label_paper_size_summary" msgid="5668204981332138168">"Размер бумаги:"</string> <string name="label_color" msgid="1108690305218188969">"Печать"</string> - <string name="label_duplex" msgid="5370037254347072243">"Двусторонний"</string> + <string name="label_duplex" msgid="5370037254347072243">"С двух сторон"</string> <string name="label_orientation" msgid="2853142581990496477">"Ориентация"</string> <string name="label_pages" msgid="7768589729282182230">"Страницы"</string> <string name="destination_default_text" msgid="5422708056807065710">"Выберите принтер"</string> diff --git a/packages/SettingsLib/SearchWidget/res/values-as/strings.xml b/packages/SettingsLib/SearchWidget/res/values-as/strings.xml index d3f922ab841c..8d95131e0e15 100644 --- a/packages/SettingsLib/SearchWidget/res/values-as/strings.xml +++ b/packages/SettingsLib/SearchWidget/res/values-as/strings.xml @@ -17,5 +17,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="search_menu" msgid="1914043873178389845">"সন্ধান সম্পৰ্কীয় ছেটিংসমূহ"</string> + <string name="search_menu" msgid="1914043873178389845">"সন্ধান সম্পৰ্কীয় ছেটিং"</string> </resources> diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml index 9f9b11d1e3b1..656fe6a9476a 100644 --- a/packages/SettingsLib/res/values-as/strings.xml +++ b/packages/SettingsLib/res/values-as/strings.xml @@ -155,7 +155,7 @@ <string name="running_process_item_user_label" msgid="3988506293099805796">"ব্যৱহাৰকাৰী: <xliff:g id="USER_NAME">%1$s</xliff:g>"</string> <string name="launch_defaults_some" msgid="3631650616557252926">"কিছুমান ডিফ\'ল্ট ছেট কৰা হৈছে"</string> <string name="launch_defaults_none" msgid="8049374306261262709">"কোনো ডিফ\'ল্ট ছেট কৰা হোৱা নাই"</string> - <string name="tts_settings" msgid="8130616705989351312">"পাঠৰ পৰা কথনৰ ছেটিংসমূহ"</string> + <string name="tts_settings" msgid="8130616705989351312">"পাঠৰ পৰা কথনৰ ছেটিং"</string> <string name="tts_settings_title" msgid="7602210956640483039">"পাঠৰ পৰা কথনৰ আউটপুট"</string> <string name="tts_default_rate_title" msgid="3964187817364304022">"কথা কোৱাৰ হাৰ"</string> <string name="tts_default_rate_summary" msgid="3781937042151716987">"পাঠ কথনৰ বেগ"</string> @@ -177,8 +177,8 @@ <string name="tts_status_requires_network" msgid="8327617638884678896">"<xliff:g id="LOCALE">%1$s</xliff:g>ক নেটৱৰ্ক সংযোগৰ দৰকাৰ"</string> <string name="tts_status_not_supported" msgid="2702997696245523743">"<xliff:g id="LOCALE">%1$s</xliff:g> সমৰ্থিত নহয়"</string> <string name="tts_status_checking" msgid="8026559918948285013">"পৰীক্ষা কৰি থকা হৈছে…"</string> - <string name="tts_engine_settings_title" msgid="7849477533103566291">"<xliff:g id="TTS_ENGINE_NAME">%s</xliff:g>ৰ বাবে ছেটিংসমূহ"</string> - <string name="tts_engine_settings_button" msgid="477155276199968948">"ইঞ্জিনৰ ছেটিংসমূহ লঞ্চ কৰক"</string> + <string name="tts_engine_settings_title" msgid="7849477533103566291">"<xliff:g id="TTS_ENGINE_NAME">%s</xliff:g>ৰ ছেটিং"</string> + <string name="tts_engine_settings_button" msgid="477155276199968948">"ইঞ্জিনৰ ছেটিং লঞ্চ কৰক"</string> <string name="tts_engine_preference_section_title" msgid="3861562305498624904">"অগ্ৰাধিকাৰপ্ৰাপ্ত ইঞ্জিন"</string> <string name="tts_general_section_title" msgid="8919671529502364567">"সাধাৰণ"</string> <string name="tts_reset_speech_pitch_title" msgid="7149398585468413246">"কথনভংগী তীব্ৰতা ৰিছেট কৰক"</string> @@ -201,9 +201,9 @@ <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="vpn_settings_not_available" msgid="2894137119965668920">"ভিপিএন ছেটিংসমূহ এই ব্যৱহাৰকাৰীজনৰ বাবে উপলব্ধ নহয়"</string> - <string name="tethering_settings_not_available" msgid="266821736434699780">"এই ব্যৱহাৰকাৰীৰ বাবে টেডাৰিং ছেটিংসমূহ উপলব্ধ নহয়"</string> - <string name="apn_settings_not_available" msgid="1147111671403342300">"এই ব্যৱহাৰকাৰীৰ বাবে একচেছ পইণ্টৰ নাম ছেটিংসমূহ উপলব্ধ নহয়"</string> + <string name="vpn_settings_not_available" msgid="2894137119965668920">"ভিপিএন ছেটিং এই ব্যৱহাৰকাৰীজনৰ বাবে উপলব্ধ নহয়"</string> + <string name="tethering_settings_not_available" msgid="266821736434699780">"এই ব্যৱহাৰকাৰীৰ বাবে টেডাৰিং ছেটিং উপলব্ধ নহয়"</string> + <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> @@ -305,7 +305,7 @@ <string name="adbwifi_warning_title" msgid="727104571653031865">"ৱায়াৰলেচ ডি\'বাগিংৰ অনুমতি দিবনে?"</string> <string name="adbwifi_warning_message" msgid="8005936574322702388">"ৱায়াৰলেচ ডি\'বাগিং কেৱল বিকাশৰ উদ্দেশ্যেৰে কৰা হয়। আপোনাৰ কম্পিউটাৰ আৰু আপোনাৰ ডিভাইচৰ মাজত ডেটা প্ৰতিলিপি কৰিবলৈ, কোনো জাননী নিদিয়াকৈয়ে আপোনাৰ ডিভাইচত এপ্সমূহ ইনষ্টল কৰিবলৈ আৰু লগ ডেটা পঢ়িবলৈ এইটো ব্যৱহাৰ কৰক।"</string> <string name="adb_keys_warning_message" msgid="2968555274488101220">"আপুনি আগতে ইউএছবি ডিবাগিঙৰ বাবে প্ৰৱেশৰ অনুমতি দিয়া সকলো কম্পিউটাৰৰ পৰা সেই অনুমতি প্ৰত্যাহাৰ কৰেনে?"</string> - <string name="dev_settings_warning_title" msgid="8251234890169074553">"বিকাশৰ কামৰ বাবে থকা ছেটিংবিলাকক অনুমতি দিবনে?"</string> + <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> @@ -468,7 +468,7 @@ <string name="external_source_trusted" msgid="1146522036773132905">"অনুমতি দিয়া হৈছে"</string> <string name="external_source_untrusted" msgid="5037891688911672227">"অনুমতি দিয়া হোৱা নাই"</string> <string name="install_other_apps" msgid="3232595082023199454">"অজ্ঞাত এপ্ ইনষ্টল কৰক"</string> - <string name="home" msgid="973834627243661438">"ছেটিংসমূহৰ গৃহপৃষ্ঠা"</string> + <string name="home" msgid="973834627243661438">"Settingsৰ গৃহপৃষ্ঠা"</string> <string-array name="battery_labels"> <item msgid="7878690469765357158">"০%"</item> <item msgid="8894873528875953317">"৫০%"</item> @@ -488,7 +488,7 @@ <string name="retail_demo_reset_title" msgid="1866911701095959800">"পাছৱৰ্ড দৰকাৰী"</string> <string name="active_input_method_subtypes" msgid="4232680535471633046">"সক্ৰিয়হৈ থকা ইনপুট পদ্ধতিসমূহ"</string> <string name="use_system_language_to_select_input_method_subtypes" msgid="4865195835541387040">"ছিষ্টেমৰ ভাষা ব্যৱহাৰ কৰক"</string> - <string name="failed_to_open_app_settings_toast" msgid="764897252657692092">"<xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g>ৰ ছেটিংবিলাক খুলিব পৰা নগ\'ল"</string> + <string name="failed_to_open_app_settings_toast" msgid="764897252657692092">"<xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g>ৰ ছেটিং খুলিব পৰা নগ\'ল"</string> <string name="ime_security_warning" msgid="6547562217880551450">"এই ইনপুট পদ্ধতিটোৱে আপুনি টাইপ কৰা আপোনাৰ ব্যক্তিগত ডেটা যেনে পাছৱৰ্ডসমূহ আৰু ক্ৰেডিট কাৰ্ডৰ নম্বৰসমূহকে ধৰি সকলো পাঠ সংগ্ৰহ কৰিবলৈ সক্ষম হ\'ব পাৰে। <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g> এপটোৰ লগত ই সংলগ্ন। এই ইনপুট পদ্ধতিটো ব্যৱহাৰ কৰেনে?"</string> <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"টোকা: ৰিবুট কৰাৰ পিছত আপুনি ফ\'নটো আনলক নকৰালৈকে এই এপটো ষ্টাৰ্ট নহ’ব"</string> <string name="ims_reg_title" msgid="8197592958123671062">"আইএমএছ পঞ্জীয়ন স্থিতি"</string> @@ -546,7 +546,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> diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml index 5da56d1325e4..6f8f99b03be6 100644 --- a/packages/SettingsLib/res/values-te/strings.xml +++ b/packages/SettingsLib/res/values-te/strings.xml @@ -167,8 +167,8 @@ <string name="tts_default_lang_summary" msgid="9042620014800063470">"టెక్స్ట్ను చదివి వినిపించేటప్పుడు, ఒక్కో భాషకు వాడాల్సిన నిర్దిష్ట వాయిస్ను సెట్ చేస్తుంది"</string> <string name="tts_play_example_title" msgid="1599468547216481684">"ఒక ఉదాహరణ వినండి"</string> <string name="tts_play_example_summary" msgid="634044730710636383">"ప్రసంగ సమన్వయం గురించి సంక్షిప్త ప్రదర్శనను ప్లే చేయి"</string> - <string name="tts_install_data_title" msgid="1829942496472751703">"వాయిస్ డేటాను ఇన్స్టాల్ చేయి"</string> - <string name="tts_install_data_summary" msgid="3608874324992243851">"ప్రసంగ సమన్వయం కోసం అవసరమైన వాయిస్ డేటాను ఇన్స్టాల్ చేయండి"</string> + <string name="tts_install_data_title" msgid="1829942496472751703">"వాయిస్ డేటాను ఇన్స్టాల్ చేయండి"</string> + <string name="tts_install_data_summary" msgid="3608874324992243851">"స్పీచ్ సమన్వయం కోసం అవసరమైన వాయిస్ డేటాను ఇన్స్టాల్ చేయండి"</string> <string name="tts_engine_security_warning" msgid="3372432853837988146">"ఈ ప్రసంగ సమన్వయ ఇంజిన్ చదివి వినిపించబడే మొత్తం వచనాన్ని అలాగే పాస్వర్డలు మరియు క్రెడిట్ కార్డు నంబర్ల వంటి వ్యక్తిగత డేటాను సేకరించగలదు. ఇది <xliff:g id="TTS_PLUGIN_ENGINE_NAME">%s</xliff:g> ఇంజిన్లో అందించబడుతుంది. ఈ ప్రసంగ సమన్వయ ఇంజిన్ యొక్క వినియోగాన్ని ప్రారంభించాలా?"</string> <string name="tts_engine_network_required" msgid="8722087649733906851">"వచనం నుండి ప్రసంగం అవుట్పుట్ కోసం ఈ భాషకు పని చేస్తున్న నెట్వర్క్ కనెక్షన్ కావాలి."</string> <string name="tts_default_sample_string" msgid="6388016028292967973">"ఇది ప్రసంగ సమన్వయానికి ఉదాహరణ"</string> diff --git a/packages/SettingsLib/src/com/android/settingslib/SignalIcon.java b/packages/SettingsLib/src/com/android/settingslib/SignalIcon.java index bc0c6f36e96a..794b0eb66519 100644 --- a/packages/SettingsLib/src/com/android/settingslib/SignalIcon.java +++ b/packages/SettingsLib/src/com/android/settingslib/SignalIcon.java @@ -15,6 +15,8 @@ */ package com.android.settingslib; +import com.android.settingslib.mobile.TelephonyIcons; + import java.text.SimpleDateFormat; import java.util.Objects; @@ -40,9 +42,17 @@ public class SignalIcon { // For logging. public final String name; - public IconGroup(String name, int[][] sbIcons, int[][] qsIcons, int[] contentDesc, - int sbNullState, int qsNullState, int sbDiscState, int qsDiscState, - int discContentDesc) { + public IconGroup( + String name, + int[][] sbIcons, + int[][] qsIcons, + int[] contentDesc, + int sbNullState, + int qsNullState, + int sbDiscState, + int qsDiscState, + int discContentDesc + ) { this.name = name; this.sbIcons = sbIcons; this.qsIcons = qsIcons; @@ -131,6 +141,19 @@ public class SignalIcon { && other.activityOut == activityOut && other.rssi == rssi; } + + @Override + public int hashCode() { + return Objects.hash( + connected, + enabled, + level, + inetCondition, + iconGroup, + activityIn, + activityOut, + rssi); + } } /** @@ -139,18 +162,31 @@ public class SignalIcon { public static class MobileIconGroup extends IconGroup { public final int dataContentDescription; // mContentDescriptionDataType public final int dataType; - public final boolean isWide; - public final int qsDataType; - - public MobileIconGroup(String name, int[][] sbIcons, int[][] qsIcons, int[] contentDesc, - int sbNullState, int qsNullState, int sbDiscState, int qsDiscState, - int discContentDesc, int dataContentDesc, int dataType, boolean isWide) { - super(name, sbIcons, qsIcons, contentDesc, sbNullState, qsNullState, sbDiscState, - qsDiscState, discContentDesc); + + public MobileIconGroup( + String name, + int[][] sbIcons, + int[][] qsIcons, + int[] contentDesc, + int sbNullState, + int qsNullState, + int sbDiscState, + int qsDiscState, + int discContentDesc, + int dataContentDesc, + int dataType + ) { + super(name, + sbIcons, + qsIcons, + contentDesc, + sbNullState, + qsNullState, + sbDiscState, + qsDiscState, + discContentDesc); this.dataContentDescription = dataContentDesc; this.dataType = dataType; - this.isWide = isWide; - this.qsDataType = dataType; // TODO: remove this field } } @@ -187,6 +223,27 @@ public class SignalIcon { defaultDataOff = state.defaultDataOff; } + /** @return true if this state is disabled or not default data */ + public boolean isDataDisabledOrNotDefault() { + return (iconGroup == TelephonyIcons.DATA_DISABLED + || (iconGroup == TelephonyIcons.NOT_DEFAULT_DATA)) && userSetup; + } + + /** @return if this state is considered to have inbound activity */ + public boolean hasActivityIn() { + return dataConnected && !carrierNetworkChangeMode && activityIn; + } + + /** @return if this state is considered to have outbound activity */ + public boolean hasActivityOut() { + return dataConnected && !carrierNetworkChangeMode && activityOut; + } + + /** @return true if this state should show a RAT icon in quick settings */ + public boolean showQuickSettingsRatIcon() { + return dataConnected || isDataDisabledOrNotDefault(); + } + @Override protected void toString(StringBuilder builder) { super.toString(builder); @@ -202,23 +259,40 @@ public class SignalIcon { builder.append("carrierNetworkChangeMode=").append(carrierNetworkChangeMode) .append(','); builder.append("userSetup=").append(userSetup).append(','); - builder.append("defaultDataOff=").append(defaultDataOff); + builder.append("defaultDataOff=").append(defaultDataOff).append(','); + builder.append("showQuickSettingsRatIcon=").append(showQuickSettingsRatIcon()); } @Override public boolean equals(Object o) { return super.equals(o) - && Objects.equals(((MobileState) o).networkName, networkName) - && Objects.equals(((MobileState) o).networkNameData, networkNameData) - && ((MobileState) o).dataSim == dataSim - && ((MobileState) o).dataConnected == dataConnected - && ((MobileState) o).isEmergency == isEmergency - && ((MobileState) o).airplaneMode == airplaneMode - && ((MobileState) o).carrierNetworkChangeMode == carrierNetworkChangeMode - && ((MobileState) o).userSetup == userSetup - && ((MobileState) o).isDefault == isDefault - && ((MobileState) o).roaming == roaming - && ((MobileState) o).defaultDataOff == defaultDataOff; + && Objects.equals(((MobileState) o).networkName, networkName) + && Objects.equals(((MobileState) o).networkNameData, networkNameData) + && ((MobileState) o).dataSim == dataSim + && ((MobileState) o).dataConnected == dataConnected + && ((MobileState) o).isEmergency == isEmergency + && ((MobileState) o).airplaneMode == airplaneMode + && ((MobileState) o).carrierNetworkChangeMode == carrierNetworkChangeMode + && ((MobileState) o).userSetup == userSetup + && ((MobileState) o).isDefault == isDefault + && ((MobileState) o).roaming == roaming + && ((MobileState) o).defaultDataOff == defaultDataOff; + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), + networkName, + networkNameData, + dataSim, + dataConnected, + isEmergency, + airplaneMode, + carrierNetworkChangeMode, + userSetup, + isDefault, + roaming, + defaultDataOff); } } } diff --git a/packages/SettingsLib/src/com/android/settingslib/mobile/TelephonyIcons.java b/packages/SettingsLib/src/com/android/settingslib/mobile/TelephonyIcons.java index f8565bc2279f..d4e58f7a2fc4 100644 --- a/packages/SettingsLib/src/com/android/settingslib/mobile/TelephonyIcons.java +++ b/packages/SettingsLib/src/com/android/settingslib/mobile/TelephonyIcons.java @@ -50,178 +50,194 @@ public class TelephonyIcons { null, null, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH, - 0, 0, + 0, + 0, 0, 0, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0], R.string.carrier_network_change_mode, - 0, - false); + 0 + ); public static final MobileIconGroup THREE_G = new MobileIconGroup( "3G", null, null, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH, - 0, 0, + 0, + 0, 0, 0, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0], R.string.data_connection_3g, - TelephonyIcons.ICON_3G, - true); + TelephonyIcons.ICON_3G + ); public static final MobileIconGroup WFC = new MobileIconGroup( "WFC", null, null, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH, - 0, 0, + 0, + 0, 0, 0, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0], - 0, 0, false); + 0, + 0); public static final MobileIconGroup UNKNOWN = new MobileIconGroup( "Unknown", null, null, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH, - 0, 0, + 0, + 0, 0, 0, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0], - 0, 0, false); + 0, + 0); public static final MobileIconGroup E = new MobileIconGroup( "E", null, null, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH, - 0, 0, + 0, + 0, 0, 0, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0], R.string.data_connection_edge, - TelephonyIcons.ICON_E, - false); + TelephonyIcons.ICON_E + ); public static final MobileIconGroup ONE_X = new MobileIconGroup( "1X", null, null, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH, - 0, 0, + 0, + 0, 0, 0, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0], R.string.data_connection_cdma, - TelephonyIcons.ICON_1X, - true); + TelephonyIcons.ICON_1X + ); public static final MobileIconGroup G = new MobileIconGroup( "G", null, null, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH, - 0, 0, + 0, + 0, 0, 0, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0], R.string.data_connection_gprs, - TelephonyIcons.ICON_G, - false); + TelephonyIcons.ICON_G + ); public static final MobileIconGroup H = new MobileIconGroup( "H", null, null, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH, - 0, 0, + 0, + 0, 0, 0, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0], R.string.data_connection_3_5g, - TelephonyIcons.ICON_H, - false); + TelephonyIcons.ICON_H + ); public static final MobileIconGroup H_PLUS = new MobileIconGroup( "H+", null, null, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH, - 0, 0, + 0, + 0, 0, 0, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0], R.string.data_connection_3_5g_plus, - TelephonyIcons.ICON_H_PLUS, - false); + TelephonyIcons.ICON_H_PLUS + ); public static final MobileIconGroup FOUR_G = new MobileIconGroup( "4G", null, null, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH, - 0, 0, + 0, + 0, 0, 0, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0], R.string.data_connection_4g, - TelephonyIcons.ICON_4G, - true); + TelephonyIcons.ICON_4G + ); public static final MobileIconGroup FOUR_G_PLUS = new MobileIconGroup( "4G+", null, null, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH, - 0, 0, + 0, + 0, 0, 0, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0], R.string.data_connection_4g_plus, - TelephonyIcons.ICON_4G_PLUS, - true); + TelephonyIcons.ICON_4G_PLUS + ); public static final MobileIconGroup LTE = new MobileIconGroup( "LTE", null, null, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH, - 0, 0, + 0, + 0, 0, 0, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0], R.string.data_connection_lte, - TelephonyIcons.ICON_LTE, - true); + TelephonyIcons.ICON_LTE + ); public static final MobileIconGroup LTE_PLUS = new MobileIconGroup( "LTE+", null, null, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH, - 0, 0, + 0, + 0, 0, 0, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0], R.string.data_connection_lte_plus, - TelephonyIcons.ICON_LTE_PLUS, - true); + TelephonyIcons.ICON_LTE_PLUS + ); public static final MobileIconGroup LTE_CA_5G_E = new MobileIconGroup( "5Ge", null, null, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH, - 0, 0, + 0, + 0, 0, 0, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0], R.string.data_connection_5ge_html, - TelephonyIcons.ICON_5G_E, - true); + TelephonyIcons.ICON_5G_E + ); public static final MobileIconGroup NR_5G = new MobileIconGroup( "5G", @@ -234,8 +250,8 @@ public class TelephonyIcons { 0, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0], R.string.data_connection_5g, - TelephonyIcons.ICON_5G, - true); + TelephonyIcons.ICON_5G + ); public static final MobileIconGroup NR_5G_PLUS = new MobileIconGroup( "5G_PLUS", @@ -248,34 +264,36 @@ public class TelephonyIcons { 0, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0], R.string.data_connection_5g_plus, - TelephonyIcons.ICON_5G_PLUS, - true); + TelephonyIcons.ICON_5G_PLUS + ); public static final MobileIconGroup DATA_DISABLED = new MobileIconGroup( "DataDisabled", null, null, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH, - 0, 0, + 0, + 0, 0, 0, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0], R.string.cell_data_off_content_description, - 0, - false); + 0 + ); public static final MobileIconGroup NOT_DEFAULT_DATA = new MobileIconGroup( "NotDefaultData", null, null, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH, - 0, 0, + 0, + 0, 0, 0, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0], R.string.not_default_data_content_description, - 0, - false); + 0 + ); public static final MobileIconGroup CARRIER_MERGED_WIFI = new MobileIconGroup( "CWF", @@ -288,8 +306,8 @@ public class TelephonyIcons { /* qsDiscState= */ 0, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0], R.string.data_connection_carrier_wifi, - TelephonyIcons.ICON_CWF, - /* isWide= */ true); + TelephonyIcons.ICON_CWF + ); // When adding a new MobileIconGround, check if the dataContentDescription has to be filtered // in QSCarrier#hasValidTypeContentDescription diff --git a/packages/SettingsLib/src/com/android/settingslib/utils/StringUtil.java b/packages/SettingsLib/src/com/android/settingslib/utils/StringUtil.java index b65637f4c45f..5ee919bfe538 100644 --- a/packages/SettingsLib/src/com/android/settingslib/utils/StringUtil.java +++ b/packages/SettingsLib/src/com/android/settingslib/utils/StringUtil.java @@ -19,6 +19,7 @@ package com.android.settingslib.utils; import android.content.Context; import android.icu.text.MeasureFormat; import android.icu.text.MeasureFormat.FormatWidth; +import android.icu.text.MessageFormat; import android.icu.text.RelativeDateTimeFormatter; import android.icu.text.RelativeDateTimeFormatter.RelativeUnit; import android.icu.util.Measure; @@ -31,7 +32,9 @@ import android.text.style.TtsSpan; import com.android.settingslib.R; import java.util.ArrayList; +import java.util.HashMap; import java.util.Locale; +import java.util.Map; /** Utility class for generally useful string methods **/ public class StringUtil { @@ -183,4 +186,37 @@ public class StringUtil { return formatRelativeTime(context, millis, withSeconds, RelativeDateTimeFormatter.Style.LONG); } + + /** + * Get ICU plural string without additional arguments + * + * @param context Context used to get the string + * @param count The number used to get the correct string for the current language's plural + * rules. + * @param resId Resource id of the string + * + * @return Formatted plural string + */ + public static String getIcuPluralsString(Context context, int count, int resId) { + MessageFormat msgFormat = new MessageFormat(context.getResources().getString(resId), + Locale.getDefault()); + Map<String, Object> arguments = new HashMap<>(); + arguments.put("count", count); + return msgFormat.format(arguments); + } + + /** + * Get ICU plural string with additional arguments + * + * @param context Context used to get the string + * @param args String arguments + * @param resId Resource id of the string + * + * @return Formatted plural string + */ + public static String getIcuPluralsString(Context context, Map<String, Object> args, int resId) { + MessageFormat msgFormat = new MessageFormat(context.getResources().getString(resId), + Locale.getDefault()); + return msgFormat.format(args); + } } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/MobileStateTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/MobileStateTest.java new file mode 100644 index 000000000000..92a32bce1799 --- /dev/null +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/MobileStateTest.java @@ -0,0 +1,133 @@ +/* + * 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.settingslib; + +import static junit.framework.Assert.assertFalse; +import static junit.framework.Assert.assertTrue; + +import com.android.settingslib.mobile.TelephonyIcons; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; + +@RunWith(RobolectricTestRunner.class) +public class MobileStateTest { + + private SignalIcon.MobileState mState = new SignalIcon.MobileState(); + + @Before + public void setUp() { + } + + @Test + public void testIsDataDisabledOrNotDefault_dataDisabled() { + mState.iconGroup = TelephonyIcons.DATA_DISABLED; + mState.userSetup = true; + + assertTrue(mState.isDataDisabledOrNotDefault()); + } + + @Test + public void testIsDataDisabledOrNotDefault_notDefaultData() { + mState.iconGroup = TelephonyIcons.NOT_DEFAULT_DATA; + mState.userSetup = true; + + assertTrue(mState.isDataDisabledOrNotDefault()); + } + + @Test + public void testIsDataDisabledOrNotDefault_notDisabled() { + mState.iconGroup = TelephonyIcons.G; + mState.userSetup = true; + + assertFalse(mState.isDataDisabledOrNotDefault()); + } + + @Test + public void testHasActivityIn_noData_noActivity() { + mState.dataConnected = false; + mState.carrierNetworkChangeMode = false; + mState.activityIn = false; + + assertFalse(mState.hasActivityIn()); + } + + @Test + public void testHasActivityIn_noData_activityIn() { + mState.dataConnected = false; + mState.carrierNetworkChangeMode = false; + mState.activityIn = true; + + assertFalse(mState.hasActivityIn()); + } + + @Test + public void testHasActivityIn_dataConnected_activityIn() { + mState.dataConnected = true; + mState.carrierNetworkChangeMode = false; + mState.activityIn = true; + + assertTrue(mState.hasActivityIn()); + } + + @Test + public void testHasActivityIn_carrierNetworkChange() { + mState.dataConnected = true; + mState.carrierNetworkChangeMode = true; + mState.activityIn = true; + + assertFalse(mState.hasActivityIn()); + } + + @Test + public void testHasActivityOut_noData_noActivity() { + mState.dataConnected = false; + mState.carrierNetworkChangeMode = false; + mState.activityOut = false; + + assertFalse(mState.hasActivityOut()); + } + + @Test + public void testHasActivityOut_noData_activityOut() { + mState.dataConnected = false; + mState.carrierNetworkChangeMode = false; + mState.activityOut = true; + + assertFalse(mState.hasActivityOut()); + } + + @Test + public void testHasActivityOut_dataConnected_activityOut() { + mState.dataConnected = true; + mState.carrierNetworkChangeMode = false; + mState.activityOut = true; + + assertTrue(mState.hasActivityOut()); + } + + @Test + public void testHasActivityOut_carrierNetworkChange() { + mState.dataConnected = true; + mState.carrierNetworkChangeMode = true; + mState.activityOut = true; + + assertFalse(mState.hasActivityOut()); + } +} diff --git a/packages/SettingsProvider/res/values-as/strings.xml b/packages/SettingsProvider/res/values-as/strings.xml index 89b7c1e95482..ead9f4da21ef 100644 --- a/packages/SettingsProvider/res/values-as/strings.xml +++ b/packages/SettingsProvider/res/values-as/strings.xml @@ -19,7 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="4567566098528588863">"ছেটিংছসমূহৰ সঞ্চয়াগাৰ"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"হটস্পটৰ ছেটিংসমূহ সলনি হৈছে"</string> + <string name="app_label" msgid="4567566098528588863">"ছেটিঙৰ ষ্ট\'ৰেজ"</string> + <string name="wifi_softap_config_change" msgid="5688373762357941645">"হটস্পটৰ ছেটিং সলনি হৈছে"</string> <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"সবিশেষ চাবলৈ টিপক"</string> </resources> diff --git a/packages/SystemUI/res/drawable/notif_footer_btn_background.xml b/packages/SystemUI/res/drawable/notif_footer_btn_background.xml index 6725a26c102c..e6266754c0af 100644 --- a/packages/SystemUI/res/drawable/notif_footer_btn_background.xml +++ b/packages/SystemUI/res/drawable/notif_footer_btn_background.xml @@ -14,19 +14,20 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - -<shape xmlns:android="http://schemas.android.com/apk/res/android" +<ripple 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/colorSurface" - /> - <corners android:radius="20dp" /> - - <padding - android:left="20dp" - android:right="20dp"> - </padding> - -</shape>
\ No newline at end of file + android:color="?android:attr/colorControlHighlight"> + <item> + <inset + android:insetBottom="4dp" + android:insetTop="4dp"> + <shape android:shape="rectangle"> + <corners android:radius="20dp" /> + <padding + android:left="20dp" + android:right="20dp" /> + <solid android:color="?androidprv:attr/colorSurface" /> + </shape> + </inset> + </item> +</ripple> diff --git a/packages/SystemUI/res/layout/internet_connectivity_dialog.xml b/packages/SystemUI/res/layout/internet_connectivity_dialog.xml index b841419c1c75..d286832631ba 100644 --- a/packages/SystemUI/res/layout/internet_connectivity_dialog.xml +++ b/packages/SystemUI/res/layout/internet_connectivity_dialog.xml @@ -39,7 +39,7 @@ android:layout_width="wrap_content" android:layout_height="32dp" android:textColor="?android:attr/textColorPrimary" - android:fontFamily="google-sans" + android:fontFamily="@*android:string/config_headlineFontFamily" android:textSize="24sp"/> <TextView @@ -50,7 +50,7 @@ android:layout_marginTop="4dp" android:ellipsize="end" android:maxLines="1" - android:fontFamily="google-sans" + android:fontFamily="@*android:string/config_headlineFontFamily" android:textSize="14sp"/> </LinearLayout> @@ -87,24 +87,49 @@ android:layout_height="wrap_content" android:orientation="vertical"> <LinearLayout - android:id="@+id/internet_list" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <LinearLayout + android:id="@+id/ethernet_layout" + style="@style/InternetDialog.Network" + android:background="@drawable/settingslib_switch_bar_bg_on" + android:visibility="gone"> + + <FrameLayout + android:layout_width="24dp" + android:layout_height="24dp" + android:layout_gravity="center_vertical|start" + android:clickable="false"> + <ImageView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:autoMirrored="true" + android:src="@drawable/stat_sys_ethernet_fully" + android:tint="@color/connected_network_primary_color"/> + </FrameLayout> + + <LinearLayout + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_weight="1" + android:gravity="start|center_vertical" + android:orientation="vertical" + android:clickable="false"> + <TextView + android:text="@string/ethernet_label" + style="@style/InternetDialog.NetworkTitle.Active"/> + <TextView + android:text="@string/to_switch_networks_disconnect_ethernet" + style="@style/InternetDialog.NetworkSummary.Active"/> + </LinearLayout> + </LinearLayout> + + <LinearLayout android:id="@+id/mobile_network_layout" - android:layout_width="match_parent" - android:layout_height="88dp" - android:clickable="true" - android:focusable="true" - android:background="?android:attr/selectableItemBackground" - android:layout_gravity="center_vertical|start" - android:orientation="horizontal" - android:layout_marginEnd="@dimen/internet_dialog_network_layout_margin" - android:layout_marginStart="@dimen/internet_dialog_network_layout_margin" - android:paddingStart="22dp" - android:paddingEnd="22dp"> + style="@style/InternetDialog.Network"> <FrameLayout android:layout_width="24dp" @@ -121,7 +146,6 @@ <LinearLayout android:layout_weight="1" - android:id="@+id/mobile_network_list" android:orientation="vertical" android:clickable="false" android:layout_width="wrap_content" @@ -129,28 +153,10 @@ android:gravity="start|center_vertical"> <TextView android:id="@+id/mobile_title" - android:textDirection="locale" - android:layout_marginStart="@dimen/internet_dialog_network_layout_margin" - android:layout_marginEnd="7dp" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical|start" - android:ellipsize="end" - android:textColor="?android:attr/textColorPrimary" - android:textSize="16sp" - android:fontFamily="google-sans"/> + style="@style/InternetDialog.NetworkTitle"/> <TextView android:id="@+id/mobile_summary" - android:textDirection="locale" - android:layout_marginStart="@dimen/internet_dialog_network_layout_margin" - android:layout_marginEnd="34dp" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical|start" - android:ellipsize="end" - android:textColor="?android:attr/textColorTertiary" - android:textSize="14sp" - android:fontFamily="google-sans"/> + style="@style/InternetDialog.NetworkSummary"/> </LinearLayout> <FrameLayout @@ -172,17 +178,9 @@ <LinearLayout android:id="@+id/turn_on_wifi_layout" - android:layout_width="match_parent" + style="@style/InternetDialog.Network" android:layout_height="72dp" - android:clickable="true" - android:focusable="true" - android:background="?android:attr/selectableItemBackground" - android:gravity="center" - android:orientation="horizontal" - android:layout_marginEnd="@dimen/internet_dialog_network_layout_margin" - android:layout_marginStart="@dimen/internet_dialog_network_layout_margin" - android:paddingStart="22dp" - android:paddingEnd="22dp"> + android:gravity="center"> <FrameLayout android:layout_weight="1" @@ -193,13 +191,10 @@ <TextView android:id="@+id/wifi_toggle_title" android:text="@string/turn_on_wifi" - android:textDirection="locale" android:layout_width="wrap_content" android:layout_height="match_parent" android:gravity="start|center_vertical" - android:textColor="?android:attr/textColorPrimary" - android:textSize="16sp" - android:fontFamily="google-sans"/> + android:textAppearance="@style/TextAppearance.InternetDialog"/> </FrameLayout> <FrameLayout @@ -222,18 +217,12 @@ <LinearLayout android:id="@+id/wifi_connected_layout" - android:layout_width="match_parent" + style="@style/InternetDialog.Network" android:layout_height="72dp" - android:layout_gravity="center_vertical|start" - android:clickable="true" - android:focusable="true" - android:visibility="gone" - android:background="?android:attr/selectableItemBackground" - android:orientation="horizontal" - android:layout_marginStart="@dimen/internet_dialog_network_layout_margin" - android:layout_marginEnd="@dimen/internet_dialog_network_layout_margin" android:paddingStart="20dp" - android:paddingEnd="24dp"> + android:paddingEnd="24dp" + android:background="@drawable/settingslib_switch_bar_bg_on" + android:visibility="gone"> <FrameLayout android:layout_width="24dp" @@ -248,7 +237,6 @@ </FrameLayout> <LinearLayout - android:id="@+id/wifi_connected_list" android:orientation="vertical" android:clickable="false" android:layout_width="wrap_content" @@ -258,26 +246,11 @@ android:gravity="start|center_vertical"> <TextView android:id="@+id/wifi_connected_title" - android:textDirection="locale" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical|start" - android:layout_marginStart="@dimen/internet_dialog_network_layout_margin" - android:ellipsize="end" - android:textColor="?android:attr/textColorPrimary" - android:textSize="14sp" - android:fontFamily="google-sans"/> + style="@style/InternetDialog.NetworkTitle.Active" + android:textSize="14sp"/> <TextView android:id="@+id/wifi_connected_summary" - android:textDirection="locale" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical|start" - android:layout_marginStart="@dimen/internet_dialog_network_layout_margin" - android:ellipsize="end" - android:textColor="?android:attr/textColorTertiary" - android:textSize="14sp" - android:fontFamily="google-sans"/> + style="@style/InternetDialog.NetworkSummary.Active"/> </LinearLayout> <FrameLayout @@ -340,13 +313,11 @@ android:layout_marginStart="@dimen/internet_dialog_network_layout_margin"> <TextView android:text="@string/see_all_networks" - android:textDirection="locale" android:layout_width="wrap_content" android:layout_height="match_parent" android:gravity="start|center_vertical" - android:textColor="?android:attr/textColorPrimary" - android:textSize="14sp" - android:fontFamily="google-sans"/> + android:textAppearance="@style/TextAppearance.InternetDialog" + android:textSize="14sp"/> </FrameLayout> </LinearLayout> @@ -366,7 +337,7 @@ android:textColor="?android:attr/textColorPrimary" android:text="@string/inline_done_button" android:textSize="14sp" - android:fontFamily="google-sans"/> + android:fontFamily="@*android:string/config_headlineFontFamily"/> </FrameLayout> </LinearLayout> </androidx.core.widget.NestedScrollView> diff --git a/packages/SystemUI/res/layout/internet_list_item.xml b/packages/SystemUI/res/layout/internet_list_item.xml index 05352c507e7e..868331ec830f 100644 --- a/packages/SystemUI/res/layout/internet_list_item.xml +++ b/packages/SystemUI/res/layout/internet_list_item.xml @@ -24,21 +24,15 @@ <LinearLayout android:id="@+id/wifi_list" - android:layout_width="match_parent" + style="@style/InternetDialog.Network" android:layout_height="72dp" - android:layout_gravity="center_vertical|start" - android:clickable="true" - android:focusable="true" - android:background="?android:attr/selectableItemBackground" - android:orientation="horizontal" android:paddingStart="20dp" - android:paddingEnd="40dp"> + android:paddingEnd="24dp"> <FrameLayout android:layout_width="24dp" android:layout_height="24dp" android:clickable="false" - android:layout_gravity="center_vertical|start" - android:layout_marginStart="@dimen/internet_dialog_network_layout_margin"> + android:layout_gravity="center_vertical|start"> <ImageView android:id="@+id/wifi_icon" android:layout_width="wrap_content" @@ -52,31 +46,16 @@ android:clickable="false" android:layout_width="wrap_content" android:layout_height="72dp" + android:layout_marginEnd="30dp" android:layout_weight="1" - android:gravity="start|center_vertical" - android:layout_marginStart="@dimen/internet_dialog_network_layout_margin"> + android:gravity="start|center_vertical"> <TextView android:id="@+id/wifi_title" - android:textDirection="locale" - android:layout_width="wrap_content" - android:layout_height="20dp" - android:gravity="start|center_vertical" - android:ellipsize="end" - android:textColor="?android:attr/textColorPrimary" - android:textSize="14sp" - android:fontFamily="google-sans" - android:layout_marginEnd="18dp"/> + style="@style/InternetDialog.NetworkTitle" + android:textSize="14sp"/> <TextView android:id="@+id/wifi_summary" - android:textDirection="locale" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:gravity="start|center_vertical" - android:ellipsize="end" - android:textColor="?android:attr/textColorSecondary" - android:textSize="14sp" - android:fontFamily="google-sans" - android:layout_marginEnd="18dp"/> + style="@style/InternetDialog.NetworkSummary"/> </LinearLayout> <FrameLayout diff --git a/packages/SystemUI/res/layout/status_bar_notification_footer.xml b/packages/SystemUI/res/layout/status_bar_notification_footer.xml index 412276d05ea3..bbb8df1c5a4a 100644 --- a/packages/SystemUI/res/layout/status_bar_notification_footer.xml +++ b/packages/SystemUI/res/layout/status_bar_notification_footer.xml @@ -30,8 +30,8 @@ style="@style/TextAppearance.NotificationSectionHeaderButton" android:id="@+id/manage_text" android:layout_width="wrap_content" - android:layout_height="40dp" - android:layout_marginTop="16dp" + android:layout_height="48dp" + android:layout_marginTop="12dp" android:layout_gravity="start" android:background="@drawable/notif_footer_btn_background" android:focusable="true" @@ -43,8 +43,8 @@ style="@style/TextAppearance.NotificationSectionHeaderButton" android:id="@+id/dismiss_text" android:layout_width="wrap_content" - android:layout_height="40dp" - android:layout_marginTop="16dp" + android:layout_height="48dp" + android:layout_marginTop="12dp" android:layout_gravity="end" android:background="@drawable/notif_footer_btn_background" android:focusable="true" diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index bfb6969f3724..5cd99f29bbab 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Soek tans na netwerke …"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Kon nie aan netwerk koppel nie"</string> <string name="see_all_networks" msgid="3773666844913168122">"Sien alles"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Ontkoppel Ethernet om netwerke te wissel"</string> </resources> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index df4eafc7301f..2f485ada1186 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"አውታረ መረቦችን በመፈለግ ላይ…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"ከአውታረ መረቡ ጋር መገናኘት አልተሳካም"</string> <string name="see_all_networks" msgid="3773666844913168122">"ሁሉንም ይመልከቱ"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"አውታረ መረቦችን ለመቀየር፣ የኢተርኔት ግንኙነት ያቋርጡ"</string> </resources> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 28c2d7c328f7..81a7f7c29ff2 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -1200,4 +1200,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"جارٍ البحث عن شبكات…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"تعذّر الاتصال بالشبكة."</string> <string name="see_all_networks" msgid="3773666844913168122">"عرض الكل"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"للتبديل بين الشبكات، يجب فصل إيثرنت."</string> </resources> diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index a5d599c05850..d73fd7357c5d 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -37,7 +37,7 @@ <string name="battery_saver_confirmation_title_generic" msgid="2299231884234959849">"বেটাৰী সঞ্চয়কাৰীৰ বিষয়ে"</string> <string name="battery_saver_confirmation_ok" msgid="5042136476802816494">"অন কৰক"</string> <string name="battery_saver_start_action" msgid="4553256017945469937">"বেটাৰি সঞ্চয়কাৰী অন কৰক"</string> - <string name="status_bar_settings_settings_button" msgid="534331565185171556">"ছেটিংসমূহ"</string> + <string name="status_bar_settings_settings_button" msgid="534331565185171556">"ছেটিং"</string> <string name="status_bar_settings_wifi_button" msgid="7243072479837270946">"ৱাই-ফাই"</string> <string name="status_bar_settings_auto_rotation" msgid="8329080442278431708">"স্বয়ং-ঘূৰ্ণন স্ক্ৰীন"</string> <string name="status_bar_settings_mute_label" msgid="914392730086057522">"মিউট"</string> @@ -233,7 +233,7 @@ <string name="accessibility_battery_level" msgid="5143715405241138822">"<xliff:g id="NUMBER">%d</xliff:g> শতাংশ বেটাৰি।"</string> <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"আপোনাৰ ব্যৱহাৰৰ ওপৰত ভিত্তি কৰি বেটাৰী <xliff:g id="PERCENTAGE">%1$s</xliff:g> শতাংশ, প্ৰায় <xliff:g id="TIME">%2$s</xliff:g> বাকী আছে"</string> <string name="accessibility_battery_level_charging" msgid="8892191177774027364">"বেটাৰি চাৰ্জ হৈ আছে, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> শতাংশ।"</string> - <string name="accessibility_settings_button" msgid="2197034218538913880">"ছিষ্টেমৰ ছেটিংসমূহ৷"</string> + <string name="accessibility_settings_button" msgid="2197034218538913880">"ছিষ্টেমৰ ছেটিং৷"</string> <string name="accessibility_notifications_button" msgid="3960913924189228831">"জাননীসমূহ।"</string> <string name="accessibility_overflow_action" msgid="8555835828182509104">"সকলো জাননীবোৰ চাওক"</string> <string name="accessibility_remove_notification" msgid="1641455251495815527">"জাননী মচক৷"</string> @@ -248,9 +248,9 @@ <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"জাননী অগ্ৰাহ্য কৰা হৈছে।"</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"জাননী পেনেল।"</string> - <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"ক্ষিপ্ৰ ছেটিংসমূহ।"</string> + <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"ক্ষিপ্ৰ ছেটিং।"</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"বন্ধ স্ক্ৰীন।"</string> - <string name="accessibility_desc_settings" msgid="6728577365389151969">"ছেটিংসমূহ"</string> + <string name="accessibility_desc_settings" msgid="6728577365389151969">"ছেটিং"</string> <string name="accessibility_desc_recent_apps" msgid="1748675199348914194">"অৱলোকন।"</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"কৰ্মস্থানৰ প্ৰ\'ফাইলৰ লক স্ক্ৰীন"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"বন্ধ কৰক"</string> @@ -318,8 +318,8 @@ <item quantity="other"> ভিতৰত আৰু <xliff:g id="NUMBER_1">%s</xliff:g>টা জাননী আছে।</item> </plurals> <string name="notification_summary_message_format" msgid="5158219088501909966">"<xliff:g id="CONTACT_NAME">%1$s</xliff:g>: <xliff:g id="MESSAGE_CONTENT">%2$s</xliff:g>"</string> - <string name="status_bar_notification_inspect_item_title" msgid="6818779631806163080">"জাননীৰ ছেটিংসমূহ"</string> - <string name="status_bar_notification_app_settings_title" msgid="5050006438806013903">"<xliff:g id="APP_NAME">%s</xliff:g> ছেটিংসমূহ"</string> + <string name="status_bar_notification_inspect_item_title" msgid="6818779631806163080">"জাননীৰ ছেটিং"</string> + <string name="status_bar_notification_app_settings_title" msgid="5050006438806013903">"<xliff:g id="APP_NAME">%s</xliff:g> ছেটিং"</string> <string name="accessibility_rotation_lock_off" msgid="3880436123632448930">"আপোনাৰ ফ\'নৰ স্ক্ৰীন স্বয়ংক্ৰিয়ভাৱে ঘূৰিব।"</string> <string name="accessibility_rotation_lock_on_landscape" msgid="936972553861524360">"স্ক্ৰীন লেণ্ডস্কে\'প দিশত লক কৰা হ’ল।"</string> <string name="accessibility_rotation_lock_on_portrait" msgid="2356633398683813837">"স্ক্ৰীন প\'ৰ্ট্ৰেইট দিশত লক কৰা হ’ল।"</string> @@ -361,7 +361,7 @@ <string name="quick_settings_media_device_label" msgid="8034019242363789941">"মিডিয়া ডিভাইচ"</string> <string name="quick_settings_rssi_label" msgid="3397615415140356701">"RSSI"</string> <string name="quick_settings_rssi_emergency_only" msgid="7499207215265078598">"জৰুৰীকালীন কল মাত্ৰ"</string> - <string name="quick_settings_settings_label" msgid="2214639529565474534">"ছেটিংসমূহ"</string> + <string name="quick_settings_settings_label" msgid="2214639529565474534">"ছেটিং"</string> <string name="quick_settings_time_label" msgid="3352680970557509303">"সময়"</string> <string name="quick_settings_user_label" msgid="1253515509432672496">"মোক"</string> <string name="quick_settings_user_title" msgid="8673045967216204537">"ব্যৱহাৰকাৰী"</string> @@ -555,9 +555,9 @@ <string name="disconnect_vpn" msgid="26286850045344557">"ভিপিএন সংযোগ বিচ্ছিন্ন কৰক"</string> <string name="monitoring_button_view_policies" msgid="3869724835853502410">"নীতিসমূহ চাওক"</string> <string name="monitoring_button_view_controls" msgid="8316440345340701117">"নিয়ন্ত্ৰণসমূহ চাওক"</string> - <string name="monitoring_description_named_management" msgid="505833016545056036">"এই ডিভাইচটো <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>ৰ।\n\nআপোনাৰ আইটি প্ৰশাসকে আপোনাৰ ডিভাইচটোৰ লগত জড়িত ছেটিংসমূহ, কৰ্পৰে’টৰ এক্সেছ, এপ্সমূহ, ডেটা আৰু আপোনাৰ ডিভাইচটোৰ অৱস্থান সম্পৰ্কীয় তথ্য নিৰীক্ষণ কৰাৰ লগতে সেয়া পৰিচালনা কৰিব পাৰে।\n\nঅধিক তথ্যৰ বাবে আপোনাৰ আইটি প্ৰশাসকৰ সৈতে যোগাযোগ কৰক।"</string> + <string name="monitoring_description_named_management" msgid="505833016545056036">"এই ডিভাইচটো <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>ৰ।\n\nআপোনাৰ আইটি প্ৰশাসকে আপোনাৰ ডিভাইচটোৰ লগত জড়িত ছেটিং, কৰ্পৰে’টৰ এক্সেছ, এপ্, ডেটা আৰু আপোনাৰ ডিভাইচটোৰ অৱস্থান সম্পৰ্কীয় তথ্য নিৰীক্ষণ কৰাৰ লগতে সেয়া পৰিচালনা কৰিব পাৰে।\n\nঅধিক তথ্যৰ বাবে আপোনাৰ আইটি প্ৰশাসকৰ সৈতে যোগাযোগ কৰক।"</string> <string name="monitoring_financed_description_named_management" msgid="6108439201399938668">"<xliff:g id="ORGANIZATION_NAME_0">%1$s</xliff:g>এ হয়তো এই ডিভাইচটোৰ সৈতে জড়িত হৈ থকা ডেটা এক্সেছ কৰিব, এপ্ পৰিচালনা কৰিব আৰু এই ডিভাইচটোৰ ছেটিং সলনি কৰিব পাৰিব।\n\nআপোনাৰ যদি কিবা প্ৰশ্ন আছে, তেন্তে <xliff:g id="ORGANIZATION_NAME_1">%2$s</xliff:g>ৰ সৈতে যোগাযোগ কৰক।"</string> - <string name="monitoring_description_management" msgid="4308879039175729014">"এই ডিভাইচটো আপোনাৰ প্ৰতিষ্ঠানৰ।\n\nআপোনাৰ আইটি প্ৰশাসকে আপোনাৰ ডিভাইচটোৰ লগত জড়িত ছেটিংসমূহ, কৰ্পৰে’টৰ এক্সেছ, এপ্সমূহ, ডেটা আৰু আপোনাৰ ডিভাইচটোৰ অৱস্থান সম্পৰ্কীয় তথ্য নিৰীক্ষণ কৰাৰ লগতে সেয়া পৰিচালনা কৰিব পাৰে।\n\nঅধিক তথ্যৰ বাবে আপোনাৰ আইটি প্ৰশাসকৰ সৈতে যোগাযোগ কৰক।"</string> + <string name="monitoring_description_management" msgid="4308879039175729014">"এই ডিভাইচটো আপোনাৰ প্ৰতিষ্ঠানৰ।\n\nআপোনাৰ আইটি প্ৰশাসকে আপোনাৰ ডিভাইচটোৰ লগত জড়িত ছেটিং, কৰ্পৰে’টৰ এক্সেছ, এপ্, ডেটা আৰু আপোনাৰ ডিভাইচটোৰ অৱস্থান সম্পৰ্কীয় তথ্য নিৰীক্ষণ কৰাৰ লগতে সেয়া পৰিচালনা কৰিব পাৰে।\n\nঅধিক তথ্যৰ বাবে আপোনাৰ আইটি প্ৰশাসকৰ সৈতে যোগাযোগ কৰক।"</string> <string name="monitoring_description_management_ca_certificate" msgid="7785013130658110130">"আপোনাৰ প্ৰতিষ্ঠানে এই ডিভাইচটোত এটা প্ৰমাণপত্ৰ সম্পৰ্কীয় কৰ্তৃপক্ষ ইনষ্টল কৰিছে। আপোনাৰ সুৰক্ষিত নেটৱৰ্ক ট্ৰেফিক পৰ্যবেক্ষণ বা সংশোধন কৰা হ\'ব পাৰে।"</string> <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"আপোনাৰ প্ৰতিষ্ঠানে আপোনাৰ কৰ্মস্থানৰ প্ৰ\'ফাইলটোত এটা প্ৰমাণপত্ৰ সম্পৰ্কীয় কৰ্তৃপক্ষ ইনষ্টল কৰিছে। আপোনাৰ সুৰক্ষিত নেটৱৰ্কৰ ট্ৰেফিক পৰ্যবেক্ষণ বা সংশোধন কৰা হ\'ব পাৰে।"</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"এই ডিভাইচটোত এটা প্ৰমাণপত্ৰ সম্পৰ্কীয় কৰ্তৃপক্ষ ইনষ্টল কৰা হৈছে। আপোনাৰ সুৰক্ষিত নেটৱৰ্কৰ ট্ৰেফিক পৰ্যবেক্ষণ বা সংশোধন কৰা হ\'ব পাৰে।"</string> @@ -569,12 +569,12 @@ <string name="monitoring_description_personal_profile_named_vpn" msgid="8179722332380953673">"আপোনাৰ ব্যক্তিগত প্ৰ\'ফাইলটো <xliff:g id="VPN_APP">%1$s</xliff:g>ৰে সংযুক্ত হৈ আছে, যিয়ে আপোনাৰ ইমেইল, এপ্ আৰু ৱেবছাইটকে ধৰি নেটৱর্কৰ কাৰ্যকলাপ পৰ্যবেক্ষণ কৰিব পাৰে।"</string> <string name="monitoring_description_do_header_generic" msgid="6130190408164834986">"আপোনাৰ ডিভাইচটো <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>ৰ দ্বাৰা পৰিচালিত।"</string> <string name="monitoring_description_do_header_with_name" msgid="2696255132542779511">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>এ আপোনাৰ ডিভাইচটো পৰিচালনা কৰিবলৈ <xliff:g id="DEVICE_OWNER_APP">%2$s</xliff:g> ব্যৱহাৰ কৰে।"</string> - <string name="monitoring_description_do_body" msgid="7700878065625769970">"আপোনাৰ প্ৰশাসকে আপোনাৰ ডিভাইচৰ লগত জড়িত ছেটিংসমূহ, কৰ্প\'ৰেইট অনুমতি, এপসমূহ, ডেটা আৰু ডিভাইচৰ অৱস্থান সম্পৰ্কীয় তথ্য পৰ্যবেক্ষণ কৰাৰ লগতে পৰিচালনা কৰিব পাৰিব।"</string> + <string name="monitoring_description_do_body" msgid="7700878065625769970">"আপোনাৰ প্ৰশাসকে আপোনাৰ ডিভাইচৰ লগত জড়িত ছেটিং, কৰ্প\'ৰেইট এক্সেছ, এপ্, ডেটা আৰু ডিভাইচৰ অৱস্থান সম্পৰ্কীয় তথ্য পৰ্যবেক্ষণ তথা পৰিচালনা কৰিব পাৰে।"</string> <string name="monitoring_description_do_learn_more_separator" msgid="1467280496376492558">" "</string> <string name="monitoring_description_do_learn_more" msgid="645149183455573790">"অধিক জানক"</string> <string name="monitoring_description_do_body_vpn" msgid="7699280130070502303">"আপুনি <xliff:g id="VPN_APP">%1$s</xliff:g> ৰে সংযুক্ত হৈ আছে, ই ইমেইল, এপ্ আৰু ৱেবছাইটকে ধৰি আপোনাৰ নেটৱর্কৰ কাৰ্যকলাপ পৰ্যবেক্ষণ কৰিব পাৰে।"</string> <string name="monitoring_description_vpn_settings_separator" msgid="8292589617720435430">" "</string> - <string name="monitoring_description_vpn_settings" msgid="5264167033247632071">"ভিপিএন ছেটিংসমূহ খোলক"</string> + <string name="monitoring_description_vpn_settings" msgid="5264167033247632071">"VPN ছেটিং খোলক"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="7107390013344435439">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="8329781950135541003">"বিশ্বাসী পৰিচয়-পত্ৰসমূহ খোলক"</string> <string name="monitoring_description_network_logging" msgid="577305979174002252">"আপোনাৰ প্ৰশাসকে নেটৱৰ্ক লগিং অন কৰিছে, যিয়ে আপোনাৰ ডিভাইচটোত নেটৱৰ্ক ট্ৰেফিক পৰ্যবেক্ষণ কৰে।\n\nএই সম্পৰ্কে অধিক জানিবলৈ আপোনাৰ প্ৰশাসকৰ সৈতে যোগাযোগ কৰক।"</string> @@ -596,7 +596,7 @@ <string name="hidden_notifications_setup" msgid="2064795578526982467">"ছেট আপ কৰক"</string> <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string> <string name="volume_zen_end_now" msgid="5901885672973736563">"এতিয়া অফ কৰক"</string> - <string name="accessibility_volume_settings" msgid="1458961116951564784">"ধ্বনিৰ ছেটিংসমূহ"</string> + <string name="accessibility_volume_settings" msgid="1458961116951564784">"ধ্বনিৰ ছেটিং"</string> <string name="accessibility_volume_expand" msgid="7653070939304433603">"সম্প্ৰসাৰণ কৰক"</string> <string name="accessibility_volume_collapse" msgid="2746845391013829996">"সংকুচিত কৰক"</string> <string name="volume_odi_captions_tip" msgid="8825655463280990941">"স্বয়ংক্ৰিয় কেপশ্বন মিডিয়া"</string> @@ -621,7 +621,7 @@ <string name="screen_pinning_start" msgid="7483998671383371313">"এপ্টো পিন কৰা হ’ল"</string> <string name="screen_pinning_exit" msgid="4553787518387346893">"এপ্টো আনপিন কৰা হ’ল"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> লুকুৱাবনে?"</string> - <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"আপুনি ইয়াক পৰৱৰ্তী সময়ত ছেটিংসমূহত অন কৰিলে ই পুনৰ প্ৰকট হ\'ব।"</string> + <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"আপুনি পৰৱৰ্তী সময়ত ছেটিঙত ইয়াক অন কৰিলে ই পুনৰ প্ৰকট হ\'ব।"</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"লুকুৱাওক"</string> <string name="stream_voice_call" msgid="7468348170702375660">"কল"</string> <string name="stream_system" msgid="7663148785370565134">"ছিষ্টেম"</string> @@ -659,7 +659,7 @@ <string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string> <string name="show_battery_percentage" msgid="6235377891802910455">"সংযুক্ত বেটাৰিৰ কিমান শতাংশ বাকী আছে দেখুওৱাক"</string> <string name="show_battery_percentage_summary" msgid="9053024758304102915">"চাৰ্জ হৈ নথকা অৱস্থাত বেটাৰি কিমান শতাংশ বাকী স্থিতি দণ্ডৰ ভিতৰত দেখুৱাওক"</string> - <string name="quick_settings" msgid="6211774484997470203">"ক্ষিপ্ৰ ছেটিংসমূহ"</string> + <string name="quick_settings" msgid="6211774484997470203">"ক্ষিপ্ৰ ছেটিং"</string> <string name="status_bar" msgid="4357390266055077437">"স্থিতি দণ্ড"</string> <string name="overview" msgid="3522318590458536816">"অৱলোকন"</string> <string name="demo_mode" msgid="263484519766901593">"ছিষ্টেমৰ UI প্ৰদৰ্শন ম\'ড"</string> @@ -684,21 +684,21 @@ <string name="zen_alarm_warning" msgid="7844303238486849503">"আপুনি আপোনাৰ পিছৰটো এলাৰ্ম <xliff:g id="WHEN">%1$s</xliff:g> বজাত শুনা নাপাব"</string> <string name="alarm_template" msgid="2234991538018805736">"<xliff:g id="WHEN">%1$s</xliff:g> বজাত"</string> <string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g> বজাত"</string> - <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"ক্ষিপ্ৰ ছেটিংসমূহ, <xliff:g id="TITLE">%s</xliff:g>।"</string> + <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"ক্ষিপ্ৰ ছেটিং, <xliff:g id="TITLE">%s</xliff:g>।"</string> <string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"হটস্পট"</string> <string name="accessibility_managed_profile" msgid="4703836746209377356">"কৰ্মস্থানৰ প্ৰ\'ফাইল"</string> <string name="tuner_warning_title" msgid="7721976098452135267">"কিছুমানৰ বাবে আমোদজনক হয় কিন্তু সকলোৰে বাবে নহয়"</string> <string name="tuner_warning" msgid="1861736288458481650">"System UI Tunerএ আপোনাক Android ব্যৱহাৰকাৰী ইণ্টাৰফেইচ সলনি কৰিবলৈ আৰু নিজৰ উপযোগিতা অনুসৰি ব্যৱহাৰ কৰিবলৈ অতিৰিক্ত সুবিধা প্ৰদান কৰে। এই পৰীক্ষামূলক সুবিধাসমূহ সলনি হ\'ব পাৰে, সেইবোৰে কাম নকৰিব পাৰে বা আগন্তুক সংস্কৰণসমূহত সেইবোৰ অন্তৰ্ভুক্ত কৰা নহ’ব পাৰে। সাৱধানেৰে আগবাঢ়ক।"</string> <string name="tuner_persistent_warning" msgid="230466285569307806">"এই পৰীক্ষামূলক সুবিধাসমূহ সলনি হ\'ব পাৰে, সেইবোৰে কাম নকৰিব পাৰে বা আগন্তুক সংস্কৰণসমূহত সেইবোৰ অন্তৰ্ভুক্ত কৰা নহ’ব পাৰে। সাৱধানেৰে আগবাঢ়ক।"</string> <string name="got_it" msgid="477119182261892069">"বুজি পালোঁ"</string> - <string name="tuner_toast" msgid="3812684836514766951">"অভিনন্দন! ছেটিংসমূহত System UI Tuner যোগ কৰা হৈছে"</string> - <string name="remove_from_settings" msgid="633775561782209994">"ছেটিংসমূহৰ পৰা আঁতৰাওক"</string> - <string name="remove_from_settings_prompt" msgid="551565437265615426">"ছেটিংসমূহৰ পৰা System UI Tuner আঁতৰাই ইয়াৰ সুবিধাসমূহ ব্যৱহাৰ কৰাটো বন্ধ কৰিবনে?"</string> + <string name="tuner_toast" msgid="3812684836514766951">"অভিনন্দন! ছেটিঙত System UI Tuner যোগ কৰা হৈছে"</string> + <string name="remove_from_settings" msgid="633775561782209994">"ছেটিঙৰ পৰা আঁতৰাওক"</string> + <string name="remove_from_settings_prompt" msgid="551565437265615426">"ছেটিঙৰ পৰা System UI Tuner আঁতৰাই ইয়াৰ সুবিধাসমূহ ব্যৱহাৰ কৰাটো বন্ধ কৰিবনে?"</string> <string name="activity_not_found" msgid="8711661533828200293">"আপোনাৰ ডিভাইচত এপ্লিকেশ্বনটো ইনষ্টল কৰা হোৱা নাই"</string> <string name="clock_seconds" msgid="8709189470828542071">"ঘড়ীৰ ছেকেণ্ড দেখুৱাওক"</string> <string name="clock_seconds_desc" msgid="2415312788902144817">"স্থিতি দণ্ডত ঘড়ীৰ ছেকেণ্ড দেখুৱাওক। এই কার্যই বেটাৰিৰ অৱস্থাত প্ৰভাৱ পেলাব পাৰে।"</string> - <string name="qs_rearrange" msgid="484816665478662911">"ক্ষিপ্ৰ ছেটিংসমূহ পুনৰ সজাওক"</string> - <string name="show_brightness" msgid="6700267491672470007">"দ্ৰুত ছেটিংসমূহত উজ্জ্বলতা দেখুৱাওক"</string> + <string name="qs_rearrange" msgid="484816665478662911">"ক্ষিপ্ৰ ছেটিং পুনৰ সজাওক"</string> + <string name="show_brightness" msgid="6700267491672470007">"দ্ৰুত ছেটিঙত উজ্জ্বলতা দেখুৱাওক"</string> <string name="experimental" msgid="3549865454812314826">"পৰীক্ষামূলক"</string> <string name="enable_bluetooth_title" msgid="866883307336662596">"ব্লুটুথ অন কৰিবনে?"</string> <string name="enable_bluetooth_message" msgid="6740938333772779717">"আপোনাৰ টেবলেটত আপোনাৰ কীব\'ৰ্ড সংযোগ কৰিবলৈ আপুনি প্ৰথমে ব্লুটুথ অন কৰিব লাগিব।"</string> @@ -748,7 +748,7 @@ <string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"বাৰ্তালাপৰ জাননীৰ শীৰ্ষত আৰু প্ৰ’ফাইল চিত্ৰ হিচাপে লক স্ক্ৰীনত দেখুৱায়, এটা বাবল হিচাপে দেখা পোৱা যায়"</string> <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"বাৰ্তালাপৰ জাননীৰ শীৰ্ষত আৰু প্ৰ’ফাইল চিত্ৰ হিচাপে লক স্ক্ৰীনত দেখুৱায়, অসুবিধা নিদিব ম’ডত ব্যাঘাত জন্মায়"</string> <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"বাৰ্তালাপৰ জাননীৰ শীৰ্ষত আৰু প্ৰ’ফাইল চিত্ৰ হিচাপে লক স্ক্ৰীনত দেখুৱায়, এটা বাবল হিচাপে দেখা পোৱা যায়, অসুবিধা নিদিব ম’ডত ব্যাঘাত জন্মায়"</string> - <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ছেটিংসমূহ"</string> + <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ছেটিং"</string> <string name="notification_priority_title" msgid="2079708866333537093">"অগ্ৰাধিকাৰ"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ বাৰ্তালাপৰ সুবিধাসমূহ সমৰ্থন নকৰে"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"এই জাননীসমূহ সংশোধন কৰিব নোৱাৰি।"</string> @@ -763,7 +763,7 @@ <string name="appops_camera_overlay" msgid="6466845606058816484">"এই এপে আপোনাৰ স্ক্ৰীনত থকা অন্য় এপৰ ওপৰত প্ৰদৰ্শিত হৈ কেমেৰা ব্য়ৱহাৰ কৰি আছে।"</string> <string name="appops_mic_overlay" msgid="4609326508944233061">"এই এপে আপোনাৰ স্ক্ৰীনত থকা অন্য় এপৰ ওপৰত প্ৰদৰ্শিত হৈ মাইক্ৰ\'ফ\'ন ব্য়ৱহাৰ কৰি আছে।"</string> <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"এই এপে আপোনাৰ স্ক্ৰীনত থকা অন্য় এপৰ ওপৰত প্ৰদৰ্শিত হৈ মাইক্ৰ\'ফ\'ন আৰু কেমেৰা ব্য়ৱহাৰ কৰি আছে।"</string> - <string name="notification_appops_settings" msgid="5208974858340445174">"ছেটিংসমূহ"</string> + <string name="notification_appops_settings" msgid="5208974858340445174">"ছেটিং"</string> <string name="notification_appops_ok" msgid="2177609375872784124">"ঠিক আছে"</string> <string name="feedback_alerted" msgid="5192459808484271208">"ছিষ্টেমটোৱে স্বয়ংক্ৰিয়ভাৱে এই জাননীটোৰ ক্ষেত্ৰত দিয়া <b>গুৰুত্ব ডিফ’ল্ট</b>লৈ বৃদ্ধি কৰিছে।"</string> <string name="feedback_silenced" msgid="9116540317466126457">"ছিষ্টেমটোৱে স্বয়ংক্ৰিয়ভাৱে এই জাননীটোৰ ক্ষেত্ৰত দিয়া <b>গুৰুত্ব নীৰৱ</b>লৈ হ্ৰাস কৰিছে।"</string> @@ -791,7 +791,7 @@ <string name="notification_menu_gear_description" msgid="6429668976593634862">"জাননীৰ নিয়ন্ত্ৰণসমূহ"</string> <string name="notification_menu_snooze_description" msgid="4740133348901973244">"জাননীক স্নুজ কৰাৰ বিকল্পসমূহ"</string> <string name="notification_menu_snooze_action" msgid="5415729610393475019">"মোক মনত পেলাই দিব"</string> - <string name="notification_menu_settings_action" msgid="7085494017202764285">"ছেটিংসমূহ"</string> + <string name="notification_menu_settings_action" msgid="7085494017202764285">"ছেটিং"</string> <string name="snooze_undo" msgid="2738844148845992103">"আনডু কৰক"</string> <string name="snoozed_for_time" msgid="7586689374860469469">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g>ৰ বাবে স্নুজ কৰক"</string> <plurals name="snoozeHourOptions" formatted="false" msgid="2066838694120718170"> @@ -856,7 +856,7 @@ <string name="battery" msgid="769686279459897127">"বেটাৰি"</string> <string name="clock" msgid="8978017607326790204">"ঘড়ী"</string> <string name="headset" msgid="4485892374984466437">"হেডছেট"</string> - <string name="accessibility_long_click_tile" msgid="210472753156768705">"ছেটিংসমূহ খোলক"</string> + <string name="accessibility_long_click_tile" msgid="210472753156768705">"ছেটিং খোলক"</string> <string name="accessibility_status_bar_headphones" msgid="1304082414912647414">"হেডফ\'ন সংযোগ হৈ আছে"</string> <string name="accessibility_status_bar_headset" msgid="2699275863720926104">"হেডছেট সংযোগ হৈ আছে"</string> <string name="data_saver" msgid="3484013368530820763">"ডেটা সঞ্চয়কাৰী"</string> @@ -920,19 +920,19 @@ <string name="accessibility_qs_edit_position" msgid="4509277359815711830">"<xliff:g id="POSITION">%1$d</xliff:g> নম্বৰ স্থান"</string> <string name="accessibility_qs_edit_tile_added" msgid="9067146040380836334">"টাইল যোগ দিয়া হৈছে"</string> <string name="accessibility_qs_edit_tile_removed" msgid="1175925632436612036">"টাইল আঁতৰোৱা হৈছে"</string> - <string name="accessibility_desc_quick_settings_edit" msgid="741658939453595297">"ক্ষিপ্ৰ ছেটিংসমূহৰ সম্পাদক।"</string> + <string name="accessibility_desc_quick_settings_edit" msgid="741658939453595297">"ক্ষিপ্ৰ ছেটিঙৰ সম্পাদক।"</string> <string name="accessibility_desc_notification_icon" msgid="7331265967584178674">"<xliff:g id="ID_1">%1$s</xliff:g> জাননী: <xliff:g id="ID_2">%2$s</xliff:g>"</string> - <string name="accessibility_quick_settings_settings" msgid="7098489591715844713">"ছেটিংসমূহ খোলক।"</string> - <string name="accessibility_quick_settings_expand" msgid="2609275052412521467">"ক্ষিপ্ৰ ছেটিংসমূহ খোলক।"</string> - <string name="accessibility_quick_settings_collapse" msgid="4674876336725041982">"ক্ষিপ্ৰ ছেটিংসমূহ বন্ধ কৰক।"</string> + <string name="accessibility_quick_settings_settings" msgid="7098489591715844713">"ছেটিং খোলক।"</string> + <string name="accessibility_quick_settings_expand" msgid="2609275052412521467">"ক্ষিপ্ৰ ছেটিং খোলক।"</string> + <string name="accessibility_quick_settings_collapse" msgid="4674876336725041982">"ক্ষিপ্ৰ ছেটিং বন্ধ কৰক।"</string> <string name="accessibility_quick_settings_alarm_set" msgid="7237918261045099853">"এলার্ম ছেট কৰা হ’ল।"</string> <string name="accessibility_quick_settings_user" msgid="505821942882668619">"<xliff:g id="ID_1">%s</xliff:g> হিচাপে ছাইন ইন হ’ল"</string> <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"ব্যৱহাৰকাৰী বাছনি কৰক"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"ইণ্টাৰনেট সংযোগ নাই"</string> <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"বিৱৰণসমূহ খোলক।"</string> <string name="accessibility_quick_settings_not_available" msgid="6860875849497473854">"<xliff:g id="REASON">%s</xliff:g>ৰ বাবে উপলব্ধ নহয়"</string> - <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g>ৰ ছেটিংসমূহ খোলক।"</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"ছেটিংসমূহৰ ক্ৰম সম্পাদনা কৰক।"</string> + <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g>ৰ ছেটিং খোলক।"</string> + <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"ছেটিঙৰ ক্ৰম সম্পাদনা কৰক।"</string> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"পাৱাৰ মেনু"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_2">%2$d</xliff:g>ৰ পৃষ্ঠা <xliff:g id="ID_1">%1$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"লক স্ক্ৰীন"</string> @@ -990,7 +990,7 @@ <string name="mobile_data_disable_title" msgid="5366476131671617790">"ম’বাইল ডেটা অফ কৰিবনে?"</string> <string name="mobile_data_disable_message" msgid="8604966027899770415">"আপুনি <xliff:g id="CARRIER">%s</xliff:g>ৰ জৰিয়তে ডেটা সংযোগ বা ইণ্টাৰনেট সংযোগ নাপাব। কেৱল ৱাই-ফাইৰ যোগেৰে ইণ্টাৰনেট উপলব্ধ হ\'ব।"</string> <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"আপোনাৰ বাহক"</string> - <string name="touch_filtered_warning" msgid="8119511393338714836">"এটা এপে অনুমতি বিচাৰি কৰা অনুৰোধ এটা ঢাকি ধৰা বাবে ছেটিংসমূহে আপোনাৰ উত্তৰ সত্যাপন কৰিব পৰা নাই।"</string> + <string name="touch_filtered_warning" msgid="8119511393338714836">"এটা এপে অনুমতি বিচাৰি কৰা অনুৰোধ এটা ঢাকি ধৰা বাবে ছেটিঙৰ পৰা আপোনাৰ উত্তৰ সত্যাপন কৰিব পৰা নাই।"</string> <string name="slice_permission_title" msgid="3262615140094151017">"<xliff:g id="APP_0">%1$s</xliff:g>ক <xliff:g id="APP_2">%2$s</xliff:g>ৰ অংশ দেখুওৱাবলৈ অনুমতি দিবনে?"</string> <string name="slice_permission_text_1" msgid="6675965177075443714">"- ই <xliff:g id="APP">%1$s</xliff:g>ৰ তথ্য পঢ়িব পাৰে"</string> <string name="slice_permission_text_2" msgid="6758906940360746983">"- ই <xliff:g id="APP">%1$s</xliff:g>ৰ ভিতৰত কাৰ্য কৰিব পাৰে"</string> @@ -1002,7 +1002,7 @@ <string name="no_auto_saver_action" msgid="7467924389609773835">"নালাগে, ধন্যবাদ"</string> <string name="auto_saver_enabled_title" msgid="4294726198280286333">"বেটাৰি সঞ্চয়কাৰীৰ সময়সূচী অন কৰা অৱস্থাত আছে"</string> <string name="auto_saver_enabled_text" msgid="7889491183116752719">"বেটাৰি চ্চাৰ্জৰ স্তৰ <xliff:g id="PERCENTAGE">%d</xliff:g>%%তকৈ কম হোৱাৰ লগে লগে বেটাৰি সঞ্চয়কাৰী স্বয়ংক্ৰিয়ভাৱে অন হ’ব।"</string> - <string name="open_saver_setting_action" msgid="2111461909782935190">"ছেটিংবোৰ"</string> + <string name="open_saver_setting_action" msgid="2111461909782935190">"ছেটিং"</string> <string name="auto_saver_okay_action" msgid="7815925750741935386">"বুজি পালোঁ"</string> <string name="heap_dump_tile_name" msgid="2464189856478823046">"SysUI হীপ ডাম্প কৰক"</string> <string name="ongoing_privacy_chip_content_single_app" msgid="2969750601815230385">"<xliff:g id="APP">%1$s</xliff:g>এ আপোনাৰ <xliff:g id="TYPES_LIST">%2$s</xliff:g> ব্যৱহাৰ কৰি আছে।"</string> @@ -1021,8 +1021,8 @@ <string name="device_services" msgid="1549944177856658705">"ডিভাইচ সেৱা"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"কোনো শিৰোনাম নাই"</string> <string name="bubble_accessibility_action_move" msgid="3185080443743819178">"আঁতৰাওক"</string> - <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"ছিষ্টেম নেভিগেশ্বন আপডে’ট কৰা হ’ল। সলনি কৰিবলৈ ছেটিংসমূহ-লৈ যাওক।"</string> - <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"ছিষ্টেম নেভিগেশ্বন আপডে’ট কৰিবলৈ ছেটিংসমূহ-লৈ যাওক"</string> + <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"ছিষ্টেম নেভিগেশ্বন আপডে’ট কৰা হ’ল। সলনি কৰিবলৈ ছেটিঙলৈ যাওক।"</string> + <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"ছিষ্টেম নেভিগেশ্বন আপডে’ট কৰিবলৈ ছেটিঙলৈ যাওক"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ষ্টেণ্ডবাই"</string> <string name="magnification_window_title" msgid="4863914360847258333">"বিবৰ্ধন ৱিণ্ড’"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"বিবৰ্ধন ৱিণ্ড’ৰ নিয়ন্ত্ৰণসমূহ"</string> @@ -1065,7 +1065,7 @@ <string name="controls_favorite_removed" msgid="5276978408529217272">"সকলো নিয়ন্ত্ৰণ আঁতৰোৱা হৈছে"</string> <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"সালসলনিসমূহ ছেভ নহ’ল"</string> <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"অন্য এপ্সমূহ চাওক"</string> - <string name="controls_favorite_load_error" msgid="5126216176144877419">"নিয়ন্ত্ৰণসমূহ ল’ড কৰিবপৰা নগ’ল। এপ্টোৰ ছেটিংসমূহ সলনি কৰা হোৱা নাই বুলি নিশ্চিত কৰিবলৈ <xliff:g id="APP">%s</xliff:g> এপ্টো পৰীক্ষা কৰক।"</string> + <string name="controls_favorite_load_error" msgid="5126216176144877419">"নিয়ন্ত্ৰণসমূহ ল’ড কৰিবপৰা নগ’ল। এপ্টোৰ ছেটিং সলনি কৰা হোৱা নাই বুলি নিশ্চিত কৰিবলৈ <xliff:g id="APP">%s</xliff:g> এপ্টো পৰীক্ষা কৰক।"</string> <string name="controls_favorite_load_none" msgid="7687593026725357775">"সমিল নিয়ন্ত্ৰণসমূহ উপলব্ধ নহয়"</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"অন্য"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"ডিভাইচৰ নিয়ন্ত্ৰণসমূহত যোগ দিয়ক"</string> @@ -1088,7 +1088,7 @@ <string name="controls_media_active_session" msgid="3146882316024153337">"বৰ্তমানৰ মিডিয়াৰ ছেশ্বনটো লুকুৱাব নোৱাৰি।"</string> <string name="controls_media_dismiss_button" msgid="9081375542265132213">"অগ্ৰাহ্য কৰক"</string> <string name="controls_media_resume" msgid="1933520684481586053">"পুনৰ আৰম্ভ কৰক"</string> - <string name="controls_media_settings_button" msgid="5815790345117172504">"ছেটিংসমূহ"</string> + <string name="controls_media_settings_button" msgid="5815790345117172504">"ছেটিং"</string> <string name="controls_media_playing_item_description" msgid="4531853311504359098">"<xliff:g id="APP_LABEL">%3$s</xliff:g>ত <xliff:g id="ARTIST_NAME">%2$s</xliff:g>ৰ <xliff:g id="SONG_NAME">%1$s</xliff:g> গীতটো প্লে’ হৈ আছে"</string> <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"প্লে’ কৰক"</string> <string name="controls_media_smartspace_rec_description" msgid="4136242327044070732">"<xliff:g id="APP_LABEL">%1$s</xliff:g> খোলক"</string> @@ -1098,7 +1098,7 @@ <string name="controls_error_retryable" msgid="864025882878378470">"আসোঁৱাহ, পুনৰ চেষ্টা কৰি আছে…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"বিচাৰি পোৱা নগ’ল"</string> <string name="controls_error_removed_title" msgid="1207794911208047818">"নিয়ন্ত্ৰণটো উপলব্ধ নহয়"</string> - <string name="controls_error_removed_message" msgid="2885911717034750542">"<xliff:g id="DEVICE">%1$s</xliff:g> এক্সেছ কৰিব পৰা নগ’ল। নিয়ন্ত্ৰণটো এতিয়াও উপলব্ধ আৰু এপ্টোৰ ছেটিংসমূহ সলনি কৰা হোৱা নাই বুলি নিশ্চিত কৰিবলৈ <xliff:g id="APPLICATION">%2$s</xliff:g> এপ্টো পৰীক্ষা কৰক।"</string> + <string name="controls_error_removed_message" msgid="2885911717034750542">"<xliff:g id="DEVICE">%1$s</xliff:g> এক্সেছ কৰিব পৰা নগ’ল। নিয়ন্ত্ৰণটো এতিয়াও উপলব্ধ আৰু এপ্টোৰ ছেটিং সলনি কৰা হোৱা নাই বুলি নিশ্চিত কৰিবলৈ <xliff:g id="APPLICATION">%2$s</xliff:g> এপ্টো পৰীক্ষা কৰক।"</string> <string name="controls_open_app" msgid="483650971094300141">"এপ্টো খোলক"</string> <string name="controls_error_generic" msgid="352500456918362905">"স্থিতি ল’ড কৰিব নোৱাৰি"</string> <string name="controls_error_failed" msgid="960228639198558525">"আসোঁৱাহ হৈছে, আকৌ চেষ্টা কৰক"</string> @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"নেটৱৰ্ক সন্ধান কৰি থকা হৈছে…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"নেটৱৰ্কৰ সৈতে সংযোগ কৰিব পৰা নগ\'ল"</string> <string name="see_all_networks" msgid="3773666844913168122">"আটাইবোৰ চাওক"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"নেটৱৰ্ক সলনি কৰিবলৈ ইথাৰনেটৰ পৰা সংযোগ বিচ্ছিন্ন কৰক"</string> </resources> diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index 7a66f4ea0d6a..f7746e8b6397 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Şəbəkə axtarılır…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Şəbəkəyə qoşulmaq alınmadı"</string> <string name="see_all_networks" msgid="3773666844913168122">"Hamısına baxın"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Şəbəkəni dəyişmək üçün etherneti ayırın"</string> </resources> diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index d7f37e495192..72efc72a36f2 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -1182,4 +1182,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Traže se mreže…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Povezivanje sa mrežom nije uspelo"</string> <string name="see_all_networks" msgid="3773666844913168122">"Pogledajte sve"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Da biste promenili mrežu, prekinite eternet vezu"</string> </resources> diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index a5d613cf7004..f7c20ab54895 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -703,8 +703,8 @@ <string name="activity_not_found" msgid="8711661533828200293">"Праграма не ўсталявана на вашым тэлефоне"</string> <string name="clock_seconds" msgid="8709189470828542071">"Паказваць секунды гадзінніка"</string> <string name="clock_seconds_desc" msgid="2415312788902144817">"Паказваць секунды гадзінніка на панэлі стану. Можа паўплываць на рэсурс акумулятара."</string> - <string name="qs_rearrange" msgid="484816665478662911">"Змяніць парадак Хуткіх налад"</string> - <string name="show_brightness" msgid="6700267491672470007">"Паказваць яркасць у Хуткіх наладах"</string> + <string name="qs_rearrange" msgid="484816665478662911">"Змяніць парадак хуткіх налад"</string> + <string name="show_brightness" msgid="6700267491672470007">"Паказваць яркасць у хуткіх наладах"</string> <string name="experimental" msgid="3549865454812314826">"Эксперыментальныя"</string> <string name="enable_bluetooth_title" msgid="866883307336662596">"Уключыць Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="6740938333772779717">"Для падлучэння клавіятуры да планшэта трэба спачатку ўключыць Bluetooth."</string> @@ -1072,7 +1072,7 @@ <string name="accessibility_control_change_unfavorite" msgid="6997408061750740327">"выдаліць з абранага"</string> <string name="accessibility_control_move" msgid="8980344493796647792">"Перамясціць у пазіцыю <xliff:g id="NUMBER">%d</xliff:g>"</string> <string name="controls_favorite_default_title" msgid="967742178688938137">"Сродкі кіравання"</string> - <string name="controls_favorite_subtitle" msgid="6481675111056961083">"Выберыце элементы кіравання, да якіх вы хочаце мець доступ з Хуткіх налад"</string> + <string name="controls_favorite_subtitle" msgid="6481675111056961083">"Выберыце элементы кіравання, да якіх вы хочаце мець доступ з хуткіх налад"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Каб змяніць парадак элементаў кіравання, утрымлівайце і перацягвайце іх"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Усе элементы кіравання выдалены"</string> <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Змяненні не захаваны"</string> @@ -1188,4 +1188,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Выконваецца пошук сетак…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Не ўдалося падключыцца да сеткі"</string> <string name="see_all_networks" msgid="3773666844913168122">"Паказаць усе"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Каб падключыцца да сетак, выключыце Ethernet"</string> </resources> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index eee5adbb0c3b..b4164a003a1a 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Търсят се мрежи…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Свързването с мрежата не бе успешно"</string> <string name="see_all_networks" msgid="3773666844913168122">"Вижте всички"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"За да превключите мрежите, прекъснете връзката с Ethernet"</string> </resources> diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index 59cb64c6d490..92da7de7286e 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"নেটওয়ার্ক সার্চ করা হচ্ছে…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"নেটওয়ার্কে কানেক্ট করা যায়নি"</string> <string name="see_all_networks" msgid="3773666844913168122">"সবকটি দেখুন"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"নেটওয়ার্ক বদলাতে ইথারনেট ডিসকানেক্ট করুন"</string> </resources> diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index af33862fee48..e913d56be38b 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -1182,4 +1182,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Traženje mreža…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Povezivanje s mrežom nije uspjelo"</string> <string name="see_all_networks" msgid="3773666844913168122">"Prikaži sve"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Da promijenite mrežu, isključite ethernet"</string> </resources> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index f99ca66beb97..be384e372993 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"S\'estan cercant xarxes…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"No s\'ha pogut connectar a la xarxa"</string> <string name="see_all_networks" msgid="3773666844913168122">"Mostra-ho tot"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Per canviar de xarxa, desconnecta la connexió Ethernet"</string> </resources> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index a128bf1d29d1..5be30774348c 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -1188,4 +1188,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Vyhledávání sítí…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Připojení k síti se nezdařilo"</string> <string name="see_all_networks" msgid="3773666844913168122">"Zobrazit vše"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Pokud chcete přepnout sítě, odpojte ethernet"</string> </resources> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index a948a038b527..2c7ffe5154b1 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Søger efter netværk…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Der kunne ikke oprettes forbindelse til netværket"</string> <string name="see_all_networks" msgid="3773666844913168122">"Se alle"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Afbryd ethernetforbindelsen for at skifte netværk"</string> </resources> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 4d00de573565..9c39acdd56f2 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Netzwerke werden gesucht…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Netzwerkverbindung konnte nicht hergestellt werden"</string> <string name="see_all_networks" msgid="3773666844913168122">"Alle ansehen"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Trenne das Ethernetkabel, um das Netzwerk zu wechseln"</string> </resources> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index 0d5c959e37c9..8705ad094e86 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Αναζήτηση δικτύων…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Αποτυχία σύνδεσης στο δίκτυο"</string> <string name="see_all_networks" msgid="3773666844913168122">"Εμφάνιση όλων"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Για εναλλαγή δικτύων, αποσυνδέστε το ethernet"</string> </resources> diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index e47680e964cb..a2bcfd1a41eb 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Searching for networks…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Failed to connect to network"</string> <string name="see_all_networks" msgid="3773666844913168122">"See all"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"To switch networks, disconnect Ethernet"</string> </resources> diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index 43f30bbb7210..1cc3cd37a8e5 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Searching for networks…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Failed to connect to network"</string> <string name="see_all_networks" msgid="3773666844913168122">"See all"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"To switch networks, disconnect Ethernet"</string> </resources> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index e47680e964cb..a2bcfd1a41eb 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Searching for networks…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Failed to connect to network"</string> <string name="see_all_networks" msgid="3773666844913168122">"See all"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"To switch networks, disconnect Ethernet"</string> </resources> diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index e47680e964cb..a2bcfd1a41eb 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Searching for networks…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Failed to connect to network"</string> <string name="see_all_networks" msgid="3773666844913168122">"See all"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"To switch networks, disconnect Ethernet"</string> </resources> diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml index e0ff8b594304..71a1c2fb5f34 100644 --- a/packages/SystemUI/res/values-en-rXC/strings.xml +++ b/packages/SystemUI/res/values-en-rXC/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Searching for networks…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Failed to connect to network"</string> <string name="see_all_networks" msgid="3773666844913168122">"See all"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"To switch networks, disconnect ethernet"</string> </resources> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 8533c120c8a4..0454e73be3d8 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Buscando redes…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Se produjo un error al establecer conexión con la red"</string> <string name="see_all_networks" msgid="3773666844913168122">"Ver todo"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Para cambiar de red, desconéctate de Ethernet"</string> </resources> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 533f368a6746..0751362138bf 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -683,7 +683,7 @@ <string name="zen_alarm_warning_indef" msgid="5252866591716504287">"No oirás la próxima alarma (<xliff:g id="WHEN">%1$s</xliff:g>) a menos que desactives esta opción antes"</string> <string name="zen_alarm_warning" msgid="7844303238486849503">"No oirás la próxima alarma (<xliff:g id="WHEN">%1$s</xliff:g>)"</string> <string name="alarm_template" msgid="2234991538018805736">"a las <xliff:g id="WHEN">%1$s</xliff:g>"</string> - <string name="alarm_template_far" msgid="3561752195856839456">"el <xliff:g id="WHEN">%1$s</xliff:g>"</string> + <string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g>"</string> <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Ajustes rápidos, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Compartir Internet"</string> <string name="accessibility_managed_profile" msgid="4703836746209377356">"Perfil de trabajo"</string> @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Buscando redes…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"No se ha podido conectar a la red"</string> <string name="see_all_networks" msgid="3773666844913168122">"Ver todo"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Para cambiar de red, desconecta el cable Ethernet"</string> </resources> diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index 5bc39f13b2cc..16920069b3db 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Võrkude otsimine …"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Võrguühenduse loomine ebaõnnestus"</string> <string name="see_all_networks" msgid="3773666844913168122">"Kuva kõik"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Võrkude vahetamiseks katkestage Etherneti-ühendus"</string> </resources> diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index aaa1387d7683..8055cfec1994 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Sareak bilatzen…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Ezin izan da konektatu sarera"</string> <string name="see_all_networks" msgid="3773666844913168122">"Ikusi guztiak"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Sarea aldatzeko, deskonektatu Ethernet-a"</string> </resources> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index a97fffb23b38..74f23ac3bbd8 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"درحال جستجوی شبکه…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"اتصال به شبکه برقرار نشد"</string> <string name="see_all_networks" msgid="3773666844913168122">"مشاهده همه"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"برای تغییر شبکه، اترنت را قطع کنید"</string> </resources> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 662a6d65697a..f1144072f0d3 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Etsitään verkkoja…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Yhteyden muodostaminen verkkoon epäonnistui"</string> <string name="see_all_networks" msgid="3773666844913168122">"Näytä kaikki"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Irrota Ethernet-johto, jos haluat vaihtaa verkkoa"</string> </resources> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index 249f12673bda..35ed848a17a3 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Recherche de réseaux en cours…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Échec de la connexion au réseau"</string> <string name="see_all_networks" msgid="3773666844913168122">"Tout afficher"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Pour changer de réseau, débranchez le câble Ethernet"</string> </resources> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 77ed144db71e..514c434be920 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Recherche de réseaux…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Échec de la connexion au réseau"</string> <string name="see_all_networks" msgid="3773666844913168122">"Tout afficher"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Pour changer de réseau, déconnectez l\'Ethernet"</string> </resources> diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index 95f473119275..1eba1ed4d301 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Buscando redes…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Produciuse un erro ao conectarse á rede"</string> <string name="see_all_networks" msgid="3773666844913168122">"Ver todo"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Para cambiar de rede, desconecta a Ethernet"</string> </resources> diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index 829b056246b5..2c4e6e5627fb 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"નેટવર્ક શોધી રહ્યાં છીએ…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"નેટવર્ક સાથે કનેક્ટ કરવામાં નિષ્ફળ થયાં"</string> <string name="see_all_networks" msgid="3773666844913168122">"બધા જુઓ"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"બીજા નેટવર્ક પર જવા માટે, ઇથરનેટ ડિસ્કનેક્ટ કરો"</string> </resources> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index dd4617da727b..3eb45ea8ee82 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"नेटवर्क खोजे जा रहे हैं…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"नेटवर्क से कनेक्ट नहीं किया जा सका"</string> <string name="see_all_networks" msgid="3773666844913168122">"सभी देखें"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"नेटवर्क बदलने के लिए, पहले ईथरनेट को डिसकनेक्ट करें"</string> </resources> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index cf465a1422eb..97dbf591a84f 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -1182,4 +1182,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Traženje mreža…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Povezivanje s mrežom nije uspjelo"</string> <string name="see_all_networks" msgid="3773666844913168122">"Prikaži sve"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Da biste se prebacili na drugu mrežu, odspojite Ethernet"</string> </resources> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index 20a973bae866..ddff2c20cb9c 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Hálózatok keresése…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Nem sikerült hálózathoz csatlakozni."</string> <string name="see_all_networks" msgid="3773666844913168122">"Megtekintés"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Hálózatváltáshoz válassza le az ethernetet"</string> </resources> diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index 17d7d75e8f23..3100b9c72000 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Ցանցերի որոնում…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Չհաջողվեց միանալ ցանցին"</string> <string name="see_all_networks" msgid="3773666844913168122">"Տեսնել բոլորը"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Մի ցանցից մյուսին անցնելու համար անջատեք Ethernet-ը"</string> </resources> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index a4743c188479..80f6ed4d4ed7 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Mencari jaringan …"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Gagal menghubungkan ke jaringan"</string> <string name="see_all_networks" msgid="3773666844913168122">"Lihat semua"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Untuk beralih jaringan, lepaskan kabel ethernet"</string> </resources> diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index d2dbf8db697d..2732b71dca14 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Leitar að netum…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Ekki tókst að tengjast neti"</string> <string name="see_all_networks" msgid="3773666844913168122">"Sjá allt"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Aftengdu ethernet til að skipta um net"</string> </resources> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 81af8010c333..9410c99ad54c 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Ricerca di reti in corso…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Connessione alla rete non riuscita"</string> <string name="see_all_networks" msgid="3773666844913168122">"Mostra tutte"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Per cambiare rete, scollega il cavo Ethernet"</string> </resources> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 0fa9c9a12716..f6b74c389305 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -1188,4 +1188,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"בתהליך חיפוש רשתות…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"נכשל הניסיון להתחבר לרשת"</string> <string name="see_all_networks" msgid="3773666844913168122">"הצגת הכול"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"כדי לעבור בין רשתות, צריך לנתק את האתרנט"</string> </resources> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index 25f72343e4dd..aa6aa3c7f374 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"ネットワークを検索しています…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"ネットワークに接続できませんでした"</string> <string name="see_all_networks" msgid="3773666844913168122">"すべて表示"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"ネットワークを変更するにはイーサネット接続を解除してください"</string> </resources> diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index 2a736345e411..ac604701827d 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"მიმდინარეობს ქსელების ძიება…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"ქსელთან დაკავშირება ვერ ხერხდება"</string> <string name="see_all_networks" msgid="3773666844913168122">"ყველას ნახვა"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"ქსელების გადასართავად, გაწყვიტეთ Ethernet-თან კავშირი"</string> </resources> diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index b09811af9616..fd2bcc7df5a2 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Маңайдағы желілер ізделуде…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Желіге қосылмады."</string> <string name="see_all_networks" msgid="3773666844913168122">"Барлығын көру"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Желілерді ауыстыру үшін ethernet кабелін ажыратыңыз."</string> </resources> diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index ff8aadd45418..035319ef682b 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"កំពុងស្វែងរកបណ្ដាញ…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"មិនអាចភ្ជាប់បណ្ដាញបានទេ"</string> <string name="see_all_networks" msgid="3773666844913168122">"មើលទាំងអស់"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"ដើម្បីប្ដូរបណ្ដាញ សូមផ្ដាច់អ៊ីសឺរណិត"</string> </resources> diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index 07fc1114196a..1d8fbb3fe777 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"ನೆಟ್ವರ್ಕ್ಗಳನ್ನು ಹುಡುಕಲಾಗುತ್ತಿದೆ…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"ನೆಟ್ವರ್ಕ್ಗೆ ಕನೆಕ್ಟ್ ಮಾಡಲು ವಿಫಲವಾಗಿದೆ"</string> <string name="see_all_networks" msgid="3773666844913168122">"ಎಲ್ಲವನ್ನೂ ನೋಡಿ"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"ನೆಟ್ವರ್ಕ್ಗಳನ್ನು ಬದಲಿಸಲು, ಇಥರ್ನೆಟ್ ಅನ್ನು ಡಿಸ್ಕನೆಕ್ಟ್ ಮಾಡಿ"</string> </resources> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index 7e729d1da808..751bfd8a8e32 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"네트워크 검색 중…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"네트워크에 연결하지 못했습니다."</string> <string name="see_all_networks" msgid="3773666844913168122">"모두 보기"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"네트워크를 전환하려면 이더넷을 연결 해제하세요."</string> </resources> diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index d9f1d2c6495d..343457226160 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Тармактар изделүүдө…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Тармакка туташпай калды"</string> <string name="see_all_networks" msgid="3773666844913168122">"Баарын көрүү"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Башка тармактарга которулуу үчүн Ethernet кабелин ажыратыңыз"</string> </resources> diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index c4fa48b69f86..b603ca6ac06e 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"ກຳລັງຊອກຫາເຄືອຂ່າຍ…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"ເຊື່ອມຕໍ່ເຄືອຂ່າຍບໍ່ສຳເລັດ"</string> <string name="see_all_networks" msgid="3773666844913168122">"ເບິ່ງທັງໝົດ"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"ເພື່ອສະຫຼັບເຄືອຂ່າຍ, ໃຫ້ຕັດການເຊື່ອມຕໍ່ອີເທີເນັດກ່ອນ"</string> </resources> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index 3a35355935f7..657c95b79534 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -1188,4 +1188,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Ieškoma tinklų…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Jungiantis prie tinklo įvyko klaida"</string> <string name="see_all_networks" msgid="3773666844913168122">"Žiūrėti viską"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Norėdami perjungti tinklus, atjunkite eternetą"</string> </resources> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index e5eaac58c6e4..f5927db7c26c 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -1182,4 +1182,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Notiek tīklu meklēšana…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Neizdevās izveidot savienojumu ar tīklu"</string> <string name="see_all_networks" msgid="3773666844913168122">"Visu tīklu skatīšana"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Lai pārslēgtu tīklus, atvienojiet tīkla Ethernet vadu."</string> </resources> diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index 85771e3e0490..396fab5d1444 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Се пребаруваат мрежи…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Не успеа да се поврзе на мрежата"</string> <string name="see_all_networks" msgid="3773666844913168122">"Прикажи ги сите"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"За промена на мрежата, прекинете ја врската со етернетот"</string> </resources> diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index db14ca8d1492..6d92e8a46b5e 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"നെറ്റ്വർക്കുകൾ തിരയുന്നു…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"നെറ്റ്വർക്കിൽ കണക്റ്റ് ചെയ്യാനായില്ല"</string> <string name="see_all_networks" msgid="3773666844913168122">"എല്ലാം കാണുക"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"മറ്റ് നെറ്റ്വർക്കുകളിലേക്ക് മാറാൻ, ഇതർനെറ്റ് വിച്ഛേദിക്കുക"</string> </resources> diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index 15414c3540fe..3968d52a84f4 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Сүлжээ хайж байна…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Сүлжээнд холбогдож чадсангүй"</string> <string name="see_all_networks" msgid="3773666844913168122">"Бүгдийг харах"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Сүлжээг сэлгэхийн тулд этернэтийг салгана уу"</string> </resources> diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index 1a4b3a1962ff..69c829c496c8 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -688,7 +688,7 @@ <string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"हॉटस्पॉट"</string> <string name="accessibility_managed_profile" msgid="4703836746209377356">"कार्य प्रोफाईल"</string> <string name="tuner_warning_title" msgid="7721976098452135267">"सर्वांसाठी नाही तर काहींसाठी मजेदार असू शकते"</string> - <string name="tuner_warning" msgid="1861736288458481650">"सिस्टम UI ट्युनर आपल्याला Android वापरकर्ता इंटरफेस ट्विक आणि कस्टमाइझ करण्याचे अनेक प्रकार देते. ही प्रयोगात्मक वैशिष्ट्ये बदलू शकतात, खंडित होऊ शकतात किंवा भविष्यातील रिलीज मध्ये कदाचित दिसणार नाहीत. सावधगिरी बाळगून पुढे सुरू ठेवा."</string> + <string name="tuner_warning" msgid="1861736288458481650">"सिस्टम UI ट्युनर आपल्याला Android यूझर इंटरफेस ट्विक आणि कस्टमाइझ करण्याचे अनेक प्रकार देते. ही प्रयोगात्मक वैशिष्ट्ये बदलू शकतात, खंडित होऊ शकतात किंवा भविष्यातील रिलीज मध्ये कदाचित दिसणार नाहीत. सावधगिरी बाळगून पुढे सुरू ठेवा."</string> <string name="tuner_persistent_warning" msgid="230466285569307806">"ही प्रयोगात्मक वैशिष्ट्ये बदलू शकतात, खंडित होऊ शकतात किंवा भविष्यातील रिलीज मध्ये कदाचित दिसणार नाहीत."</string> <string name="got_it" msgid="477119182261892069">"समजले"</string> <string name="tuner_toast" msgid="3812684836514766951">"अभिनंदन! सिस्टम UI ट्युनर सेटिंग्जमध्ये जोडले गेले आहे"</string> @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"नेटवर्क शोधत आहे…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"नेटवर्कशी कनेक्ट करता आले नाही"</string> <string name="see_all_networks" msgid="3773666844913168122">"सर्व पहा"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"नेटवर्क स्विच करण्यासाठी, इथरनेट केबल डिस्कनेक्ट करा"</string> </resources> diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index 554b08748941..ebe0094d3392 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Mencari rangkaian…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Gagal menyambung kepada rangkaian"</string> <string name="see_all_networks" msgid="3773666844913168122">"Lihat semua"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Untuk menukar rangkaian, putuskan sambungan ethernet"</string> </resources> diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index c19dd2f405c9..42ed54c91ac4 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"ကွန်ရက်များကို ရှာဖွေနေသည်…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"ကွန်ရက်သို့ ချိတ်ဆက်၍မရပါ"</string> <string name="see_all_networks" msgid="3773666844913168122">"အားလုံးကြည့်ရန်"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"ကွန်ရက်ပြောင်းရန် အီသာနက်ကို ချိတ်ဆက်မှုဖြုတ်ပါ"</string> </resources> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index 5deb61291c5a..3337aa1daeef 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Søker etter nettverk …"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Kunne ikke koble til nettverket"</string> <string name="see_all_networks" msgid="3773666844913168122">"Se alle"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"For å bytte nettverk, koble fra Ethernet"</string> </resources> diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index d4362d5b6c73..a7113f3c0081 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"नेटवर्कहरू खोजिँदै छन्…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"नेटवर्कमा कनेक्ट गर्न सकिएन"</string> <string name="see_all_networks" msgid="3773666844913168122">"सबै नेटवर्क हेर्नुहोस्"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"नेटवर्क बदल्न इथरनेट डिस्कनेक्ट गर्नुहोस्"</string> </resources> diff --git a/packages/SystemUI/res/values-night/styles.xml b/packages/SystemUI/res/values-night/styles.xml index 461505f12ce6..ffcc3a821d36 100644 --- a/packages/SystemUI/res/values-night/styles.xml +++ b/packages/SystemUI/res/values-night/styles.xml @@ -48,4 +48,16 @@ <item name="android:windowLightStatusBar">false</item> </style> + <style name="TextAppearance.InternetDialog.Active"> + <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item> + <item name="android:textSize">16sp</item> + <item name="android:textColor">@color/connected_network_primary_color</item> + <item name="android:textDirection">locale</item> + </style> + + <style name="TextAppearance.InternetDialog.Secondary.Active"> + <item name="android:textSize">14sp</item> + <item name="android:textColor">@color/connected_network_secondary_color</item> + </style> + </resources> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index 8c9a8782f1e0..ea9822980b07 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Netwerken zoeken…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Kan geen verbinding maken met het netwerk"</string> <string name="see_all_networks" msgid="3773666844913168122">"Alles tonen"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Verbreek de ethernetverbinding om van netwerk te wisselen"</string> </resources> diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index b43e902a27a5..1ea599f12c20 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"ନେଟୱାର୍କଗୁଡ଼ିକ ସନ୍ଧାନ କରାଯାଉଛି…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"ନେଟୱାର୍କକୁ ସଂଯୋଗ କରିବାରେ ବିଫଳ ହୋଇଛି"</string> <string name="see_all_networks" msgid="3773666844913168122">"ସବୁ ଦେଖନ୍ତୁ"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"ନେଟୱାର୍କ ସ୍ୱିଚ୍ କରିବାକୁ, ଇଥରନେଟ୍ ବିଚ୍ଛିନ୍ନ କରନ୍ତୁ"</string> </resources> diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index d667813b9a93..06364eaabe1f 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"ਨੈੱਟਵਰਕ ਖੋਜੇ ਜਾ ਰਹੇ ਹਨ…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"ਨੈੱਟਵਰਕ ਨਾਲ ਕਨੈਕਟ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ"</string> <string name="see_all_networks" msgid="3773666844913168122">"ਸਭ ਦੇਖੋ"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"ਨੈੱਟਵਰਕਾਂ ਨੂੰ ਬਦਲਣ ਲਈ, ਈਥਰਨੈੱਟ ਨੂੰ ਡਿਸਕਨੈਕਟ ਕਰੋ"</string> </resources> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index 51fc45e49a3e..ae4b5d60727b 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -1188,4 +1188,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Szukam sieci…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Nie udało się połączyć z siecią"</string> <string name="see_all_networks" msgid="3773666844913168122">"Pokaż wszystko"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Aby przełączać sieci, odłącz Ethernet"</string> </resources> diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index 8109c31284a1..cbd43f878e08 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -592,7 +592,7 @@ <string name="keyguard_indication_trust_unlocked_plugged_in" msgid="2323452175329362855">"<xliff:g id="KEYGUARD_INDICATION">%1$s</xliff:g>\n<xliff:g id="POWER_INDICATION">%2$s</xliff:g>"</string> <string name="hidden_notifications_title" msgid="1782412844777612795">"Receba notificações mais rápido"</string> <string name="hidden_notifications_text" msgid="5899627470450792578">"Veja-as antes de desbloquear"</string> - <string name="hidden_notifications_cancel" msgid="4805370226181001278">"Não, obrigado"</string> + <string name="hidden_notifications_cancel" msgid="4805370226181001278">"Agora não"</string> <string name="hidden_notifications_setup" msgid="2064795578526982467">"Configurar"</string> <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string> <string name="volume_zen_end_now" msgid="5901885672973736563">"Desativar agora"</string> @@ -617,7 +617,7 @@ <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"Para liberar o app, toque nos botões \"Voltar\" e home e os mantenha pressionados"</string> <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"Para liberar o app, deslize para cima e mantenha a tela pressionada"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"Entendi"</string> - <string name="screen_pinning_negative" msgid="6882816864569211666">"Não, obrigado"</string> + <string name="screen_pinning_negative" msgid="6882816864569211666">"Agora não"</string> <string name="screen_pinning_start" msgid="7483998671383371313">"App fixado"</string> <string name="screen_pinning_exit" msgid="4553787518387346893">"App liberado"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"Esconder <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Procurando redes…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Falha ao conectar à rede"</string> <string name="see_all_networks" msgid="3773666844913168122">"Ver tudo"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Para mudar de rede, desconecte o cabo Ethernet"</string> </resources> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index 222db52a59ff..a8f62585dc38 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"A procurar redes…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Não foi possível estabelecer ligação à rede"</string> <string name="see_all_networks" msgid="3773666844913168122">"Veja tudo"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Para mudar de rede, desligue a Ethernet"</string> </resources> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 8109c31284a1..cbd43f878e08 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -592,7 +592,7 @@ <string name="keyguard_indication_trust_unlocked_plugged_in" msgid="2323452175329362855">"<xliff:g id="KEYGUARD_INDICATION">%1$s</xliff:g>\n<xliff:g id="POWER_INDICATION">%2$s</xliff:g>"</string> <string name="hidden_notifications_title" msgid="1782412844777612795">"Receba notificações mais rápido"</string> <string name="hidden_notifications_text" msgid="5899627470450792578">"Veja-as antes de desbloquear"</string> - <string name="hidden_notifications_cancel" msgid="4805370226181001278">"Não, obrigado"</string> + <string name="hidden_notifications_cancel" msgid="4805370226181001278">"Agora não"</string> <string name="hidden_notifications_setup" msgid="2064795578526982467">"Configurar"</string> <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string> <string name="volume_zen_end_now" msgid="5901885672973736563">"Desativar agora"</string> @@ -617,7 +617,7 @@ <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"Para liberar o app, toque nos botões \"Voltar\" e home e os mantenha pressionados"</string> <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"Para liberar o app, deslize para cima e mantenha a tela pressionada"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"Entendi"</string> - <string name="screen_pinning_negative" msgid="6882816864569211666">"Não, obrigado"</string> + <string name="screen_pinning_negative" msgid="6882816864569211666">"Agora não"</string> <string name="screen_pinning_start" msgid="7483998671383371313">"App fixado"</string> <string name="screen_pinning_exit" msgid="4553787518387346893">"App liberado"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"Esconder <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Procurando redes…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Falha ao conectar à rede"</string> <string name="see_all_networks" msgid="3773666844913168122">"Ver tudo"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Para mudar de rede, desconecte o cabo Ethernet"</string> </resources> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index 95d264707d0a..751ea3ac4270 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -1182,4 +1182,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Se caută rețele…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Nu s-a realizat conexiunea la rețea"</string> <string name="see_all_networks" msgid="3773666844913168122">"Afișează-le pe toate"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Pentru a schimba rețeaua, deconectați ethernet"</string> </resources> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index 58052ac079f7..4452a0206c7e 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -1188,4 +1188,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Поиск сетей…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Не удалось подключиться к сети"</string> <string name="see_all_networks" msgid="3773666844913168122">"Показать все"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Чтобы переключиться между сетями, отключите кабель Ethernet."</string> </resources> diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index b52ae9365750..e87aefb1db58 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"ජාල සඳහා සොයමින්…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"ජාලය වෙත සම්බන්ධ වීම අසාර්ථක විය"</string> <string name="see_all_networks" msgid="3773666844913168122">"සියල්ල බලන්න"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"ජාල මාරු කිරීමට, ඊතර්නෙට් විසන්ධි කරන්න"</string> </resources> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index 0590d3185aaf..a1719f060ece 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -1188,4 +1188,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Vyhľadávajú sa siete…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Nepodarilo sa pripojiť k sieti"</string> <string name="see_all_networks" msgid="3773666844913168122">"Zobraziť všetko"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Ak chcete prepnúť siete, odpojte ethernet"</string> </resources> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index 0d1e1fb55590..7d86eb1f94df 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -1188,4 +1188,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Iskanje omrežij …"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Vzpostavljanje povezave z omrežjem ni uspelo."</string> <string name="see_all_networks" msgid="3773666844913168122">"Prikaz vseh omrežij"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Če želite preklopiti omrežje, prekinite ethernetno povezavo."</string> </resources> diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index 8a40a3e33644..c5eb836f3d95 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Po kërkon për rrjete…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Lidhja me rrjetin dështoi"</string> <string name="see_all_networks" msgid="3773666844913168122">"Shiko të gjitha"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Për të ndërruar rrjetet, shkëput Ethernet-in"</string> </resources> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index fb9d3d4533e9..b75535a132bf 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -1182,4 +1182,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Траже се мреже…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Повезивање са мрежом није успело"</string> <string name="see_all_networks" msgid="3773666844913168122">"Погледајте све"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Да бисте променили мрежу, прекините етернет везу"</string> </resources> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index d8e31d24bbc4..b0ef22502cd2 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Söker efter nätverk …"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Det gick inte att ansluta till nätverket"</string> <string name="see_all_networks" msgid="3773666844913168122">"Visa alla"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Koppla bort Ethernet för att växla nätverk"</string> </resources> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index 27a25c07b39d..fa1517a23802 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Inatafuta mitandao…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Imeshindwa kuunganisha kwenye mtandao"</string> <string name="see_all_networks" msgid="3773666844913168122">"Angalia yote"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Ili kubadili mitandao, tenganisha ethaneti"</string> </resources> diff --git a/packages/SystemUI/res/values-sw600dp-port/config.xml b/packages/SystemUI/res/values-sw600dp-port/config.xml new file mode 100644 index 000000000000..02fd25bd077c --- /dev/null +++ b/packages/SystemUI/res/values-sw600dp-port/config.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ 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 + --> +<resources> + + <!-- The maximum number of tiles in the QuickQSPanel --> + <integer name="quick_qs_panel_max_tiles">6</integer> + + <!-- The maximum number of rows in the QuickSettings --> + <integer name="quick_settings_max_rows">3</integer> + + <!-- The number of columns in the QuickSettings --> + <integer name="quick_settings_num_columns">3</integer> +</resources> diff --git a/packages/SystemUI/res/values-sw600dp-port/dimens.xml b/packages/SystemUI/res/values-sw600dp-port/dimens.xml index 40838f362f5c..da2403a96afa 100644 --- a/packages/SystemUI/res/values-sw600dp-port/dimens.xml +++ b/packages/SystemUI/res/values-sw600dp-port/dimens.xml @@ -16,6 +16,6 @@ --> <resources> <!-- Size of the panel of large phones on portrait. This shouldn't fill, but have some padding on the side --> - <dimen name="notification_panel_width">416dp</dimen> + <dimen name="notification_panel_width">504dp</dimen> </resources> diff --git a/packages/SystemUI/res/values-sw720dp/config.xml b/packages/SystemUI/res/values-sw720dp/config.xml index 436f8d0998f5..ac44251b2255 100644 --- a/packages/SystemUI/res/values-sw720dp/config.xml +++ b/packages/SystemUI/res/values-sw720dp/config.xml @@ -22,5 +22,14 @@ <resources> <integer name="status_bar_config_maxNotificationIcons">5</integer> + <!-- The maximum number of tiles in the QuickQSPanel --> + <integer name="quick_qs_panel_max_tiles">6</integer> + + <!-- The number of columns in the QuickSettings --> + <integer name="quick_settings_num_columns">3</integer> + + <!-- The maximum number of rows in the QuickSettings --> + <integer name="quick_settings_max_rows">3</integer> + </resources> diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index 01abf2af63a6..5e6e4c60dc89 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -513,7 +513,7 @@ <string name="media_projection_dialog_title" msgid="3316063622495360646">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> மூலம் ரெக்கார்டிங் செய்யவோ அனுப்புவதற்கோ தொடங்கிவீட்டீர்களா?"</string> <string name="media_projection_remember_text" msgid="6896767327140422951">"மீண்டும் காட்டாதே"</string> <string name="clear_all_notifications_text" msgid="348312370303046130">"எல்லாவற்றையும் அழி"</string> - <string name="manage_notifications_text" msgid="6885645344647733116">"அறிவிப்புகளை நிர்வகி"</string> + <string name="manage_notifications_text" msgid="6885645344647733116">"நிர்வகி"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"இதுவரை வந்த அறிவிப்புகள்"</string> <string name="notification_section_header_incoming" msgid="850925217908095197">"புதிது"</string> <string name="notification_section_header_gentle" msgid="6804099527336337197">"சைலன்ட்"</string> @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"நெட்வொர்க்குகளைத் தேடுகிறது…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"நெட்வொர்க்குடன் இணைக்க முடியவில்லை"</string> <string name="see_all_networks" msgid="3773666844913168122">"அனைத்தையும் காட்டு"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"நெட்வொர்க்குகளை மாற்ற ஈதர்நெட் இணைப்பைத் துண்டிக்கவும்"</string> </resources> diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index 21a0ca962a34..f4d93ac3fcee 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -125,7 +125,7 @@ <string name="screenrecord_start_error" msgid="2200660692479682368">"స్క్రీన్ రికార్డింగ్ ప్రారంభించడంలో ఎర్రర్ ఏర్పడింది"</string> <string name="usb_preference_title" msgid="1439924437558480718">"USB ఫైల్ బదిలీ ఎంపికలు"</string> <string name="use_mtp_button_title" msgid="5036082897886518086">"మీడియా ప్లేయర్గా (MTP) మౌంట్ చేయి"</string> - <string name="use_ptp_button_title" msgid="7676427598943446826">"కెమెరాగా (PTP) మౌంట్ చేయి"</string> + <string name="use_ptp_button_title" msgid="7676427598943446826">"ఒక కెమెరాగా (PTP) మౌంట్ చేయండి"</string> <string name="installer_cd_button_title" msgid="5499998592841984743">"Macకు Android ఫైల్ బదిలీ యాప్ ఇన్స్టాల్ చేయండి"</string> <string name="accessibility_back" msgid="6530104400086152611">"వెనుకకు"</string> <string name="accessibility_home" msgid="5430449841237966217">"హోమ్"</string> @@ -147,7 +147,7 @@ <string name="accessibility_manage_notification" msgid="582215815790143983">"నోటిఫికేషన్లను నిర్వహించండి"</string> <string name="phone_label" msgid="5715229948920451352">"ఫోన్ను తెరువు"</string> <string name="voice_assist_label" msgid="3725967093735929020">"వాయిస్ అసిస్టెంట్ను తెరువు"</string> - <string name="camera_label" msgid="8253821920931143699">"కెమెరాను తెరువు"</string> + <string name="camera_label" msgid="8253821920931143699">"కెమెరాను తెరవండి"</string> <string name="cancel" msgid="1089011503403416730">"రద్దు చేయి"</string> <string name="biometric_dialog_confirm" msgid="2005978443007344895">"నిర్ధారించు"</string> <string name="biometric_dialog_try_again" msgid="8575345628117768844">"మళ్లీ ప్రయత్నించు"</string> @@ -430,11 +430,11 @@ <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"ప్రారంభించు"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"ఆపు"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"పరికరం మైక్రోఫోన్ను అన్బ్లాక్ చేయమంటారా?"</string> - <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"పరికరం కెమెరాను అన్బ్లాక్ చేయమంటారా?"</string> - <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"పరికరం కెమెరా, మైక్రోఫోన్ను అన్బ్లాక్ చేయమంటారా?"</string> + <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"పరికరంలోని కెమెరాను అన్బ్లాక్ చేయమంటారా?"</string> + <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"పరికరంలోని కెమెరా, మైక్రోఫోన్లను అన్బ్లాక్ చేయమంటారా?"</string> <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"మీ మైక్రోఫోన్ను ఉపయోగించడానికి అనుమతి పొందిన అన్ని యాప్లు, సర్వీస్లకు యాక్సెస్ను ఇది అన్బ్లాక్ చేస్తుంది."</string> - <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"మీ కెమెరాను ఉపయోగించడానికి అనుమతి పొందిన అన్ని యాప్లు, సర్వీస్లకు యాక్సెస్ను ఇది అన్బ్లాక్ చేస్తుంది."</string> - <string name="sensor_privacy_start_use_mic_camera_dialog_content" msgid="3577642558418404919">"మీ కెమెరాను లేదా మైక్రోఫోన్ను ఉపయోగించడానికి అనుమతి పొందిన అన్ని యాప్లు, సర్వీస్లకు యాక్సెస్ను ఇది అన్బ్లాక్ చేస్తుంది."</string> + <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"ఇది, మీ కెమెరాను ఉపయోగించడానికి అనుమతి పొందిన అన్ని యాప్లకు, సర్వీస్లకు యాక్సెస్ను అన్బ్లాక్ చేస్తుంది."</string> + <string name="sensor_privacy_start_use_mic_camera_dialog_content" msgid="3577642558418404919">"ఇది, మీ కెమెరాను లేదా మైక్రోఫోన్ను ఉపయోగించడానికి అనుమతి పొందిన అన్ని యాప్లకు, సర్వీస్లకు యాక్సెస్ను అన్బ్లాక్ చేస్తుంది."</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"ఇతర పరికరం"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"స్థూలదృష్టిని టోగుల్ చేయి"</string> <string name="expanded_header_battery_charged" msgid="5307907517976548448">"ఛార్జ్ చేయబడింది"</string> @@ -462,7 +462,7 @@ <string name="do_disclosure_with_name" msgid="2091641464065004091">"ఈ పరికరం <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>కు చెందినది"</string> <string name="do_financed_disclosure_with_name" msgid="6723004643314467864">"ఈ పరికరం <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> ద్వారా అందించబడింది"</string> <string name="phone_hint" msgid="6682125338461375925">"ఫోన్ కోసం చిహ్నాన్ని స్వైప్ చేయండి"</string> - <string name="voice_hint" msgid="7476017460191291417">"వాయిస్ అసిస్టెంట్ చిహ్నం నుండి స్వైప్"</string> + <string name="voice_hint" msgid="7476017460191291417">"వాయిస్ అసిస్టెంట్ కోసం చిహ్నం నుండి స్వైప్ చేయండి"</string> <string name="camera_hint" msgid="4519495795000658637">"కెమెరా కోసం చిహ్నాన్ని స్వైప్ చేయండి"</string> <string name="interruption_level_none_with_warning" msgid="8394434073508145437">"మొత్తం నిశ్శబ్దం. దీని వలన స్క్రీన్ రీడర్లు కూడా నిశ్శబ్దమవుతాయి."</string> <string name="interruption_level_none" msgid="219484038314193379">"మొత్తం నిశ్శబ్దం"</string> @@ -756,13 +756,13 @@ <string name="notification_delegate_header" msgid="1264510071031479920">"ప్రాక్సీ చేయబడిన నోటిఫికేషన్"</string> <string name="notification_channel_dialog_title" msgid="6856514143093200019">"అన్ని <xliff:g id="APP_NAME">%1$s</xliff:g> నోటిఫికేషన్లు"</string> <string name="see_more_title" msgid="7409317011708185729">"మరిన్ని చూడండి"</string> - <string name="appops_camera" msgid="5215967620896725715">"ఈ యాప్ ఈ కెమెరాను ఉపయోగిస్తోంది."</string> + <string name="appops_camera" msgid="5215967620896725715">"ఈ యాప్, కెమెరాను ఉపయోగిస్తోంది."</string> <string name="appops_microphone" msgid="8805468338613070149">"ఈ యాప్ మైక్రోఫోన్ను ఉపయోగిస్తుంది."</string> <string name="appops_overlay" msgid="4822261562576558490">"ఈ యాప్ మీ స్క్రీన్లోని ఇతర యాప్లపై ప్రదర్శించబడుతోంది."</string> - <string name="appops_camera_mic" msgid="7032239823944420431">"ఈ యాప్ మైక్రోఫోన్ మరియు కెమెరాను ఉపయోగిస్తుంది."</string> - <string name="appops_camera_overlay" msgid="6466845606058816484">"ఈ యాప్ మీ స్క్రీన్లోని ఇతర యాప్లపై ప్రదర్శించబడుతోంది మరియు కెమెరాను ఉపయోగిస్తుంది."</string> + <string name="appops_camera_mic" msgid="7032239823944420431">"ఈ యాప్ మైక్రోఫోన్ను, కెమెరాను ఉపయోగిస్తోంది."</string> + <string name="appops_camera_overlay" msgid="6466845606058816484">"ఈ యాప్ మీ స్క్రీన్లోని ఇతర యాప్లపై ప్రదర్శించబడుతోంది, కెమెరాను ఉపయోగిస్తోంది."</string> <string name="appops_mic_overlay" msgid="4609326508944233061">"ఈ యాప్ మీ స్క్రీన్లోని ఇతర యాప్లపై ప్రదర్శించబడుతోంది మరియు మైక్రోఫోన్ను ఉపయోగిస్తుంది."</string> - <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"ఈ యాప్ మీ స్క్రీన్లోని ఇతర యాప్లపై ప్రదర్శించబడుతోంది మరియు మైక్రోఫోన్, కెమెరాను ఉపయోగిస్తుంది."</string> + <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"ఈ యాప్ మీ స్క్రీన్లోని ఇతర యాప్లపై ప్రదర్శించబడుతోంది, మైక్రోఫోన్, కెమెరాను ఉపయోగిస్తోంది."</string> <string name="notification_appops_settings" msgid="5208974858340445174">"సెట్టింగ్లు"</string> <string name="notification_appops_ok" msgid="2177609375872784124">"సరే"</string> <string name="feedback_alerted" msgid="5192459808484271208">"ఈ నోటిఫికేషన్, సిస్టమ్ ద్వారా దానంతట అదే <b>ఆటోమేటిక్గా ప్రమోట్ చేయబడింది</b>."</string> @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"నెట్వర్క్ల కోసం సెర్చ్ చేస్తోంది…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"నెట్వర్క్కు కనెక్ట్ చేయడం విఫలమైంది"</string> <string name="see_all_networks" msgid="3773666844913168122">"అన్నీ చూడండి"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"నెట్వర్క్లను మార్చడానికి, ఈథర్నెట్ను డిస్కనెక్ట్ చేయండి"</string> </resources> diff --git a/packages/SystemUI/res/values-te/strings_tv.xml b/packages/SystemUI/res/values-te/strings_tv.xml index 7eded1eaaa65..592f8ce71c1e 100644 --- a/packages/SystemUI/res/values-te/strings_tv.xml +++ b/packages/SystemUI/res/values-te/strings_tv.xml @@ -28,8 +28,8 @@ <string name="tv_notification_panel_no_notifications" msgid="9115191912267270678">"నోటిఫికేషన్లు లేవు"</string> <string name="mic_recording_announcement" msgid="7587123608060316575">"మైక్రోఫోన్ రికార్డింగ్ చేస్తోంది"</string> <string name="camera_recording_announcement" msgid="7240177719403759112">"కెమెరా రికార్డింగ్ చేస్తోంది"</string> - <string name="mic_and_camera_recording_announcement" msgid="8599231390508812667">"కెమెరా, మైక్రోఫోన్ రికార్డింగ్ చేస్తున్నాయి"</string> + <string name="mic_and_camera_recording_announcement" msgid="8599231390508812667">"కెమెరా, మైక్రోఫోన్లు రికార్డింగ్ చేస్తున్నాయి"</string> <string name="mic_stopped_recording_announcement" msgid="7301537004900721242">"మైక్రోఫోన్ రికార్డింగ్ చేయడం ఆపివేసింది"</string> - <string name="camera_stopped_recording_announcement" msgid="8540496432367032801">"కెమెరా రికార్డింగ్ చేయడం ఆపివేసింది"</string> - <string name="mic_camera_stopped_recording_announcement" msgid="8708524579599977412">"కెమెరా, మైక్రోఫోన్ రికార్డింగ్ చేయడం ఆపివేశాయి"</string> + <string name="camera_stopped_recording_announcement" msgid="8540496432367032801">"రికార్డింగ్ చేయడాన్ని కెమెరా ఆపివేసింది"</string> + <string name="mic_camera_stopped_recording_announcement" msgid="8708524579599977412">"కెమెరా, మైక్రోఫోన్లు రికార్డింగ్ చేయడం ఆపివేశాయి"</string> </resources> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index e053541ed94e..d0603a9ea149 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"กำลังค้นหาเครือข่าย…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"เชื่อมต่อเครือข่ายไม่สำเร็จ"</string> <string name="see_all_networks" msgid="3773666844913168122">"ดูทั้งหมด"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"ตัดการเชื่อมต่ออีเทอร์เน็ตเพื่อสลับเครือข่าย"</string> </resources> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index 9eb144916908..bb1cbe8d8ee9 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Naghahanap ng mga network…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Hind nakakonekta sa network"</string> <string name="see_all_networks" msgid="3773666844913168122">"Tingnan lahat"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Para lumipat ng network, idiskonekta ang ethernet"</string> </resources> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index d1599bf95e67..15b702c384ee 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Ağlar aranıyor…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Ağa bağlanılamadı"</string> <string name="see_all_networks" msgid="3773666844913168122">"Tümünü göster"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Ağ değiştirmek için ethernet bağlantısını kesin"</string> </resources> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 482742a8419a..dc30e0beaafb 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -1188,4 +1188,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Пошук мереж…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Не вдалося підключитися до мережі"</string> <string name="see_all_networks" msgid="3773666844913168122">"Показати все"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Щоб вибрати іншу мережу, від’єднайте кабель Ethernet"</string> </resources> diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index 9c80c7ea6bdc..667a9577ef3e 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"نیٹ ورکس تلاش کیے جا رہے ہیں…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"نیٹ ورک سے منسلک ہونے میں ناکام ہو گیا"</string> <string name="see_all_networks" msgid="3773666844913168122">"سبھی دیکھیں"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"نیٹ ورکس پر سوئچ کرنے کیلئے، ایتھرنیٹ غیر منسلک کریں"</string> </resources> diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index 3b775770c0cd..b02ef403bfeb 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Tarmoqlar qidirilmoqda…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Tarmoqqa ulanmadi"</string> <string name="see_all_networks" msgid="3773666844913168122">"Hammasi"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Boshqa tarmoqqa almashish uchun Ethernet tarmogʻini uzing"</string> </resources> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 2d8d2de34c44..d046494e2134 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Đang tìm mạng…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Không kết nối được với mạng"</string> <string name="see_all_networks" msgid="3773666844913168122">"Xem tất cả"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Để chuyển mạng, hãy rút cáp Ethernet"</string> </resources> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 41ebca96539f..c7747fac198e 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"正在搜索网络…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"未能连接到网络"</string> <string name="see_all_networks" msgid="3773666844913168122">"查看全部"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"如要切换网络,请断开以太网连接"</string> </resources> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index 63bc3f65e9a9..e7ffeeae336e 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"正在搜尋網絡…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"無法連接網絡"</string> <string name="see_all_networks" msgid="3773666844913168122">"顯示全部"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"如要切換網絡,請中斷以太網連線"</string> </resources> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index eeb7522b67be..b49cd2b1e7cc 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"正在搜尋網路…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"無法連上網路"</string> <string name="see_all_networks" msgid="3773666844913168122">"查看全部"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"如要切換網路,請中斷乙太網路連線"</string> </resources> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index 29ae3695b472..d4fb489807cb 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -1176,4 +1176,5 @@ <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Iseshela amanethiwekhi…"</string> <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Yehlulekile ukuxhuma kunethiwekhi"</string> <string name="see_all_networks" msgid="3773666844913168122">"Bona konke"</string> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Ukuze ushintshe amanethiwekhi, nqamula i-ethernet"</string> </resources> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 03ba28a3c7f5..3d491b8498e1 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -3022,4 +3022,6 @@ <string name="wifi_failed_connect_message">Failed to connect to network</string> <!-- Provider Model: Title to see all the networks [CHAR LIMIT=50] --> <string name="see_all_networks">See all</string> + <!-- Summary for warning to disconnect ethernet first then switch to other networks. [CHAR LIMIT=60] --> + <string name="to_switch_networks_disconnect_ethernet">To switch networks, disconnect ethernet</string> </resources> diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml index d25474255bfc..8a809e46fe99 100644 --- a/packages/SystemUI/res/values/styles.xml +++ b/packages/SystemUI/res/values/styles.xml @@ -951,4 +951,60 @@ <item name="android:maxHeight">4dp</item> </style> + <!-- Internet Dialog --> + <style name="InternetDialog"> + <item name="android:layout_width">wrap_content</item> + <item name="android:layout_height">wrap_content</item> + <item name="android:layout_gravity">center_vertical|start</item> + <item name="android:layout_marginStart">@dimen/internet_dialog_network_layout_margin</item> + </style> + + <style name="InternetDialog.Network"> + <item name="android:layout_width">match_parent</item> + <item name="android:layout_height">88dp</item> + <item name="android:layout_marginEnd">@dimen/internet_dialog_network_layout_margin</item> + <item name="android:paddingStart">22dp</item> + <item name="android:paddingEnd">22dp</item> + <item name="android:orientation">horizontal</item> + <item name="android:focusable">true</item> + <item name="android:clickable">true</item> + </style> + + <style name="InternetDialog.NetworkTitle"> + <item name="android:layout_marginEnd">7dp</item> + <item name="android:ellipsize">end</item> + <item name="android:textAppearance">@style/TextAppearance.InternetDialog</item> + </style> + + <style name="InternetDialog.NetworkTitle.Active"> + <item name="android:textAppearance">@style/TextAppearance.InternetDialog.Active</item> + </style> + + <style name="InternetDialog.NetworkSummary"> + <item name="android:layout_marginEnd">34dp</item> + <item name="android:ellipsize">end</item> + <item name="android:textAppearance">@style/TextAppearance.InternetDialog.Secondary</item> + </style> + + <style name="InternetDialog.NetworkSummary.Active"> + <item name="android:textAppearance">@style/TextAppearance.InternetDialog.Secondary.Active + </item> + </style> + + <style name="TextAppearance.InternetDialog"> + <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item> + <item name="android:textSize">16sp</item> + <item name="android:textColor">?android:attr/textColorPrimary</item> + <item name="android:textDirection">locale</item> + </style> + + <style name="TextAppearance.InternetDialog.Secondary"> + <item name="android:textSize">14sp</item> + <item name="android:textColor">?android:attr/textColorTertiary</item> + </style> + + <style name="TextAppearance.InternetDialog.Active"/> + + <style name="TextAppearance.InternetDialog.Secondary.Active"/> + </resources> diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/utilities/Utilities.java b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/utilities/Utilities.java index e33985dc4288..6154d84d5b37 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/utilities/Utilities.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/utilities/Utilities.java @@ -18,16 +18,19 @@ package com.android.systemui.shared.recents.utilities; import static android.app.StatusBarManager.NAVIGATION_HINT_BACK_ALT; import static android.app.StatusBarManager.NAVIGATION_HINT_IME_SHOWN; +import static android.util.DisplayMetrics.DENSITY_DEVICE_STABLE; +import android.annotation.TargetApi; import android.content.Context; -import android.content.res.Configuration; -import android.content.res.Resources; import android.graphics.Color; +import android.graphics.Rect; import android.inputmethodservice.InputMethodService; +import android.os.Build; import android.os.Handler; import android.os.Message; import android.util.DisplayMetrics; import android.view.Surface; +import android.view.WindowManager; /* Common code */ public class Utilities { @@ -117,21 +120,20 @@ public class Utilities { return hints; } - /** See {@link #isTablet(Configuration, Context)} */ + /** @return whether or not {@param context} represents that of a large screen device or not */ + @TargetApi(Build.VERSION_CODES.R) public static boolean isTablet(Context context) { - Configuration newConfig = context.getResources().getConfiguration(); - return isTablet(newConfig, context); + final WindowManager windowManager = context.getSystemService(WindowManager.class); + final Rect bounds = windowManager.getCurrentWindowMetrics().getBounds(); + + float originalSmallestWidth = dpiFromPx(Math.min(bounds.width(), bounds.height()), + context.getResources().getConfiguration().densityDpi); + return dpiFromPx(Math.min(bounds.width(), bounds.height()), DENSITY_DEVICE_STABLE) + >= TABLET_MIN_DPS && originalSmallestWidth >= TABLET_MIN_DPS; } - /** - * @return whether or not {@param newConfig} represents that of a large screen device or not - */ - public static boolean isTablet(Configuration newConfig, Context context) { - float density = Resources.getSystem().getDisplayMetrics().density; - int size = Math.min((int) (density * newConfig.screenWidthDp), - (int) (density* newConfig.screenHeightDp)); - DisplayMetrics metrics = context.getResources().getDisplayMetrics(); - float densityRatio = (float) metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT; - return (size / densityRatio) >= TABLET_MIN_DPS; + public static float dpiFromPx(float size, int densityDpi) { + float densityRatio = (float) densityDpi / DisplayMetrics.DENSITY_DEFAULT; + return (size / densityRatio); } } diff --git a/packages/SystemUI/src/com/android/keyguard/LockIconView.java b/packages/SystemUI/src/com/android/keyguard/LockIconView.java index 371564a98aad..ef4353b93179 100644 --- a/packages/SystemUI/src/com/android/keyguard/LockIconView.java +++ b/packages/SystemUI/src/com/android/keyguard/LockIconView.java @@ -48,6 +48,7 @@ public class LockIconView extends FrameLayout implements Dumpable { private ImageView mBgView; private int mLockIconColor; + private boolean mUseBackground = false; public LockIconView(Context context, AttributeSet attrs) { super(context, attrs); @@ -61,8 +62,8 @@ public class LockIconView extends FrameLayout implements Dumpable { mBgView = findViewById(R.id.lock_icon_bg); } - void updateColorAndBackgroundVisibility(boolean useBackground) { - if (useBackground && mLockIcon.getDrawable() != null) { + void updateColorAndBackgroundVisibility() { + if (mUseBackground && mLockIcon.getDrawable() != null) { mLockIconColor = Utils.getColorAttrDefaultColor(getContext(), android.R.attr.textColorPrimary); mBgView.setBackground(getContext().getDrawable(R.drawable.fingerprint_bg)); @@ -78,6 +79,9 @@ public class LockIconView extends FrameLayout implements Dumpable { void setImageDrawable(Drawable drawable) { mLockIcon.setImageDrawable(drawable); + + if (!mUseBackground) return; + if (drawable == null) { mBgView.setVisibility(View.INVISIBLE); } else { @@ -86,6 +90,14 @@ public class LockIconView extends FrameLayout implements Dumpable { } /** + * Whether or not to render the lock icon background. Mainly used for UDPFS. + */ + public void setUseBackground(boolean useBackground) { + mUseBackground = useBackground; + updateColorAndBackgroundVisibility(); + } + + /** * Set the location of the lock icon. */ @VisibleForTesting diff --git a/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java b/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java index 28e19acce506..8cfd225fc4df 100644 --- a/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java @@ -346,7 +346,7 @@ public class LockIconViewController extends ViewController<LockIconView> impleme } private void updateColors() { - mView.updateColorAndBackgroundVisibility(mUdfpsSupported); + mView.updateColorAndBackgroundVisibility(); } private void updateConfiguration() { @@ -427,6 +427,8 @@ public class LockIconViewController extends ViewController<LockIconView> impleme boolean wasUdfpsEnrolled = mUdfpsEnrolled; mUdfpsSupported = mAuthController.getUdfpsSensorLocation() != null; + mView.setUseBackground(mUdfpsSupported); + mUdfpsEnrolled = mKeyguardUpdateMonitor.isUdfpsEnrolled(); if (wasUdfpsSupported != mUdfpsSupported || wasUdfpsEnrolled != mUdfpsEnrolled) { updateVisibility(); diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenu.java b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenu.java index 05256e646948..f182e772f75e 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenu.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenu.java @@ -41,6 +41,7 @@ import androidx.annotation.NonNull; import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.Prefs; +import com.android.systemui.shared.system.SysUiStatsLog; /** * Contains logic for an accessibility floating menu view. @@ -177,6 +178,9 @@ public class AccessibilityFloatingMenu implements IAccessibilityFloatingMenu { } private void onDragEnd(Position position) { + SysUiStatsLog.write(SysUiStatsLog.ACCESSIBILITY_FLOATING_MENU_UI_CHANGED, + position.getPercentageX(), position.getPercentageY(), + mContext.getResources().getConfiguration().orientation); savePosition(mContext, position); showDockTooltipIfNecessary(mContext); } diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java index c125612380d3..b998fb50d0d5 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java +++ b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java @@ -75,6 +75,8 @@ public class MediaControlPanel { private static final String TAG = "MediaControlPanel"; private static final float DISABLED_ALPHA = 0.38f; + private static final String EXPORTED_SMARTSPACE_TRAMPOLINE_ACTIVITY_NAME = "com.google" + + ".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; @@ -627,6 +629,22 @@ public class MediaControlPanel { closeGuts(); mMediaDataManagerLazy.get().dismissSmartspaceRecommendation( data.getTargetId(), MediaViewController.GUTS_ANIMATION_DURATION + 100L); + + Intent dismissIntent = data.getDismissIntent(); + if (dismissIntent == null) { + Log.w(TAG, "Cannot create dismiss action click action: " + + "extras missing dismiss_intent."); + return; + } + + if (dismissIntent.getComponent() != null + && dismissIntent.getComponent().getClassName() + .equals(EXPORTED_SMARTSPACE_TRAMPOLINE_ACTIVITY_NAME)) { + // Dismiss the card Smartspace data through Smartspace trampoline activity. + mContext.startActivity(dismissIntent); + } else { + mContext.sendBroadcast(dismissIntent); + } }); mController = null; diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaDataFilter.kt b/packages/SystemUI/src/com/android/systemui/media/MediaDataFilter.kt index c8deb014f781..79206e86da09 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaDataFilter.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaDataFilter.kt @@ -16,6 +16,7 @@ package com.android.systemui.media +import android.content.Context import android.os.SystemProperties import android.util.Log import com.android.internal.annotations.VisibleForTesting @@ -32,6 +33,8 @@ import kotlin.collections.LinkedHashMap private const val TAG = "MediaDataFilter" private const val DEBUG = true +private const val EXPORTED_SMARTSPACE_TRAMPOLINE_ACTIVITY_NAME = ("com.google" + + ".android.apps.gsa.staticplugins.opa.smartspace.ExportedSmartspaceTrampolineActivity") private const val RESUMABLE_MEDIA_MAX_AGE_SECONDS_KEY = "resumable_media_max_age_seconds" /** @@ -51,6 +54,7 @@ internal val SMARTSPACE_MAX_AGE = SystemProperties * background users (e.g. timeouts). */ class MediaDataFilter @Inject constructor( + private val context: Context, private val broadcastDispatcher: BroadcastDispatcher, private val mediaResumeListener: MediaResumeListener, private val lockscreenUserManager: NotificationLockscreenUserManager, @@ -229,6 +233,18 @@ class MediaDataFilter @Inject constructor( mediaDataManager.setTimedOut(it, timedOut = true, forceUpdate = true) } if (smartspaceMediaData.isActive) { + val dismissIntent = smartspaceMediaData.dismissIntent + if (dismissIntent == null) { + Log.w(TAG, "Cannot create dismiss action click action: " + + "extras missing dismiss_intent.") + } else if (dismissIntent.getComponent() != null && + dismissIntent.getComponent().getClassName() + == EXPORTED_SMARTSPACE_TRAMPOLINE_ACTIVITY_NAME) { + // Dismiss the card Smartspace data through Smartspace trampoline activity. + context.startActivity(dismissIntent) + } else { + context.sendBroadcast(dismissIntent) + } smartspaceMediaData = EMPTY_SMARTSPACE_MEDIA_DATA.copy( targetId = smartspaceMediaData.targetId, isValid = smartspaceMediaData.isValid) } diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt b/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt index ba99f5df653c..eacdab6e537d 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt @@ -76,12 +76,13 @@ private val ART_URIS = arrayOf( private const val TAG = "MediaDataManager" private const val DEBUG = true +private const val EXTRAS_SMARTSPACE_DISMISS_INTENT_KEY = "dismiss_intent" private val LOADING = MediaData(-1, false, 0, null, null, null, null, null, emptyList(), emptyList(), "INVALID", null, null, null, true, null) @VisibleForTesting internal val EMPTY_SMARTSPACE_MEDIA_DATA = SmartspaceMediaData("INVALID", false, false, - "INVALID", null, emptyList(), 0) + "INVALID", null, emptyList(), null, 0) fun isMediaNotification(sbn: StatusBarNotification): Boolean { if (!sbn.notification.hasMediaSession()) { @@ -883,12 +884,22 @@ class MediaDataManager( target: SmartspaceTarget, isActive: Boolean ): SmartspaceMediaData { + var dismissIntent: Intent? = null + if (target.baseAction != null && target.baseAction.extras != null) { + dismissIntent = target + .baseAction + .extras + .getParcelable(EXTRAS_SMARTSPACE_DISMISS_INTENT_KEY) as Intent + } packageName(target)?.let { return SmartspaceMediaData(target.smartspaceTargetId, isActive, true, it, - target.baseAction, target.iconGrid, 0) + target.baseAction, target.iconGrid, + dismissIntent, 0) } return EMPTY_SMARTSPACE_MEDIA_DATA - .copy(targetId = target.smartspaceTargetId, isActive = isActive) + .copy(targetId = target.smartspaceTargetId, + isActive = isActive, + dismissIntent = dismissIntent) } private fun packageName(target: SmartspaceTarget): String? { diff --git a/packages/SystemUI/src/com/android/systemui/media/SmartspaceMediaData.kt b/packages/SystemUI/src/com/android/systemui/media/SmartspaceMediaData.kt index 9ac128920edb..61fdefd4579f 100644 --- a/packages/SystemUI/src/com/android/systemui/media/SmartspaceMediaData.kt +++ b/packages/SystemUI/src/com/android/systemui/media/SmartspaceMediaData.kt @@ -17,6 +17,7 @@ package com.android.systemui.media import android.app.smartspace.SmartspaceAction +import android.content.Intent /** State of a Smartspace media recommendations view. */ data class SmartspaceMediaData( @@ -45,6 +46,10 @@ data class SmartspaceMediaData( */ val recommendations: List<SmartspaceAction>, /** + * Intent for the user's initiated dismissal. + */ + val dismissIntent: Intent?, + /** * View's background color. */ val backgroundColor: Int diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java index b8df49e1cd4b..a1a630aca94c 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java @@ -205,7 +205,7 @@ public class NavigationBarController implements @Override public void onConfigChanged(Configuration newConfig) { boolean isOldConfigTablet = mIsTablet; - mIsTablet = isTablet(newConfig, mContext); + mIsTablet = isTablet(mContext); boolean largeScreenChanged = mIsTablet != isOldConfigTablet; // If we folded/unfolded while in 3 button, show navbar in folded state, hide in unfolded if (largeScreenChanged && updateNavbarForTaskbar()) { diff --git a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java index 1bd36644bbc5..1a7a306c978c 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java +++ b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java @@ -114,6 +114,7 @@ public class PagedTileLayout extends ViewPager implements QSTileLayout { super.onConfigurationChanged(newConfig); if (mLayoutOrientation != newConfig.orientation) { mLayoutOrientation = newConfig.orientation; + mDistributeTiles = true; setCurrentItem(0, false); mPageToRestore = 0; } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java index 31ddd977b7f0..8e436611e805 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java @@ -23,6 +23,7 @@ import android.content.res.Configuration; import android.graphics.Canvas; import android.graphics.Path; import android.graphics.Point; +import android.graphics.PointF; import android.util.AttributeSet; import android.view.View; import android.view.WindowInsets; @@ -304,6 +305,16 @@ public class QSContainerImpl extends FrameLayout implements Dumpable { } } + @Override + protected boolean isTransformedTouchPointInView(float x, float y, + View child, PointF outLocalPoint) { + // Prevent touches outside the clipped area from propagating to a child in that area. + if (mClippingEnabled && y + getTranslationY() > mFancyClippingTop) { + return false; + } + return super.isTransformedTouchPointInView(x, y, child, outLocalPoint); + } + private void updateClippingPath() { mFancyClippingPath.reset(); if (!mClippingEnabled) { diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java index 97568f9dc317..f7d1b1e2f5eb 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java @@ -26,6 +26,7 @@ import android.content.res.Configuration; import android.metrics.LogMaker; import android.view.View; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.UiEventLogger; import com.android.systemui.Dumpable; @@ -79,7 +80,8 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr private final QSHost.Callback mQSHostCallback = this::setTiles; - private final QSPanel.OnConfigurationChangedListener mOnConfigurationChangedListener = + @VisibleForTesting + protected final QSPanel.OnConfigurationChangedListener mOnConfigurationChangedListener = new QSPanel.OnConfigurationChangedListener() { @Override public void onConfigurationChange(Configuration newConfig) { @@ -156,6 +158,7 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr mView.addOnConfigurationChangedListener(mOnConfigurationChangedListener); mHost.addCallback(mQSHostCallback); setTiles(); + mLastOrientation = getResources().getConfiguration().orientation; switchTileLayout(true); mDumpManager.registerDumpable(mView.getDumpableTag(), this); @@ -356,8 +359,7 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr return false; } return mUsingMediaPlayer && mMediaHost.getVisible() - && getResources().getConfiguration().orientation - == Configuration.ORIENTATION_LANDSCAPE; + && mLastOrientation == Configuration.ORIENTATION_LANDSCAPE; } private void logTiles() { diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java index 8e886e82d352..b1af8416e06d 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java @@ -275,7 +275,7 @@ public class CellularTile extends QSTileImpl<SignalState> { return; } mInfo.dataSubscriptionName = mController.getMobileDataNetworkName(); - mInfo.dataContentDescription = indicators.description != null + mInfo.dataContentDescription = indicators.qsDescription != null ? indicators.typeContentDescriptionHtml : null; mInfo.activityIn = indicators.activityIn; mInfo.activityOut = indicators.activityOut; diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java index 34f2b6331678..87edc2cf8bac 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java @@ -47,6 +47,7 @@ import javax.inject.Inject; /** Quick settings tile: Hotspot **/ public class HotspotTile extends QSTileImpl<BooleanState> { + private final Icon mEnabledStatic = ResourceIcon.get(R.drawable.ic_hotspot); private final HotspotController mHotspotController; @@ -98,7 +99,7 @@ public class HotspotTile extends QSTileImpl<BooleanState> { @Override public Intent getLongClickIntent() { - return new Intent(Settings.ACTION_TETHER_SETTINGS); + return new Intent(Settings.ACTION_WIFI_TETHER_SETTING); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTile.java index cc9e7485dcff..530804ed09e7 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTile.java @@ -279,9 +279,9 @@ public class InternetTile extends QSTileImpl<SignalState> { // Not data sim, don't display. return; } - mCellularInfo.mDataSubscriptionName = indicators.description == null - ? mController.getMobileDataNetworkName() : indicators.description; - mCellularInfo.mDataContentDescription = indicators.description != null + mCellularInfo.mDataSubscriptionName = indicators.qsDescription == null + ? mController.getMobileDataNetworkName() : indicators.qsDescription; + mCellularInfo.mDataContentDescription = indicators.qsDescription != null ? indicators.typeContentDescriptionHtml : null; mCellularInfo.mMobileSignalIconId = indicators.qsIcon.icon; mCellularInfo.mQsTypeIcon = indicators.qsType; diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialog.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialog.java index b1db8a97b8af..16b41a776176 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialog.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialog.java @@ -52,6 +52,7 @@ import android.widget.ProgressBar; import android.widget.Switch; import android.widget.TextView; +import androidx.annotation.MainThread; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import androidx.annotation.WorkerThread; @@ -60,7 +61,6 @@ import androidx.recyclerview.widget.RecyclerView; import com.android.internal.logging.UiEvent; import com.android.internal.logging.UiEventLogger; -import com.android.settingslib.Utils; import com.android.systemui.Prefs; import com.android.systemui.R; import com.android.systemui.dagger.SysUISingleton; @@ -105,12 +105,10 @@ public class InternetDialog extends SystemUIDialog implements private View mDivider; private ProgressBar mProgressBar; private LinearLayout mInternetDialogLayout; - private LinearLayout mInternetListLayout; private LinearLayout mConnectedWifListLayout; - private LinearLayout mConnectedWifList; private LinearLayout mMobileNetworkLayout; - private LinearLayout mMobileNetworkList; private LinearLayout mTurnWifiOnLayout; + private LinearLayout mEthernetLayout; private TextView mWifiToggleTitleText; private LinearLayout mSeeAllLayout; private RecyclerView mWifiRecyclerView; @@ -126,7 +124,6 @@ public class InternetDialog extends SystemUIDialog implements private Button mDoneButton; private Drawable mBackgroundOn; private int mListMaxHeight; - private int mLayoutWidth; private int mDefaultDataSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; private boolean mCanConfigMobileData; @@ -181,8 +178,6 @@ public class InternetDialog extends SystemUIDialog implements }; mListMaxHeight = context.getResources().getDimensionPixelSize( R.dimen.internet_dialog_list_max_height); - mLayoutWidth = context.getResources().getDimensionPixelSize( - R.dimen.internet_dialog_list_max_width); mUiEventLogger = uiEventLogger; mAdapter = new InternetAdapter(mInternetDialogController); if (!aboveStatusBar) { @@ -221,13 +216,11 @@ public class InternetDialog extends SystemUIDialog implements mInternetDialogSubTitle = mDialogView.requireViewById(R.id.internet_dialog_subtitle); mDivider = mDialogView.requireViewById(R.id.divider); mProgressBar = mDialogView.requireViewById(R.id.wifi_searching_progress); - mInternetListLayout = mDialogView.requireViewById(R.id.internet_list); + mEthernetLayout = mDialogView.requireViewById(R.id.ethernet_layout); mMobileNetworkLayout = mDialogView.requireViewById(R.id.mobile_network_layout); - mMobileNetworkList = mDialogView.requireViewById(R.id.mobile_network_list); mTurnWifiOnLayout = mDialogView.requireViewById(R.id.turn_on_wifi_layout); mWifiToggleTitleText = mDialogView.requireViewById(R.id.wifi_toggle_title); mConnectedWifListLayout = mDialogView.requireViewById(R.id.wifi_connected_layout); - mConnectedWifList = mDialogView.requireViewById(R.id.wifi_connected_list); mConnectedWifiIcon = mDialogView.requireViewById(R.id.wifi_connected_icon); mConnectedWifiTitleText = mDialogView.requireViewById(R.id.wifi_connected_title); mConnectedWifiSummaryText = mDialogView.requireViewById(R.id.wifi_connected_summary); @@ -309,7 +302,9 @@ public class InternetDialog extends SystemUIDialog implements } else { mInternetDialogSubTitle.setText(getSubtitleText()); } - setMobileDataLayout(mInternetDialogController.activeNetworkIsCellular()); + updateEthernet(); + setMobileDataLayout(mInternetDialogController.activeNetworkIsCellular() + || mInternetDialogController.isCarrierNetworkActive()); if (!mCanConfigWifi) { return; @@ -355,7 +350,13 @@ public class InternetDialog extends SystemUIDialog implements mDoneButton.setOnClickListener(v -> dismiss()); } - private void setMobileDataLayout(boolean isCellularNetwork) { + @MainThread + private void updateEthernet() { + mEthernetLayout.setVisibility( + mInternetDialogController.hasEthernet() ? View.VISIBLE : View.GONE); + } + + private void setMobileDataLayout(boolean isCarrierNetworkConnected) { if (mInternetDialogController.isAirplaneModeEnabled() || !mInternetDialogController.hasCarrier()) { mMobileNetworkLayout.setVisibility(View.GONE); @@ -371,38 +372,33 @@ public class InternetDialog extends SystemUIDialog implements mMobileSummaryText.setVisibility(View.GONE); } mSignalIcon.setImageDrawable(getSignalStrengthDrawable()); - if (mInternetDialogController.isNightMode()) { - int titleColor = isCellularNetwork ? mContext.getColor( - R.color.connected_network_primary_color) : Utils.getColorAttrDefaultColor( - mContext, android.R.attr.textColorPrimary); - int summaryColor = isCellularNetwork ? mContext.getColor( - R.color.connected_network_secondary_color) : Utils.getColorAttrDefaultColor( - mContext, android.R.attr.textColorSecondary); - - mMobileTitleText.setTextColor(titleColor); - mMobileSummaryText.setTextColor(summaryColor); - } - mMobileNetworkLayout.setBackground(isCellularNetwork ? mBackgroundOn : null); + mMobileTitleText.setTextAppearance(isCarrierNetworkConnected + ? R.style.TextAppearance_InternetDialog_Active + : R.style.TextAppearance_InternetDialog); + mMobileSummaryText.setTextAppearance(isCarrierNetworkConnected + ? R.style.TextAppearance_InternetDialog_Secondary_Active + : R.style.TextAppearance_InternetDialog_Secondary); + mMobileNetworkLayout.setBackground(isCarrierNetworkConnected ? mBackgroundOn : null); mMobileDataToggle.setVisibility(mCanConfigMobileData ? View.VISIBLE : View.INVISIBLE); } } + @MainThread private void updateWifiToggle(boolean isWifiEnabled, boolean isDeviceLocked) { mWiFiToggle.setChecked(isWifiEnabled); - if (isDeviceLocked && mInternetDialogController.isNightMode()) { - int titleColor = mConnectedWifiEntry != null ? mContext.getColor( - R.color.connected_network_primary_color) : Utils.getColorAttrDefaultColor( - mContext, android.R.attr.textColorPrimary); - mWifiToggleTitleText.setTextColor(titleColor); + if (isDeviceLocked) { + mWifiToggleTitleText.setTextAppearance((mConnectedWifiEntry != null) + ? R.style.TextAppearance_InternetDialog_Active + : R.style.TextAppearance_InternetDialog); } mTurnWifiOnLayout.setBackground( (isDeviceLocked && mConnectedWifiEntry != null) ? mBackgroundOn : null); } + @MainThread private void updateConnectedWifi(boolean isWifiEnabled, boolean isDeviceLocked) { if (!isWifiEnabled || mConnectedWifiEntry == null || isDeviceLocked) { - mConnectedWifListLayout.setBackground(null); mConnectedWifListLayout.setVisibility(View.GONE); return; } @@ -411,15 +407,8 @@ public class InternetDialog extends SystemUIDialog implements mConnectedWifiSummaryText.setText(mConnectedWifiEntry.getSummary(false)); mConnectedWifiIcon.setImageDrawable( mInternetDialogController.getInternetWifiDrawable(mConnectedWifiEntry)); - if (mInternetDialogController.isNightMode()) { - mConnectedWifiTitleText.setTextColor( - mContext.getColor(R.color.connected_network_primary_color)); - mConnectedWifiSummaryText.setTextColor( - mContext.getColor(R.color.connected_network_secondary_color)); - } mWifiSettingsIcon.setColorFilter( mContext.getColor(R.color.connected_network_primary_color)); - mConnectedWifListLayout.setBackground(mBackgroundOn); } void onClickConnectedWifi() { @@ -528,11 +517,18 @@ public class InternetDialog extends SystemUIDialog implements } @Override + @WorkerThread public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) { mHandler.post(() -> updateDialog()); } @Override + @WorkerThread + public void onLost(Network network) { + mHandler.post(() -> updateDialog()); + } + + @Override public void onSubscriptionsChanged(int defaultDataSubId) { mDefaultDataSubId = defaultDataSubId; mTelephonyManager = mTelephonyManager.createForSubscriptionId(mDefaultDataSubId); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java index 50e7e43822ea..66d9c5558c2f 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java @@ -23,7 +23,6 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; -import android.content.res.Configuration; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; @@ -31,7 +30,6 @@ import android.graphics.drawable.LayerDrawable; import android.net.ConnectivityManager; import android.net.Network; import android.net.NetworkCapabilities; -import android.net.NetworkRequest; import android.net.wifi.WifiManager; import android.os.Handler; import android.provider.Settings; @@ -49,6 +47,7 @@ import android.util.Log; import android.view.Gravity; import android.widget.Toast; +import androidx.annotation.MainThread; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; @@ -133,6 +132,7 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, private KeyguardUpdateMonitor mKeyguardUpdateMonitor; private GlobalSettings mGlobalSettings; private int mDefaultDataSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; + private ConnectivityManager.NetworkCallback mConnectivityManagerNetworkCallback; @VisibleForTesting protected ActivityStarter mActivityStarter; @@ -146,6 +146,8 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, protected boolean mCanConfigWifi; @VisibleForTesting protected KeyguardStateController mKeyguardStateController; + @VisibleForTesting + protected boolean mHasEthernet = false; private final KeyguardUpdateMonitorCallback mKeyguardUpdateCallback = new KeyguardUpdateMonitorCallback() { @@ -193,6 +195,7 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, mAccessPointController = accessPointController; mConfig = MobileMappings.Config.readConfig(mContext); mWifiIconInjector = new WifiUtils.InternetIconInjector(mContext); + mConnectivityManagerNetworkCallback = new DataConnectivityListener(); } void onStart(@NonNull InternetDialogCallback callback, boolean canConfigWifi) { @@ -216,9 +219,7 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, mInternetTelephonyCallback = new InternetTelephonyCallback(); mTelephonyManager.registerTelephonyCallback(mExecutor, mInternetTelephonyCallback); // Listen the connectivity changes - mConnectivityManager.registerNetworkCallback(new NetworkRequest.Builder() - .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) - .build(), new DataConnectivityListener(), mHandler); + mConnectivityManager.registerDefaultNetworkCallback(mConnectivityManagerNetworkCallback); mCanConfigWifi = canConfigWifi; scanWifiAccessPoints(); } @@ -233,6 +234,7 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, mOnSubscriptionsChangedListener); mAccessPointController.removeAccessPointCallback(this); mKeyguardUpdateMonitor.removeCallback(mKeyguardUpdateCallback); + mConnectivityManager.unregisterNetworkCallback(mConnectivityManagerNetworkCallback); } @VisibleForTesting @@ -351,11 +353,6 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, return drawable; } - boolean isNightMode() { - return (mContext.getResources().getConfiguration().uiMode - & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES; - } - Drawable getSignalStrengthDrawable() { Drawable drawable = mContext.getDrawable( R.drawable.ic_signal_strength_zero_bar_no_internet); @@ -373,9 +370,12 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, drawable = shared.get(); } - drawable.setTint(activeNetworkIsCellular() ? mContext.getColor( - R.color.connected_network_primary_color) : Utils.getColorAttrDefaultColor( - mContext, android.R.attr.textColorTertiary)); + int tintColor = Utils.getColorAttrDefaultColor(mContext, + android.R.attr.textColorTertiary); + if (activeNetworkIsCellular() || isCarrierNetworkActive()) { + tintColor = mContext.getColor(R.color.connected_network_primary_color); + } + drawable.setTint(tintColor); } catch (Throwable e) { e.printStackTrace(); } @@ -536,9 +536,7 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, } int resId = mapIconSets(config).get(iconKey).dataContentDescription; - final MergedCarrierEntry mergedCarrierEntry = - mAccessPointController.getMergedCarrierEntry(); - if (mergedCarrierEntry != null && mergedCarrierEntry.isDefaultNetwork()) { + if (isCarrierNetworkActive()) { SignalIcon.MobileIconGroup carrierMergedWifiIconGroup = TelephonyIcons.CARRIER_MERGED_WIFI; resId = carrierMergedWifiIconGroup.dataContentDescription; @@ -557,7 +555,7 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, return context.getString(R.string.mobile_data_no_connection); } String summary = networkTypeDescription; - if (activeNetworkIsCellular()) { + if (activeNetworkIsCellular() || isCarrierNetworkActive()) { summary = context.getString(R.string.preference_summary_default_combination, context.getString(R.string.mobile_data_connection_active), networkTypeDescription); @@ -586,6 +584,12 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, } } + boolean isCarrierNetworkActive() { + final MergedCarrierEntry mergedCarrierEntry = + mAccessPointController.getMergedCarrierEntry(); + return mergedCarrierEntry != null && mergedCarrierEntry.isDefaultNetwork(); + } + WifiManager getWifiManager() { return mWifiManager; } @@ -800,6 +804,9 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, } int count = MAX_WIFI_ENTRY_COUNT; + if (mHasEthernet) { + count -= 1; + } if (hasCarrier()) { count -= 1; } @@ -870,23 +877,32 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, @Override @WorkerThread public void onCapabilitiesChanged(@NonNull Network network, - @NonNull NetworkCapabilities networkCapabilities) { - if (mCanConfigWifi) { - for (int transport : networkCapabilities.getTransportTypes()) { - if (transport == NetworkCapabilities.TRANSPORT_WIFI) { - scanWifiAccessPoints(); - break; - } - } - } - final Network activeNetwork = mConnectivityManager.getActiveNetwork(); - if (activeNetwork != null && activeNetwork.equals(network)) { - // update UI - mCallback.onCapabilitiesChanged(network, networkCapabilities); + @NonNull NetworkCapabilities capabilities) { + mHasEthernet = capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET); + if (mCanConfigWifi && (mHasEthernet || capabilities.hasTransport( + NetworkCapabilities.TRANSPORT_WIFI))) { + scanWifiAccessPoints(); } + // update UI + mCallback.onCapabilitiesChanged(network, capabilities); + } + + @Override + @WorkerThread + public void onLost(@NonNull Network network) { + mHasEthernet = false; + mCallback.onLost(network); } } + /** + * Return {@code true} If the Ethernet exists + */ + @MainThread + public boolean hasEthernet() { + return mHasEthernet; + } + private final BroadcastReceiver mConnectionStateReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { @@ -934,6 +950,8 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities); + void onLost(@NonNull Network network); + void onSubscriptionsChanged(int defaultDataSubId); void onServiceStateChanged(ServiceState serviceState); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index 7babcba293be..4400909d0bff 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java @@ -610,6 +610,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable mClearAllEnabled = res.getBoolean(R.bool.config_enableNotificationsClearAll); mGroupMembershipManager = groupMembershipManager; mGroupExpansionManager = groupExpansionManager; + setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES); } void initializeForegroundServiceSection(ForegroundServiceDungeonView fgsSectionView) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java index eca91a3f6fb7..e775e96de749 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java @@ -182,8 +182,7 @@ public abstract class PanelBar extends FrameLayout { } boolean fullyClosed = true; boolean fullyOpened = false; - if (SPEW) LOG("panelExpansionChanged: start state=%d", mState); - PanelViewController pv = mPanel; + if (SPEW) LOG("panelExpansionChanged: start state=%d, f=%.1f", mState, frac); mExpanded = expanded; mPanelFraction = frac; updateVisibility(); @@ -194,9 +193,7 @@ public abstract class PanelBar extends FrameLayout { onPanelPeeked(); } fullyClosed = false; - final float thisFrac = pv.getExpandedFraction(); - if (SPEW) LOG("panelExpansionChanged: -> %s: f=%.1f", pv.getName(), thisFrac); - fullyOpened = thisFrac >= 1f; + fullyOpened = frac >= 1f; } if (fullyOpened && !mTracking) { go(STATE_OPEN); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java index a0edc7c494bc..1e5251196379 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java @@ -149,7 +149,7 @@ public class BrightnessMirrorController private void reinflate() { int index = mStatusBarWindow.indexOfChild(mBrightnessMirror); mStatusBarWindow.removeView(mBrightnessMirror); - mBrightnessMirror = (FrameLayout) LayoutInflater.from(mBrightnessMirror.getContext()) + mBrightnessMirror = (FrameLayout) LayoutInflater.from(mStatusBarWindow.getContext()) .inflate(R.layout.brightness_mirror_container, mStatusBarWindow, false); mToggleSliderController = setMirrorLayout(); mStatusBarWindow.addView(mBrightnessMirror, index); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java index 3490e1567ea8..a543c7c95d16 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java @@ -91,8 +91,7 @@ public class MobileSignalController extends SignalController<MobileState, Mobile private int mImsType = IMS_TYPE_WWAN; // Save entire info for logging, we only use the id. final SubscriptionInfo mSubscriptionInfo; - // @VisibleForDemoMode - Map<String, MobileIconGroup> mNetworkToIconLookup; + private Map<String, MobileIconGroup> mNetworkToIconLookup; // Since some pieces of the phone state are interdependent we store it locally, // this could potentially become part of MobileState for simplification/complication @@ -108,8 +107,6 @@ public class MobileSignalController extends SignalController<MobileState, Mobile private Config mConfig; @VisibleForTesting boolean mInflateSignalStrengths = false; - private MobileStatusTracker.Callback mCallback; - private RegistrationCallback mRegistrationCallback; private int mLastWwanLevel; private int mLastWlanLevel; private int mLastWlanCrossSimLevel; @@ -121,6 +118,82 @@ public class MobileSignalController extends SignalController<MobileState, Mobile // Where to copy the next state into. private int mMobileStatusHistoryIndex; + private final MobileStatusTracker.Callback mMobileCallback = + new MobileStatusTracker.Callback() { + private String mLastStatus; + + @Override + public void onMobileStatusChanged(boolean updateTelephony, + MobileStatus mobileStatus) { + if (Log.isLoggable(mTag, Log.DEBUG)) { + Log.d(mTag, "onMobileStatusChanged=" + + " updateTelephony=" + updateTelephony + + " mobileStatus=" + mobileStatus.toString()); + } + String currentStatus = mobileStatus.toString(); + if (!currentStatus.equals(mLastStatus)) { + mLastStatus = currentStatus; + String status = new StringBuilder() + .append(SSDF.format(System.currentTimeMillis())).append(",") + .append(currentStatus) + .toString(); + recordLastMobileStatus(status); + } + updateMobileStatus(mobileStatus); + if (updateTelephony) { + updateTelephony(); + } else { + notifyListenersIfNecessary(); + } + } + }; + + private final RegistrationCallback mRegistrationCallback = new RegistrationCallback() { + @Override + public void onRegistered(ImsRegistrationAttributes attributes) { + Log.d(mTag, "onRegistered: " + "attributes=" + attributes); + int imsTransportType = attributes.getTransportType(); + int registrationAttributes = attributes.getAttributeFlags(); + if (imsTransportType == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) { + mImsType = IMS_TYPE_WWAN; + IconState statusIcon = new IconState( + true, + getCallStrengthIcon(mLastWwanLevel, /* isWifi= */false), + getCallStrengthDescription(mLastWwanLevel, /* isWifi= */false)); + notifyCallStateChange(statusIcon, mSubscriptionInfo.getSubscriptionId()); + } else if (imsTransportType == AccessNetworkConstants.TRANSPORT_TYPE_WLAN) { + if (registrationAttributes == 0) { + mImsType = IMS_TYPE_WLAN; + IconState statusIcon = new IconState( + true, + getCallStrengthIcon(mLastWlanLevel, /* isWifi= */true), + getCallStrengthDescription(mLastWlanLevel, /* isWifi= */true)); + notifyCallStateChange(statusIcon, mSubscriptionInfo.getSubscriptionId()); + } else if (registrationAttributes + == ImsRegistrationAttributes.ATTR_EPDG_OVER_CELL_INTERNET) { + mImsType = IMS_TYPE_WLAN_CROSS_SIM; + IconState statusIcon = new IconState( + true, + getCallStrengthIcon(mLastWlanCrossSimLevel, /* isWifi= */false), + getCallStrengthDescription( + mLastWlanCrossSimLevel, /* isWifi= */false)); + notifyCallStateChange(statusIcon, mSubscriptionInfo.getSubscriptionId()); + } + } + } + + @Override + public void onUnregistered(ImsReasonInfo info) { + Log.d(mTag, "onDeregistered: " + "info=" + info); + mImsType = IMS_TYPE_WWAN; + IconState statusIcon = new IconState( + true, + getCallStrengthIcon(mLastWwanLevel, /* isWifi= */false), + getCallStrengthDescription(mLastWwanLevel, /* isWifi= */false)); + notifyCallStateChange(statusIcon, mSubscriptionInfo.getSubscriptionId()); + } + }; + // TODO: Reduce number of vars passed in, if we have the NetworkController, probably don't // need listener lists anymore. public MobileSignalController( @@ -144,8 +217,8 @@ public class MobileSignalController extends SignalController<MobileState, Mobile mPhone = phone; mDefaults = defaults; mSubscriptionInfo = info; - mNetworkNameSeparator = getTextIfExists(R.string.status_bar_network_name_separator) - .toString(); + mNetworkNameSeparator = getTextIfExists( + R.string.status_bar_network_name_separator).toString(); mNetworkNameDefault = getTextIfExists( com.android.internal.R.string.lockscreen_carrier_default).toString(); mReceiverHandler = new Handler(receiverLooper); @@ -165,83 +238,9 @@ public class MobileSignalController extends SignalController<MobileState, Mobile updateTelephony(); } }; - mCallback = new MobileStatusTracker.Callback() { - private String mLastStatus; - - @Override - public void onMobileStatusChanged(boolean updateTelephony, - MobileStatus mobileStatus) { - if (Log.isLoggable(mTag, Log.DEBUG)) { - Log.d(mTag, "onMobileStatusChanged=" - + " updateTelephony=" + updateTelephony - + " mobileStatus=" + mobileStatus.toString()); - } - String currentStatus = mobileStatus.toString(); - if (!currentStatus.equals(mLastStatus)) { - mLastStatus = currentStatus; - String status = new StringBuilder() - .append(SSDF.format(System.currentTimeMillis())).append(",") - .append(currentStatus) - .toString(); - recordLastMobileStatus(status); - } - updateMobileStatus(mobileStatus); - if (updateTelephony) { - updateTelephony(); - } else { - notifyListenersIfNecessary(); - } - } - }; - - mRegistrationCallback = new RegistrationCallback() { - @Override - public void onRegistered(ImsRegistrationAttributes attributes) { - Log.d(mTag, "onRegistered: " + "attributes=" + attributes); - int imsTransportType = attributes.getTransportType(); - int registrationAttributes = attributes.getAttributeFlags(); - if (imsTransportType == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) { - mImsType = IMS_TYPE_WWAN; - IconState statusIcon = new IconState( - true, - getCallStrengthIcon(mLastWwanLevel, /* isWifi= */false), - getCallStrengthDescription(mLastWwanLevel, /* isWifi= */false)); - notifyCallStateChange(statusIcon, mSubscriptionInfo.getSubscriptionId()); - } else if (imsTransportType == AccessNetworkConstants.TRANSPORT_TYPE_WLAN) { - if (registrationAttributes == 0) { - mImsType = IMS_TYPE_WLAN; - IconState statusIcon = new IconState( - true, - getCallStrengthIcon(mLastWlanLevel, /* isWifi= */true), - getCallStrengthDescription(mLastWlanLevel, /* isWifi= */true)); - notifyCallStateChange(statusIcon, mSubscriptionInfo.getSubscriptionId()); - } else if (registrationAttributes - == ImsRegistrationAttributes.ATTR_EPDG_OVER_CELL_INTERNET) { - mImsType = IMS_TYPE_WLAN_CROSS_SIM; - IconState statusIcon = new IconState( - true, - getCallStrengthIcon(mLastWlanCrossSimLevel, /* isWifi= */false), - getCallStrengthDescription( - mLastWlanCrossSimLevel, /* isWifi= */false)); - notifyCallStateChange(statusIcon, mSubscriptionInfo.getSubscriptionId()); - } - } - } - - @Override - public void onUnregistered(ImsReasonInfo info) { - Log.d(mTag, "onDeregistered: " + "info=" + info); - mImsType = IMS_TYPE_WWAN; - IconState statusIcon = new IconState( - true, - getCallStrengthIcon(mLastWwanLevel, /* isWifi= */false), - getCallStrengthDescription(mLastWwanLevel, /* isWifi= */false)); - notifyCallStateChange(statusIcon, mSubscriptionInfo.getSubscriptionId()); - } - }; mImsMmTelManager = ImsMmTelManager.createForSubscriptionId(info.getSubscriptionId()); mMobileStatusTracker = new MobileStatusTracker(mPhone, receiverLooper, - info, mDefaults, mCallback); + info, mDefaults, mMobileCallback); mProviderModelBehavior = featureFlags.isCombinedStatusBarSignalIconsEnabled(); mProviderModelSetting = featureFlags.isProviderModelSettingEnabled(); } @@ -385,89 +384,83 @@ public class MobileSignalController extends SignalController<MobileState, Mobile if (mCurrentState.inetCondition == 0) { dataContentDescription = mContext.getString(R.string.data_connection_no_internet); } - final boolean dataDisabled = (mCurrentState.iconGroup == TelephonyIcons.DATA_DISABLED - || (mCurrentState.iconGroup == TelephonyIcons.NOT_DEFAULT_DATA)) - && mCurrentState.userSetup; - if (mProviderModelBehavior) { - // Show icon in QS when we are connected or data is disabled. - boolean showDataIcon = mCurrentState.dataConnected || dataDisabled; - - int qsTypeIcon = 0; - IconState qsIcon = null; - CharSequence description = null; - // Only send data sim callbacks to QS. - if (mCurrentState.dataSim && mCurrentState.isDefault) { - qsTypeIcon = - (showDataIcon || mConfig.alwaysShowDataRatIcon) ? icons.qsDataType : 0; - qsIcon = new IconState(mCurrentState.enabled - && !mCurrentState.isEmergency, getQsCurrentIconId(), contentDescription); - description = mCurrentState.isEmergency ? null : mCurrentState.networkName; + final QsInfo qsInfo = getQsInfo(contentDescription, icons.dataType); + final SbInfo sbInfo = getSbInfo(contentDescription, icons.dataType); + + MobileDataIndicators mobileDataIndicators = new MobileDataIndicators( + sbInfo.icon, + qsInfo.icon, + sbInfo.ratTypeIcon, + qsInfo.ratTypeIcon, + mCurrentState.hasActivityIn(), + mCurrentState.hasActivityOut(), + dataContentDescription, + dataContentDescriptionHtml, + qsInfo.description, + mSubscriptionInfo.getSubscriptionId(), + mCurrentState.roaming, + sbInfo.showTriangle); + callback.setMobileDataIndicators(mobileDataIndicators); + } + + private QsInfo getQsInfo(String contentDescription, int dataTypeIcon) { + int qsTypeIcon = 0; + IconState qsIcon = null; + CharSequence qsDescription = null; + + boolean pm = mProviderModelSetting || mProviderModelBehavior; + if (mCurrentState.dataSim) { + // If using provider model behavior, only show QS icons if the state is also default + if (pm && !mCurrentState.isDefault) { + return new QsInfo(qsTypeIcon, qsIcon, qsDescription); + } + + if (mCurrentState.showQuickSettingsRatIcon() || mConfig.alwaysShowDataRatIcon) { + qsTypeIcon = dataTypeIcon; + } + + boolean qsIconVisible = mCurrentState.enabled && !mCurrentState.isEmergency; + qsIcon = new IconState(qsIconVisible, getQsCurrentIconId(), contentDescription); + + if (!mCurrentState.isEmergency) { + qsDescription = mCurrentState.networkName; } - boolean activityIn = mCurrentState.dataConnected - && !mCurrentState.carrierNetworkChangeMode - && mCurrentState.activityIn; - boolean activityOut = mCurrentState.dataConnected - && !mCurrentState.carrierNetworkChangeMode - && mCurrentState.activityOut; - showDataIcon &= mCurrentState.dataSim && mCurrentState.isDefault; - boolean showTriangle = showDataIcon && !mCurrentState.airplaneMode; - int typeIcon = (showDataIcon || mConfig.alwaysShowDataRatIcon) ? icons.dataType : 0; - showDataIcon |= mCurrentState.roaming; - IconState statusIcon = new IconState(showDataIcon && !mCurrentState.airplaneMode, + } + + return new QsInfo(qsTypeIcon, qsIcon, qsDescription); + } + + private SbInfo getSbInfo(String contentDescription, int dataTypeIcon) { + final boolean dataDisabled = mCurrentState.isDataDisabledOrNotDefault(); + boolean showTriangle = false; + int typeIcon = 0; + IconState statusIcon = null; + + if (mProviderModelBehavior) { + boolean showDataIconStatusBar = (mCurrentState.dataConnected || dataDisabled) + && (mCurrentState.dataSim && mCurrentState.isDefault); + typeIcon = + (showDataIconStatusBar || mConfig.alwaysShowDataRatIcon) ? dataTypeIcon : 0; + showDataIconStatusBar |= mCurrentState.roaming; + statusIcon = new IconState( + showDataIconStatusBar && !mCurrentState.airplaneMode, getCurrentIconId(), contentDescription); - MobileDataIndicators mobileDataIndicators = new MobileDataIndicators( - statusIcon, qsIcon, typeIcon, qsTypeIcon, - activityIn, activityOut, dataContentDescription, dataContentDescriptionHtml, - description, icons.isWide, mSubscriptionInfo.getSubscriptionId(), - mCurrentState.roaming, showTriangle); - callback.setMobileDataIndicators(mobileDataIndicators); + + showTriangle = showDataIconStatusBar && !mCurrentState.airplaneMode; } else { - boolean showDataIcon = mCurrentState.dataConnected || dataDisabled; - IconState statusIcon = new IconState( + statusIcon = new IconState( mCurrentState.enabled && !mCurrentState.airplaneMode, getCurrentIconId(), contentDescription); - int qsTypeIcon = 0; - IconState qsIcon = null; - CharSequence description = null; - // Only send data sim callbacks to QS. - if (mProviderModelSetting) { - if (mCurrentState.dataSim && mCurrentState.isDefault) { - qsTypeIcon = - (showDataIcon || mConfig.alwaysShowDataRatIcon) ? icons.qsDataType : 0; - qsIcon = new IconState( - mCurrentState.enabled && !mCurrentState.isEmergency, - getQsCurrentIconId(), contentDescription); - description = mCurrentState.isEmergency ? null : mCurrentState.networkName; - } - } else { - if (mCurrentState.dataSim) { - qsTypeIcon = - (showDataIcon || mConfig.alwaysShowDataRatIcon) ? icons.qsDataType : 0; - qsIcon = new IconState( - mCurrentState.enabled && !mCurrentState.isEmergency, - getQsCurrentIconId(), contentDescription); - description = mCurrentState.isEmergency ? null : mCurrentState.networkName; - } - } - - boolean activityIn = mCurrentState.dataConnected - && !mCurrentState.carrierNetworkChangeMode - && mCurrentState.activityIn; - boolean activityOut = mCurrentState.dataConnected - && !mCurrentState.carrierNetworkChangeMode - && mCurrentState.activityOut; - showDataIcon &= mCurrentState.isDefault || dataDisabled; - int typeIcon = (showDataIcon || mConfig.alwaysShowDataRatIcon) ? icons.dataType : 0; - boolean showTriangle = mCurrentState.enabled && !mCurrentState.airplaneMode; - MobileDataIndicators mobileDataIndicators = new MobileDataIndicators( - statusIcon, qsIcon, typeIcon, qsTypeIcon, - activityIn, activityOut, dataContentDescription, dataContentDescriptionHtml, - description, icons.isWide, mSubscriptionInfo.getSubscriptionId(), - mCurrentState.roaming, showTriangle); - callback.setMobileDataIndicators(mobileDataIndicators); + boolean showDataIconInStatusBar = + (mCurrentState.dataConnected && mCurrentState.isDefault) || dataDisabled; + typeIcon = + (showDataIconInStatusBar || mConfig.alwaysShowDataRatIcon) ? dataTypeIcon : 0; + showTriangle = mCurrentState.enabled && !mCurrentState.airplaneMode; } + + return new SbInfo(showTriangle, typeIcon, statusIcon); } @Override @@ -841,12 +834,15 @@ public class MobileSignalController extends SignalController<MobileState, Mobile public void dump(PrintWriter pw) { super.dump(pw); pw.println(" mSubscription=" + mSubscriptionInfo + ","); + pw.println(" mProviderModelSetting=" + mProviderModelSetting + ","); + pw.println(" mProviderModelBehavior=" + mProviderModelBehavior + ","); pw.println(" mServiceState=" + mServiceState + ","); pw.println(" mSignalStrength=" + mSignalStrength + ","); pw.println(" mTelephonyDisplayInfo=" + mTelephonyDisplayInfo + ","); pw.println(" mDataState=" + mDataState + ","); pw.println(" mInflateSignalStrengths=" + mInflateSignalStrengths + ","); pw.println(" isDataDisabled=" + isDataDisabled() + ","); + pw.println(" mNetworkToIconLookup=" + mNetworkToIconLookup + ","); pw.println(" MobileStatusHistory"); int size = 0; for (int i = 0; i < STATUS_HISTORY_SIZE; i++) { @@ -862,4 +858,31 @@ public class MobileSignalController extends SignalController<MobileState, Mobile + mMobileStatusHistory[i & (STATUS_HISTORY_SIZE - 1)]); } } + + /** Box for QS icon info */ + private static final class QsInfo { + final int ratTypeIcon; + final IconState icon; + final CharSequence description; + + QsInfo(int typeIcon, IconState iconState, CharSequence desc) { + ratTypeIcon = typeIcon; + icon = iconState; + description = desc; + } + } + + /** Box for StatusBar icon info */ + private static final class SbInfo { + final boolean showTriangle; + final int ratTypeIcon; + final IconState icon; + + SbInfo(boolean show, int typeIcon, IconState iconState) { + showTriangle = show; + ratTypeIcon = typeIcon; + icon = iconState; + } + } + } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java index eeea699a0b74..9aec9038fadb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java @@ -81,7 +81,7 @@ public interface NetworkController extends CallbackController<SignalCallback>, D .append(",qsIcon=").append(qsIcon == null ? "" : qsIcon.toString()) .append(",activityIn=").append(activityIn) .append(",activityOut=").append(activityOut) - .append(",description=").append(description) + .append(",qsDescription=").append(description) .append(",isTransient=").append(isTransient) .append(",statusLabel=").append(statusLabel) .append(']').toString(); @@ -100,8 +100,7 @@ public interface NetworkController extends CallbackController<SignalCallback>, D public boolean activityOut; public CharSequence typeContentDescription; public CharSequence typeContentDescriptionHtml; - public CharSequence description; - public boolean isWide; + public CharSequence qsDescription; public int subId; public boolean roaming; public boolean showTriangle; @@ -109,7 +108,7 @@ public interface NetworkController extends CallbackController<SignalCallback>, D public MobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType, int qsType, boolean activityIn, boolean activityOut, CharSequence typeContentDescription, CharSequence typeContentDescriptionHtml, - CharSequence description, boolean isWide, int subId, boolean roaming, + CharSequence qsDescription, int subId, boolean roaming, boolean showTriangle) { this.statusIcon = statusIcon; this.qsIcon = qsIcon; @@ -119,8 +118,7 @@ public interface NetworkController extends CallbackController<SignalCallback>, D this.activityOut = activityOut; this.typeContentDescription = typeContentDescription; this.typeContentDescriptionHtml = typeContentDescriptionHtml; - this.description = description; - this.isWide = isWide; + this.qsDescription = qsDescription; this.subId = subId; this.roaming = roaming; this.showTriangle = showTriangle; @@ -137,8 +135,7 @@ public interface NetworkController extends CallbackController<SignalCallback>, D .append(",activityOut=").append(activityOut) .append(",typeContentDescription=").append(typeContentDescription) .append(",typeContentDescriptionHtml=").append(typeContentDescriptionHtml) - .append(",description=").append(description) - .append(",isWide=").append(isWide) + .append(",description=").append(qsDescription) .append(",subId=").append(subId) .append(",roaming=").append(roaming) .append(",showTriangle=").append(showTriangle) @@ -186,11 +183,13 @@ public interface NetworkController extends CallbackController<SignalCallback>, D default void setCallIndicator(IconState statusIcon, int subId) {} } - public interface EmergencyListener { + /** */ + interface EmergencyListener { void setEmergencyCallsOnly(boolean emergencyOnly); } - public static class IconState { + /** */ + class IconState { public final boolean visible; public final int icon; public final String contentDescription; @@ -220,7 +219,7 @@ public interface NetworkController extends CallbackController<SignalCallback>, D * Tracks changes in access points. Allows listening for changes, scanning for new APs, * and connecting to new ones. */ - public interface AccessPointController { + interface AccessPointController { void addAccessPointCallback(AccessPointCallback callback); void removeAccessPointCallback(AccessPointCallback callback); void scanForAccessPoints(); @@ -230,7 +229,7 @@ public interface NetworkController extends CallbackController<SignalCallback>, D boolean canConfigWifi(); boolean canConfigMobileData(); - public interface AccessPointCallback { + interface AccessPointCallback { void onAccessPointsChanged(List<WifiEntry> accessPoints); void onSettingsActivityTriggered(Intent settingsIntent); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java index fc19564bf554..3f7ddc6c1538 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java @@ -163,7 +163,7 @@ public class WifiSignalController extends int qsTypeIcon = 0; IconState qsIcon = null; if (sbVisible) { - qsTypeIcon = icons.qsDataType; + qsTypeIcon = icons.dataType; qsIcon = new IconState(mCurrentState.connected, getQsCurrentIconIdForCarrierWifi(), contentDescription); } @@ -172,7 +172,7 @@ public class WifiSignalController extends MobileDataIndicators mobileDataIndicators = new MobileDataIndicators( statusIcon, qsIcon, typeIcon, qsTypeIcon, mCurrentState.activityIn, mCurrentState.activityOut, dataContentDescription, - dataContentDescriptionHtml, description, icons.isWide, + dataContentDescriptionHtml, description, mCurrentState.subId, /* roaming= */ false, /* showTriangle= */ true ); callback.setMobileDataIndicators(mobileDataIndicators); diff --git a/packages/SystemUI/src/com/android/systemui/util/AlphaTintDrawableWrapper.java b/packages/SystemUI/src/com/android/systemui/util/AlphaTintDrawableWrapper.java index a22793b05070..516efc06386a 100644 --- a/packages/SystemUI/src/com/android/systemui/util/AlphaTintDrawableWrapper.java +++ b/packages/SystemUI/src/com/android/systemui/util/AlphaTintDrawableWrapper.java @@ -109,6 +109,12 @@ public class AlphaTintDrawableWrapper extends InsetDrawable { } } + @Override + public void setTintList(ColorStateList tint) { + super.setTintList(tint); + mTint = tint; + } + private void applyTint() { if (getDrawable() != null && mTint != null) { getDrawable().mutate().setTintList(mTint); diff --git a/packages/SystemUI/src/com/android/systemui/util/RoundedCornerProgressDrawable.kt b/packages/SystemUI/src/com/android/systemui/util/RoundedCornerProgressDrawable.kt index 3b64f9f953c3..1059d6c61287 100644 --- a/packages/SystemUI/src/com/android/systemui/util/RoundedCornerProgressDrawable.kt +++ b/packages/SystemUI/src/com/android/systemui/util/RoundedCornerProgressDrawable.kt @@ -69,6 +69,10 @@ class RoundedCornerProgressDrawable @JvmOverloads constructor( return super.getChangingConfigurations() or ActivityInfo.CONFIG_DENSITY } + override fun canApplyTheme(): Boolean { + return (drawable?.canApplyTheme() ?: false) || super.canApplyTheme() + } + private class RoundedCornerState(private val wrappedState: ConstantState) : ConstantState() { override fun newDrawable(): Drawable { return newDrawable(null, null) @@ -82,5 +86,9 @@ class RoundedCornerProgressDrawable @JvmOverloads constructor( override fun getChangingConfigurations(): Int { return wrappedState.changingConfigurations } + + override fun canApplyTheme(): Boolean { + return true + } } }
\ No newline at end of file diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/LockIconViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/LockIconViewControllerTest.java index af6dee76139e..c464cad3e0b2 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/LockIconViewControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/LockIconViewControllerTest.java @@ -32,6 +32,7 @@ import android.os.Vibrator; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.util.DisplayMetrics; +import android.util.Pair; import android.view.View; import android.view.accessibility.AccessibilityManager; @@ -128,20 +129,7 @@ public class LockIconViewControllerTest extends SysuiTestCase { @Test public void testUpdateFingerprintLocationOnInit() { // GIVEN fp sensor location is available pre-attached - final PointF udfpsLocation = new PointF(50, 75); - final int radius = 33; - final FingerprintSensorPropertiesInternal fpProps = - new FingerprintSensorPropertiesInternal( - /* sensorId */ 0, - /* strength */ 0, - /* max enrollments per user */ 5, - /* component info */ new ArrayList<>(), - /* sensorType */ 3, - /* resetLockoutRequiresHwToken */ false, - List.of(new SensorLocationInternal("" /* displayId */, - (int) udfpsLocation.x, (int) udfpsLocation.y, radius))); - when(mAuthController.getUdfpsSensorLocation()).thenReturn(udfpsLocation); - when(mAuthController.getUdfpsProps()).thenReturn(List.of(fpProps)); + Pair<Integer, PointF> udfps = setupUdfps(); // WHEN lock icon view controller is initialized and attached mLockIconViewController.init(); @@ -149,8 +137,8 @@ public class LockIconViewControllerTest extends SysuiTestCase { mAttachListener.onViewAttachedToWindow(mLockIconView); // THEN lock icon view location is updated with the same coordinates as fpProps - verify(mLockIconView).setCenterLocation(mPointCaptor.capture(), eq(radius)); - assertEquals(udfpsLocation, mPointCaptor.getValue()); + verify(mLockIconView).setCenterLocation(mPointCaptor.capture(), eq(udfps.first)); + assertEquals(udfps.second, mPointCaptor.getValue()); } @Test @@ -164,6 +152,47 @@ public class LockIconViewControllerTest extends SysuiTestCase { // GIVEN fp sensor location is available post-atttached captureAuthControllerCallback(); + Pair<Integer, PointF> udfps = setupUdfps(); + + // WHEN all authenticators are registered + mAuthControllerCallback.onAllAuthenticatorsRegistered(); + + // THEN lock icon view location is updated with the same coordinates as fpProps + verify(mLockIconView).setCenterLocation(mPointCaptor.capture(), eq(udfps.first)); + assertEquals(udfps.second, mPointCaptor.getValue()); + } + + @Test + public void testLockIconViewBackgroundEnabledWhenUdfpsIsAvailable() { + // GIVEN Udpfs sensor location is available + setupUdfps(); + + mLockIconViewController.init(); + captureAttachListener(); + + // WHEN the view is attached + mAttachListener.onViewAttachedToWindow(mLockIconView); + + // THEN the lock icon view background should be enabled + verify(mLockIconView).setUseBackground(true); + } + + @Test + public void testLockIconViewBackgroundDisabledWhenUdfpsIsUnavailable() { + // GIVEN Udfps sensor location is not available + when(mAuthController.getUdfpsSensorLocation()).thenReturn(null); + + mLockIconViewController.init(); + captureAttachListener(); + + // WHEN the view is attached + mAttachListener.onViewAttachedToWindow(mLockIconView); + + // THEN the lock icon view background should be disabled + verify(mLockIconView).setUseBackground(false); + } + + private Pair<Integer, PointF> setupUdfps() { final PointF udfpsLocation = new PointF(50, 75); final int radius = 33; final FingerprintSensorPropertiesInternal fpProps = @@ -179,12 +208,7 @@ public class LockIconViewControllerTest extends SysuiTestCase { when(mAuthController.getUdfpsSensorLocation()).thenReturn(udfpsLocation); when(mAuthController.getUdfpsProps()).thenReturn(List.of(fpProps)); - // WHEN all authenticators are registered - mAuthControllerCallback.onAllAuthenticatorsRegistered(); - - // THEN lock icon view location is updated with the same coordinates as fpProps - verify(mLockIconView).setCenterLocation(mPointCaptor.capture(), eq(radius)); - assertEquals(udfpsLocation, mPointCaptor.getValue()); + return new Pair(radius, udfpsLocation); } private void captureAuthControllerCallback() { diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataFilterTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataFilterTest.kt index d8791867cb45..28aed2085528 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataFilterTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataFilterTest.kt @@ -86,7 +86,7 @@ class MediaDataFilterTest : SysuiTestCase() { @Before fun setup() { MockitoAnnotations.initMocks(this) - mediaDataFilter = MediaDataFilter(broadcastDispatcher, mediaResumeListener, + mediaDataFilter = MediaDataFilter(context, broadcastDispatcher, mediaResumeListener, lockscreenUserManager, executor, clock) mediaDataFilter.mediaDataManager = mediaDataManager mediaDataFilter.addListener(listener) 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 5c3108c33147..47c5545ab587 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt @@ -4,6 +4,7 @@ import android.app.Notification.MediaStyle import android.app.PendingIntent import android.app.smartspace.SmartspaceAction import android.app.smartspace.SmartspaceTarget +import android.content.Intent import android.graphics.Bitmap import android.media.MediaDescription import android.media.MediaMetadata @@ -51,6 +52,7 @@ private const val APP_NAME = "SystemUI" private const val SESSION_ARTIST = "artist" private const val SESSION_TITLE = "title" private const val USER_ID = 0 +private val DISMISS_INTENT = Intent().apply { action = "dismiss" } private fun <T> anyObject(): T { return Mockito.anyObject<T>() @@ -83,6 +85,7 @@ class MediaDataManagerTest : SysuiTestCase() { lateinit var smartspaceMediaDataProvider: SmartspaceMediaDataProvider @Mock lateinit var mediaSmartspaceTarget: SmartspaceTarget @Mock private lateinit var mediaRecommendationItem: SmartspaceAction + @Mock private lateinit var mediaSmartspaceBaseAction: SmartspaceAction lateinit var mediaDataManager: MediaDataManager lateinit var mediaNotification: StatusBarNotification @Captor lateinit var mediaDataCaptor: ArgumentCaptor<MediaData> @@ -146,8 +149,12 @@ class MediaDataManagerTest : SysuiTestCase() { // treat mediaSessionBasedFilter as a listener for testing. listener = mediaSessionBasedFilter - val recommendationExtras = Bundle() - recommendationExtras.putString("package_name", PACKAGE_NAME) + val recommendationExtras = Bundle().apply { + putString("package_name", PACKAGE_NAME) + putParcelable("dismiss_intent", DISMISS_INTENT) + } + whenever(mediaSmartspaceBaseAction.extras).thenReturn(recommendationExtras) + whenever(mediaSmartspaceTarget.baseAction).thenReturn(mediaSmartspaceBaseAction) whenever(mediaRecommendationItem.extras).thenReturn(recommendationExtras) whenever(mediaSmartspaceTarget.smartspaceTargetId).thenReturn(KEY_MEDIA_SMARTSPACE) whenever(mediaSmartspaceTarget.featureType).thenReturn(SmartspaceTarget.FEATURE_MEDIA) @@ -380,7 +387,8 @@ class MediaDataManagerTest : SysuiTestCase() { verify(listener).onSmartspaceMediaDataLoaded( eq(KEY_MEDIA_SMARTSPACE), eq(SmartspaceMediaData(KEY_MEDIA_SMARTSPACE, true /* isActive */, true /*isValid */, - PACKAGE_NAME, null, listOf(mediaRecommendationItem), 0)), + PACKAGE_NAME, mediaSmartspaceBaseAction, listOf(mediaRecommendationItem), + DISMISS_INTENT, 0)), eq(false)) } @@ -391,7 +399,8 @@ class MediaDataManagerTest : SysuiTestCase() { verify(listener).onSmartspaceMediaDataLoaded( eq(KEY_MEDIA_SMARTSPACE), eq(EMPTY_SMARTSPACE_MEDIA_DATA - .copy(targetId = KEY_MEDIA_SMARTSPACE, isActive = true, isValid = false)), + .copy(targetId = KEY_MEDIA_SMARTSPACE, isActive = true, + isValid = false, dismissIntent = DISMISS_INTENT)), eq(false)) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java index 36228dcb08c3..e37f4224060c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java @@ -168,9 +168,12 @@ public class NavigationBarTest extends SysuiTestCase { Display defaultDisplay = mContext.getSystemService(WindowManager.class).getDefaultDisplay(); when(windowManager.getDefaultDisplay()).thenReturn( defaultDisplay); - WindowMetrics metrics = mContext.getSystemService(WindowManager.class) + WindowMetrics maximumWindowMetrics = mContext.getSystemService(WindowManager.class) .getMaximumWindowMetrics(); - when(windowManager.getMaximumWindowMetrics()).thenReturn(metrics); + when(windowManager.getMaximumWindowMetrics()).thenReturn(maximumWindowMetrics); + WindowMetrics currentWindowMetrics = mContext.getSystemService(WindowManager.class) + .getCurrentWindowMetrics(); + when(windowManager.getCurrentWindowMetrics()).thenReturn(currentWindowMetrics); doNothing().when(windowManager).addView(any(), any()); mContext.addMockSystemService(Context.WINDOW_SERVICE, windowManager); mSysuiTestableContextExternal.addMockSystemService(Context.WINDOW_SERVICE, windowManager); diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java index 6ff5aa0a2fde..2e1fb07e6aa5 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java @@ -27,6 +27,7 @@ import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; +import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -95,11 +96,11 @@ public class QSPanelControllerBaseTest extends SysuiTestCase { Resources mResources; @Mock Configuration mConfiguration; + @Mock + Runnable mHorizontalLayoutListener; private QSPanelControllerBase<QSPanel> mController; - - /** Implementation needed to ensure we have a reflectively-available class name. */ private class TestableQSPanelControllerBase extends QSPanelControllerBase<QSPanel> { protected TestableQSPanelControllerBase(QSPanel view, QSTileHost host, @@ -239,17 +240,43 @@ public class QSPanelControllerBaseTest extends SysuiTestCase { when(mMediaHost.getVisible()).thenReturn(true); when(mResources.getBoolean(R.bool.config_use_split_notification_shade)).thenReturn(false); + when(mQSPanel.getDumpableTag()).thenReturn("QSPanelLandscape"); mController = new TestableQSPanelControllerBase(mQSPanel, mQSTileHost, mQSCustomizerController, mMediaHost, mMetricsLogger, mUiEventLogger, mQSLogger, mDumpManager); + mController.init(); assertThat(mController.shouldUseHorizontalLayout()).isTrue(); when(mResources.getBoolean(R.bool.config_use_split_notification_shade)).thenReturn(true); + when(mQSPanel.getDumpableTag()).thenReturn("QSPanelPortrait"); mController = new TestableQSPanelControllerBase(mQSPanel, mQSTileHost, mQSCustomizerController, mMediaHost, mMetricsLogger, mUiEventLogger, mQSLogger, mDumpManager); + mController.init(); + + assertThat(mController.shouldUseHorizontalLayout()).isFalse(); + } + + @Test + public void testChangeConfiguration_shouldUseHorizontalLayout() { + when(mMediaHost.getVisible()).thenReturn(true); + mController.setUsingHorizontalLayoutChangeListener(mHorizontalLayoutListener); + + // When device is rotated to landscape + mConfiguration.orientation = Configuration.ORIENTATION_LANDSCAPE; + mController.mOnConfigurationChangedListener.onConfigurationChange(mConfiguration); + + // Then the layout changes + assertThat(mController.shouldUseHorizontalLayout()).isTrue(); + verify(mHorizontalLayoutListener).run(); // not invoked + + // When it is rotated back to portrait + mConfiguration.orientation = Configuration.ORIENTATION_PORTRAIT; + mController.mOnConfigurationChangedListener.onConfigurationChange(mConfiguration); + // Then the layout changes back assertThat(mController.shouldUseHorizontalLayout()).isFalse(); + verify(mHorizontalLayoutListener, times(2)).run(); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java index a21f4887038c..06a4ae096d44 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java @@ -23,6 +23,8 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.content.res.Configuration; +import android.content.res.Resources; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper.RunWithLooper; @@ -98,6 +100,10 @@ public class QSPanelControllerTest extends SysuiTestCase { @Mock CommandQueue mCommandQueue; FalsingManagerFake mFalsingManager = new FalsingManagerFake(); + @Mock + Resources mResources; + @Mock + Configuration mConfiguration; private QSPanelController mController; @@ -109,7 +115,8 @@ public class QSPanelControllerTest extends SysuiTestCase { when(mQSPanel.getDumpableTag()).thenReturn("QSPanel"); when(mQSPanel.getOrCreateTileLayout()).thenReturn(mPagedTileLayout); when(mQSPanel.getTileLayout()).thenReturn(mPagedTileLayout); - when(mQSPanel.getResources()).thenReturn(mContext.getResources()); + when(mQSPanel.getResources()).thenReturn(mResources); + when(mResources.getConfiguration()).thenReturn(mConfiguration); when(mQSTileHost.getTiles()).thenReturn(Collections.singleton(mQSTile)); when(mQSTileHost.createTileView(any(), eq(mQSTile), anyBoolean())).thenReturn(mQSTileView); when(mToggleSliderViewControllerFactory.create(any(), any())) diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/carrier/QSCarrierGroupControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/carrier/QSCarrierGroupControllerTest.java index 126b332af30d..a1b72104509b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/carrier/QSCarrierGroupControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/carrier/QSCarrierGroupControllerTest.java @@ -232,7 +232,7 @@ public class QSCarrierGroupControllerTest extends LeakCheckedTest { MobileDataIndicators indicators = new MobileDataIndicators( mock(NetworkController.IconState.class), mock(NetworkController.IconState.class), - 0, 0, true, true, "", "", "", true, 0, true, true); + 0, 0, true, true, "", "", "", 0, true, true); mSignalCallback.setMobileDataIndicators(indicators); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogControllerTest.java index baddacc3e6f5..18f48a36100c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogControllerTest.java @@ -444,6 +444,47 @@ public class InternetDialogControllerTest extends SysuiTestCase { verify(mInternetDialogCallback).onAccessPointsChanged(mWifiEntries, mConnectedEntry); } + @Test + public void onAccessPointsChanged_fourWifiEntries_callbackCutMore() { + reset(mInternetDialogCallback); + mInternetDialogController.setAirplaneModeEnabled(true); + mAccessPoints.clear(); + mAccessPoints.add(mWifiEntry1); + mAccessPoints.add(mWifiEntry2); + mAccessPoints.add(mWifiEntry3); + mAccessPoints.add(mWifiEntry4); + + mInternetDialogController.onAccessPointsChanged(mAccessPoints); + + mWifiEntries.clear(); + mWifiEntries.add(mWifiEntry1); + mWifiEntries.add(mWifiEntry2); + mWifiEntries.add(mWifiEntry3); + mWifiEntries.add(mWifiEntry4); + verify(mInternetDialogCallback) + .onAccessPointsChanged(mWifiEntries, null /* connectedEntry */); + + // If the Ethernet exists, then Wi-Fi entries will cut last one. + reset(mInternetDialogCallback); + mInternetDialogController.mHasEthernet = true; + + mInternetDialogController.onAccessPointsChanged(mAccessPoints); + + mWifiEntries.remove(mWifiEntry4); + verify(mInternetDialogCallback) + .onAccessPointsChanged(mWifiEntries, null /* connectedEntry */); + + // Turn off airplane mode to has carrier network, then Wi-Fi entries will cut last one. + reset(mInternetDialogCallback); + mInternetDialogController.setAirplaneModeEnabled(false); + + mInternetDialogController.onAccessPointsChanged(mAccessPoints); + + mWifiEntries.remove(mWifiEntry3); + verify(mInternetDialogCallback) + .onAccessPointsChanged(mWifiEntries, null /* connectedEntry */); + } + private String getResourcesString(String name) { return mContext.getResources().getString(getResourcesId(name)); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogTest.java index fa9c0538e9bd..c42b64a09985 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogTest.java @@ -67,6 +67,7 @@ public class InternetDialogTest extends SysuiTestCase { private InternetDialog mInternetDialog; private View mDialogView; private View mSubTitle; + private LinearLayout mEthernet; private LinearLayout mMobileDataToggle; private LinearLayout mWifiToggle; private LinearLayout mConnectedWifi; @@ -97,6 +98,7 @@ public class InternetDialogTest extends SysuiTestCase { mDialogView = mInternetDialog.mDialogView; mSubTitle = mDialogView.requireViewById(R.id.internet_dialog_subtitle); + mEthernet = mDialogView.requireViewById(R.id.ethernet_layout); mMobileDataToggle = mDialogView.requireViewById(R.id.mobile_network_layout); mWifiToggle = mDialogView.requireViewById(R.id.turn_on_wifi_layout); mConnectedWifi = mDialogView.requireViewById(R.id.wifi_connected_layout); @@ -139,6 +141,46 @@ public class InternetDialogTest extends SysuiTestCase { } @Test + public void updateDialog_apmOffAndHasEthernet_showEthernet() { + when(mInternetDialogController.isAirplaneModeEnabled()).thenReturn(false); + when(mInternetDialogController.hasEthernet()).thenReturn(true); + + mInternetDialog.updateDialog(); + + assertThat(mEthernet.getVisibility()).isEqualTo(View.VISIBLE); + } + + @Test + public void updateDialog_apmOffAndNoEthernet_hideEthernet() { + when(mInternetDialogController.isAirplaneModeEnabled()).thenReturn(false); + when(mInternetDialogController.hasEthernet()).thenReturn(false); + + mInternetDialog.updateDialog(); + + assertThat(mEthernet.getVisibility()).isEqualTo(View.GONE); + } + + @Test + public void updateDialog_apmOnAndHasEthernet_showEthernet() { + when(mInternetDialogController.isAirplaneModeEnabled()).thenReturn(true); + when(mInternetDialogController.hasEthernet()).thenReturn(true); + + mInternetDialog.updateDialog(); + + assertThat(mEthernet.getVisibility()).isEqualTo(View.VISIBLE); + } + + @Test + public void updateDialog_apmOnAndNoEthernet_hideEthernet() { + when(mInternetDialogController.isAirplaneModeEnabled()).thenReturn(true); + when(mInternetDialogController.hasEthernet()).thenReturn(false); + + mInternetDialog.updateDialog(); + + assertThat(mEthernet.getVisibility()).isEqualTo(View.GONE); + } + + @Test public void updateDialog_withApmOn_mobileDataLayoutGone() { when(mInternetDialogController.isAirplaneModeEnabled()).thenReturn(true); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java index 24182434f1ba..3c55df934f76 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java @@ -124,7 +124,7 @@ public class CallbackHandlerTest extends SysuiTestCase { boolean roaming = true; MobileDataIndicators indicators = new MobileDataIndicators( status, qs, type, qsType, in, out, typeDescription, - typeDescriptionHtml, description, wide, subId, roaming, true); + typeDescriptionHtml, description, subId, roaming, true); mHandler.setMobileDataIndicators(indicators); waitForCallbacks(); @@ -141,8 +141,7 @@ public class CallbackHandlerTest extends SysuiTestCase { assertEquals(out, expected.activityOut); assertEquals(typeDescription, expected.typeContentDescription); assertEquals(typeDescriptionHtml, expected.typeContentDescriptionHtml); - assertEquals(description, expected.description); - assertEquals(wide, expected.isWide); + assertEquals(description, expected.qsDescription); assertEquals(subId, expected.subId); assertTrue(expected.roaming); assertTrue(expected.showTriangle); diff --git a/packages/services/CameraExtensionsProxy/AndroidManifest.xml b/packages/services/CameraExtensionsProxy/AndroidManifest.xml index d35689413749..ef1d581d717e 100644 --- a/packages/services/CameraExtensionsProxy/AndroidManifest.xml +++ b/packages/services/CameraExtensionsProxy/AndroidManifest.xml @@ -8,6 +8,7 @@ android:directBootAware="true"> <service android:name=".CameraExtensionsProxyService" + android:visibleToInstantApps="true" android:exported="true"> </service> <uses-library android:name="androidx.camera.extensions.impl" android:required="false" /> diff --git a/services/core/java/com/android/server/BootReceiver.java b/services/core/java/com/android/server/BootReceiver.java index fdba098e6b80..48f5b51a8404 100644 --- a/services/core/java/com/android/server/BootReceiver.java +++ b/services/core/java/com/android/server/BootReceiver.java @@ -476,7 +476,11 @@ public class BootReceiver extends BroadcastReceiver { */ public static void addTombstoneToDropBox(Context ctx, File tombstone, boolean proto) { final DropBoxManager db = ctx.getSystemService(DropBoxManager.class); - final String bootReason = SystemProperties.get("ro.boot.bootreason", null); + if (db == null) { + Slog.e(TAG, "Can't log tombstone: DropBoxManager not available"); + return; + } + HashMap<String, Long> timestamps = readTimestamps(); try { if (proto) { @@ -484,7 +488,7 @@ public class BootReceiver extends BroadcastReceiver { } else { final String headers = getBootHeadersToLogAndUpdate(); addFileToDropBox(db, timestamps, headers, tombstone.getPath(), LOG_SIZE, - TAG_TOMBSTONE); + TAG_TOMBSTONE); } } catch (IOException e) { Slog.e(TAG, "Can't log tombstone", e); diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 85ffaa231c21..e4d184b372dc 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -15404,12 +15404,14 @@ public class ActivityManagerService extends IActivityManager.Stub } @Override - public void updateDeviceIdleTempAllowlist(int[] appids, int changingUid, boolean adding, - long durationMs, @TempAllowListType int type, @ReasonCode int reasonCode, - @Nullable String reason, int callingUid) { + public void updateDeviceIdleTempAllowlist(@Nullable int[] appids, int changingUid, + boolean adding, long durationMs, @TempAllowListType int type, + @ReasonCode int reasonCode, @Nullable String reason, int callingUid) { synchronized (ActivityManagerService.this) { synchronized (mProcLock) { - mDeviceIdleTempAllowlist = appids; + if (appids != null) { + mDeviceIdleTempAllowlist = appids; + } if (adding) { if (type == TEMPORARY_ALLOW_LIST_TYPE_FOREGROUND_SERVICE_ALLOWED) { // Note, the device idle temp-allowlist are by app-ids, but here @@ -15419,12 +15421,7 @@ public class ActivityManagerService extends IActivityManager.Stub callingUid)); } } else { - // Note in the removing case, we need to remove all the UIDs matching - // the appId, because DeviceIdle's temp-allowlist are based on AppIds, - // not UIDs. - // For eacmple, "cmd deviceidle tempallowlist -r PACKAGE" will - // not only remove this app for user 0, but for all users. - mFgsStartTempAllowList.removeAppId(UserHandle.getAppId(changingUid)); + mFgsStartTempAllowList.removeUid(changingUid); } setAppIdTempAllowlistStateLSP(changingUid, adding); } diff --git a/services/core/java/com/android/server/am/CacheOomRanker.java b/services/core/java/com/android/server/am/CacheOomRanker.java index 50278fd81bb2..e6ffcfcd3510 100644 --- a/services/core/java/com/android/server/am/CacheOomRanker.java +++ b/services/core/java/com/android/server/am/CacheOomRanker.java @@ -16,6 +16,8 @@ package com.android.server.am; +import android.os.Process; +import android.os.SystemClock; import android.provider.DeviceConfig; import android.util.Slog; @@ -38,21 +40,40 @@ public class CacheOomRanker { private static final boolean DEFAULT_USE_OOM_RE_RANKING = false; @VisibleForTesting static final String KEY_OOM_RE_RANKING_NUMBER_TO_RE_RANK = "oom_re_ranking_number_to_re_rank"; - @VisibleForTesting static final int DEFAULT_OOM_RE_RANKING_NUMBER_TO_RE_RANK = 8; + @VisibleForTesting + static final int DEFAULT_OOM_RE_RANKING_NUMBER_TO_RE_RANK = 8; + @VisibleForTesting + static final String KEY_OOM_RE_RANKING_PRESERVE_TOP_N_APPS = + "oom_re_ranking_preserve_top_n_apps"; + @VisibleForTesting + static final int DEFAULT_PRESERVE_TOP_N_APPS = 3; + @VisibleForTesting + static final String KEY_OOM_RE_RANKING_USE_FREQUENT_RSS = "oom_re_ranking_rss_use_frequent_rss"; + @VisibleForTesting + static final boolean DEFAULT_USE_FREQUENT_RSS = true; + @VisibleForTesting + static final String KEY_OOM_RE_RANKING_RSS_UPDATE_RATE_MS = "oom_re_ranking_rss_update_rate_ms"; + @VisibleForTesting + static final long DEFAULT_RSS_UPDATE_RATE_MS = 10_000; // 10 seconds @VisibleForTesting static final String KEY_OOM_RE_RANKING_LRU_WEIGHT = "oom_re_ranking_lru_weight"; - @VisibleForTesting static final float DEFAULT_OOM_RE_RANKING_LRU_WEIGHT = 0.35f; + @VisibleForTesting + static final float DEFAULT_OOM_RE_RANKING_LRU_WEIGHT = 0.35f; @VisibleForTesting static final String KEY_OOM_RE_RANKING_USES_WEIGHT = "oom_re_ranking_uses_weight"; - @VisibleForTesting static final float DEFAULT_OOM_RE_RANKING_USES_WEIGHT = 0.5f; + @VisibleForTesting + static final float DEFAULT_OOM_RE_RANKING_USES_WEIGHT = 0.5f; @VisibleForTesting static final String KEY_OOM_RE_RANKING_RSS_WEIGHT = "oom_re_ranking_rss_weight"; - @VisibleForTesting static final float DEFAULT_OOM_RE_RANKING_RSS_WEIGHT = 0.15f; + @VisibleForTesting + static final float DEFAULT_OOM_RE_RANKING_RSS_WEIGHT = 0.15f; private static final Comparator<RankedProcessRecord> SCORED_PROCESS_RECORD_COMPARATOR = new ScoreComparator(); private static final Comparator<RankedProcessRecord> CACHE_USE_COMPARATOR = new CacheUseComparator(); + private static final Comparator<RankedProcessRecord> RSS_COMPARATOR = + new RssComparator(); private static final Comparator<RankedProcessRecord> LAST_RSS_COMPARATOR = new LastRssComparator(); private static final Comparator<RankedProcessRecord> LAST_ACTIVITY_TIME_COMPARATOR = @@ -61,20 +82,33 @@ public class CacheOomRanker { private final Object mPhenotypeFlagLock = new Object(); private final ActivityManagerService mService; + private final ProcessDependencies mProcessDependencies; private final ActivityManagerGlobalLock mProcLock; private final Object mProfilerLock; @GuardedBy("mPhenotypeFlagLock") private boolean mUseOomReRanking = DEFAULT_USE_OOM_RE_RANKING; + @GuardedBy("mPhenotypeFlagLock") + @VisibleForTesting + int mPreserveTopNApps = DEFAULT_PRESERVE_TOP_N_APPS; + @GuardedBy("mPhenotypeFlagLock") + @VisibleForTesting + boolean mUseFrequentRss = DEFAULT_USE_FREQUENT_RSS; + @GuardedBy("mPhenotypeFlagLock") + @VisibleForTesting + long mRssUpdateRateMs = DEFAULT_RSS_UPDATE_RATE_MS; // Weight to apply to the LRU ordering. @GuardedBy("mPhenotypeFlagLock") - @VisibleForTesting float mLruWeight = DEFAULT_OOM_RE_RANKING_LRU_WEIGHT; + @VisibleForTesting + float mLruWeight = DEFAULT_OOM_RE_RANKING_LRU_WEIGHT; // Weight to apply to the ordering by number of times the process has been added to the cache. @GuardedBy("mPhenotypeFlagLock") - @VisibleForTesting float mUsesWeight = DEFAULT_OOM_RE_RANKING_USES_WEIGHT; + @VisibleForTesting + float mUsesWeight = DEFAULT_OOM_RE_RANKING_USES_WEIGHT; // Weight to apply to the ordering by RSS used by the processes. @GuardedBy("mPhenotypeFlagLock") - @VisibleForTesting float mRssWeight = DEFAULT_OOM_RE_RANKING_RSS_WEIGHT; + @VisibleForTesting + float mRssWeight = DEFAULT_OOM_RE_RANKING_RSS_WEIGHT; // Positions to replace in the lru list. @GuardedBy("mPhenotypeFlagLock") @@ -93,6 +127,12 @@ public class CacheOomRanker { updateUseOomReranking(); } else if (KEY_OOM_RE_RANKING_NUMBER_TO_RE_RANK.equals(name)) { updateNumberToReRank(); + } else if (KEY_OOM_RE_RANKING_PRESERVE_TOP_N_APPS.equals(name)) { + updatePreserveTopNApps(); + } else if (KEY_OOM_RE_RANKING_USE_FREQUENT_RSS.equals(name)) { + updateUseFrequentRss(); + } else if (KEY_OOM_RE_RANKING_RSS_UPDATE_RATE_MS.equals(name)) { + updateRssUpdateRateMs(); } else if (KEY_OOM_RE_RANKING_LRU_WEIGHT.equals(name)) { updateLruWeight(); } else if (KEY_OOM_RE_RANKING_USES_WEIGHT.equals(name)) { @@ -106,9 +146,15 @@ public class CacheOomRanker { }; CacheOomRanker(final ActivityManagerService service) { + this(service, new ProcessDependenciesImpl()); + } + + @VisibleForTesting + CacheOomRanker(final ActivityManagerService service, ProcessDependencies processDependencies) { mService = service; mProcLock = service.mProcLock; mProfilerLock = service.mAppProfiler.mProfilerLock; + mProcessDependencies = processDependencies; } /** Load settings from device config and register a listener for changes. */ @@ -160,6 +206,31 @@ public class CacheOomRanker { } @GuardedBy("mPhenotypeFlagLock") + private void updatePreserveTopNApps() { + int preserveTopNApps = DeviceConfig.getInt(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + KEY_OOM_RE_RANKING_PRESERVE_TOP_N_APPS, DEFAULT_PRESERVE_TOP_N_APPS); + if (preserveTopNApps < 0) { + Slog.w(OomAdjuster.TAG, + "Found negative value for preserveTopNApps, setting to default: " + + preserveTopNApps); + preserveTopNApps = DEFAULT_PRESERVE_TOP_N_APPS; + } + mPreserveTopNApps = preserveTopNApps; + } + + @GuardedBy("mPhenotypeFlagLock") + private void updateRssUpdateRateMs() { + mRssUpdateRateMs = DeviceConfig.getLong(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + KEY_OOM_RE_RANKING_RSS_UPDATE_RATE_MS, DEFAULT_RSS_UPDATE_RATE_MS); + } + + @GuardedBy("mPhenotypeFlagLock") + private void updateUseFrequentRss() { + mUseFrequentRss = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + KEY_OOM_RE_RANKING_USE_FREQUENT_RSS, DEFAULT_USE_FREQUENT_RSS); + } + + @GuardedBy("mPhenotypeFlagLock") private void updateLruWeight() { mLruWeight = DeviceConfig.getFloat(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, KEY_OOM_RE_RANKING_LRU_WEIGHT, DEFAULT_OOM_RE_RANKING_LRU_WEIGHT); @@ -183,9 +254,39 @@ public class CacheOomRanker { */ @GuardedBy({"mService", "mProcLock"}) void reRankLruCachedAppsLSP(ArrayList<ProcessRecord> lruList, int lruProcessServiceStart) { + // The lruList is a list of processes ordered by how recently they were used. The + // least-recently-used apps are at the beginning of the list. We keep track of two + // indices in the lruList: + // + // getNumberToReRank=5, preserveTopNApps=3, lruProcessServiceStart=7, + // lruList= + // 0: app A ^ + // 1: app B | These apps are re-ranked, as they are the first five apps (see + // 2: app C | getNumberToReRank), excluding... + // 3: app D v + // 4: app E ^ + // 5: app F | The three most-recently-used apps in the cache (see preserveTopNApps). + // 6: app G v + // 7: service A ^ + // 8: service B | Everything beyond lruProcessServiceStart is ignored, as these aren't + // 9: service C | apps. + // 10: activity A | + // ... | + // + // `numProcessesEvaluated` moves across the apps (indices 0-6) or until we've found enough + // apps to re-rank, and made sure none of them are in the top `preserveTopNApps` apps. + // Re-ranked apps are copied into `scoredProcessRecords`, where the re-ranking calculation + // happens. + // + // Note that some apps in the `lruList` can be skipped, if they don't pass + //`appCanBeReRanked`. + float lruWeight; float usesWeight; float rssWeight; + int preserveTopNApps; + boolean useFrequentRss; + long rssUpdateRateMs; int[] lruPositions; RankedProcessRecord[] scoredProcessRecords; @@ -193,6 +294,9 @@ public class CacheOomRanker { lruWeight = mLruWeight; usesWeight = mUsesWeight; rssWeight = mRssWeight; + preserveTopNApps = mPreserveTopNApps; + useFrequentRss = mUseFrequentRss; + rssUpdateRateMs = mRssUpdateRateMs; lruPositions = mLruPositions; scoredProcessRecords = mScoredProcessRecords; } @@ -202,52 +306,98 @@ public class CacheOomRanker { return; } + int numProcessesEvaluated = 0; // Collect the least recently used processes to re-rank, only rank cached // processes further down the list than mLruProcessServiceStart. - int cachedProcessPos = 0; - for (int i = 0; i < lruProcessServiceStart - && cachedProcessPos < scoredProcessRecords.length; ++i) { - ProcessRecord app = lruList.get(i); + int numProcessesReRanked = 0; + while (numProcessesEvaluated < lruProcessServiceStart + && numProcessesReRanked < scoredProcessRecords.length) { + ProcessRecord process = lruList.get(numProcessesEvaluated); // Processes that will be assigned a cached oom adj score. - if (!app.isKilledByAm() && app.getThread() != null && app.mState.getCurAdj() - >= ProcessList.UNKNOWN_ADJ) { - scoredProcessRecords[cachedProcessPos].proc = app; - scoredProcessRecords[cachedProcessPos].score = 0.0f; - lruPositions[cachedProcessPos] = i; - ++cachedProcessPos; + if (appCanBeReRanked(process)) { + scoredProcessRecords[numProcessesReRanked].proc = process; + scoredProcessRecords[numProcessesReRanked].score = 0.0f; + lruPositions[numProcessesReRanked] = numProcessesEvaluated; + ++numProcessesReRanked; } + ++numProcessesEvaluated; } - // TODO maybe ensure a certain number above this in the cache before re-ranking. - if (cachedProcessPos < scoredProcessRecords.length) { - // Ignore we don't have enough processes to worry about re-ranking. - return; + // Count how many apps we're not re-ranking (up to preserveTopNApps). + int numProcessesNotReRanked = 0; + while (numProcessesEvaluated < lruProcessServiceStart + && numProcessesNotReRanked < preserveTopNApps) { + ProcessRecord process = lruList.get(numProcessesEvaluated); + if (appCanBeReRanked(process)) { + numProcessesNotReRanked++; + } + numProcessesEvaluated++; + } + // Exclude the top `preserveTopNApps` apps from re-ranking. + if (numProcessesNotReRanked < preserveTopNApps) { + numProcessesReRanked -= preserveTopNApps - numProcessesNotReRanked; + if (numProcessesReRanked < 0) { + numProcessesReRanked = 0; + } + } + + if (useFrequentRss) { + // Update RSS values for re-ranked apps. + long nowMs = SystemClock.elapsedRealtime(); + for (int i = 0; i < numProcessesReRanked; ++i) { + RankedProcessRecord scoredProcessRecord = scoredProcessRecords[i]; + long sinceUpdateMs = + nowMs - scoredProcessRecord.proc.mState.getCacheOomRankerRssTimeMs(); + if (scoredProcessRecord.proc.mState.getCacheOomRankerRss() != 0 + && sinceUpdateMs < rssUpdateRateMs) { + continue; + } + + long[] rss = mProcessDependencies.getRss(scoredProcessRecord.proc.getPid()); + if (rss == null || rss.length == 0) { + Slog.e( + OomAdjuster.TAG, + "Process.getRss returned bad value, not re-ranking: " + + Arrays.toString(rss)); + return; + } + // First element is total RSS: + // frameworks/base/core/jni/android_util_Process.cpp:1192 + scoredProcessRecord.proc.mState.setCacheOomRankerRss(rss[0], nowMs); + scoredProcessRecord.proc.mProfile.setLastRss(rss[0]); + } } // Add scores for each of the weighted features we want to rank based on. if (lruWeight > 0.0f) { // This doesn't use the LRU list ordering as after the first re-ranking // that will no longer be lru. - Arrays.sort(scoredProcessRecords, LAST_ACTIVITY_TIME_COMPARATOR); + Arrays.sort(scoredProcessRecords, 0, numProcessesReRanked, + LAST_ACTIVITY_TIME_COMPARATOR); addToScore(scoredProcessRecords, lruWeight); } if (rssWeight > 0.0f) { - synchronized (mService.mAppProfiler.mProfilerLock) { - Arrays.sort(scoredProcessRecords, LAST_RSS_COMPARATOR); + if (useFrequentRss) { + Arrays.sort(scoredProcessRecords, 0, numProcessesReRanked, RSS_COMPARATOR); + } else { + synchronized (mService.mAppProfiler.mProfilerLock) { + Arrays.sort(scoredProcessRecords, 0, numProcessesReRanked, LAST_RSS_COMPARATOR); + } } addToScore(scoredProcessRecords, rssWeight); } if (usesWeight > 0.0f) { - Arrays.sort(scoredProcessRecords, CACHE_USE_COMPARATOR); + Arrays.sort(scoredProcessRecords, 0, numProcessesReRanked, CACHE_USE_COMPARATOR); addToScore(scoredProcessRecords, usesWeight); } // Re-rank by the new combined score. - Arrays.sort(scoredProcessRecords, SCORED_PROCESS_RECORD_COMPARATOR); + Arrays.sort(scoredProcessRecords, 0, numProcessesReRanked, + SCORED_PROCESS_RECORD_COMPARATOR); if (ActivityManagerDebugConfig.DEBUG_OOM_ADJ) { boolean printedHeader = false; - for (int i = 0; i < scoredProcessRecords.length; ++i) { + for (int i = 0; i < numProcessesReRanked; ++i) { if (scoredProcessRecords[i].proc.getPid() != lruList.get(lruPositions[i]).getPid()) { if (!printedHeader) { @@ -260,12 +410,18 @@ public class CacheOomRanker { } } - for (int i = 0; i < scoredProcessRecords.length; ++i) { + for (int i = 0; i < numProcessesReRanked; ++i) { lruList.set(lruPositions[i], scoredProcessRecords[i].proc); scoredProcessRecords[i].proc = null; } } + private static boolean appCanBeReRanked(ProcessRecord process) { + return !process.isKilledByAm() + && process.getThread() != null + && process.mState.getCurAdj() >= ProcessList.UNKNOWN_ADJ; + } + private static void addToScore(RankedProcessRecord[] scores, float weight) { for (int i = 1; i < scores.length; ++i) { scores[i].score += i * weight; @@ -305,6 +461,16 @@ public class CacheOomRanker { } } + private static class RssComparator implements Comparator<RankedProcessRecord> { + @Override + public int compare(RankedProcessRecord o1, RankedProcessRecord o2) { + // High RSS first to match least recently used. + return Long.compare( + o2.proc.mState.getCacheOomRankerRss(), + o1.proc.mState.getCacheOomRankerRss()); + } + } + private static class LastRssComparator implements Comparator<RankedProcessRecord> { @Override public int compare(RankedProcessRecord o1, RankedProcessRecord o2) { @@ -317,4 +483,18 @@ public class CacheOomRanker { public ProcessRecord proc; public float score; } + + /** + * Interface for mocking {@link Process} static methods. + */ + interface ProcessDependencies { + long[] getRss(int pid); + } + + private static class ProcessDependenciesImpl implements ProcessDependencies { + @Override + public long[] getRss(int pid) { + return Process.getRss(pid); + } + } } diff --git a/services/core/java/com/android/server/am/ProcessStateRecord.java b/services/core/java/com/android/server/am/ProcessStateRecord.java index d4474d663769..206dd889fb70 100644 --- a/services/core/java/com/android/server/am/ProcessStateRecord.java +++ b/services/core/java/com/android/server/am/ProcessStateRecord.java @@ -343,6 +343,20 @@ final class ProcessStateRecord { private int mCacheOomRankerUseCount; /** + * Process memory usage (RSS). + * + * Periodically populated by {@code CacheOomRanker}, stored in this object to cache the values. + */ + @GuardedBy("mService") + private long mCacheOomRankerRss; + + /** + * The last time, in milliseconds since boot, since {@link #mCacheOomRankerRss} was updated. + */ + @GuardedBy("mService") + private long mCacheOomRankerRssTimeMs; + + /** * Whether or not this process is reachable from given process. */ @GuardedBy("mService") @@ -577,6 +591,10 @@ final class ProcessStateRecord { @GuardedBy({"mService", "mProcLock"}) void setSetProcState(int setProcState) { + if (ActivityManager.isProcStateCached(mSetProcState) + && !ActivityManager.isProcStateCached(setProcState)) { + mCacheOomRankerUseCount++; + } mSetProcState = setProcState; } @@ -840,12 +858,7 @@ final class ProcessStateRecord { @GuardedBy("mService") void setCached(boolean cached) { - if (mCached != cached) { - mCached = cached; - if (cached) { - ++mCacheOomRankerUseCount; - } - } + mCached = cached; } @GuardedBy("mService") @@ -1151,6 +1164,21 @@ final class ProcessStateRecord { return mLastInvisibleTime; } + public void setCacheOomRankerRss(long rss, long rssTimeMs) { + mCacheOomRankerRss = rss; + mCacheOomRankerRssTimeMs = rssTimeMs; + } + + @GuardedBy("mService") + public long getCacheOomRankerRss() { + return mCacheOomRankerRss; + } + + @GuardedBy("mService") + public long getCacheOomRankerRssTimeMs() { + return mCacheOomRankerRssTimeMs; + } + @GuardedBy({"mService", "mProcLock"}) void dump(PrintWriter pw, String prefix, long nowUptime) { if (mReportedInteraction || mFgInteractionTime != 0) { diff --git a/services/core/java/com/android/server/apphibernation/AppHibernationService.java b/services/core/java/com/android/server/apphibernation/AppHibernationService.java index db2ecc54dbfe..19dcee4828dd 100644 --- a/services/core/java/com/android/server/apphibernation/AppHibernationService.java +++ b/services/core/java/com/android/server/apphibernation/AppHibernationService.java @@ -696,7 +696,7 @@ public final class AppHibernationService extends SystemService { idpw.print("User Level Hibernation States, "); idpw.printPair("user", userId); idpw.println(); - Map<String, UserLevelState> stateMap = mUserStates.get(i); + Map<String, UserLevelState> stateMap = mUserStates.get(userId); idpw.increaseIndent(); for (UserLevelState state : stateMap.values()) { idpw.print(state); diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index abbe13ac260f..1063481d6788 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -721,13 +721,13 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call final IBinder token = device.getDisplayTokenLocked(); final DisplayDeviceInfo info = device.getDisplayDeviceInfoLocked(); mHandler.post(() -> { - if (mDisplayDevice == device) { - return; + if (mDisplayDevice != device) { + mDisplayDevice = device; + mUniqueDisplayId = uniqueId; + mDisplayDeviceConfig = config; + loadFromDisplayDeviceConfig(token, info); + updatePowerState(); } - mDisplayDevice = device; - mUniqueDisplayId = uniqueId; - mDisplayDeviceConfig = config; - loadFromDisplayDeviceConfig(token, info); }); } diff --git a/services/core/java/com/android/server/display/LogicalDisplayMapper.java b/services/core/java/com/android/server/display/LogicalDisplayMapper.java index 973dcc4c79e5..0fbc3e8fb89a 100644 --- a/services/core/java/com/android/server/display/LogicalDisplayMapper.java +++ b/services/core/java/com/android/server/display/LogicalDisplayMapper.java @@ -22,6 +22,8 @@ import android.hardware.devicestate.DeviceStateManager; import android.os.Handler; import android.os.Looper; import android.os.Message; +import android.os.PowerManager; +import android.os.SystemClock; import android.os.SystemProperties; import android.text.TextUtils; import android.util.ArraySet; @@ -69,7 +71,7 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { public static final int DISPLAY_GROUP_EVENT_CHANGED = 2; public static final int DISPLAY_GROUP_EVENT_REMOVED = 3; - private static final int TIMEOUT_STATE_TRANSITION_MILLIS = 500; + private static final int TIMEOUT_STATE_TRANSITION_MILLIS = 300; private static final int MSG_TRANSITION_TO_PENDING_DEVICE_STATE = 1; @@ -98,6 +100,11 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { private final boolean mSupportsConcurrentInternalDisplays; /** + * Wake the device when transitioning into this device state. + */ + private final int mDeviceStateOnWhichToWakeUp; + + /** * Map of all logical displays indexed by logical display id. * Any modification to mLogicalDisplays must invalidate the DisplayManagerGlobal cache. * TODO: multi-display - Move the aforementioned comment? @@ -113,6 +120,7 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { private final Listener mListener; private final DisplayManagerService.SyncRoot mSyncRoot; private final LogicalDisplayMapperHandler mHandler; + private final PowerManager mPowerManager; /** * Has an entry for every logical display that the rest of the system has been notified about. @@ -150,12 +158,15 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { @NonNull Listener listener, @NonNull DisplayManagerService.SyncRoot syncRoot, @NonNull Handler handler) { mSyncRoot = syncRoot; + mPowerManager = context.getSystemService(PowerManager.class); mHandler = new LogicalDisplayMapperHandler(handler.getLooper()); mDisplayDeviceRepo = repo; mListener = listener; mSingleDisplayDemoMode = SystemProperties.getBoolean("persist.demo.singledisplay", false); mSupportsConcurrentInternalDisplays = context.getResources().getBoolean( com.android.internal.R.bool.config_supportsConcurrentInternalDisplays); + mDeviceStateOnWhichToWakeUp = context.getResources().getInteger( + com.android.internal.R.integer.config_deviceStateOnWhichToWakeUp); mDisplayDeviceRepo.addListener(this); mDeviceStateToLayoutMap = new DeviceStateToLayoutMap(); } @@ -318,6 +329,7 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { ipw.println("mSingleDisplayDemoMode=" + mSingleDisplayDemoMode); ipw.println("mCurrentLayout=" + mCurrentLayout); + ipw.println("mDeviceStateOnWhichToWakeUp=" + mDeviceStateOnWhichToWakeUp); final int logicalDisplayCount = mLogicalDisplays.size(); ipw.println(); @@ -335,7 +347,9 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { } void setDeviceStateLocked(int state) { - Slog.i(TAG, "Requesting Transition to state: " + state); + final boolean isInteractive = mPowerManager.isInteractive(); + Slog.i(TAG, "Requesting Transition to state: " + state + ", from state=" + mDeviceState + + ", interactive=" + isInteractive); // As part of a state transition, we may need to turn off some displays temporarily so that // the transition is smooth. Plus, on some devices, only one internal displays can be // on at a time. We use DISPLAY_PHASE_LAYOUT_TRANSITION to mark a display that needs to be @@ -344,8 +358,13 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { resetLayoutLocked(mDeviceState, state, LogicalDisplay.DISPLAY_PHASE_LAYOUT_TRANSITION); } mPendingDeviceState = state; - if (areAllTransitioningDisplaysOffLocked()) { - // Nothing to wait on, we're good to go + final boolean wakeDevice = mPendingDeviceState == mDeviceStateOnWhichToWakeUp + && !isInteractive; + + // If all displays are off already, we can just transition here, unless the device is asleep + // and we plan on waking it up. In that case, fall through to the call to wakeUp, and defer + // the final transition until later once the device is awake. + if (areAllTransitioningDisplaysOffLocked() && !wakeDevice) { transitionToPendingStateLocked(); return; } @@ -356,6 +375,14 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { // Send the transitioning phase updates to DisplayManager so that the displays can // start turning OFF in preparation for the new layout. updateLogicalDisplaysLocked(); + + if (wakeDevice) { + // We already told the displays to turn off, now we need to wake the device as + // we transition to this new state. We do it here so that the waking happens between the + // transition from one layout to another. + mPowerManager.wakeUp(SystemClock.uptimeMillis(), PowerManager.WAKE_REASON_UNFOLD_DEVICE, + "server.display:unfold"); + } mHandler.sendEmptyMessageDelayed(MSG_TRANSITION_TO_PENDING_DEVICE_STATE, TIMEOUT_STATE_TRANSITION_MILLIS); } @@ -482,6 +509,7 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { assignDisplayGroupLocked(display); mLogicalDisplaysToUpdate.put(displayId, LOGICAL_DISPLAY_EVENT_CHANGED); + // The display is involved in a display layout transition } else if (updateState == UPDATE_STATE_TRANSITION) { mLogicalDisplaysToUpdate.put(displayId, LOGICAL_DISPLAY_EVENT_DEVICE_STATE_TRANSITION); @@ -672,14 +700,14 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { // We consider a display-device as changing/transition if // 1) It's already marked as transitioning - // 2) It's going from enabled to disabled + // 2) It's going from enabled to disabled, or vice versa // 3) It's enabled, but it's mapped to a new logical display ID. To the user this // would look like apps moving from one screen to another since task-stacks stay // with the logical display [ID]. final boolean isTransitioning = (logicalDisplay.getPhase() == LogicalDisplay.DISPLAY_PHASE_LAYOUT_TRANSITION) - || (wasEnabled && !willBeEnabled) - || (wasEnabled && deviceHasNewLogicalDisplayId); + || (wasEnabled != willBeEnabled) + || deviceHasNewLogicalDisplayId; if (isTransitioning) { setDisplayPhase(logicalDisplay, phase); diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index c45b661f06fb..19a968628248 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -3790,8 +3790,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A ProtoLog.v(WM_DEBUG_APP_TRANSITIONS, "Removing app token: %s", this); - commitVisibility(false /* visible */, true /* performLayout */); - getDisplayContent().mOpeningApps.remove(this); getDisplayContent().mUnknownAppVisibilityController.appRemovedOrHidden(this); mWmService.mTaskSnapshotController.onAppRemoved(this); @@ -3799,8 +3797,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A mTaskSupervisor.mStoppingActivities.remove(this); waitingToShow = false; - // TODO(b/169035022): move to a more-appropriate place. - mAtmService.getTransitionController().collect(this); // Defer removal of this activity when either a child is animating, or app transition is on // going. App transition animation might be applied on the parent task not on the activity, // but the actual frame buffer is associated with the activity, so we have to keep the @@ -3816,6 +3812,16 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A delayed = true; } + // Don't commit visibility if it is waiting to animate. It will be set post animation. + if (!delayed) { + commitVisibility(false /* visible */, true /* performLayout */); + } else { + setVisibleRequested(false /* visible */); + } + + // TODO(b/169035022): move to a more-appropriate place. + mAtmService.getTransitionController().collect(this); + ProtoLog.v(WM_DEBUG_APP_TRANSITIONS, "Removing app %s delayed=%b animation=%s animating=%b", this, delayed, getAnimation(), @@ -4972,7 +4978,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A private void postApplyAnimation(boolean visible) { final boolean usingShellTransitions = mAtmService.getTransitionController().getTransitionPlayer() != null; - final boolean delayed = isAnimating(PARENTS | CHILDREN, + final boolean delayed = isAnimating(TRANSITION | PARENTS | CHILDREN, ANIMATION_TYPE_APP_TRANSITION | ANIMATION_TYPE_WINDOW_ANIMATION | ANIMATION_TYPE_RECENTS); if (!delayed && !usingShellTransitions) { @@ -5943,6 +5949,9 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } void startFreezingScreen(int overrideOriginalDisplayRotation) { + if (mAtmService.getTransitionController().isShellTransitionsEnabled()) { + return; + } ProtoLog.i(WM_DEBUG_ORIENTATION, "Set freezing of %s: visible=%b freezing=%b visibleRequested=%b. %s", appToken, isVisible(), mFreezingScreen, mVisibleRequested, @@ -6909,7 +6918,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A @Override void prepareSurfaces() { - final boolean show = isVisible() || isAnimating(PARENTS, + final boolean show = isVisible() || isAnimating(TRANSITION | PARENTS, ANIMATION_TYPE_APP_TRANSITION | ANIMATION_TYPE_RECENTS); if (mSurfaceControl != null) { @@ -8443,9 +8452,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A if (shouldRelaunchLocked(changes, mTmpConfig) || forceNewConfig) { // Aha, the activity isn't handling the change, so DIE DIE DIE. configChangeFlags |= changes; - if (!mAtmService.getTransitionController().isShellTransitionsEnabled()) { - startFreezingScreenLocked(globalChanges); - } + startFreezingScreenLocked(globalChanges); forceNewConfig = false; // Do not preserve window if it is freezing screen because the original window won't be // able to update drawn state that causes freeze timeout. diff --git a/services/core/java/com/android/server/wm/AnimationAdapter.java b/services/core/java/com/android/server/wm/AnimationAdapter.java index 529c4f608743..486328a758da 100644 --- a/services/core/java/com/android/server/wm/AnimationAdapter.java +++ b/services/core/java/com/android/server/wm/AnimationAdapter.java @@ -16,6 +16,7 @@ package com.android.server.wm; +import android.annotation.ColorInt; import android.util.proto.ProtoOutputStream; import android.view.SurfaceControl; import android.view.SurfaceControl.Transaction; @@ -106,4 +107,14 @@ interface AnimationAdapter { default boolean shouldDeferAnimationFinish(Runnable endDeferFinishCallback) { return false; } + + /** + * Gets the background color to show behind an animation. + * + * @return The background color to show behind an animation (0 for no background color). + */ + @ColorInt + default int getBackgroundColor() { + return 0; + } } diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 63f6387c87ae..f800f0e395de 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -76,6 +76,7 @@ import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG; import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ERROR; import static android.view.WindowManager.LayoutParams.TYPE_TOAST; import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER; +import static android.view.WindowManager.TRANSIT_CHANGE; import static android.view.WindowManager.TRANSIT_OPEN; import static android.view.WindowManager.TRANSIT_TO_FRONT; import static android.window.DisplayAreaOrganizer.FEATURE_ROOT; @@ -1389,11 +1390,16 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp final Configuration currentDisplayConfig = getConfiguration(); mTmpConfiguration.setTo(currentDisplayConfig); computeScreenConfiguration(mTmpConfiguration); - configChanged |= currentDisplayConfig.diff(mTmpConfiguration) != 0; + final int changes = currentDisplayConfig.diff(mTmpConfiguration); + configChanged |= changes != 0; if (configChanged) { mWaitingForConfig = true; - mWmService.startFreezingDisplay(0 /* exitAnim */, 0 /* enterAnim */, this); + if (mAtmService.getTransitionController().isShellTransitionsEnabled()) { + requestChangeTransitionIfNeeded(changes); + } else { + mWmService.startFreezingDisplay(0 /* exitAnim */, 0 /* enterAnim */, this); + } sendNewConfiguration(); } @@ -3165,6 +3171,24 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp return mScreenRotationAnimation; } + /** + * Requests to start a transition for the display configuration change. The given changes must + * be non-zero. This method is no-op if the display has been collected. + */ + void requestChangeTransitionIfNeeded(@ActivityInfo.Config int changes) { + final TransitionController controller = mAtmService.getTransitionController(); + if (controller.isCollecting()) { + if (!controller.isCollecting(this)) { + controller.collect(this); + } + return; + } + final Transition t = controller.requestTransitionIfNeeded(TRANSIT_CHANGE, this); + if (t != null) { + t.setKnownConfigChanges(this, changes); + } + } + /** If the display is in transition, there should be a screenshot covering it. */ @Override boolean inTransition() { @@ -5724,6 +5748,9 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } mWmService.mDisplayNotificationController.dispatchDisplayChanged( this, getConfiguration()); + if (isReady() && mAtmService.getTransitionController().isShellTransitionsEnabled()) { + requestChangeTransitionIfNeeded(changes); + } } return changes; } diff --git a/services/core/java/com/android/server/wm/DisplayRotation.java b/services/core/java/com/android/server/wm/DisplayRotation.java index c9db14de507c..971bebd8c486 100644 --- a/services/core/java/com/android/server/wm/DisplayRotation.java +++ b/services/core/java/com/android/server/wm/DisplayRotation.java @@ -22,7 +22,6 @@ import static android.view.WindowManager.LayoutParams.ROTATION_ANIMATION_CROSSFA import static android.view.WindowManager.LayoutParams.ROTATION_ANIMATION_JUMPCUT; import static android.view.WindowManager.LayoutParams.ROTATION_ANIMATION_ROTATE; import static android.view.WindowManager.LayoutParams.ROTATION_ANIMATION_SEAMLESS; -import static android.view.WindowManager.TRANSIT_CHANGE; import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ORIENTATION; import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.LID_OPEN; @@ -492,12 +491,6 @@ public class DisplayRotation { recentsAnimationController.cancelAnimationForDisplayChange(); } - final Transition t = (useShellTransitions - && !mService.mAtmService.getTransitionController().isCollecting()) - ? mService.mAtmService.getTransitionController().createTransition(TRANSIT_CHANGE) - : null; - mService.mAtmService.getTransitionController().collect(mDisplayContent); - ProtoLog.v(WM_DEBUG_ORIENTATION, "Display id=%d rotation changed to %d from %d, lastOrientation=%d", displayId, rotation, oldRotation, lastOrientation); @@ -511,11 +504,10 @@ public class DisplayRotation { mDisplayContent.setLayoutNeeded(); if (useShellTransitions) { - if (t != null) { - // This created its own transition, so send a start request. - mService.mAtmService.getTransitionController().requestStartTransition( - t, null /* trigger */, null /* remote */); - } else { + final boolean wasInTransition = mDisplayContent.inTransition(); + mDisplayContent.requestChangeTransitionIfNeeded( + ActivityInfo.CONFIG_WINDOW_CONFIGURATION); + if (wasInTransition) { // Use remote-rotation infra since the transition has already been requested // TODO(shell-transitions): Remove this once lifecycle management can cover all // rotation cases. diff --git a/services/core/java/com/android/server/wm/DragDropController.java b/services/core/java/com/android/server/wm/DragDropController.java index d12d07ab7448..cc6a8807bb9d 100644 --- a/services/core/java/com/android/server/wm/DragDropController.java +++ b/services/core/java/com/android/server/wm/DragDropController.java @@ -22,6 +22,7 @@ import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import android.annotation.NonNull; import android.content.ClipData; +import android.content.Context; import android.os.Binder; import android.os.Handler; import android.os.IBinder; @@ -32,6 +33,7 @@ import android.view.Display; import android.view.IWindow; import android.view.SurfaceControl; import android.view.View; +import android.view.accessibility.AccessibilityManager; import com.android.server.wm.WindowManagerInternal.IDragDropCallback; @@ -43,7 +45,8 @@ import java.util.concurrent.atomic.AtomicReference; */ class DragDropController { private static final float DRAG_SHADOW_ALPHA_TRANSPARENT = .7071f; - private static final long DRAG_TIMEOUT_MS = 5000; + static final long DRAG_TIMEOUT_MS = 5000; + private static final int A11Y_DRAG_TIMEOUT_DEFAULT_MS = 60000; // Messages for Handler. static final int MSG_DRAG_END_TIMEOUT = 0; @@ -151,36 +154,48 @@ class DragDropController { mDragState.mOriginalAlpha = alpha; mDragState.mToken = dragToken; mDragState.mDisplayContent = displayContent; + mDragState.mData = data; - final Display display = displayContent.getDisplay(); - if (!mCallback.get().registerInputChannel( - mDragState, display, mService.mInputManager, - callingWin.mInputChannel)) { - Slog.e(TAG_WM, "Unable to transfer touch focus"); - return null; - } + if ((flags & View.DRAG_FLAG_ACCESSIBILITY_ACTION) == 0) { + final Display display = displayContent.getDisplay(); + if (!mCallback.get().registerInputChannel( + mDragState, display, mService.mInputManager, + callingWin.mInputChannel)) { + Slog.e(TAG_WM, "Unable to transfer touch focus"); + return null; + } - final SurfaceControl surfaceControl = mDragState.mSurfaceControl; - mDragState.mData = data; - mDragState.broadcastDragStartedLocked(touchX, touchY); - mDragState.overridePointerIconLocked(touchSource); - // remember the thumb offsets for later - mDragState.mThumbOffsetX = thumbCenterX; - mDragState.mThumbOffsetY = thumbCenterY; - - // Make the surface visible at the proper location - if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG_WM, ">>> OPEN TRANSACTION performDrag"); - - final SurfaceControl.Transaction transaction = mDragState.mTransaction; - transaction.setAlpha(surfaceControl, mDragState.mOriginalAlpha); - transaction.setPosition( - surfaceControl, touchX - thumbCenterX, touchY - thumbCenterY); - transaction.show(surfaceControl); - displayContent.reparentToOverlay(transaction, surfaceControl); - callingWin.scheduleAnimation(); - - if (SHOW_LIGHT_TRANSACTIONS) { - Slog.i(TAG_WM, "<<< CLOSE TRANSACTION performDrag"); + final SurfaceControl surfaceControl = mDragState.mSurfaceControl; + mDragState.broadcastDragStartedLocked(touchX, touchY); + mDragState.overridePointerIconLocked(touchSource); + // remember the thumb offsets for later + mDragState.mThumbOffsetX = thumbCenterX; + mDragState.mThumbOffsetY = thumbCenterY; + + // Make the surface visible at the proper location + if (SHOW_LIGHT_TRANSACTIONS) { + Slog.i(TAG_WM, ">>> OPEN TRANSACTION performDrag"); + } + + final SurfaceControl.Transaction transaction = mDragState.mTransaction; + transaction.setAlpha(surfaceControl, mDragState.mOriginalAlpha); + transaction.setPosition( + surfaceControl, touchX - thumbCenterX, touchY - thumbCenterY); + transaction.show(surfaceControl); + displayContent.reparentToOverlay(transaction, surfaceControl); + callingWin.scheduleAnimation(); + if (SHOW_LIGHT_TRANSACTIONS) { + Slog.i(TAG_WM, "<<< CLOSE TRANSACTION performDrag"); + } + } else { + // Skip surface logic for a drag triggered by an AccessibilityAction + mDragState.broadcastDragStartedLocked(touchX, touchY); + + // Timeout for the user to drop the content + sendTimeoutMessage(MSG_DRAG_END_TIMEOUT, callingWin.mClient.asBinder(), + getAccessibilityManager().getRecommendedTimeoutMillis( + A11Y_DRAG_TIMEOUT_DEFAULT_MS, + AccessibilityManager.FLAG_CONTENT_CONTROLS)); } } finally { if (surface != null) { @@ -309,10 +324,10 @@ class DragDropController { /** * Sends a timeout message to the Handler managed by DragDropController. */ - void sendTimeoutMessage(int what, Object arg) { + void sendTimeoutMessage(int what, Object arg, long timeoutMs) { mHandler.removeMessages(what, arg); final Message msg = mHandler.obtainMessage(what, arg); - mHandler.sendMessageDelayed(msg, DRAG_TIMEOUT_MS); + mHandler.sendMessageDelayed(msg, timeoutMs); } /** @@ -332,6 +347,30 @@ class DragDropController { } } + boolean dropForAccessibility(IWindow window, float x, float y) { + synchronized (mService.mGlobalLock) { + final boolean isA11yEnabled = getAccessibilityManager().isEnabled(); + if (!dragDropActiveLocked()) { + return false; + } + if (mDragState.isAccessibilityDragDrop() && isA11yEnabled) { + final WindowState winState = mService.windowForClientLocked( + null, window, false); + if (!mDragState.isWindowNotified(winState)) { + return false; + } + IBinder token = winState.mInputChannelToken; + return mDragState.reportDropWindowLock(token, x, y); + } + return false; + } + } + + AccessibilityManager getAccessibilityManager() { + return (AccessibilityManager) mService.mContext.getSystemService( + Context.ACCESSIBILITY_SERVICE); + } + private class DragHandler extends Handler { /** * Lock for window manager. diff --git a/services/core/java/com/android/server/wm/DragState.java b/services/core/java/com/android/server/wm/DragState.java index aa257f847e25..4fc123d3f68a 100644 --- a/services/core/java/com/android/server/wm/DragState.java +++ b/services/core/java/com/android/server/wm/DragState.java @@ -253,7 +253,7 @@ class DragState { mTransaction.reparent(mSurfaceControl, null).apply(); } else { mDragDropController.sendTimeoutMessage(MSG_REMOVE_DRAG_SURFACE_TIMEOUT, - mSurfaceControl); + mSurfaceControl, DragDropController.DRAG_TIMEOUT_MS); } mSurfaceControl = null; } @@ -276,9 +276,9 @@ class DragState { * Notify the drop target and tells it about the data. If the drop event is not sent to the * target, invokes {@code endDragLocked} immediately. */ - void reportDropWindowLock(IBinder token, float x, float y) { + boolean reportDropWindowLock(IBinder token, float x, float y) { if (mAnimator != null) { - return; + return false; } final WindowState touchedWin = mService.mInputToWindowMap.get(token); @@ -288,7 +288,7 @@ class DragState { mDragResult = false; endDragLocked(); if (DEBUG_DRAG) Slog.d(TAG_WM, "Drop outside a valid window " + touchedWin); - return; + return false; } if (DEBUG_DRAG) Slog.d(TAG_WM, "sending DROP to " + touchedWin); @@ -322,16 +322,19 @@ class DragState { touchedWin.mClient.dispatchDragEvent(event); // 5 second timeout for this window to respond to the drop - mDragDropController.sendTimeoutMessage(MSG_DRAG_END_TIMEOUT, clientToken); + mDragDropController.sendTimeoutMessage(MSG_DRAG_END_TIMEOUT, clientToken, + DragDropController.DRAG_TIMEOUT_MS); } catch (RemoteException e) { Slog.w(TAG_WM, "can't send drop notification to win " + touchedWin); endDragLocked(); + return false; } finally { if (myPid != touchedWin.mSession.mPid) { event.recycle(); } } mToken = clientToken; + return true; } class InputInterceptor { @@ -553,7 +556,7 @@ class DragState { } } - private boolean isWindowNotified(WindowState newWin) { + boolean isWindowNotified(WindowState newWin) { for (WindowState ws : mNotifiedWindows) { if (ws == newWin) { return true; @@ -567,8 +570,10 @@ class DragState { return; } if (!mDragResult) { - mAnimator = createReturnAnimationLocked(); - return; // Will call closeLocked() when the animation is done. + if (!isAccessibilityDragDrop()) { + mAnimator = createReturnAnimationLocked(); + return; // Will call closeLocked() when the animation is done. + } } closeLocked(); } @@ -577,7 +582,7 @@ class DragState { if (mAnimator != null) { return; } - if (!mDragInProgress || skipAnimation) { + if (!mDragInProgress || skipAnimation || isAccessibilityDragDrop()) { // mDragInProgress is false if an app invokes Session#cancelDragAndDrop before // Session#performDrag. Reset the drag state without playing the cancel animation // because H.DRAG_START_TIMEOUT may be sent to WindowManagerService, which will cause @@ -722,4 +727,8 @@ class DragState { mDragDropController.sendHandlerMessage(MSG_ANIMATION_END, null); } } + + boolean isAccessibilityDragDrop() { + return (mFlags & View.DRAG_FLAG_ACCESSIBILITY_ACTION) != 0; + } } diff --git a/services/core/java/com/android/server/wm/LetterboxConfiguration.java b/services/core/java/com/android/server/wm/LetterboxConfiguration.java index 76a098d131fe..72fbfcc2959e 100644 --- a/services/core/java/com/android/server/wm/LetterboxConfiguration.java +++ b/services/core/java/com/android/server/wm/LetterboxConfiguration.java @@ -174,7 +174,7 @@ final class LetterboxConfiguration { * Whether corners of letterboxed activities are rounded. */ boolean isLetterboxActivityCornersRounded() { - return getLetterboxActivityCornersRadius() > 0; + return getLetterboxActivityCornersRadius() != 0; } /** diff --git a/services/core/java/com/android/server/wm/LetterboxUiController.java b/services/core/java/com/android/server/wm/LetterboxUiController.java index 0d99bacff33d..cf2afc93c419 100644 --- a/services/core/java/com/android/server/wm/LetterboxUiController.java +++ b/services/core/java/com/android/server/wm/LetterboxUiController.java @@ -38,6 +38,9 @@ import android.graphics.Color; import android.graphics.Point; import android.graphics.Rect; import android.util.Slog; +import android.view.InsetsSource; +import android.view.InsetsState; +import android.view.RoundedCorner; import android.view.SurfaceControl; import android.view.SurfaceControl.Transaction; import android.view.WindowManager; @@ -295,21 +298,57 @@ final class LetterboxUiController { } private void updateRoundedCorners(WindowState mainWindow) { - int cornersRadius = - // Don't round corners if letterboxed only for display cutout. - shouldShowLetterboxUi(mainWindow) - && !mainWindow.isLetterboxedForDisplayCutout() - ? Math.max(0, mLetterboxConfiguration.getLetterboxActivityCornersRadius()) - : 0; - setCornersRadius(mainWindow, cornersRadius); - } - - private void setCornersRadius(WindowState mainWindow, int cornersRadius) { final SurfaceControl windowSurface = mainWindow.getClientViewRootSurface(); if (windowSurface != null && windowSurface.isValid()) { Transaction transaction = mActivityRecord.getSyncTransaction(); - transaction.setCornerRadius(windowSurface, cornersRadius); + + if (!isLetterboxedNotForDisplayCutout(mainWindow) + || !mLetterboxConfiguration.isLetterboxActivityCornersRounded()) { + transaction + .setWindowCrop(windowSurface, null) + .setCornerRadius(windowSurface, 0); + return; + } + + final InsetsState insetsState = mainWindow.getInsetsState(); + final InsetsSource taskbarInsetsSource = + insetsState.getSource(InsetsState.ITYPE_EXTRA_NAVIGATION_BAR); + + Rect cropBounds = new Rect(mActivityRecord.getBounds()); + // Activity bounds are in screen coordinates while (0,0) for activity's surface control + // is at the top left corner of an app window so offsetting bounds accordingly. + cropBounds.offsetTo(0, 0); + // Rounded cornerners should be displayed above the taskbar. + cropBounds.bottom = Math.min(cropBounds.bottom, taskbarInsetsSource.getFrame().top); + transaction + .setWindowCrop(windowSurface, cropBounds) + .setCornerRadius(windowSurface, getRoundedCorners(insetsState)); + } + } + + // Returns rounded corners radius based on override in + // R.integer.config_letterboxActivityCornersRadius or min device bottom corner radii. + // Device corners can be different on the right and left sides but we use the same radius + // for all corners for consistency and pick a minimal bottom one for consistency with a + // taskbar rounded corners. + private int getRoundedCorners(InsetsState insetsState) { + if (mLetterboxConfiguration.getLetterboxActivityCornersRadius() >= 0) { + return mLetterboxConfiguration.getLetterboxActivityCornersRadius(); } + return Math.min( + getInsetsStateCornerRadius(insetsState, RoundedCorner.POSITION_BOTTOM_LEFT), + getInsetsStateCornerRadius(insetsState, RoundedCorner.POSITION_BOTTOM_RIGHT)); + } + + private int getInsetsStateCornerRadius( + InsetsState insetsState, @RoundedCorner.Position int position) { + RoundedCorner corner = insetsState.getRoundedCorners().getRoundedCorner(position); + return corner == null ? 0 : corner.getRadius(); + } + + private boolean isLetterboxedNotForDisplayCutout(WindowState mainWindow) { + return shouldShowLetterboxUi(mainWindow) + && !mainWindow.isLetterboxedForDisplayCutout(); } private void updateWallpaperForLetterbox(WindowState mainWindow) { @@ -317,9 +356,8 @@ final class LetterboxUiController { mLetterboxConfiguration.getLetterboxBackgroundType(); boolean wallpaperShouldBeShown = letterboxBackgroundType == LETTERBOX_BACKGROUND_WALLPAPER - && shouldShowLetterboxUi(mainWindow) // Don't use wallpaper as a background if letterboxed for display cutout. - && !mainWindow.isLetterboxedForDisplayCutout() + && isLetterboxedNotForDisplayCutout(mainWindow) // Check that dark scrim alpha or blur radius are provided && (getLetterboxWallpaperBlurRadius() > 0 || getLetterboxWallpaperDarkScrimAlpha() > 0) @@ -375,6 +413,8 @@ final class LetterboxUiController { pw.println(prefix + " letterboxBackgroundType=" + letterboxBackgroundTypeToString( mLetterboxConfiguration.getLetterboxBackgroundType())); + pw.println(prefix + " letterboxCornerRadius=" + + getRoundedCorners(mainWin.getInsetsState())); if (mLetterboxConfiguration.getLetterboxBackgroundType() == LETTERBOX_BACKGROUND_WALLPAPER) { pw.println(prefix + " isLetterboxWallpaperBlurSupported=" diff --git a/services/core/java/com/android/server/wm/LocalAnimationAdapter.java b/services/core/java/com/android/server/wm/LocalAnimationAdapter.java index 520bd8b2108e..8f161bf6ecc4 100644 --- a/services/core/java/com/android/server/wm/LocalAnimationAdapter.java +++ b/services/core/java/com/android/server/wm/LocalAnimationAdapter.java @@ -19,6 +19,7 @@ package com.android.server.wm; import static com.android.server.wm.AnimationAdapterProto.LOCAL; import static com.android.server.wm.LocalAnimationAdapterProto.ANIMATION_SPEC; +import android.annotation.ColorInt; import android.os.SystemClock; import android.util.proto.ProtoOutputStream; import android.view.SurfaceControl; @@ -72,6 +73,12 @@ class LocalAnimationAdapter implements AnimationAdapter { } @Override + @ColorInt + public int getBackgroundColor() { + return mSpec.getBackgroundColor(); + } + + @Override public void dump(PrintWriter pw, String prefix) { mSpec.dump(pw, prefix); } @@ -149,5 +156,9 @@ class LocalAnimationAdapter implements AnimationAdapter { } void dumpDebugInner(ProtoOutputStream proto); + + default int getBackgroundColor() { + return 0; + } } } diff --git a/services/core/java/com/android/server/wm/Session.java b/services/core/java/com/android/server/wm/Session.java index 0b5677724fc3..8c056b2a43b3 100644 --- a/services/core/java/com/android/server/wm/Session.java +++ b/services/core/java/com/android/server/wm/Session.java @@ -299,6 +299,17 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient { } } + + @Override + public boolean dropForAccessibility(IWindow window, int x, int y) { + final long ident = Binder.clearCallingIdentity(); + try { + return mDragDropController.dropForAccessibility(window, x, y); + } finally { + Binder.restoreCallingIdentity(ident); + } + } + /** * Validates the given drag data. */ diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java index 1a46d0f9a877..1909875565f6 100644 --- a/services/core/java/com/android/server/wm/Transition.java +++ b/services/core/java/com/android/server/wm/Transition.java @@ -58,6 +58,7 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManager; +import android.content.pm.ActivityInfo; import android.graphics.Point; import android.graphics.Rect; import android.os.Binder; @@ -269,6 +270,18 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe mChanges.get(wc).mExistenceChanged = true; } + /** + * Specifies configuration change explicitly for the window container, so it can be chosen as + * transition target. This is usually used with transition mode + * {@link android.view.WindowManager#TRANSIT_CHANGE}. + */ + void setKnownConfigChanges(WindowContainer<?> wc, @ActivityInfo.Config int changes) { + final ChangeInfo changeInfo = mChanges.get(wc); + if (changeInfo != null) { + changeInfo.mKnownConfigChanges = changes; + } + } + private void sendRemoteCallback(@Nullable IRemoteCallback callback) { if (callback == null) return; mController.mAtm.mH.sendMessage(PooledLambda.obtainMessage(cb -> { @@ -1218,6 +1231,7 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe final Rect mAbsoluteBounds = new Rect(); boolean mShowWallpaper; int mRotation = ROTATION_UNDEFINED; + @ActivityInfo.Config int mKnownConfigChanges; ChangeInfo(@NonNull WindowContainer origState) { mVisible = origState.isVisibleRequested(); @@ -1240,6 +1254,7 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe final boolean currVisible = newState.isVisibleRequested(); if (currVisible == mVisible && !mVisible) return false; return currVisible != mVisible + || mKnownConfigChanges != 0 // if mWindowingMode is 0, this container wasn't attached at collect time, so // assume no change in windowing-mode. || (mWindowingMode != 0 && newState.getWindowingMode() != mWindowingMode) diff --git a/services/core/java/com/android/server/wm/TransitionController.java b/services/core/java/com/android/server/wm/TransitionController.java index c1d0f80adbb7..fc5423942dc3 100644 --- a/services/core/java/com/android/server/wm/TransitionController.java +++ b/services/core/java/com/android/server/wm/TransitionController.java @@ -71,15 +71,7 @@ class TransitionController { final Lock mRunningLock = new Lock(); - private final IBinder.DeathRecipient mTransitionPlayerDeath = () -> { - // clean-up/finish any playing transitions. - for (int i = 0; i < mPlayingTransitions.size(); ++i) { - mPlayingTransitions.get(i).cleanUpOnFailure(); - } - mPlayingTransitions.clear(); - mTransitionPlayer = null; - mRunningLock.doNotifyLocked(); - }; + private final IBinder.DeathRecipient mTransitionPlayerDeath; /** The transition currently being constructed (collecting participants). */ private Transition mCollectingTransition = null; @@ -90,6 +82,17 @@ class TransitionController { TransitionController(ActivityTaskManagerService atm) { mAtm = atm; mStatusBar = LocalServices.getService(StatusBarManagerInternal.class); + mTransitionPlayerDeath = () -> { + synchronized (mAtm.mGlobalLock) { + // Clean-up/finish any playing transitions. + for (int i = 0; i < mPlayingTransitions.size(); ++i) { + mPlayingTransitions.get(i).cleanUpOnFailure(); + } + mPlayingTransitions.clear(); + mTransitionPlayer = null; + mRunningLock.doNotifyLocked(); + } + }; } /** @see #createTransition(int, int) */ diff --git a/services/core/java/com/android/server/wm/WindowAnimationSpec.java b/services/core/java/com/android/server/wm/WindowAnimationSpec.java index ec4eb5dc85de..70822eebba82 100644 --- a/services/core/java/com/android/server/wm/WindowAnimationSpec.java +++ b/services/core/java/com/android/server/wm/WindowAnimationSpec.java @@ -21,6 +21,7 @@ import static com.android.server.wm.AnimationSpecProto.WINDOW; import static com.android.server.wm.WindowAnimationSpecProto.ANIMATION; import static com.android.server.wm.WindowStateAnimator.ROOT_TASK_CLIP_NONE; +import android.annotation.ColorInt; import android.graphics.Point; import android.graphics.Rect; import android.os.SystemClock; @@ -85,6 +86,12 @@ public class WindowAnimationSpec implements AnimationSpec { } @Override + @ColorInt + public int getBackgroundColor() { + return mAnimation.getBackgroundColor(); + } + + @Override public void apply(Transaction t, SurfaceControl leash, long currentPlayTime) { final TmpValues tmp = mThreadLocalTmps.get(); tmp.transformation.clear(); diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java index 0b2b05054e60..4cc764ac33ca 100644 --- a/services/core/java/com/android/server/wm/WindowOrganizerController.java +++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java @@ -327,7 +327,7 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub if (transition != null) { // First check if we have a display rotation transition and if so, update it. final DisplayContent dc = DisplayRotation.getDisplayFromTransition(transition); - if (dc != null && transition.mChanges.get(dc).mRotation != dc.getRotation()) { + if (dc != null && transition.mChanges.get(dc).hasChanged(dc)) { // Go through all tasks and collect them before the rotation // TODO(shell-transitions): move collect() to onConfigurationChange once // wallpaper handling is synchronized. diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 2ccbf4070eba..02d77b09c654 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -2582,8 +2582,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP } } final boolean isAnimating = mAnimatingExit - || isAnimating(TRANSITION | PARENTS, EXIT_ANIMATING_TYPES) - && (mActivityRecord == null || !mActivityRecord.isWaitingForTransitionStart()); + || isAnimating(TRANSITION | PARENTS, EXIT_ANIMATING_TYPES); final boolean lastWindowIsStartingWindow = startingWindow && mActivityRecord != null && mActivityRecord.isLastWindow(this); // We delay the removal of a window if it has a showing surface that can be used to run diff --git a/services/tests/mockingservicestests/src/com/android/server/am/CacheOomRankerTest.java b/services/tests/mockingservicestests/src/com/android/server/am/CacheOomRankerTest.java index 022fadcc6dd0..609768c0e62a 100644 --- a/services/tests/mockingservicestests/src/com/android/server/am/CacheOomRankerTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/am/CacheOomRankerTest.java @@ -21,12 +21,16 @@ import static android.app.ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; +import android.app.ActivityManager; +import android.app.IApplicationThread; import android.content.ComponentName; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManagerInternal; +import android.os.Environment; import android.os.Handler; import android.os.HandlerThread; import android.os.Process; @@ -48,8 +52,14 @@ import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import java.io.File; -import java.time.Duration; +import java.time.Instant; +import java.time.LocalDate; +import java.time.ZoneOffset; +import java.time.temporal.ChronoUnit; import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executor; import java.util.concurrent.TimeUnit; @@ -60,8 +70,11 @@ import java.util.concurrent.TimeUnit; * Build/Install/Run: * atest FrameworksMockingServicesTests:CacheOomRankerTest */ +@SuppressWarnings("GuardedBy") // No tests are concurrent, so no need to test locking. @RunWith(MockitoJUnitRunner.class) public class CacheOomRankerTest { + private static final Instant NOW = LocalDate.of(2021, 1, 1).atStartOfDay( + ZoneOffset.UTC).toInstant(); @Mock private AppOpsService mAppOpsService; @@ -82,6 +95,7 @@ public class CacheOomRankerTest { private int mNextUid = 30000; private int mNextPackageUid = 40000; private int mNextPackageName = 1; + private Map<Integer, Long> mPidToRss; private TestExecutor mExecutor = new TestExecutor(); private CacheOomRanker mCacheOomRanker; @@ -107,7 +121,15 @@ public class CacheOomRankerTest { LocalServices.removeServiceForTest(PackageManagerInternal.class); LocalServices.addService(PackageManagerInternal.class, mPackageManagerInt); - mCacheOomRanker = new CacheOomRanker(mAms); + mPidToRss = new HashMap<>(); + mCacheOomRanker = new CacheOomRanker( + mAms, + pid -> { + Long rss = mPidToRss.get(pid); + assertThat(rss).isNotNull(); + return new long[]{rss}; + } + ); mCacheOomRanker.init(mExecutor); } @@ -136,6 +158,15 @@ public class CacheOomRankerTest { mExecutor.init(); DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + CacheOomRanker.KEY_OOM_RE_RANKING_PRESERVE_TOP_N_APPS, + Integer.toString(CacheOomRanker.DEFAULT_PRESERVE_TOP_N_APPS + 1), + false); + mExecutor.waitForLatch(); + assertThat(mCacheOomRanker.mPreserveTopNApps) + .isEqualTo(CacheOomRanker.DEFAULT_PRESERVE_TOP_N_APPS + 1); + + mExecutor.init(); + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, CacheOomRanker.KEY_OOM_RE_RANKING_LRU_WEIGHT, Float.toString(CacheOomRanker.DEFAULT_OOM_RE_RANKING_LRU_WEIGHT + 0.1f), false); @@ -165,6 +196,9 @@ public class CacheOomRankerTest { @Test public void reRankLruCachedApps_lruImpactsOrdering() throws InterruptedException { setConfig(/* numberToReRank= */ 5, + /* preserveTopNApps= */ 0, + /* useFrequentRss= */ true, + /* rssUpdateRateMs= */ 0, /* usesWeight= */ 0.0f, /* pssWeight= */ 0.0f, /* lruWeight= */1.0f); @@ -172,36 +206,40 @@ public class CacheOomRankerTest { ProcessList list = new ProcessList(); ArrayList<ProcessRecord> processList = list.getLruProcessesLSP(); ProcessRecord lastUsed40MinutesAgo = nextProcessRecord(ProcessList.UNKNOWN_ADJ, - Duration.ofMinutes(40).toMillis(), 10 * 1024L, 1000); + NOW.minus(40, ChronoUnit.MINUTES).toEpochMilli(), 10 * 1024L, 1000); processList.add(lastUsed40MinutesAgo); ProcessRecord lastUsed42MinutesAgo = nextProcessRecord(ProcessList.UNKNOWN_ADJ, - Duration.ofMinutes(42).toMillis(), 20 * 1024L, 2000); + NOW.minus(42, ChronoUnit.MINUTES).toEpochMilli(), 20 * 1024L, 2000); processList.add(lastUsed42MinutesAgo); ProcessRecord lastUsed60MinutesAgo = nextProcessRecord(ProcessList.UNKNOWN_ADJ, - Duration.ofMinutes(60).toMillis(), 1024L, 10000); + NOW.minus(60, ChronoUnit.MINUTES).toEpochMilli(), 1024L, 10000); processList.add(lastUsed60MinutesAgo); ProcessRecord lastUsed15MinutesAgo = nextProcessRecord(ProcessList.UNKNOWN_ADJ, - Duration.ofMinutes(15).toMillis(), 100 * 1024L, 10); + NOW.minus(15, ChronoUnit.MINUTES).toEpochMilli(), 100 * 1024L, 10); processList.add(lastUsed15MinutesAgo); ProcessRecord lastUsed17MinutesAgo = nextProcessRecord(ProcessList.UNKNOWN_ADJ, - Duration.ofMinutes(17).toMillis(), 1024L, 20); + NOW.minus(17, ChronoUnit.MINUTES).toEpochMilli(), 1024L, 20); processList.add(lastUsed17MinutesAgo); // Only re-ranking 5 entries so this should stay in most recent position. ProcessRecord lastUsed30MinutesAgo = nextProcessRecord(ProcessList.UNKNOWN_ADJ, - Duration.ofMinutes(30).toMillis(), 1024L, 20); + NOW.minus(30, ChronoUnit.MINUTES).toEpochMilli(), 1024L, 20); processList.add(lastUsed30MinutesAgo); + list.setLruProcessServiceStartLSP(processList.size()); mCacheOomRanker.reRankLruCachedAppsLSP(processList, list.getLruProcessServiceStartLOSP()); // First 5 ordered by least recently used first, then last processes position unchanged. assertThat(processList).containsExactly(lastUsed60MinutesAgo, lastUsed42MinutesAgo, lastUsed40MinutesAgo, lastUsed17MinutesAgo, lastUsed15MinutesAgo, - lastUsed30MinutesAgo); + lastUsed30MinutesAgo).inOrder(); } @Test public void reRankLruCachedApps_rssImpactsOrdering() throws InterruptedException { setConfig(/* numberToReRank= */ 6, + /* preserveTopNApps= */ 0, + /* useFrequentRss= */ true, + /* rssUpdateRateMs= */ 0, /* usesWeight= */ 0.0f, /* pssWeight= */ 1.0f, /* lruWeight= */ 0.0f); @@ -209,145 +247,459 @@ public class CacheOomRankerTest { ProcessList list = new ProcessList(); ArrayList<ProcessRecord> processList = list.getLruProcessesLSP(); ProcessRecord rss10k = nextProcessRecord(ProcessList.UNKNOWN_ADJ, - Duration.ofMinutes(40).toMillis(), 10 * 1024L, 1000); + NOW.minus(40, ChronoUnit.MINUTES).toEpochMilli(), 10 * 1024L, 1000); processList.add(rss10k); ProcessRecord rss20k = nextProcessRecord(ProcessList.UNKNOWN_ADJ, - Duration.ofMinutes(42).toMillis(), 20 * 1024L, 2000); + NOW.minus(42, ChronoUnit.MINUTES).toEpochMilli(), 20 * 1024L, 2000); processList.add(rss20k); ProcessRecord rss1k = nextProcessRecord(ProcessList.UNKNOWN_ADJ, - Duration.ofMinutes(60).toMillis(), 1024L, 10000); + NOW.minus(60, ChronoUnit.MINUTES).toEpochMilli(), 1024L, 10000); processList.add(rss1k); ProcessRecord rss100k = nextProcessRecord(ProcessList.UNKNOWN_ADJ, - Duration.ofMinutes(15).toMillis(), 100 * 1024L, 10); + NOW.minus(15, ChronoUnit.MINUTES).toEpochMilli(), 100 * 1024L, 10); processList.add(rss100k); ProcessRecord rss2k = nextProcessRecord(ProcessList.UNKNOWN_ADJ, - Duration.ofMinutes(17).toMillis(), 2 * 1024L, 20); + NOW.minus(17, ChronoUnit.MINUTES).toEpochMilli(), 2 * 1024L, 20); processList.add(rss2k); ProcessRecord rss15k = nextProcessRecord(ProcessList.UNKNOWN_ADJ, - Duration.ofMinutes(30).toMillis(), 15 * 1024L, 20); + NOW.minus(30, ChronoUnit.MINUTES).toEpochMilli(), 15 * 1024L, 20); processList.add(rss15k); // Only re-ranking 6 entries so this should stay in most recent position. ProcessRecord rss16k = nextProcessRecord(ProcessList.UNKNOWN_ADJ, - Duration.ofMinutes(30).toMillis(), 16 * 1024L, 20); + NOW.minus(30, ChronoUnit.MINUTES).toEpochMilli(), 16 * 1024L, 20); processList.add(rss16k); + list.setLruProcessServiceStartLSP(processList.size()); mCacheOomRanker.reRankLruCachedAppsLSP(processList, list.getLruProcessServiceStartLOSP()); // First 6 ordered by largest pss, then last processes position unchanged. assertThat(processList).containsExactly(rss100k, rss20k, rss15k, rss10k, rss2k, rss1k, - rss16k); + rss16k).inOrder(); } @Test + public void reRankLruCachedApps_rssImpactsOrdering_cachedRssValues() + throws InterruptedException { + setConfig(/* numberToReRank= */ 6, + /* preserveTopNApps= */ 0, + /* useFrequentRss= */ true, + /* rssUpdateRateMs= */ 10000000, + /* usesWeight= */ 0.0f, + /* pssWeight= */ 1.0f, + /* lruWeight= */ 0.0f); + + ProcessList list = new ProcessList(); + ArrayList<ProcessRecord> processList = list.getLruProcessesLSP(); + ProcessRecord rss10k = nextProcessRecord(ProcessList.UNKNOWN_ADJ, + NOW.minus(40, ChronoUnit.MINUTES).toEpochMilli(), 10 * 1024L, 1000); + processList.add(rss10k); + ProcessRecord rss20k = nextProcessRecord(ProcessList.UNKNOWN_ADJ, + NOW.minus(42, ChronoUnit.MINUTES).toEpochMilli(), 20 * 1024L, 2000); + processList.add(rss20k); + ProcessRecord rss1k = nextProcessRecord(ProcessList.UNKNOWN_ADJ, + NOW.minus(60, ChronoUnit.MINUTES).toEpochMilli(), 1024L, 10000); + processList.add(rss1k); + ProcessRecord rss100k = nextProcessRecord(ProcessList.UNKNOWN_ADJ, + NOW.minus(15, ChronoUnit.MINUTES).toEpochMilli(), 100 * 1024L, 10); + processList.add(rss100k); + ProcessRecord rss2k = nextProcessRecord(ProcessList.UNKNOWN_ADJ, + NOW.minus(17, ChronoUnit.MINUTES).toEpochMilli(), 2 * 1024L, 20); + processList.add(rss2k); + ProcessRecord rss15k = nextProcessRecord(ProcessList.UNKNOWN_ADJ, + NOW.minus(30, ChronoUnit.MINUTES).toEpochMilli(), 15 * 1024L, 20); + processList.add(rss15k); + // Only re-ranking 6 entries so this should stay in most recent position. + ProcessRecord rss16k = nextProcessRecord(ProcessList.UNKNOWN_ADJ, + NOW.minus(30, ChronoUnit.MINUTES).toEpochMilli(), 16 * 1024L, 20); + processList.add(rss16k); + list.setLruProcessServiceStartLSP(processList.size()); + + mCacheOomRanker.reRankLruCachedAppsLSP(processList, list.getLruProcessServiceStartLOSP()); + // First 6 ordered by largest pss, then last processes position unchanged. + assertThat(processList).containsExactly(rss100k, rss20k, rss15k, rss10k, rss2k, rss1k, + rss16k).inOrder(); + + // Clear mPidToRss so that Process.getRss calls fail. + mPidToRss.clear(); + // Mix up the process list to ensure that CacheOomRanker actually re-ranks. + Collections.swap(processList, 0, 1); + + mCacheOomRanker.reRankLruCachedAppsLSP(processList, list.getLruProcessServiceStartLOSP()); + // Re ranking is the same. + assertThat(processList).containsExactly(rss100k, rss20k, rss15k, rss10k, rss2k, rss1k, + rss16k).inOrder(); + } + + @Test + public void reRankLruCachedApps_rssImpactsOrdering_profileRss() + throws InterruptedException { + setConfig(/* numberToReRank= */ 6, + /* preserveTopNApps= */ 0, + /* useFrequentRss= */ false, + /* rssUpdateRateMs= */ 10000000, + /* usesWeight= */ 0.0f, + /* pssWeight= */ 1.0f, + /* lruWeight= */ 0.0f); + + ProcessList list = new ProcessList(); + ArrayList<ProcessRecord> processList = list.getLruProcessesLSP(); + ProcessRecord rss10k = nextProcessRecord(ProcessList.UNKNOWN_ADJ, + NOW.minus(40, ChronoUnit.MINUTES).toEpochMilli(), 0L, 1000); + rss10k.mProfile.setLastRss(10 * 1024L); + processList.add(rss10k); + ProcessRecord rss20k = nextProcessRecord(ProcessList.UNKNOWN_ADJ, + NOW.minus(42, ChronoUnit.MINUTES).toEpochMilli(), 0L, 2000); + rss20k.mProfile.setLastRss(20 * 1024L); + processList.add(rss20k); + ProcessRecord rss1k = nextProcessRecord(ProcessList.UNKNOWN_ADJ, + NOW.minus(60, ChronoUnit.MINUTES).toEpochMilli(), 0L, 10000); + rss1k.mProfile.setLastRss(1024L); + processList.add(rss1k); + ProcessRecord rss100k = nextProcessRecord(ProcessList.UNKNOWN_ADJ, + NOW.minus(15, ChronoUnit.MINUTES).toEpochMilli(), 0L, 10); + rss100k.mProfile.setLastRss(100 * 1024L); + processList.add(rss100k); + ProcessRecord rss2k = nextProcessRecord(ProcessList.UNKNOWN_ADJ, + NOW.minus(17, ChronoUnit.MINUTES).toEpochMilli(), 0L, 20); + rss2k.mProfile.setLastRss(2 * 1024L); + processList.add(rss2k); + ProcessRecord rss15k = nextProcessRecord(ProcessList.UNKNOWN_ADJ, + NOW.minus(30, ChronoUnit.MINUTES).toEpochMilli(), 15 * 1024L, 20); + rss15k.mProfile.setLastRss(15 * 1024L); + processList.add(rss15k); + // Only re-ranking 6 entries so this should stay in most recent position. + ProcessRecord rss16k = nextProcessRecord(ProcessList.UNKNOWN_ADJ, + NOW.minus(30, ChronoUnit.MINUTES).toEpochMilli(), 16 * 1024L, 20); + rss16k.mProfile.setLastRss(16 * 1024L); + processList.add(rss16k); + list.setLruProcessServiceStartLSP(processList.size()); + + // This should not be used, as RSS values are taken from mProfile. + mPidToRss.clear(); + + mCacheOomRanker.reRankLruCachedAppsLSP(processList, list.getLruProcessServiceStartLOSP()); + // First 6 ordered by largest pss, then last processes position unchanged. + assertThat(processList).containsExactly(rss100k, rss20k, rss15k, rss10k, rss2k, rss1k, + rss16k).inOrder(); + + // Clear mPidToRss so that Process.getRss calls fail. + mPidToRss.clear(); + // Mix up the process list to ensure that CacheOomRanker actually re-ranks. + Collections.swap(processList, 0, 1); + + mCacheOomRanker.reRankLruCachedAppsLSP(processList, list.getLruProcessServiceStartLOSP()); + // Re ranking is the same. + assertThat(processList).containsExactly(rss100k, rss20k, rss15k, rss10k, rss2k, rss1k, + rss16k).inOrder(); + } + + + @Test public void reRankLruCachedApps_usesImpactsOrdering() throws InterruptedException { setConfig(/* numberToReRank= */ 4, + /* preserveTopNApps= */ 0, + /* useFrequentRss= */ true, + /* rssUpdateRateMs= */ 0, /* usesWeight= */ 1.0f, /* pssWeight= */ 0.0f, /* lruWeight= */ 0.0f); ProcessList list = new ProcessList(); - list.setLruProcessServiceStartLSP(1); ArrayList<ProcessRecord> processList = list.getLruProcessesLSP(); ProcessRecord used1000 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, - Duration.ofMinutes(40).toMillis(), 10 * 1024L, 1000); + NOW.minus(40, ChronoUnit.MINUTES).toEpochMilli(), 10 * 1024L, 1000); processList.add(used1000); ProcessRecord used2000 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, - Duration.ofMinutes(42).toMillis(), 20 * 1024L, 2000); + NOW.minus(42, ChronoUnit.MINUTES).toEpochMilli(), 20 * 1024L, 2000); processList.add(used2000); ProcessRecord used10 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, - Duration.ofMinutes(15).toMillis(), 100 * 1024L, 10); + NOW.minus(15, ChronoUnit.MINUTES).toEpochMilli(), 100 * 1024L, 10); processList.add(used10); ProcessRecord used20 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, - Duration.ofMinutes(17).toMillis(), 2 * 1024L, 20); + NOW.minus(17, ChronoUnit.MINUTES).toEpochMilli(), 2 * 1024L, 20); processList.add(used20); // Only re-ranking 6 entries so last two should stay in most recent position. ProcessRecord used500 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, - Duration.ofMinutes(30).toMillis(), 15 * 1024L, 500); + NOW.minus(30, ChronoUnit.MINUTES).toEpochMilli(), 15 * 1024L, 500); processList.add(used500); ProcessRecord used200 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, - Duration.ofMinutes(30).toMillis(), 16 * 1024L, 200); + NOW.minus(30, ChronoUnit.MINUTES).toEpochMilli(), 16 * 1024L, 200); processList.add(used200); + list.setLruProcessServiceStartLSP(processList.size()); mCacheOomRanker.reRankLruCachedAppsLSP(processList, list.getLruProcessServiceStartLOSP()); // First 4 ordered by uses, then last processes position unchanged. assertThat(processList).containsExactly(used10, used20, used1000, used2000, used500, - used200); + used200).inOrder(); } @Test - public void reRankLruCachedApps_notEnoughProcesses() throws InterruptedException { + public void reRankLruCachedApps_fewProcesses() throws InterruptedException { setConfig(/* numberToReRank= */ 4, - /* usesWeight= */ 0.5f, - /* pssWeight= */ 0.2f, - /* lruWeight= */ 0.3f); + /* preserveTopNApps= */ 0, + /* useFrequentRss= */ true, + /* rssUpdateRateMs= */ 0, + /* usesWeight= */ 1.0f, + /* pssWeight= */ 0.0f, + /* lruWeight= */ 0.0f); ProcessList list = new ProcessList(); ArrayList<ProcessRecord> processList = list.getLruProcessesLSP(); - ProcessRecord unknownAdj1 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, - Duration.ofMinutes(40).toMillis(), 10 * 1024L, 1000); - processList.add(unknownAdj1); - ProcessRecord unknownAdj2 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, - Duration.ofMinutes(42).toMillis(), 20 * 1024L, 2000); - processList.add(unknownAdj2); - ProcessRecord unknownAdj3 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, - Duration.ofMinutes(15).toMillis(), 100 * 1024L, 10); - processList.add(unknownAdj3); + ProcessRecord used1000 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, + NOW.minus(40, ChronoUnit.MINUTES).toEpochMilli(), 10 * 1024L, 1000); + processList.add(used1000); + ProcessRecord used2000 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, + NOW.minus(42, ChronoUnit.MINUTES).toEpochMilli(), 20 * 1024L, 2000); + processList.add(used2000); + ProcessRecord used10 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, + NOW.minus(15, ChronoUnit.MINUTES).toEpochMilli(), 100 * 1024L, 10); + processList.add(used10); ProcessRecord foregroundAdj = nextProcessRecord(ProcessList.FOREGROUND_APP_ADJ, - Duration.ofMinutes(17).toMillis(), 2 * 1024L, 20); + NOW.minus(17, ChronoUnit.MINUTES).toEpochMilli(), 2 * 1024L, 20); processList.add(foregroundAdj); ProcessRecord serviceAdj = nextProcessRecord(ProcessList.SERVICE_ADJ, - Duration.ofMinutes(30).toMillis(), 15 * 1024L, 500); + NOW.minus(30, ChronoUnit.MINUTES).toEpochMilli(), 15 * 1024L, 500); processList.add(serviceAdj); ProcessRecord systemAdj = nextProcessRecord(ProcessList.SYSTEM_ADJ, - Duration.ofMinutes(30).toMillis(), 16 * 1024L, 200); + NOW.minus(30, ChronoUnit.MINUTES).toEpochMilli(), 16 * 1024L, 200); processList.add(systemAdj); + list.setLruProcessServiceStartLSP(processList.size()); - // 6 Processes but only 3 in eligible for cache so no re-ranking. mCacheOomRanker.reRankLruCachedAppsLSP(processList, list.getLruProcessServiceStartLOSP()); - // All positions unchanged. - assertThat(processList).containsExactly(unknownAdj1, unknownAdj2, unknownAdj3, - foregroundAdj, serviceAdj, systemAdj); + // 6 processes, only 3 in eligible for cache, so only those are re-ranked. + assertThat(processList).containsExactly(used10, used1000, used2000, + foregroundAdj, serviceAdj, systemAdj).inOrder(); } @Test - public void reRankLruCachedApps_notEnoughNonServiceProcesses() throws InterruptedException { + public void reRankLruCachedApps_fewNonServiceProcesses() throws InterruptedException { setConfig(/* numberToReRank= */ 4, + /* preserveTopNApps= */ 0, + /* useFrequentRss= */ true, + /* rssUpdateRateMs= */ 0, /* usesWeight= */ 1.0f, /* pssWeight= */ 0.0f, /* lruWeight= */ 0.0f); ProcessList list = new ProcessList(); - list.setLruProcessServiceStartLSP(4); ArrayList<ProcessRecord> processList = list.getLruProcessesLSP(); ProcessRecord used1000 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, - Duration.ofMinutes(40).toMillis(), 10 * 1024L, 1000); + NOW.minus(40, ChronoUnit.MINUTES).toEpochMilli(), 10 * 1024L, 1000); processList.add(used1000); ProcessRecord used2000 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, - Duration.ofMinutes(42).toMillis(), 20 * 1024L, 2000); + NOW.minus(42, ChronoUnit.MINUTES).toEpochMilli(), 20 * 1024L, 2000); processList.add(used2000); ProcessRecord used10 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, - Duration.ofMinutes(15).toMillis(), 100 * 1024L, 10); + NOW.minus(15, ChronoUnit.MINUTES).toEpochMilli(), 100 * 1024L, 10); + processList.add(used10); + ProcessRecord service1 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, + NOW.minus(17, ChronoUnit.MINUTES).toEpochMilli(), 2 * 1024L, 20); + processList.add(service1); + ProcessRecord service2 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, + NOW.minus(30, ChronoUnit.MINUTES).toEpochMilli(), 15 * 1024L, 500); + processList.add(service2); + ProcessRecord service3 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, + NOW.minus(30, ChronoUnit.MINUTES).toEpochMilli(), 16 * 1024L, 200); + processList.add(service3); + list.setLruProcessServiceStartLSP(3); + + mCacheOomRanker.reRankLruCachedAppsLSP(processList, list.getLruProcessServiceStartLOSP()); + + // Services unchanged, rest re-ranked. + assertThat(processList).containsExactly(used10, used1000, used2000, service1, service2, + service3).inOrder(); + } + + @Test + public void reRankLruCachedApps_manyProcessesThenFew() throws InterruptedException { + setConfig(/* numberToReRank= */ 6, + /* preserveTopNApps= */ 0, + /* useFrequentRss= */ true, + /* rssUpdateRateMs= */ 0, + /* usesWeight= */ 1.0f, + /* pssWeight= */ 0.0f, + /* lruWeight= */ 0.0f); + + ProcessList set1List = new ProcessList(); + ArrayList<ProcessRecord> set1ProcessList = set1List.getLruProcessesLSP(); + ProcessRecord set1Used1000 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, + NOW.minus(40, ChronoUnit.MINUTES).toEpochMilli(), 10 * 1024L, 1000); + set1ProcessList.add(set1Used1000); + ProcessRecord set1Used2000 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, + NOW.minus(42, ChronoUnit.MINUTES).toEpochMilli(), 20 * 1024L, 2000); + set1ProcessList.add(set1Used2000); + ProcessRecord set1Used10 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, + NOW.minus(15, ChronoUnit.MINUTES).toEpochMilli(), 100 * 1024L, 10); + set1ProcessList.add(set1Used10); + ProcessRecord set1Uses20 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, + NOW.minus(17, ChronoUnit.MINUTES).toEpochMilli(), 2 * 1024L, 20); + set1ProcessList.add(set1Uses20); + ProcessRecord set1Uses500 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, + NOW.minus(30, ChronoUnit.MINUTES).toEpochMilli(), 15 * 1024L, 500); + set1ProcessList.add(set1Uses500); + ProcessRecord set1Uses200 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, + NOW.minus(30, ChronoUnit.MINUTES).toEpochMilli(), 16 * 1024L, 200); + set1ProcessList.add(set1Uses200); + set1List.setLruProcessServiceStartLSP(set1ProcessList.size()); + + mCacheOomRanker.reRankLruCachedAppsLSP(set1ProcessList, + set1List.getLruProcessServiceStartLOSP()); + assertThat(set1ProcessList).containsExactly(set1Used10, set1Uses20, set1Uses200, + set1Uses500, set1Used1000, set1Used2000).inOrder(); + + ProcessList set2List = new ProcessList(); + ArrayList<ProcessRecord> set2ProcessList = set2List.getLruProcessesLSP(); + ProcessRecord set2Used1000 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, + NOW.minus(40, ChronoUnit.MINUTES).toEpochMilli(), 10 * 1024L, 1000); + set2ProcessList.add(set2Used1000); + ProcessRecord set2Used2000 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, + NOW.minus(42, ChronoUnit.MINUTES).toEpochMilli(), 20 * 1024L, 2000); + set2ProcessList.add(set2Used2000); + ProcessRecord set2Used10 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, + NOW.minus(15, ChronoUnit.MINUTES).toEpochMilli(), 100 * 1024L, 10); + set2ProcessList.add(set2Used10); + ProcessRecord set2ForegroundAdj = nextProcessRecord(ProcessList.FOREGROUND_APP_ADJ, + NOW.minus(17, ChronoUnit.MINUTES).toEpochMilli(), 2 * 1024L, 20); + set2ProcessList.add(set2ForegroundAdj); + ProcessRecord set2ServiceAdj = nextProcessRecord(ProcessList.SERVICE_ADJ, + NOW.minus(30, ChronoUnit.MINUTES).toEpochMilli(), 15 * 1024L, 500); + set2ProcessList.add(set2ServiceAdj); + ProcessRecord set2SystemAdj = nextProcessRecord(ProcessList.SYSTEM_ADJ, + NOW.minus(30, ChronoUnit.MINUTES).toEpochMilli(), 16 * 1024L, 200); + set2ProcessList.add(set2SystemAdj); + set2List.setLruProcessServiceStartLSP(set2ProcessList.size()); + + mCacheOomRanker.reRankLruCachedAppsLSP(set2ProcessList, + set2List.getLruProcessServiceStartLOSP()); + assertThat(set2ProcessList).containsExactly(set2Used10, set2Used1000, set2Used2000, + set2ForegroundAdj, set2ServiceAdj, set2SystemAdj).inOrder(); + } + + @Test + public void reRankLruCachedApps_preservesTopNApps() throws InterruptedException { + setConfig(/* numberToReRank= */ 6, + /* preserveTopNApps= */ 3, + /* useFrequentRss= */ true, + /* rssUpdateRateMs= */ 0, + /* usesWeight= */ 1.0f, + /* pssWeight= */ 0.0f, + /* lruWeight= */ 0.0f); + + ProcessList list = new ProcessList(); + ArrayList<ProcessRecord> processList = list.getLruProcessesLSP(); + ProcessRecord used1000 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, + NOW.minus(40, ChronoUnit.MINUTES).toEpochMilli(), 10 * 1024L, 1000); + processList.add(used1000); + ProcessRecord used2000 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, + NOW.minus(42, ChronoUnit.MINUTES).toEpochMilli(), 20 * 1024L, 2000); + processList.add(used2000); + ProcessRecord used10 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, + NOW.minus(15, ChronoUnit.MINUTES).toEpochMilli(), 100 * 1024L, 10); + processList.add(used10); + // Preserving the top 3 processes, so these should not be re-ranked. + ProcessRecord used20 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, + NOW.minus(17, ChronoUnit.MINUTES).toEpochMilli(), 2 * 1024L, 20); + processList.add(used20); + ProcessRecord used500 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, + NOW.minus(30, ChronoUnit.MINUTES).toEpochMilli(), 15 * 1024L, 500); + processList.add(used500); + ProcessRecord used200 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, + NOW.minus(30, ChronoUnit.MINUTES).toEpochMilli(), 16 * 1024L, 200); + processList.add(used200); + list.setLruProcessServiceStartLSP(processList.size()); + + mCacheOomRanker.reRankLruCachedAppsLSP(processList, list.getLruProcessServiceStartLOSP()); + + // First 3 ordered by uses, then last processes position unchanged. + assertThat(processList).containsExactly(used10, used1000, used2000, used20, used500, + used200).inOrder(); + } + + @Test + public void reRankLruCachedApps_preservesTopNApps_allAppsUnchanged() + throws InterruptedException { + setConfig(/* numberToReRank= */ 6, + /* preserveTopNApps= */ 100, + /* useFrequentRss= */ true, + /* rssUpdateRateMs= */ 0, + /* usesWeight= */ 1.0f, + /* pssWeight= */ 0.0f, + /* lruWeight= */ 0.0f); + + ProcessList list = new ProcessList(); + ArrayList<ProcessRecord> processList = list.getLruProcessesLSP(); + ProcessRecord used1000 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, + NOW.minus(40, ChronoUnit.MINUTES).toEpochMilli(), 10 * 1024L, 1000); + processList.add(used1000); + ProcessRecord used2000 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, + NOW.minus(42, ChronoUnit.MINUTES).toEpochMilli(), 20 * 1024L, 2000); + processList.add(used2000); + ProcessRecord used10 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, + NOW.minus(15, ChronoUnit.MINUTES).toEpochMilli(), 100 * 1024L, 10); processList.add(used10); ProcessRecord used20 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, - Duration.ofMinutes(17).toMillis(), 2 * 1024L, 20); + NOW.minus(17, ChronoUnit.MINUTES).toEpochMilli(), 2 * 1024L, 20); processList.add(used20); ProcessRecord used500 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, - Duration.ofMinutes(30).toMillis(), 15 * 1024L, 500); + NOW.minus(30, ChronoUnit.MINUTES).toEpochMilli(), 15 * 1024L, 500); processList.add(used500); ProcessRecord used200 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, - Duration.ofMinutes(30).toMillis(), 16 * 1024L, 200); + NOW.minus(30, ChronoUnit.MINUTES).toEpochMilli(), 16 * 1024L, 200); processList.add(used200); + list.setLruProcessServiceStartLSP(processList.size()); mCacheOomRanker.reRankLruCachedAppsLSP(processList, list.getLruProcessServiceStartLOSP()); - // All positions unchanged. + // Nothing reordered, as we preserve the top 100 apps. assertThat(processList).containsExactly(used1000, used2000, used10, used20, used500, - used200); + used200).inOrder(); + } + + @Test + public void reRankLruCachedApps_preservesTopNApps_negativeReplacedWithDefault() + throws InterruptedException { + setConfig(/* numberToReRank= */ 6, + /* preserveTopNApps= */ -100, + /* useFrequentRss= */ true, + /* rssUpdateRateMs= */ 0, + /* usesWeight= */ 1.0f, + /* pssWeight= */ 0.0f, + /* lruWeight= */ 0.0f); + + ProcessList list = new ProcessList(); + ArrayList<ProcessRecord> processList = list.getLruProcessesLSP(); + ProcessRecord used1000 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, + NOW.minus(40, ChronoUnit.MINUTES).toEpochMilli(), 10 * 1024L, 1000); + processList.add(used1000); + ProcessRecord used2000 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, + NOW.minus(42, ChronoUnit.MINUTES).toEpochMilli(), 20 * 1024L, 2000); + processList.add(used2000); + ProcessRecord used10 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, + NOW.minus(15, ChronoUnit.MINUTES).toEpochMilli(), 100 * 1024L, 10); + processList.add(used10); + // Negative preserveTopNApps interpreted as the default (3), so the last three are unranked. + ProcessRecord used20 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, + NOW.minus(17, ChronoUnit.MINUTES).toEpochMilli(), 2 * 1024L, 20); + processList.add(used20); + ProcessRecord used500 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, + NOW.minus(30, ChronoUnit.MINUTES).toEpochMilli(), 15 * 1024L, 500); + processList.add(used500); + ProcessRecord used200 = nextProcessRecord(ProcessList.UNKNOWN_ADJ, + NOW.minus(30, ChronoUnit.MINUTES).toEpochMilli(), 16 * 1024L, 200); + processList.add(used200); + list.setLruProcessServiceStartLSP(processList.size()); + + mCacheOomRanker.reRankLruCachedAppsLSP(processList, list.getLruProcessServiceStartLOSP()); + + // First 3 apps re-ranked, as preserveTopNApps is interpreted as 3. + assertThat(processList).containsExactly(used10, used1000, used2000, used20, used500, + used200).inOrder(); } - private void setConfig(int numberToReRank, float useWeight, float pssWeight, float lruWeight) + private void setConfig(int numberToReRank, int preserveTopNApps, boolean useFrequentRss, + long rssUpdateRateMs, float usesWeight, float pssWeight, float lruWeight) throws InterruptedException { mExecutor.init(4); DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, @@ -355,6 +707,18 @@ public class CacheOomRankerTest { Integer.toString(numberToReRank), false); DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + CacheOomRanker.KEY_OOM_RE_RANKING_PRESERVE_TOP_N_APPS, + Integer.toString(preserveTopNApps), + false); + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + CacheOomRanker.KEY_OOM_RE_RANKING_USE_FREQUENT_RSS, + Boolean.toString(useFrequentRss), + false); + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + CacheOomRanker.KEY_OOM_RE_RANKING_RSS_UPDATE_RATE_MS, + Long.toString(rssUpdateRateMs), + false); + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, CacheOomRanker.KEY_OOM_RE_RANKING_LRU_WEIGHT, Float.toString(lruWeight), false); @@ -364,17 +728,19 @@ public class CacheOomRankerTest { false); DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, CacheOomRanker.KEY_OOM_RE_RANKING_USES_WEIGHT, - Float.toString(useWeight), + Float.toString(usesWeight), false); mExecutor.waitForLatch(); assertThat(mCacheOomRanker.getNumberToReRank()).isEqualTo(numberToReRank); + assertThat(mCacheOomRanker.mUseFrequentRss).isEqualTo(useFrequentRss); + assertThat(mCacheOomRanker.mRssUpdateRateMs).isEqualTo(rssUpdateRateMs); assertThat(mCacheOomRanker.mRssWeight).isEqualTo(pssWeight); - assertThat(mCacheOomRanker.mUsesWeight).isEqualTo(useWeight); + assertThat(mCacheOomRanker.mUsesWeight).isEqualTo(usesWeight); assertThat(mCacheOomRanker.mLruWeight).isEqualTo(lruWeight); } private ProcessRecord nextProcessRecord(int setAdj, long lastActivityTime, long lastRss, - int returnedToCacheCount) { + int wentToForegroundCount) { ApplicationInfo ai = new ApplicationInfo(); ai.packageName = "a.package.name" + mNextPackageName++; ProcessRecord app = new ProcessRecord(mAms, ai, ai.packageName + ":process", mNextUid++); @@ -382,14 +748,20 @@ public class CacheOomRankerTest { app.info.uid = mNextPackageUid++; // Exact value does not mater, it can be any state for which compaction is allowed. app.mState.setSetProcState(PROCESS_STATE_BOUND_FOREGROUND_SERVICE); - app.mState.setSetAdj(setAdj); + app.mState.setCurAdj(setAdj); app.setLastActivityTime(lastActivityTime); - app.mProfile.setLastRss(lastRss); + mPidToRss.put(app.getPid(), lastRss); app.mState.setCached(false); - for (int i = 0; i < returnedToCacheCount; ++i) { - app.mState.setCached(false); - app.mState.setCached(true); + for (int i = 0; i < wentToForegroundCount; ++i) { + app.mState.setSetProcState(ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE); + app.mState.setSetProcState(ActivityManager.PROCESS_STATE_CACHED_RECENT); } + // Sets the thread returned by ProcessRecord#getThread, which we use to check whether the + // app is currently launching. + ProcessStatsService processStatsService = new ProcessStatsService( + mock(ActivityManagerService.class), new File(Environment.getDataSystemCeDirectory(), + "procstats")); + app.makeActive(mock(IApplicationThread.class), processStatsService); return app; } diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java index 51cc3186c773..c434b137317e 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java @@ -2987,6 +2987,7 @@ public class ActivityRecordTests extends WindowTestsBase { mDisplayContent.setImeInputTarget(app); // Simulate app is closing and expect the last IME is shown and IME insets is frozen. + mDisplayContent.mOpeningApps.clear(); app.mActivityRecord.commitVisibility(false, false); app.mActivityRecord.onWindowsGone(); @@ -3005,6 +3006,24 @@ public class ActivityRecordTests extends WindowTestsBase { assertFalse(app.mActivityRecord.mImeInsetsFrozenUntilStartInput); } + @Test + public void testInClosingAnimation_doNotHideSurface() { + final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); + makeWindowVisibleAndDrawn(app); + + // Put the activity in close transition. + mDisplayContent.mOpeningApps.clear(); + mDisplayContent.mClosingApps.add(app.mActivityRecord); + mDisplayContent.prepareAppTransition(TRANSIT_CLOSE); + + // Update visibility and call to remove window + app.mActivityRecord.commitVisibility(false, false); + app.mActivityRecord.prepareSurfaces(); + + // Because the app is waiting for transition, it should not hide the surface. + assertTrue(app.mActivityRecord.isSurfaceShowing()); + } + private void assertHasStartingWindow(ActivityRecord atoken) { assertNotNull(atoken.mStartingSurface); assertNotNull(atoken.mStartingData); diff --git a/services/tests/wmtests/src/com/android/server/wm/DragDropControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/DragDropControllerTests.java index 223dc3121cd6..a1e8ca4aa84b 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DragDropControllerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DragDropControllerTests.java @@ -58,6 +58,7 @@ import android.view.SurfaceControl; import android.view.SurfaceSession; import android.view.View; import android.view.WindowManager; +import android.view.accessibility.AccessibilityManager; import androidx.test.filters.SmallTest; @@ -70,6 +71,7 @@ import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mockito; import java.util.ArrayList; import java.util.concurrent.CountDownLatch; @@ -97,14 +99,20 @@ public class DragDropControllerTests extends WindowTestsBase { static class TestDragDropController extends DragDropController { private Runnable mCloseCallback; boolean mDeferDragStateClosed; + boolean mIsAccessibilityDrag; TestDragDropController(WindowManagerService service, Looper looper) { super(service, looper); } void setOnClosedCallbackLocked(Runnable runnable) { - assertTrue(dragDropActiveLocked()); - mCloseCallback = runnable; + if (mIsAccessibilityDrag) { + // Accessibility does not use animation + assertTrue(!dragDropActiveLocked()); + } else { + assertTrue(dragDropActiveLocked()); + mCloseCallback = runnable; + } } @Override @@ -171,6 +179,10 @@ public class DragDropControllerTests extends WindowTestsBase { } latch = new CountDownLatch(1); mTarget.setOnClosedCallbackLocked(latch::countDown); + if (mTarget.mIsAccessibilityDrag) { + mTarget.mIsAccessibilityDrag = false; + return; + } assertTrue(awaitInWmLock(() -> latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS))); } @@ -180,6 +192,12 @@ public class DragDropControllerTests extends WindowTestsBase { } @Test + public void testA11yDragFlow() { + mTarget.mIsAccessibilityDrag = true; + doA11yDragAndDrop(0, ClipData.newPlainText("label", "Test"), 0, 0); + } + + @Test public void testPerformDrag_NullDataWithGrantUri() { doDragAndDrop(View.DRAG_FLAG_GLOBAL | View.DRAG_FLAG_GLOBAL_URI_READ, null, 0, 0); } @@ -436,4 +454,22 @@ public class DragDropControllerTests extends WindowTestsBase { appSession.kill(); } } + + private void doA11yDragAndDrop(int flags, ClipData data, float dropX, float dropY) { + spyOn(mTarget); + AccessibilityManager accessibilityManager = Mockito.mock(AccessibilityManager.class); + when(accessibilityManager.isEnabled()).thenReturn(true); + doReturn(accessibilityManager).when(mTarget).getAccessibilityManager(); + startA11yDrag(flags, data, () -> { + boolean dropped = mTarget.dropForAccessibility(mWindow.mClient, dropX, dropY); + mToken = mWindow.mClient.asBinder(); + }); + } + + private void startA11yDrag(int flags, ClipData data, Runnable r) { + mToken = mTarget.performDrag(0, 0, mWindow.mClient, + flags | View.DRAG_FLAG_ACCESSIBILITY_ACTION, null, 0, 0, 0, 0, 0, data); + assertNotNull(mToken); + r.run(); + } } diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index d5be4f36145a..989663406a6b 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -8854,7 +8854,8 @@ public class TelephonyManager { } /** - * Set the preferred network type to global mode which includes LTE, CDMA, EvDo and GSM/WCDMA. + * Set the preferred network type to global mode which includes NR, LTE, CDMA, EvDo + * and GSM/WCDMA. * * <p>Requires that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}). * @@ -8865,7 +8866,8 @@ public class TelephonyManager { } /** - * Set the preferred network type to global mode which includes LTE, CDMA, EvDo and GSM/WCDMA. + * Set the preferred network type to global mode which includes NR, LTE, CDMA, EvDo + * and GSM/WCDMA. * * <p>Requires that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}). * @@ -8873,7 +8875,7 @@ public class TelephonyManager { * @hide */ public boolean setPreferredNetworkTypeToGlobal(int subId) { - return setPreferredNetworkType(subId, RILConstants.NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA); + return setPreferredNetworkType(subId, RILConstants.NETWORK_MODE_NR_LTE_CDMA_EVDO_GSM_WCDMA); } /** |