diff options
229 files changed, 3111 insertions, 3004 deletions
diff --git a/core/java/android/animation/AnimationHandler.java b/core/java/android/animation/AnimationHandler.java index df8a50a1fa5c..19606c16cb70 100644 --- a/core/java/android/animation/AnimationHandler.java +++ b/core/java/android/animation/AnimationHandler.java @@ -19,10 +19,10 @@ package android.animation; import android.os.SystemClock; import android.os.SystemProperties; import android.util.ArrayMap; +import android.util.ArraySet; import android.util.Log; import android.view.Choreographer; -import java.lang.ref.WeakReference; import java.util.ArrayList; /** @@ -40,7 +40,7 @@ import java.util.ArrayList; public class AnimationHandler { private static final String TAG = "AnimationHandler"; - private static final boolean LOCAL_LOGV = false; + private static final boolean LOCAL_LOGV = true; /** * Internal per-thread collections used to avoid set collisions as animations start and end @@ -78,7 +78,7 @@ public class AnimationHandler { * store visible (foreground) requestors; if the set size reaches zero, there are no * objects in the foreground and it is time to pause animators. */ - private final ArrayList<WeakReference<Object>> mAnimatorRequestors = new ArrayList<>(); + private final ArraySet<Object> mAnimatorRequestors = new ArraySet<>(); private final Choreographer.FrameCallback mFrameCallback = new Choreographer.FrameCallback() { @Override @@ -141,9 +141,24 @@ public class AnimationHandler { * tracking obsolete+enabled requestors. */ public static void removeRequestor(Object requestor) { - getInstance().requestAnimatorsEnabledImpl(false, requestor); + getInstance().removeRequestorImpl(requestor); + } + + private void removeRequestorImpl(Object requestor) { + // Also request disablement, in case that requestor was the sole object keeping + // animators un-paused + long startTime = System.nanoTime(); + requestAnimatorsEnabled(false, requestor); + Log.d(TAG, "removeRequestorImpl called requestAnimatorsEnabled after " + + (System.nanoTime() - startTime)); + mAnimatorRequestors.remove(requestor); + Log.d(TAG, "removeRequestorImpl removed requestor after " + + (System.nanoTime() - startTime)); if (LOCAL_LOGV) { - Log.v(TAG, "removeRequestor for " + requestor); + Log.v(TAG, "removeRequestorImpl for " + requestor); + for (int i = 0; i < mAnimatorRequestors.size(); ++i) { + Log.v(TAG, "animatorRequesters " + i + " = " + mAnimatorRequestors.valueAt(i)); + } } } @@ -161,44 +176,25 @@ public class AnimationHandler { } private void requestAnimatorsEnabledImpl(boolean enable, Object requestor) { + long startTime = System.nanoTime(); boolean wasEmpty = mAnimatorRequestors.isEmpty(); setAnimatorPausingEnabled(isPauseBgAnimationsEnabledInSystemProperties()); - synchronized (mAnimatorRequestors) { - // Only store WeakRef objects to avoid leaks - if (enable) { - // First, check whether such a reference is already on the list - WeakReference<Object> weakRef = null; - for (int i = mAnimatorRequestors.size() - 1; i >= 0; --i) { - WeakReference<Object> ref = mAnimatorRequestors.get(i); - Object referent = ref.get(); - if (referent == requestor) { - weakRef = ref; - } else if (referent == null) { - // Remove any reference that has been cleared - mAnimatorRequestors.remove(i); - } - } - if (weakRef == null) { - weakRef = new WeakReference<>(requestor); - mAnimatorRequestors.add(weakRef); - } - } else { - for (int i = mAnimatorRequestors.size() - 1; i >= 0; --i) { - WeakReference<Object> ref = mAnimatorRequestors.get(i); - Object referent = ref.get(); - if (referent == requestor || referent == null) { - // remove requested item or item that has been cleared - mAnimatorRequestors.remove(i); - } - } - // If a reference to the requestor wasn't in the list, nothing to remove - } + Log.d(TAG, "requestAnimatorsEnabledImpl called setAnimatorPausingEnabled after " + + (System.nanoTime() - startTime)); + if (enable) { + mAnimatorRequestors.add(requestor); + } else { + mAnimatorRequestors.remove(requestor); } + Log.d(TAG, "requestAnimatorsEnabledImpl added/removed after " + + (System.nanoTime() - startTime)); if (!sAnimatorPausingEnabled) { // Resume any animators that have been paused in the meantime, otherwise noop // Leave logic above so that if pausing gets re-enabled, the state of the requestors // list is valid resumeAnimators(); + Log.d(TAG, "requestAnimatorsEnabledImpl resumed, returning after " + + (System.nanoTime() - startTime)); return; } boolean isEmpty = mAnimatorRequestors.isEmpty(); @@ -213,13 +209,12 @@ public class AnimationHandler { Animator.getBackgroundPauseDelay()); } } + Log.d(TAG, "requestAnimatorsEnabledImpl post was/is check after " + + (System.nanoTime() - startTime)); if (LOCAL_LOGV) { - Log.v(TAG, (enable ? "enable" : "disable") + " animators for " + requestor - + " with pauseDelay of " + Animator.getBackgroundPauseDelay()); + Log.v(TAG, enable ? "enable" : "disable" + " animators for " + requestor); for (int i = 0; i < mAnimatorRequestors.size(); ++i) { - Log.v(TAG, "animatorRequestors " + i + " = " - + mAnimatorRequestors.get(i) + " with referent " - + mAnimatorRequestors.get(i).get()); + Log.v(TAG, "animatorRequesters " + i + " = " + mAnimatorRequestors.valueAt(i)); } } } diff --git a/core/java/android/hardware/camera2/CameraManager.java b/core/java/android/hardware/camera2/CameraManager.java index 7fed2200d606..30b7d250f828 100644 --- a/core/java/android/hardware/camera2/CameraManager.java +++ b/core/java/android/hardware/camera2/CameraManager.java @@ -25,7 +25,7 @@ import android.annotation.SystemService; import android.annotation.TestApi; import android.app.compat.CompatChanges; import android.compat.annotation.ChangeId; -import android.compat.annotation.Disabled; +import android.compat.annotation.EnabledSince; import android.compat.annotation.Overridable; import android.content.Context; import android.content.pm.PackageManager; @@ -114,7 +114,7 @@ public final class CameraManager { */ @ChangeId @Overridable - @Disabled + @EnabledSince(targetSdkVersion = android.os.Build.VERSION_CODES.TIRAMISU) @TestApi public static final long OVERRIDE_FRONT_CAMERA_APP_COMPAT = 250678880L; diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 550bf348d1c7..c0183ad48139 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -1417,11 +1417,7 @@ public final class ViewRootImpl implements ViewParent, mFirstPostImeInputStage = earlyPostImeStage; mPendingInputEventQueueLengthCounterName = "aq:pending:" + counterSuffix; - if (!mRemoved || !mAppVisible) { - AnimationHandler.requestAnimatorsEnabled(mAppVisible, this); - } else if (LOCAL_LOGV) { - Log.v(mTag, "setView() enabling visibility when removed"); - } + AnimationHandler.requestAnimatorsEnabled(mAppVisible, this); } } } @@ -1759,12 +1755,7 @@ public final class ViewRootImpl implements ViewParent, if (!mAppVisible) { WindowManagerGlobal.trimForeground(); } - // Only enable if the window is not already removed (via earlier call to doDie()) - if (!mRemoved || !mAppVisible) { - AnimationHandler.requestAnimatorsEnabled(mAppVisible, this); - } else if (LOCAL_LOGV) { - Log.v(mTag, "handleAppVisibility() enabling visibility when removed"); - } + AnimationHandler.requestAnimatorsEnabled(mAppVisible, this); } } @@ -3808,44 +3799,7 @@ public final class ViewRootImpl implements ViewParent, } if (mAdded) { - profileRendering(hasWindowFocus); - if (hasWindowFocus) { - if (mAttachInfo.mThreadedRenderer != null && mSurface.isValid()) { - mFullRedrawNeeded = true; - try { - final Rect surfaceInsets = mWindowAttributes.surfaceInsets; - mAttachInfo.mThreadedRenderer.initializeIfNeeded( - mWidth, mHeight, mAttachInfo, mSurface, surfaceInsets); - } catch (OutOfResourcesException e) { - Log.e(mTag, "OutOfResourcesException locking surface", e); - try { - if (!mWindowSession.outOfMemory(mWindow)) { - Slog.w(mTag, "No processes killed for memory;" - + " killing self"); - Process.killProcess(Process.myPid()); - } - } catch (RemoteException ex) { - } - // Retry in a bit. - mHandler.sendMessageDelayed(mHandler.obtainMessage( - MSG_WINDOW_FOCUS_CHANGED), 500); - return; - } - } - } - - mAttachInfo.mHasWindowFocus = hasWindowFocus; - mImeFocusController.updateImeFocusable(mWindowAttributes, true /* force */); - mImeFocusController.onPreWindowFocus(hasWindowFocus, mWindowAttributes); - - if (mView != null) { - mAttachInfo.mKeyDispatchState.reset(); - mView.dispatchWindowFocusChanged(hasWindowFocus); - mAttachInfo.mTreeObserver.dispatchOnWindowFocusChange(hasWindowFocus); - if (mAttachInfo.mTooltipHost != null) { - mAttachInfo.mTooltipHost.hideTooltip(); - } - } + dispatchFocusEvent(hasWindowFocus); // Note: must be done after the focus change callbacks, // so all of the view state is set up correctly. @@ -3881,6 +3835,45 @@ public final class ViewRootImpl implements ViewParent, } } + private void dispatchFocusEvent(boolean hasWindowFocus) { + profileRendering(hasWindowFocus); + if (hasWindowFocus && mAttachInfo.mThreadedRenderer != null && mSurface.isValid()) { + mFullRedrawNeeded = true; + try { + final Rect surfaceInsets = mWindowAttributes.surfaceInsets; + mAttachInfo.mThreadedRenderer.initializeIfNeeded( + mWidth, mHeight, mAttachInfo, mSurface, surfaceInsets); + } catch (OutOfResourcesException e) { + Log.e(mTag, "OutOfResourcesException locking surface", e); + try { + if (!mWindowSession.outOfMemory(mWindow)) { + Slog.w(mTag, "No processes killed for memory;" + + " killing self"); + Process.killProcess(Process.myPid()); + } + } catch (RemoteException ex) { + } + // Retry in a bit. + mHandler.sendMessageDelayed(mHandler.obtainMessage( + MSG_WINDOW_FOCUS_CHANGED), 500); + return; + } + } + + mAttachInfo.mHasWindowFocus = hasWindowFocus; + mImeFocusController.updateImeFocusable(mWindowAttributes, true /* force */); + mImeFocusController.onPreWindowFocus(hasWindowFocus, mWindowAttributes); + + if (mView != null) { + mAttachInfo.mKeyDispatchState.reset(); + mView.dispatchWindowFocusChanged(hasWindowFocus); + mAttachInfo.mTreeObserver.dispatchOnWindowFocusChange(hasWindowFocus); + if (mAttachInfo.mTooltipHost != null) { + mAttachInfo.mTooltipHost.hideTooltip(); + } + } + } + private void handleWindowTouchModeChanged() { final boolean inTouchMode; synchronized (this) { diff --git a/core/java/android/window/TaskConstants.java b/core/java/android/window/TaskConstants.java new file mode 100644 index 000000000000..c40384027adf --- /dev/null +++ b/core/java/android/window/TaskConstants.java @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.window; + +import android.annotation.IntDef; + +/** + * Holds constants related to task managements but not suitable in {@code TaskOrganizer}. + * @hide + */ +public class TaskConstants { + + /** + * Sizes of a z-order region assigned to child layers of task layers. Components are allowed to + * use all values in [assigned value, assigned value + region size). + * @hide + */ + public static final int TASK_CHILD_LAYER_REGION_SIZE = 10000; + + /** + * Indicates system responding to task drag resizing while app content isn't updated. + * @hide + */ + public static final int TASK_CHILD_LAYER_TASK_BACKGROUND = -3 * TASK_CHILD_LAYER_REGION_SIZE; + + /** + * Provides solid color letterbox background or blur effect and dimming for the wallpaper + * letterbox background. It also listens to touches for double tap gesture for repositioning + * letterbox. + * @hide + */ + public static final int TASK_CHILD_LAYER_LETTERBOX_BACKGROUND = + -2 * TASK_CHILD_LAYER_REGION_SIZE; + + /** + * When a unresizable app is moved in the different configuration, a restart button appears + * allowing to adapt (~resize) app to the new configuration mocks. + * @hide + */ + public static final int TASK_CHILD_LAYER_SIZE_COMPAT_RESTART_BUTTON = + TASK_CHILD_LAYER_REGION_SIZE; + + /** + * Shown the first time an app is opened in size compat mode in landscape. + * @hide + */ + public static final int TASK_CHILD_LAYER_LETTERBOX_EDUCATION = 2 * TASK_CHILD_LAYER_REGION_SIZE; + + /** + * Captions, window frames and resize handlers around task windows. + * @hide + */ + public static final int TASK_CHILD_LAYER_WINDOW_DECORATIONS = 3 * TASK_CHILD_LAYER_REGION_SIZE; + + /** + * Overlays the task when going into PIP w/ gesture navigation. + * @hide + */ + public static final int TASK_CHILD_LAYER_RECENTS_ANIMATION_PIP_OVERLAY = + 4 * TASK_CHILD_LAYER_REGION_SIZE; + + /** + * Allows other apps to add overlays on the task (i.e. game dashboard) + * @hide + */ + public static final int TASK_CHILD_LAYER_TASK_OVERLAY = 5 * TASK_CHILD_LAYER_REGION_SIZE; + + /** + * Legacy machanism to force an activity to the top of the task (i.e. for work profile + * comfirmation). + * @hide + */ + public static final int TASK_CHILD_LAYER_TASK_OVERLAY_ACTIVITIES = + 6 * TASK_CHILD_LAYER_REGION_SIZE; + + /** + * Z-orders of task child layers other than activities, task fragments and layers interleaved + * with them, e.g. IME windows. [-10000, 10000) is reserved for these layers. + * @hide + */ + @IntDef({ + TASK_CHILD_LAYER_TASK_BACKGROUND, + TASK_CHILD_LAYER_LETTERBOX_BACKGROUND, + TASK_CHILD_LAYER_SIZE_COMPAT_RESTART_BUTTON, + TASK_CHILD_LAYER_LETTERBOX_EDUCATION, + TASK_CHILD_LAYER_WINDOW_DECORATIONS, + TASK_CHILD_LAYER_RECENTS_ANIMATION_PIP_OVERLAY, + TASK_CHILD_LAYER_TASK_OVERLAY, + TASK_CHILD_LAYER_TASK_OVERLAY_ACTIVITIES + }) + public @interface TaskChildLayer {} +} diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 9508a95340d0..1934d6e8208e 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -1167,8 +1167,8 @@ <string name="no" msgid="5122037903299899715">"Cancel·la"</string> <string name="dialog_alert_title" msgid="651856561974090712">"Atenció"</string> <string name="loading" msgid="3138021523725055037">"S\'està carregant…"</string> - <string name="capital_on" msgid="2770685323900821829">"SÍ"</string> - <string name="capital_off" msgid="7443704171014626777">"NO"</string> + <string name="capital_on" msgid="2770685323900821829">"ACTIVAT"</string> + <string name="capital_off" msgid="7443704171014626777">"DESACTIVAT"</string> <string name="checked" msgid="9179896827054513119">"seleccionat"</string> <string name="not_checked" msgid="7972320087569023342">"no seleccionat"</string> <string name="selected" msgid="6614607926197755875">"seleccionat"</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 9d928d20c465..4e5c8f72b0fe 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -1167,8 +1167,8 @@ <string name="no" msgid="5122037903299899715">"Cancelar"</string> <string name="dialog_alert_title" msgid="651856561974090712">"Atención"</string> <string name="loading" msgid="3138021523725055037">"Cargando…"</string> - <string name="capital_on" msgid="2770685323900821829">"Sí"</string> - <string name="capital_off" msgid="7443704171014626777">"No"</string> + <string name="capital_on" msgid="2770685323900821829">"ACTIVADO"</string> + <string name="capital_off" msgid="7443704171014626777">"Desactivado"</string> <string name="checked" msgid="9179896827054513119">"activado"</string> <string name="not_checked" msgid="7972320087569023342">"desactivado"</string> <string name="selected" msgid="6614607926197755875">"seleccionado"</string> diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index d7d87df02a0b..e60a96e3a4b7 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -565,12 +565,12 @@ <string name="permdesc_manageFingerprint" msgid="2025616816437339865">"Aztarna digitalaren txantiloiak gehitzeko eta ezabatzeko metodoei dei egitea baimentzen die aplikazioei."</string> <string name="permlab_useFingerprint" msgid="1001421069766751922">"erabili hatz-marken hardwarea"</string> <string name="permdesc_useFingerprint" msgid="412463055059323742">"Autentifikatzeko hatz-marken hardwarea erabiltzeko baimena ematen die aplikazioei."</string> - <string name="permlab_audioWrite" msgid="8501705294265669405">"musika-bilduma aldatu"</string> - <string name="permdesc_audioWrite" msgid="8057399517013412431">"Musika-bilduma aldatzeko baimena ematen die aplikazioei."</string> - <string name="permlab_videoWrite" msgid="5940738769586451318">"bideo-bilduma aldatu"</string> - <string name="permdesc_videoWrite" msgid="6124731210613317051">"Bideo-bilduma aldatzeko baimena ematen die aplikazioei."</string> - <string name="permlab_imagesWrite" msgid="1774555086984985578">"argazki-bilduma aldatu"</string> - <string name="permdesc_imagesWrite" msgid="5195054463269193317">"Argazki-bilduma aldatzeko baimena ematen die aplikazioei."</string> + <string name="permlab_audioWrite" msgid="8501705294265669405">"musika bilduma aldatu"</string> + <string name="permdesc_audioWrite" msgid="8057399517013412431">"Musika bilduma aldatzeko baimena ematen die aplikazioei."</string> + <string name="permlab_videoWrite" msgid="5940738769586451318">"bideo bilduma aldatu"</string> + <string name="permdesc_videoWrite" msgid="6124731210613317051">"Bideo bilduma aldatzeko baimena ematen die aplikazioei."</string> + <string name="permlab_imagesWrite" msgid="1774555086984985578">"argazki bilduma aldatu"</string> + <string name="permdesc_imagesWrite" msgid="5195054463269193317">"Argazki bilduma aldatzeko baimena ematen die aplikazioei."</string> <string name="permlab_mediaLocation" msgid="7368098373378598066">"multimedia-edukien bildumako kokapena irakurri"</string> <string name="permdesc_mediaLocation" msgid="597912899423578138">"Multimedia-edukien bildumako kokapena irakurtzeko baimena ematen die aplikazioei."</string> <string name="biometric_app_setting_name" msgid="3339209978734534457">"Erabili sistema biometrikoak"</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 04cca86e6076..c2a84607706d 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -1167,8 +1167,8 @@ <string name="no" msgid="5122037903299899715">"Annuler"</string> <string name="dialog_alert_title" msgid="651856561974090712">"Attention"</string> <string name="loading" msgid="3138021523725055037">"Chargement…"</string> - <string name="capital_on" msgid="2770685323900821829">"OUI"</string> - <string name="capital_off" msgid="7443704171014626777">"NON"</string> + <string name="capital_on" msgid="2770685323900821829">"ACTIVÉ"</string> + <string name="capital_off" msgid="7443704171014626777">"DÉSACTIVÉ"</string> <string name="checked" msgid="9179896827054513119">"activé"</string> <string name="not_checked" msgid="7972320087569023342">"désactivé"</string> <string name="selected" msgid="6614607926197755875">"sélectionné"</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index ec39ba2d7a0b..30426c9b34f2 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -1487,7 +1487,7 @@ <string name="accessibility_binding_label" msgid="1974602776545801715">"נגישות"</string> <string name="wallpaper_binding_label" msgid="1197440498000786738">"טפט"</string> <string name="chooser_wallpaper" msgid="3082405680079923708">"שינוי טפט"</string> - <string name="notification_listener_binding_label" msgid="2702165274471499713">"מאזין להתראות"</string> + <string name="notification_listener_binding_label" msgid="2702165274471499713">"האזנה להתראות"</string> <string name="vr_listener_binding_label" msgid="8013112996671206429">"VR ליסנר"</string> <string name="condition_provider_service_binding_label" msgid="8490641013951857673">"ספק תנאי"</string> <string name="notification_ranker_binding_label" msgid="432708245635563763">"שירות של דירוג התראות"</string> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index 83efe7194a70..12015ec6d85f 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -1486,7 +1486,7 @@ <string name="accessibility_binding_label" msgid="1974602776545801715">"Tillgänglighet"</string> <string name="wallpaper_binding_label" msgid="1197440498000786738">"Bakgrund"</string> <string name="chooser_wallpaper" msgid="3082405680079923708">"Ändra bakgrund"</string> - <string name="notification_listener_binding_label" msgid="2702165274471499713">"Meddelandelyssnare"</string> + <string name="notification_listener_binding_label" msgid="2702165274471499713">"Aviseringslyssnare"</string> <string name="vr_listener_binding_label" msgid="8013112996671206429">"Lyssnare för VR"</string> <string name="condition_provider_service_binding_label" msgid="8490641013951857673">"Leverantör"</string> <string name="notification_ranker_binding_label" msgid="432708245635563763">"Rankningstjänst för aviseringar"</string> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index 8db018d6db0c..cc4d15e339dd 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -652,9 +652,9 @@ <string name="face_acquired_recalibrate" msgid="8724013080976469746">"請重新註冊面孔。"</string> <string name="face_acquired_too_different" msgid="2520389515612972889">"無法辨識面孔,請再試一次。"</string> <string name="face_acquired_too_similar" msgid="8882920552674125694">"請稍為轉換頭部的位置"</string> - <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"請正面望向手機"</string> - <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"請正面望向手機"</string> - <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"請正面望向手機"</string> + <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"正面望向手機"</string> + <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"正面望向手機"</string> + <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"正面望向手機"</string> <string name="face_acquired_obscured" msgid="4917643294953326639">"移開遮住面孔的任何物件。"</string> <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"請清理螢幕頂部,包括黑色列"</string> <!-- no translation found for face_acquired_dark_glasses_detected (5643703296620631986) --> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 18c29d196ada..bbbb79c79527 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -5300,6 +5300,10 @@ <!-- Whether using split screen aspect ratio as a default aspect ratio for unresizable apps. --> <bool name="config_letterboxIsSplitScreenAspectRatioForUnresizableAppsEnabled">false</bool> + <!-- Whether the specific behaviour for translucent activities letterboxing is enabled. + TODO(b/255532890) Enable when ignoreOrientationRequest is set --> + <bool name="config_letterboxIsEnabledForTranslucentActivities">false</bool> + <!-- Whether a camera compat controller is enabled to allow the user to apply or revert treatment for stretched issues in camera viewfinder. --> <bool name="config_isCameraCompatControlForStretchedIssuesEnabled">false</bool> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index b9259218c2d3..b0f6ae6085e3 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -4401,6 +4401,9 @@ <!-- Set to true to make assistant show in front of the dream/screensaver. --> <java-symbol type="bool" name="config_assistantOnTopOfDream"/> + <!-- Set to true to enable letterboxing on translucent activities. --> + <java-symbol type="bool" name="config_letterboxIsEnabledForTranslucentActivities" /> + <java-symbol type="string" name="config_overrideComponentUiPackage" /> <java-symbol type="string" name="notification_channel_network_status" /> diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/WindowExtensionsImpl.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/WindowExtensionsImpl.java index 7e9c4189dabb..fb0a9db6a20b 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/WindowExtensionsImpl.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/WindowExtensionsImpl.java @@ -41,7 +41,7 @@ public class WindowExtensionsImpl implements WindowExtensions { // TODO(b/241126279) Introduce constants to better version functionality @Override public int getVendorApiLevel() { - return 2; + return 1; } /** diff --git a/libs/WindowManager/Shell/res/values-hi/strings.xml b/libs/WindowManager/Shell/res/values-hi/strings.xml index 9229fc2ae1e1..bed39fb77400 100644 --- a/libs/WindowManager/Shell/res/values-hi/strings.xml +++ b/libs/WindowManager/Shell/res/values-hi/strings.xml @@ -33,8 +33,7 @@ <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> - <!-- no translation found for dock_multi_instances_not_supported_text (5242868470666346929) --> - <skip /> + <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"इस ऐप्लिकेशन को सिर्फ़ एक विंडो में खोला जा सकता है."</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> diff --git a/libs/WindowManager/Shell/res/values/config.xml b/libs/WindowManager/Shell/res/values/config.xml index c6197c8a730b..23db2335ecc0 100644 --- a/libs/WindowManager/Shell/res/values/config.xml +++ b/libs/WindowManager/Shell/res/values/config.xml @@ -113,6 +113,6 @@ <bool name="config_dimNonImeAttachedSide">true</bool> <!-- Components support to launch multiple instances into split-screen --> - <string-array name="config_componentsSupportMultiInstancesSplit"> + <string-array name="config_appsSupportMultiInstancesSplit"> </string-array> </resources> 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 214b304df07c..c63419851f7f 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 @@ -403,5 +403,10 @@ public class DividerView extends FrameLayout implements View.OnTouchListener { } return true; } + + @Override + public boolean onDoubleTapEvent(@NonNull MotionEvent e) { + return true; + } } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitDecorManager.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitDecorManager.java index c836b95ffab8..a9d3c9f154cd 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitDecorManager.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitDecorManager.java @@ -74,7 +74,8 @@ public class SplitDecorManager extends WindowlessWindowManager { private boolean mShown; private boolean mIsResizing; - private final Rect mBounds = new Rect(); + private final Rect mOldBounds = new Rect(); + private final Rect mResizingBounds = new Rect(); private final Rect mTempRect = new Rect(); private ValueAnimator mFadeAnimator; @@ -158,6 +159,8 @@ public class SplitDecorManager extends WindowlessWindowManager { mResizingIconView = null; mIsResizing = false; mShown = false; + mOldBounds.setEmpty(); + mResizingBounds.setEmpty(); } /** Showing resizing hint. */ @@ -170,13 +173,14 @@ public class SplitDecorManager extends WindowlessWindowManager { if (!mIsResizing) { mIsResizing = true; - mBounds.set(newBounds); + mOldBounds.set(newBounds); } + mResizingBounds.set(newBounds); mOffsetX = offsetX; mOffsetY = offsetY; final boolean show = - newBounds.width() > mBounds.width() || newBounds.height() > mBounds.height(); + newBounds.width() > mOldBounds.width() || newBounds.height() > mOldBounds.height(); final boolean update = show != mShown; if (update && mFadeAnimator != null && mFadeAnimator.isRunning()) { // If we need to animate and animator still running, cancel it before we ensure both @@ -193,8 +197,8 @@ public class SplitDecorManager extends WindowlessWindowManager { if (mGapBackgroundLeash == null && !immediately) { final boolean isLandscape = newBounds.height() == sideBounds.height(); - final int left = isLandscape ? mBounds.width() : 0; - final int top = isLandscape ? 0 : mBounds.height(); + final int left = isLandscape ? mOldBounds.width() : 0; + final int top = isLandscape ? 0 : mOldBounds.height(); mGapBackgroundLeash = SurfaceUtils.makeColorLayer(mHostLeash, GAP_BACKGROUND_SURFACE_NAME, mSurfaceSession); // Fill up another side bounds area. @@ -272,6 +276,8 @@ public class SplitDecorManager extends WindowlessWindowManager { mIsResizing = false; mOffsetX = 0; mOffsetY = 0; + mOldBounds.setEmpty(); + mResizingBounds.setEmpty(); if (mFadeAnimator != null && mFadeAnimator.isRunning()) { if (!mShown) { // If fade-out animation is running, just add release callback to it. @@ -303,8 +309,8 @@ public class SplitDecorManager extends WindowlessWindowManager { /** Screenshot host leash and attach on it if meet some conditions */ public void screenshotIfNeeded(SurfaceControl.Transaction t) { - if (!mShown && mIsResizing) { - mTempRect.set(mBounds); + if (!mShown && mIsResizing && !mOldBounds.equals(mResizingBounds)) { + mTempRect.set(mOldBounds); mTempRect.offsetTo(0, 0); mScreenshot = ScreenshotUtils.takeScreenshot(t, mHostLeash, mTempRect, Integer.MAX_VALUE - 1); @@ -315,7 +321,7 @@ public class SplitDecorManager extends WindowlessWindowManager { public void setScreenshotIfNeeded(SurfaceControl screenshot, SurfaceControl.Transaction t) { if (screenshot == null || !screenshot.isValid()) return; - if (!mShown && mIsResizing) { + if (!mShown && mIsResizing && !mOldBounds.equals(mResizingBounds)) { mScreenshot = screenshot; t.reparent(screenshot, mHostLeash); t.setLayer(screenshot, Integer.MAX_VALUE - 1); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java index 62bf5172e106..d93a9012c8f1 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java @@ -240,7 +240,7 @@ public class DragAndDropPolicy { // Update launch options for the split side we are targeting. position = leftOrTop ? SPLIT_POSITION_TOP_OR_LEFT : SPLIT_POSITION_BOTTOM_OR_RIGHT; // Add some data for logging splitscreen once it is invoked - mSplitScreen.logOnDroppedToSplit(position, mLoggerSessionId); + mSplitScreen.onDroppedToSplit(position, mLoggerSessionId); } final ClipDescription description = data.getDescription(); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/MainStage.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/MainStage.java index e7ec15e70c11..89538cb394d4 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/MainStage.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/MainStage.java @@ -16,9 +16,6 @@ package com.android.wm.shell.splitscreen; -import static com.android.wm.shell.common.split.SplitScreenConstants.CONTROLLED_ACTIVITY_TYPES; -import static com.android.wm.shell.common.split.SplitScreenConstants.CONTROLLED_WINDOWING_MODES; - import android.content.Context; import android.view.SurfaceSession; import android.window.WindowContainerToken; @@ -34,8 +31,6 @@ import com.android.wm.shell.common.SyncTransactionQueue; * @see StageCoordinator */ class MainStage extends StageTaskListener { - private static final String TAG = MainStage.class.getSimpleName(); - private boolean mIsActive = false; MainStage(Context context, ShellTaskOrganizer taskOrganizer, int displayId, @@ -52,15 +47,8 @@ class MainStage extends StageTaskListener { void activate(WindowContainerTransaction wct, boolean includingTopTask) { if (mIsActive) return; - final WindowContainerToken rootToken = mRootTaskInfo.token; if (includingTopTask) { - wct.reparentTasks( - null /* currentParent */, - rootToken, - CONTROLLED_WINDOWING_MODES, - CONTROLLED_ACTIVITY_TYPES, - true /* onTop */, - true /* reparentTopOnly */); + reparentTopTask(wct); } mIsActive = true; diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java index 9329d021d007..ef70d9bd84ee 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java @@ -18,7 +18,6 @@ package com.android.wm.shell.splitscreen; import static android.app.ActivityManager.START_SUCCESS; import static android.app.ActivityManager.START_TASK_TO_FRONT; -import static android.app.ActivityTaskManager.INVALID_TASK_ID; import static android.content.Intent.FLAG_ACTIVITY_MULTIPLE_TASK; import static android.content.Intent.FLAG_ACTIVITY_NO_USER_ACTION; import static android.view.Display.DEFAULT_DISPLAY; @@ -98,7 +97,6 @@ import com.android.wm.shell.transition.Transitions; import java.io.PrintWriter; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; -import java.util.Objects; import java.util.Optional; import java.util.concurrent.Executor; @@ -123,7 +121,8 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, public static final int EXIT_REASON_SCREEN_LOCKED = 7; public static final int EXIT_REASON_SCREEN_LOCKED_SHOW_ON_TOP = 8; public static final int EXIT_REASON_CHILD_TASK_ENTER_PIP = 9; - public static final int EXIT_REASON_FULLSCREEN_SHORTCUT = 10; + public static final int EXIT_REASON_RECREATE_SPLIT = 10; + public static final int EXIT_REASON_FULLSCREEN_SHORTCUT = 11; @IntDef(value = { EXIT_REASON_UNKNOWN, EXIT_REASON_APP_DOES_NOT_SUPPORT_MULTIWINDOW, @@ -135,6 +134,7 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, EXIT_REASON_SCREEN_LOCKED, EXIT_REASON_SCREEN_LOCKED_SHOW_ON_TOP, EXIT_REASON_CHILD_TASK_ENTER_PIP, + EXIT_REASON_RECREATE_SPLIT, EXIT_REASON_FULLSCREEN_SHORTCUT, }) @Retention(RetentionPolicy.SOURCE) @@ -171,7 +171,7 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, private final IconProvider mIconProvider; private final Optional<RecentTasksController> mRecentTasksOptional; private final SplitScreenShellCommandHandler mSplitScreenShellCommandHandler; - private final String[] mMultiInstancesComponents; + private final String[] mAppsSupportMultiInstances; @VisibleForTesting StageCoordinator mStageCoordinator; @@ -221,8 +221,8 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, // TODO(255224696): Remove the config once having a way for client apps to opt-in // multi-instances split. - mMultiInstancesComponents = mContext.getResources() - .getStringArray(R.array.config_componentsSupportMultiInstancesSplit); + mAppsSupportMultiInstances = mContext.getResources() + .getStringArray(R.array.config_appsSupportMultiInstancesSplit); } @VisibleForTesting @@ -261,8 +261,8 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, mStageCoordinator = stageCoordinator; mSplitScreenShellCommandHandler = new SplitScreenShellCommandHandler(this); shellInit.addInitCallback(this::onInit, this); - mMultiInstancesComponents = mContext.getResources() - .getStringArray(R.array.config_componentsSupportMultiInstancesSplit); + mAppsSupportMultiInstances = mContext.getResources() + .getStringArray(R.array.config_appsSupportMultiInstancesSplit); } public SplitScreen asSplitScreen() { @@ -472,7 +472,7 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, */ public void startShortcut(String packageName, String shortcutId, @SplitPosition int position, @Nullable Bundle options, UserHandle user, @NonNull InstanceId instanceId) { - mStageCoordinator.getLogger().enterRequested(instanceId, ENTER_REASON_LAUNCHER); + mStageCoordinator.onRequestToSplit(instanceId, ENTER_REASON_LAUNCHER); startShortcut(packageName, shortcutId, position, options, user); } @@ -520,7 +520,7 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, */ public void startIntent(PendingIntent intent, @Nullable Intent fillInIntent, @SplitPosition int position, @Nullable Bundle options, @NonNull InstanceId instanceId) { - mStageCoordinator.getLogger().enterRequested(instanceId, ENTER_REASON_LAUNCHER); + mStageCoordinator.onRequestToSplit(instanceId, ENTER_REASON_LAUNCHER); startIntent(intent, fillInIntent, position, options); } @@ -529,7 +529,7 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, @SplitPosition int splitPosition, float splitRatio, RemoteAnimationAdapter adapter, InstanceId instanceId) { Intent fillInIntent = null; - if (launchSameComponentAdjacently(pendingIntent, splitPosition, taskId)) { + if (launchSameAppAdjacently(pendingIntent, taskId)) { if (supportMultiInstancesSplit(pendingIntent.getIntent().getComponent())) { fillInIntent = new Intent(); fillInIntent.addFlags(FLAG_ACTIVITY_MULTIPLE_TASK); @@ -556,7 +556,7 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, int taskId, @Nullable Bundle options2, @SplitPosition int splitPosition, float splitRatio, @Nullable RemoteTransition remoteTransition, InstanceId instanceId) { Intent fillInIntent = null; - if (launchSameComponentAdjacently(pendingIntent, splitPosition, taskId)) { + if (launchSameAppAdjacently(pendingIntent, taskId)) { if (supportMultiInstancesSplit(pendingIntent.getIntent().getComponent())) { fillInIntent = new Intent(); fillInIntent.addFlags(FLAG_ACTIVITY_MULTIPLE_TASK); @@ -578,7 +578,7 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, float splitRatio, RemoteAnimationAdapter adapter, InstanceId instanceId) { Intent fillInIntent1 = null; Intent fillInIntent2 = null; - if (launchSameComponentAdjacently(pendingIntent1, pendingIntent2)) { + if (launchSameAppAdjacently(pendingIntent1, pendingIntent2)) { if (supportMultiInstancesSplit(pendingIntent1.getIntent().getComponent())) { fillInIntent1 = new Intent(); fillInIntent1.addFlags(FLAG_ACTIVITY_MULTIPLE_TASK); @@ -613,7 +613,7 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, if (fillInIntent == null) fillInIntent = new Intent(); fillInIntent.addFlags(FLAG_ACTIVITY_NO_USER_ACTION); - if (launchSameComponentAdjacently(intent, position, INVALID_TASK_ID)) { + if (launchSameAppAdjacently(position, intent)) { final ComponentName launching = intent.getIntent().getComponent(); if (supportMultiInstancesSplit(launching)) { // To prevent accumulating large number of instances in the background, reuse task @@ -647,47 +647,52 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, mStageCoordinator.startIntent(intent, fillInIntent, position, options); } - /** Returns {@code true} if it's launching the same component on both sides of the split. */ - private boolean launchSameComponentAdjacently(@Nullable PendingIntent pendingIntent, - @SplitPosition int position, int taskId) { - if (pendingIntent == null || pendingIntent.getIntent() == null) return false; - - final ComponentName launchingActivity = pendingIntent.getIntent().getComponent(); - if (launchingActivity == null) return false; - - if (taskId != INVALID_TASK_ID) { - final ActivityManager.RunningTaskInfo taskInfo = - mTaskOrganizer.getRunningTaskInfo(taskId); - if (taskInfo != null) { - return Objects.equals(taskInfo.baseIntent.getComponent(), launchingActivity); - } - return false; + @Nullable + private String getPackageName(Intent intent) { + if (intent == null || intent.getComponent() == null) { + return null; } + return intent.getComponent().getPackageName(); + } - if (!isSplitScreenVisible()) { - // Split screen is not yet activated, check if the current top running task is valid to - // split together. - final ActivityManager.RunningTaskInfo topRunningTask = mRecentTasksOptional + private boolean launchSameAppAdjacently(@SplitPosition int position, + PendingIntent pendingIntent) { + ActivityManager.RunningTaskInfo adjacentTaskInfo = null; + if (isSplitScreenVisible()) { + adjacentTaskInfo = getTaskInfo(SplitLayout.reversePosition(position)); + } else { + adjacentTaskInfo = mRecentTasksOptional .map(recentTasks -> recentTasks.getTopRunningTask()).orElse(null); - if (topRunningTask != null && isValidToEnterSplitScreen(topRunningTask)) { - return Objects.equals(topRunningTask.baseIntent.getComponent(), launchingActivity); + if (!isValidToEnterSplitScreen(adjacentTaskInfo)) { + return false; } + } + + if (adjacentTaskInfo == null) { return false; } - // Compare to the adjacent side of the split to determine if this is launching the same - // component adjacently. - final ActivityManager.RunningTaskInfo pairedTaskInfo = - getTaskInfo(SplitLayout.reversePosition(position)); - final ComponentName pairedActivity = pairedTaskInfo != null - ? pairedTaskInfo.baseIntent.getComponent() : null; - return Objects.equals(launchingActivity, pairedActivity); + final String targetPackageName = getPackageName(pendingIntent.getIntent()); + final String adjacentPackageName = getPackageName(adjacentTaskInfo.baseIntent); + return targetPackageName != null && targetPackageName.equals(adjacentPackageName); + } + + private boolean launchSameAppAdjacently(PendingIntent pendingIntent, int taskId) { + final ActivityManager.RunningTaskInfo adjacentTaskInfo = + mTaskOrganizer.getRunningTaskInfo(taskId); + if (adjacentTaskInfo == null) { + return false; + } + final String targetPackageName = getPackageName(pendingIntent.getIntent()); + final String adjacentPackageName = getPackageName(adjacentTaskInfo.baseIntent); + return targetPackageName != null && targetPackageName.equals(adjacentPackageName); } - private boolean launchSameComponentAdjacently(PendingIntent pendingIntent1, + private boolean launchSameAppAdjacently(PendingIntent pendingIntent1, PendingIntent pendingIntent2) { - return Objects.equals(pendingIntent1.getIntent().getComponent(), - pendingIntent2.getIntent().getComponent()); + final String targetPackageName = getPackageName(pendingIntent1.getIntent()); + final String adjacentPackageName = getPackageName(pendingIntent2.getIntent()); + return targetPackageName != null && targetPackageName.equals(adjacentPackageName); } @VisibleForTesting @@ -695,9 +700,9 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, boolean supportMultiInstancesSplit(@Nullable ComponentName launching) { if (launching == null) return false; - final String componentName = launching.flattenToString(); - for (int i = 0; i < mMultiInstancesComponents.length; i++) { - if (mMultiInstancesComponents[i].equals(componentName)) { + final String packageName = launching.getPackageName(); + for (int i = 0; i < mAppsSupportMultiInstances.length; i++) { + if (mAppsSupportMultiInstances[i].equals(packageName)) { return true; } } @@ -781,10 +786,10 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, return splitTasksLayer; } /** - * Sets drag info to be logged when splitscreen is entered. + * Drop callback when splitscreen is entered. */ - public void logOnDroppedToSplit(@SplitPosition int position, InstanceId dragSessionId) { - mStageCoordinator.logOnDroppedToSplit(position, dragSessionId); + public void onDroppedToSplit(@SplitPosition int position, InstanceId dragSessionId) { + mStageCoordinator.onDroppedToSplit(position, dragSessionId); } /** @@ -812,6 +817,8 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, return "APP_DOES_NOT_SUPPORT_MULTIWINDOW"; case EXIT_REASON_CHILD_TASK_ENTER_PIP: return "CHILD_TASK_ENTER_PIP"; + case EXIT_REASON_RECREATE_SPLIT: + return "RECREATE_SPLIT"; default: return "unknown reason, reason int = " + exitReason; } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitscreenEventLogger.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitscreenEventLogger.java index 1016e1bcd66f..5483fa5d29f6 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitscreenEventLogger.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitscreenEventLogger.java @@ -21,9 +21,11 @@ import static com.android.internal.util.FrameworkStatsLog.SPLITSCREEN_UICHANGED_ import static com.android.internal.util.FrameworkStatsLog.SPLITSCREEN_UICHANGED__ENTER_REASON__UNKNOWN_ENTER; import static com.android.internal.util.FrameworkStatsLog.SPLITSCREEN_UICHANGED__EXIT_REASON__APP_DOES_NOT_SUPPORT_MULTIWINDOW; import static com.android.internal.util.FrameworkStatsLog.SPLITSCREEN_UICHANGED__EXIT_REASON__APP_FINISHED; +import static com.android.internal.util.FrameworkStatsLog.SPLITSCREEN_UICHANGED__EXIT_REASON__CHILD_TASK_ENTER_PIP; import static com.android.internal.util.FrameworkStatsLog.SPLITSCREEN_UICHANGED__EXIT_REASON__DEVICE_FOLDED; import static com.android.internal.util.FrameworkStatsLog.SPLITSCREEN_UICHANGED__EXIT_REASON__DRAG_DIVIDER; import static com.android.internal.util.FrameworkStatsLog.SPLITSCREEN_UICHANGED__EXIT_REASON__FULLSCREEN_SHORTCUT; +import static com.android.internal.util.FrameworkStatsLog.SPLITSCREEN_UICHANGED__EXIT_REASON__RECREATE_SPLIT; import static com.android.internal.util.FrameworkStatsLog.SPLITSCREEN_UICHANGED__EXIT_REASON__RETURN_HOME; import static com.android.internal.util.FrameworkStatsLog.SPLITSCREEN_UICHANGED__EXIT_REASON__ROOT_TASK_VANISHED; import static com.android.internal.util.FrameworkStatsLog.SPLITSCREEN_UICHANGED__EXIT_REASON__SCREEN_LOCKED; @@ -37,9 +39,11 @@ import static com.android.wm.shell.splitscreen.SplitScreenController.ENTER_REASO import static com.android.wm.shell.splitscreen.SplitScreenController.ENTER_REASON_UNKNOWN; import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_APP_DOES_NOT_SUPPORT_MULTIWINDOW; import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_APP_FINISHED; +import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_CHILD_TASK_ENTER_PIP; import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_DEVICE_FOLDED; import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_DRAG_DIVIDER; import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_FULLSCREEN_SHORTCUT; +import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_RECREATE_SPLIT; import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_RETURN_HOME; import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_ROOT_TASK_VANISHED; import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_SCREEN_LOCKED; @@ -182,6 +186,10 @@ public class SplitscreenEventLogger { return SPLITSCREEN_UICHANGED__EXIT_REASON__SCREEN_LOCKED; case EXIT_REASON_SCREEN_LOCKED_SHOW_ON_TOP: return SPLITSCREEN_UICHANGED__EXIT_REASON__SCREEN_LOCKED_SHOW_ON_TOP; + case EXIT_REASON_CHILD_TASK_ENTER_PIP: + return SPLITSCREEN_UICHANGED__EXIT_REASON__CHILD_TASK_ENTER_PIP; + case EXIT_REASON_RECREATE_SPLIT: + return SPLITSCREEN_UICHANGED__EXIT_REASON__RECREATE_SPLIT; case EXIT_REASON_FULLSCREEN_SHORTCUT: return SPLITSCREEN_UICHANGED__EXIT_REASON__FULLSCREEN_SHORTCUT; case EXIT_REASON_UNKNOWN: diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java index da8dc8733ef5..602d0e6c0201 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java @@ -49,10 +49,11 @@ import static com.android.wm.shell.splitscreen.SplitScreenController.ENTER_REASO import static com.android.wm.shell.splitscreen.SplitScreenController.ENTER_REASON_MULTI_INSTANCE; import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_APP_DOES_NOT_SUPPORT_MULTIWINDOW; import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_APP_FINISHED; -import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_FULLSCREEN_SHORTCUT; import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_CHILD_TASK_ENTER_PIP; import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_DEVICE_FOLDED; import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_DRAG_DIVIDER; +import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_FULLSCREEN_SHORTCUT; +import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_RECREATE_SPLIT; import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_RETURN_HOME; import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_ROOT_TASK_VANISHED; import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_SCREEN_LOCKED_SHOW_ON_TOP; @@ -199,7 +200,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, // and exit, since exit itself can trigger a number of changes that update the stages. private boolean mShouldUpdateRecents; private boolean mExitSplitScreenOnHide; - private boolean mIsDividerRemoteAnimating; + private boolean mIsSplitEntering; + private boolean mIsDropEntering; private boolean mIsExiting; /** The target stage to dismiss to when unlock after folded. */ @@ -347,10 +349,19 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, return mSplitTransitions; } - boolean isSplitScreenVisible() { + public boolean isSplitScreenVisible() { return mSideStageListener.mVisible && mMainStageListener.mVisible; } + public boolean isSplitActive() { + return mMainStage.isActive(); + } + + boolean isSplitScreenRunningBackground() { + return !isSplitScreenVisible() && mMainStageListener.mHasChildren + && mSideStageListener.mHasChildren; + } + @StageType int getStageOfTask(int taskId) { if (mMainStage.containsTask(taskId)) { @@ -373,11 +384,12 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, targetStage = mSideStage; sideStagePosition = stagePosition; } else { - if (mMainStage.isActive()) { + if (isSplitScreenVisible()) { // If the split screen is activated, retrieves target stage based on position. targetStage = stagePosition == mSideStagePosition ? mSideStage : mMainStage; sideStagePosition = mSideStagePosition; } else { + exitSplitIfBackground(); targetStage = mSideStage; sideStagePosition = stagePosition; } @@ -673,6 +685,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, @Nullable PendingIntent mainPendingIntent, @Nullable Intent mainFillInIntent, @Nullable Bundle mainOptions, @SplitPosition int sidePosition, float splitRatio, RemoteAnimationAdapter adapter, InstanceId instanceId) { + exitSplitIfBackground(); // Init divider first to make divider leash for remote animation target. mSplitLayout.init(); mSplitLayout.setDivideRatio(splitRatio); @@ -685,11 +698,13 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, // Set false to avoid record new bounds with old task still on top; mShouldUpdateRecents = false; - mIsDividerRemoteAnimating = true; + mIsSplitEntering = true; final WindowContainerTransaction evictWct = new WindowContainerTransaction(); - prepareEvictChildTasks(SPLIT_POSITION_TOP_OR_LEFT, evictWct); - prepareEvictChildTasks(SPLIT_POSITION_BOTTOM_OR_RIGHT, evictWct); + if (isSplitScreenVisible()) { + mMainStage.evictAllChildren(evictWct); + mSideStage.evictAllChildren(evictWct); + } IRemoteAnimationRunner wrapper = new IRemoteAnimationRunner.Stub() { @Override @@ -769,7 +784,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, private void onRemoteAnimationFinishedOrCancelled(boolean cancel, WindowContainerTransaction evictWct) { - mIsDividerRemoteAnimating = false; + mIsSplitEntering = false; mShouldUpdateRecents = true; // If any stage has no child after animation finished, it means that split will display // nothing, such status will happen if task and intent is same app but not support @@ -781,6 +796,9 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, mSplitUnsupportedToast.show(); } else { mSyncQueue.queue(evictWct); + mSyncQueue.runInSync(t -> { + updateSurfaceBounds(mSplitLayout, t, false /* applyResizingOffset */); + }); } } @@ -815,7 +833,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, switch (stage) { case STAGE_TYPE_UNDEFINED: { if (position != SPLIT_POSITION_UNDEFINED) { - if (mMainStage.isActive()) { + if (isSplitScreenVisible()) { // Use the stage of the specified position options = resolveStartStage( position == mSideStagePosition ? STAGE_TYPE_SIDE : STAGE_TYPE_MAIN, @@ -1045,7 +1063,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } }); mShouldUpdateRecents = false; - mIsDividerRemoteAnimating = false; + mIsSplitEntering = false; mSplitLayout.getInvisibleBounds(mTempRect1); if (childrenToTop == null || childrenToTop.getTopVisibleChildTaskId() == INVALID_TASK_ID) { @@ -1064,6 +1082,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, wct.setSmallestScreenWidthDp(childrenToTop.mRootTaskInfo.token, SMALLEST_SCREEN_WIDTH_DP_UNDEFINED); } + wct.setReparentLeafTaskIfRelaunch(mRootTaskInfo.token, + false /* reparentLeafTaskIfRelaunch */); mSyncQueue.queue(wct); mSyncQueue.runInSync(t -> { t.setWindowCrop(mMainStage.mRootLeash, null) @@ -1102,6 +1122,13 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } } + /** Exit split screen if it still running background */ + public void exitSplitIfBackground() { + if (!isSplitScreenRunningBackground()) return; + + exitSplitScreen(null /* childrenToTop */, EXIT_REASON_RECREATE_SPLIT); + } + /** * Overridden by child classes. */ @@ -1374,7 +1401,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, && !ENABLE_SHELL_TRANSITIONS) { // Clear the divider remote animating flag as the divider will be re-rendered to apply // the new rotation config. - mIsDividerRemoteAnimating = false; + mIsSplitEntering = false; mSplitLayout.update(null /* t */); onLayoutSizeChanged(mSplitLayout); } @@ -1423,6 +1450,33 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, }); } + void onChildTaskAppeared(StageListenerImpl stageListener, int taskId) { + if (stageListener == mSideStageListener && isSplitScreenRunningBackground()) { + // Handle entring split case here if split already running background. + if (mIsDropEntering) { + mSplitLayout.resetDividerPosition(); + } else { + mSplitLayout.setDividerAtBorder(mSideStagePosition == SPLIT_POSITION_TOP_OR_LEFT); + } + final WindowContainerTransaction wct = new WindowContainerTransaction(); + mMainStage.evictAllChildren(wct); + mSideStage.evictOtherChildren(wct, taskId); + mMainStage.reparentTopTask(wct); + updateWindowBounds(mSplitLayout, wct); + wct.reorder(mRootTaskInfo.token, true); + + mSyncQueue.queue(wct); + mSyncQueue.runInSync(t -> { + if (mIsDropEntering) { + updateSurfaceBounds(mSplitLayout, t, false /* applyResizingOffset */); + mIsDropEntering = false; + } else { + mSplitLayout.flingDividerToCenter(); + } + }); + } + } + private void onRootTaskVanished() { final WindowContainerTransaction wct = new WindowContainerTransaction(); if (mRootTaskInfo != null) { @@ -1441,20 +1495,20 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, return; } + final WindowContainerTransaction wct = new WindowContainerTransaction(); if (!mainStageVisible) { + wct.setReparentLeafTaskIfRelaunch(mRootTaskInfo.token, + true /* setReparentLeafTaskIfRelaunch */); // Both stages are not visible, check if it needs to dismiss split screen. - if (mExitSplitScreenOnHide - // Don't dismiss split screen when both stages are not visible due to sleeping - // display. - || (!mMainStage.mRootTaskInfo.isSleeping - && !mSideStage.mRootTaskInfo.isSleeping)) { + if (mExitSplitScreenOnHide) { exitSplitScreen(null /* childrenToTop */, EXIT_REASON_RETURN_HOME); } + } else { + wct.setReparentLeafTaskIfRelaunch(mRootTaskInfo.token, + false /* setReparentLeafTaskIfRelaunch */); } - + mSyncQueue.queue(wct); mSyncQueue.runInSync(t -> { - t.setVisibility(mSideStage.mRootLeash, sideStageVisible) - .setVisibility(mMainStage.mRootLeash, mainStageVisible); setDividerVisibility(mainStageVisible, t); }); } @@ -1479,7 +1533,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, mDividerVisible = visible; sendSplitVisibilityChanged(); - if (mIsDividerRemoteAnimating) { + if (mIsSplitEntering) { ProtoLog.d(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN, " Skip animating divider bar due to it's remote animating."); return; @@ -1499,7 +1553,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, " Skip animating divider bar due to divider leash not ready."); return; } - if (mIsDividerRemoteAnimating) { + if (mIsSplitEntering) { ProtoLog.d(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN, " Skip animating divider bar due to it's remote animating."); return; @@ -1555,26 +1609,22 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, if (!hasChildren && !mIsExiting && mMainStage.isActive()) { if (isSideStage && mMainStageListener.mVisible) { // Exit to main stage if side stage no longer has children. - if (ENABLE_SHELL_TRANSITIONS) { - exitSplitScreen(mMainStage, EXIT_REASON_APP_FINISHED); - } else { - mSplitLayout.flingDividerToDismiss( - mSideStagePosition == SPLIT_POSITION_BOTTOM_OR_RIGHT, - EXIT_REASON_APP_FINISHED); - } + mSplitLayout.flingDividerToDismiss( + mSideStagePosition == SPLIT_POSITION_BOTTOM_OR_RIGHT, + EXIT_REASON_APP_FINISHED); } else if (!isSideStage && mSideStageListener.mVisible) { // Exit to side stage if main stage no longer has children. - if (ENABLE_SHELL_TRANSITIONS) { - exitSplitScreen(mSideStage, EXIT_REASON_APP_FINISHED); - } else { - mSplitLayout.flingDividerToDismiss( - mSideStagePosition != SPLIT_POSITION_BOTTOM_OR_RIGHT, - EXIT_REASON_APP_FINISHED); - } + mSplitLayout.flingDividerToDismiss( + mSideStagePosition != SPLIT_POSITION_BOTTOM_OR_RIGHT, + EXIT_REASON_APP_FINISHED); + } else if (isSplitScreenRunningBackground()) { + // Do not exit to any stage due to running background. + exitSplitScreen(null /* childrenToTop */, EXIT_REASON_APP_FINISHED); } } else if (isSideStage && hasChildren && !mMainStage.isActive()) { - final WindowContainerTransaction wct = new WindowContainerTransaction(); mSplitLayout.init(); + + final WindowContainerTransaction wct = new WindowContainerTransaction(); if (mLogger.isEnterRequestedByDrag()) { prepareEnterSplitScreen(wct); } else { @@ -1589,8 +1639,9 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, mSyncQueue.queue(wct); mSyncQueue.runInSync(t -> { - if (mLogger.isEnterRequestedByDrag()) { + if (mIsDropEntering) { updateSurfaceBounds(mSplitLayout, t, false /* applyResizingOffset */); + mIsDropEntering = false; } else { mShowDecorImmediately = true; mSplitLayout.flingDividerToCenter(); @@ -1945,10 +1996,6 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } } - public boolean isSplitActive() { - return mMainStage.isActive(); - } - @Override public void mergeAnimation(IBinder transition, TransitionInfo info, SurfaceControl.Transaction t, IBinder mergeTarget, @@ -2304,11 +2351,29 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, /** * Sets drag info to be logged when splitscreen is next entered. */ - public void logOnDroppedToSplit(@SplitPosition int position, InstanceId dragSessionId) { + public void onDroppedToSplit(@SplitPosition int position, InstanceId dragSessionId) { + if (!isSplitScreenVisible()) { + mIsDropEntering = true; + } + if (isSplitScreenRunningBackground()) { + // Split running background, log exit first and start new enter request. + logExit(EXIT_REASON_RECREATE_SPLIT); + } mLogger.enterRequestedByDrag(position, dragSessionId); } /** + * Sets info to be logged when splitscreen is next entered. + */ + public void onRequestToSplit(InstanceId sessionId, int enterReason) { + if (isSplitScreenRunningBackground()) { + // Split running background, log exit first and start new enter request. + logExit(EXIT_REASON_RECREATE_SPLIT); + } + mLogger.enterRequested(sessionId, enterReason); + } + + /** * Logs the exit of splitscreen. */ private void logExit(@ExitReason int exitReason) { @@ -2343,6 +2408,11 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } @Override + public void onChildTaskAppeared(int taskId) { + StageCoordinator.this.onChildTaskAppeared(this, taskId); + } + + @Override public void onStatusChanged(boolean visible, boolean hasChildren) { if (!mHasRootTask) return; diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java index 8a52c8750ba6..a841b7f96d3c 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java @@ -22,6 +22,7 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import static android.view.RemoteAnimationTarget.MODE_OPENING; import static com.android.wm.shell.common.split.SplitScreenConstants.CONTROLLED_ACTIVITY_TYPES; +import static com.android.wm.shell.common.split.SplitScreenConstants.CONTROLLED_WINDOWING_MODES; import static com.android.wm.shell.common.split.SplitScreenConstants.CONTROLLED_WINDOWING_MODES_WHEN_ACTIVE; import static com.android.wm.shell.transition.Transitions.ENABLE_SHELL_TRANSITIONS; @@ -69,6 +70,8 @@ class StageTaskListener implements ShellTaskOrganizer.TaskListener { public interface StageListenerCallbacks { void onRootTaskAppeared(); + void onChildTaskAppeared(int taskId); + void onStatusChanged(boolean visible, boolean hasChildren); void onChildTaskStatusChanged(int taskId, boolean present, boolean visible); @@ -185,6 +188,7 @@ class StageTaskListener implements ShellTaskOrganizer.TaskListener { // Status is managed/synchronized by the transition lifecycle. return; } + mCallbacks.onChildTaskAppeared(taskId); sendStatusChanged(); } else { throw new IllegalArgumentException(this + "\n Unknown task: " + taskInfo @@ -338,6 +342,14 @@ class StageTaskListener implements ShellTaskOrganizer.TaskListener { } } + void evictOtherChildren(WindowContainerTransaction wct, int taskId) { + for (int i = mChildrenTaskInfo.size() - 1; i >= 0; i--) { + final ActivityManager.RunningTaskInfo taskInfo = mChildrenTaskInfo.valueAt(i); + if (taskId == taskInfo.taskId) continue; + wct.reparent(taskInfo.token, null /* parent */, false /* onTop */); + } + } + void evictNonOpeningChildren(RemoteAnimationTarget[] apps, WindowContainerTransaction wct) { final SparseArray<ActivityManager.RunningTaskInfo> toBeEvict = mChildrenTaskInfo.clone(); for (int i = 0; i < apps.length; i++) { @@ -360,6 +372,12 @@ class StageTaskListener implements ShellTaskOrganizer.TaskListener { } } + void reparentTopTask(WindowContainerTransaction wct) { + wct.reparentTasks(null /* currentParent */, mRootTaskInfo.token, + CONTROLLED_WINDOWING_MODES, CONTROLLED_ACTIVITY_TYPES, + true /* onTop */, true /* reparentTopOnly */); + } + void resetBounds(WindowContainerTransaction wct) { wct.setBounds(mRootTaskInfo.token, null); wct.setAppBounds(mRootTaskInfo.token, null); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedHandler.java index 3cba92956f95..a2d7bc43653a 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedHandler.java @@ -111,7 +111,7 @@ public class DefaultMixedHandler implements Transitions.TransitionHandler { @Override public WindowContainerTransaction handleRequest(@NonNull IBinder transition, @NonNull TransitionRequestInfo request) { - if (mPipHandler.requestHasPipEnter(request) && mSplitHandler.isSplitActive()) { + if (mPipHandler.requestHasPipEnter(request) && mSplitHandler.isSplitScreenVisible()) { ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " Got a PiP-enter request while " + "Split-Screen is active, so treat it as Mixed."); if (request.getRemoteTransition() != null) { diff --git a/libs/WindowManager/Shell/tests/unittest/AndroidManifest.xml b/libs/WindowManager/Shell/tests/unittest/AndroidManifest.xml index 59d9104fb5ba..fac04614d945 100644 --- a/libs/WindowManager/Shell/tests/unittest/AndroidManifest.xml +++ b/libs/WindowManager/Shell/tests/unittest/AndroidManifest.xml @@ -19,6 +19,8 @@ xmlns:tools="http://schemas.android.com/tools" package="com.android.wm.shell.tests"> + <uses-permission android:name="android.permission.READ_DEVICE_CONFIG" /> + <application android:debuggable="true" android:largeHeap="true"> <uses-library android:name="android.test.mock" /> <uses-library android:name="android.test.runner" /> diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml index 77b8b4fe09ef..90ff2c695059 100644 --- a/packages/SettingsLib/res/values-bs/strings.xml +++ b/packages/SettingsLib/res/values-bs/strings.xml @@ -477,7 +477,7 @@ <string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_remaining_charging_duration_only" msgid="8085099012811384899">"<xliff:g id="TIME">%1$s</xliff:g> do potpune napunjenosti"</string> <string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> do potpune napunjenosti"</string> - <string name="power_charging_limited" msgid="6732738149313642521">"<xliff:g id="LEVEL">%1$s</xliff:g> – punjenje pauzirano"</string> + <string name="power_charging_limited" msgid="6732738149313642521">"<xliff:g id="LEVEL">%1$s</xliff:g> - Punjenje je pauzirano"</string> <string name="power_charging_future_paused" msgid="6829683663982987290">"<xliff:g id="LEVEL">%1$s</xliff:g> – Punjenje do <xliff:g id="DOCK_DEFENDER_THRESHOLD">%2$s</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="268625384868401114">"Nepoznato"</string> <string name="battery_info_status_charging" msgid="4279958015430387405">"Punjenje"</string> diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml index 66e30f970e94..0bed0569ac36 100644 --- a/packages/SettingsLib/res/values-zu/strings.xml +++ b/packages/SettingsLib/res/values-zu/strings.xml @@ -477,8 +477,7 @@ <string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_remaining_charging_duration_only" msgid="8085099012811384899">"<xliff:g id="TIME">%1$s</xliff:g> okusele kuze kugcwale"</string> <string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> okusele kuze kugcwale"</string> - <!-- no translation found for power_charging_limited (6732738149313642521) --> - <skip /> + <string name="power_charging_limited" msgid="6732738149313642521">"<xliff:g id="LEVEL">%1$s</xliff:g> - Ukushaja kumiswe isikhashana"</string> <string name="power_charging_future_paused" msgid="6829683663982987290">"<xliff:g id="LEVEL">%1$s</xliff:g> - Ishaja ku-<xliff:g id="DOCK_DEFENDER_THRESHOLD">%2$s</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="268625384868401114">"Akwaziwa"</string> <string name="battery_info_status_charging" msgid="4279958015430387405">"Iyashaja"</string> diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index acaa008f2a0c..4f08a30ed630 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -23,11 +23,6 @@ xmlns:tools="http://schemas.android.com/tools" coreApp="true"> - <!-- Using OpenGL ES 2.0 --> - <uses-feature - android:glEsVersion="0x00020000" - android:required="true" /> - <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <!-- Used to read wallpaper --> @@ -416,6 +411,7 @@ <service android:name=".screenshot.ScreenshotCrossProfileService" android:permission="com.android.systemui.permission.SELF" + android:process=":screenshot_cross_profile" android:exported="false" /> <service android:name=".screenrecord.RecordingService" /> diff --git a/packages/SystemUI/animation/src/com/android/systemui/surfaceeffects/ripple/MultiRippleController.kt b/packages/SystemUI/animation/src/com/android/systemui/surfaceeffects/ripple/MultiRippleController.kt index 93e78acc63fd..8cd8bf6ca1db 100644 --- a/packages/SystemUI/animation/src/com/android/systemui/surfaceeffects/ripple/MultiRippleController.kt +++ b/packages/SystemUI/animation/src/com/android/systemui/surfaceeffects/ripple/MultiRippleController.kt @@ -21,9 +21,20 @@ import androidx.annotation.VisibleForTesting /** Controller that handles playing [RippleAnimation]. */ class MultiRippleController(private val multipleRippleView: MultiRippleView) { + private val ripplesFinishedListeners = ArrayList<RipplesFinishedListener>() + companion object { /** Max number of ripple animations at a time. */ @VisibleForTesting const val MAX_RIPPLE_NUMBER = 10 + + interface RipplesFinishedListener { + /** Triggered when all the ripples finish running. */ + fun onRipplesFinish() + } + } + + fun addRipplesFinishedListener(listener: RipplesFinishedListener) { + ripplesFinishedListeners.add(listener) } /** Updates all the ripple colors during the animation. */ @@ -38,8 +49,13 @@ class MultiRippleController(private val multipleRippleView: MultiRippleView) { multipleRippleView.ripples.add(rippleAnimation) - // Remove ripple once the animation is done - rippleAnimation.play { multipleRippleView.ripples.remove(rippleAnimation) } + rippleAnimation.play { + // Remove ripple once the animation is done + multipleRippleView.ripples.remove(rippleAnimation) + if (multipleRippleView.ripples.isEmpty()) { + ripplesFinishedListeners.forEach { listener -> listener.onRipplesFinish() } + } + } // Trigger drawing multipleRippleView.invalidate() diff --git a/packages/SystemUI/animation/src/com/android/systemui/surfaceeffects/ripple/MultiRippleView.kt b/packages/SystemUI/animation/src/com/android/systemui/surfaceeffects/ripple/MultiRippleView.kt index b8dc223af56c..550d2c6d8732 100644 --- a/packages/SystemUI/animation/src/com/android/systemui/surfaceeffects/ripple/MultiRippleView.kt +++ b/packages/SystemUI/animation/src/com/android/systemui/surfaceeffects/ripple/MultiRippleView.kt @@ -33,21 +33,11 @@ class MultiRippleView(context: Context?, attrs: AttributeSet?) : View(context, a @VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE) val ripples = ArrayList<RippleAnimation>() - private val listeners = ArrayList<RipplesFinishedListener>() private val ripplePaint = Paint() private var isWarningLogged = false companion object { private const val TAG = "MultiRippleView" - - interface RipplesFinishedListener { - /** Triggered when all the ripples finish running. */ - fun onRipplesFinish() - } - } - - fun addRipplesFinishedListener(listener: RipplesFinishedListener) { - listeners.add(listener) } override fun onDraw(canvas: Canvas?) { @@ -76,8 +66,6 @@ class MultiRippleView(context: Context?, attrs: AttributeSet?) : View(context, a if (shouldInvalidate) { invalidate() - } else { // Nothing is playing. - listeners.forEach { listener -> listener.onRipplesFinish() } } } } diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockController.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockController.kt index c540f0f7d557..e138ef8a1ea8 100644 --- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockController.kt +++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockController.kt @@ -20,6 +20,7 @@ import android.graphics.Rect import android.icu.text.NumberFormat import android.util.TypedValue import android.view.LayoutInflater +import android.view.View import android.widget.FrameLayout import androidx.annotation.VisibleForTesting import com.android.systemui.customization.R @@ -151,9 +152,15 @@ class DefaultClockController( view: AnimatableClockView, ) : DefaultClockFaceController(view) { override fun recomputePadding(targetRegion: Rect?) { - // Ignore Target Region until top padding fixed in aod + // We center the view within the targetRegion instead of within the parent + // view by computing the difference and adding that to the padding. + val parent = view.parent + val yDiff = + if (targetRegion != null && parent is View && parent.isLaidOut()) + targetRegion.centerY() - parent.height / 2f + else 0f val lp = view.getLayoutParams() as FrameLayout.LayoutParams - lp.topMargin = (-0.5f * view.bottom).toInt() + lp.topMargin = (-0.5f * view.bottom + yDiff).toInt() view.setLayoutParams(lp) } diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_clock_switch.xml b/packages/SystemUI/res-keyguard/layout/keyguard_clock_switch.xml index 218c5cc9b7fe..b49afeef09f3 100644 --- a/packages/SystemUI/res-keyguard/layout/keyguard_clock_switch.xml +++ b/packages/SystemUI/res-keyguard/layout/keyguard_clock_switch.xml @@ -35,7 +35,6 @@ android:visibility="invisible" /> <FrameLayout android:id="@+id/lockscreen_clock_view_large" - android:layout_marginTop="@dimen/keyguard_large_clock_top_margin" android:layout_width="match_parent" android:layout_height="match_parent" android:clipChildren="false" diff --git a/packages/SystemUI/res/drawable/dream_aqi_badge_bg.xml b/packages/SystemUI/res/drawable/controls_panel_background.xml index 1992c7733bd3..9092877fc6fa 100644 --- a/packages/SystemUI/res/drawable/dream_aqi_badge_bg.xml +++ b/packages/SystemUI/res/drawable/controls_panel_background.xml @@ -1,3 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> <!-- ~ Copyright (C) 2022 The Android Open Source Project ~ @@ -12,9 +13,10 @@ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ~ See the License for the specific language governing permissions and ~ limitations under the License. + ~ --> <shape xmlns:android="http://schemas.android.com/apk/res/android"> - <solid android:color="@color/dream_overlay_aqi_unknown" /> - <corners android:radius="@dimen/dream_aqi_badge_corner_radius" /> + <solid android:color="#1F1F1F" /> + <corners android:radius="@dimen/notification_corner_radius" /> </shape>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/clipboard_overlay.xml b/packages/SystemUI/res/layout/clipboard_overlay.xml index 0e9abee2f050..9134f96f59e1 100644 --- a/packages/SystemUI/res/layout/clipboard_overlay.xml +++ b/packages/SystemUI/res/layout/clipboard_overlay.xml @@ -102,6 +102,7 @@ android:layout_margin="@dimen/overlay_border_width" android:layout_height="wrap_content" android:layout_gravity="center" + app:layout_constraintHorizontal_bias="0" app:layout_constraintBottom_toBottomOf="@id/preview_border" app:layout_constraintStart_toStartOf="@id/preview_border" app:layout_constraintEnd_toEndOf="@id/preview_border" diff --git a/packages/SystemUI/res/layout/controls_with_favorites.xml b/packages/SystemUI/res/layout/controls_with_favorites.xml index 9efad2269463..ee3adba00fe5 100644 --- a/packages/SystemUI/res/layout/controls_with_favorites.xml +++ b/packages/SystemUI/res/layout/controls_with_favorites.xml @@ -90,7 +90,7 @@ android:layout_weight="1" android:layout_marginLeft="@dimen/global_actions_side_margin" android:layout_marginRight="@dimen/global_actions_side_margin" - android:background="#ff0000" + android:background="@drawable/controls_panel_background" android:padding="@dimen/global_actions_side_margin" android:visibility="gone" /> diff --git a/packages/SystemUI/res/layout/dream_overlay_complication_aqi.xml b/packages/SystemUI/res/layout/dream_overlay_complication_aqi.xml deleted file mode 100644 index fcebb8d3f6c6..000000000000 --- a/packages/SystemUI/res/layout/dream_overlay_complication_aqi.xml +++ /dev/null @@ -1,26 +0,0 @@ -<!-- - ~ Copyright (C) 2022 The Android Open Source Project - ~ - ~ Licensed under the Apache License, Version 2.0 (the "License"); - ~ you may not use this file except in compliance with the License. - ~ You may obtain a copy of the License at - ~ - ~ http://www.apache.org/licenses/LICENSE-2.0 - ~ - ~ Unless required by applicable law or agreed to in writing, software - ~ distributed under the License is distributed on an "AS IS" BASIS, - ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ~ See the License for the specific language governing permissions and - ~ limitations under the License. - --> - -<TextView - xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/aqi_view" - style="@style/clock_subtitle" - android:visibility="gone" - android:background="@drawable/dream_aqi_badge_bg" - android:paddingHorizontal="@dimen/dream_aqi_badge_padding_horizontal" - android:paddingVertical="@dimen/dream_aqi_badge_padding_vertical" - android:layout_width="wrap_content" - android:layout_height="wrap_content"/>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/screenshot_static.xml b/packages/SystemUI/res/layout/screenshot_static.xml index 88429925eed0..65983b79570e 100644 --- a/packages/SystemUI/res/layout/screenshot_static.xml +++ b/packages/SystemUI/res/layout/screenshot_static.xml @@ -100,6 +100,7 @@ android:background="@drawable/overlay_preview_background" android:adjustViewBounds="true" android:clickable="true" + app:layout_constraintHorizontal_bias="0" app:layout_constraintBottom_toBottomOf="@id/screenshot_preview_border" app:layout_constraintStart_toStartOf="@id/screenshot_preview_border" app:layout_constraintEnd_toEndOf="@id/screenshot_preview_border" diff --git a/packages/SystemUI/res/raw/image_wallpaper_fragment_shader.glsl b/packages/SystemUI/res/raw/image_wallpaper_fragment_shader.glsl deleted file mode 100644 index e4b6e0778664..000000000000 --- a/packages/SystemUI/res/raw/image_wallpaper_fragment_shader.glsl +++ /dev/null @@ -1,11 +0,0 @@ -precision mediump float; - -// The actual wallpaper texture. -uniform sampler2D uTexture; - -varying vec2 vTextureCoordinates; - -void main() { - // gets the pixel value of the wallpaper for this uv coordinates on screen. - gl_FragColor = texture2D(uTexture, vTextureCoordinates); -}
\ No newline at end of file diff --git a/packages/SystemUI/res/raw/image_wallpaper_vertex_shader.glsl b/packages/SystemUI/res/raw/image_wallpaper_vertex_shader.glsl deleted file mode 100644 index 4393e2bb0ebf..000000000000 --- a/packages/SystemUI/res/raw/image_wallpaper_vertex_shader.glsl +++ /dev/null @@ -1,8 +0,0 @@ -attribute vec4 aPosition; -attribute vec2 aTextureCoordinates; -varying vec2 vTextureCoordinates; - -void main() { - vTextureCoordinates = aTextureCoordinates; - gl_Position = aPosition; -}
\ No newline at end of file diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index eb2f12a82a9b..16c615b9059d 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Kennisgewings onderbreek deur Moenie Steur Nie"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Begin nou"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Geen kennisgewings nie"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"Geen nuwe kennisgewings nie"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"Ontsluit om ouer kennisgewings te sien"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Hierdie toestel word deur jou ouer bestuur"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"Jou organisasie besit hierdie toestel en kan netwerkverkeer monitor"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> besit hierdie toestel en kan netwerkverkeer monitor"</string> @@ -1013,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Draai om na voorste skerm vir ’n beter selfie?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Gebruik die agterste kamera vir ’n breër foto met ’n hoër resolusie."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Hierdie skerm sal afskakel"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index c6919ce4f15a..966701a26ff5 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -1014,4 +1014,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"ለተሻለ የራስ ፎቶ ወደፊት ማሳያ ይገልበጥ?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"ከፍተኛ ጥራት ላለው ሰፊ ፎቶ የኋለኛውን ካሜራ ይጠቀሙ።"</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ ይህ ማያ ገጽ ይጠፋል"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index af80419a9269..eae26f050e90 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"تم إيقاف الإشعارات مؤقتًا وفقًا لإعداد \"عدم الإزعاج\""</string> <string name="media_projection_action_text" msgid="3634906766918186440">"البدء الآن"</string> <string name="empty_shade_text" msgid="8935967157319717412">"ليس هناك أي اشعارات"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"ما مِن إشعارات جديدة"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"افتَح قفل الشاشة لعرض الإشعارات الأقدم."</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"يتولّى أحد الوالدين إدارة هذا الجهاز."</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"تملك مؤسستك هذا الجهاز ويمكنها تتبّع حركة بيانات الشبكة."</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"تملك مؤسسة <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> هذا الجهاز ويمكنها تتبّع حركة بيانات الشبكة"</string> @@ -1013,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"أتريد استخدام الكاميرا الأمامية لصورة ذاتية أفضل؟"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"استخدِم الكاميرا الخلفية لالتقاط صورة أعرض وبدرجة دقة أعلى."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"* سيتم إطفاء هذه الشاشة."</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index 20bd1d43697c..6fc82be36941 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"অসুবিধা নিদিব-ই জাননী পজ কৰিছে"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"এতিয়াই আৰম্ভ কৰক"</string> <string name="empty_shade_text" msgid="8935967157319717412">"কোনো জাননী নাই"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"কোনো নতুন জাননী নাই"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"পুৰণি জাননী চবলৈ আনলক কৰক"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"এই ডিভাইচটো আপোনাৰ অভিভাৱকে পৰিচালনা কৰে"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"এই ডিভাইচটোৰ গৰাকী আপোনাৰ প্ৰতিষ্ঠান আৰু ই নেটৱৰ্কৰ ট্ৰেফিক নিৰীক্ষণ কৰিব পাৰে"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"এই ডিভাইচটোৰ গৰাকী <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> আৰু এইটোৱে নেটৱৰ্কৰ ট্ৰেফিক নিৰীক্ষণ কৰিব পাৰে"</string> @@ -1013,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"উন্নত ছেল্ফিৰ বাবে সন্মুখৰ ডিছপ্লে’ লুটিয়াই দিবনে?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"অধিক ৰিজ’লিউশ্বনৰ বহল ফট’ৰ বাবে পিছফালে থকা কেমেৰাটো ব্যৱহাৰ কৰক।"</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ ই স্ক্ৰীনখন অফ হ’ব"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index 3b4451230486..e4e031a417cb 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Bildirişlər \"Narahat Etməyin\" rejimi tərəfindən dayandırıldı"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"İndi başlayın"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Heç bir bildiriş yoxdur"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"Yeni bildiriş yoxdur"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"Köhnə bildirişləri görmək üçün kilidi açın"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Bu cihaz valideyniniz tərəfindən idarə olunur"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"Təşkilatınız bu cihazın sahibidir və şəbəkə trafikinə nəzarət edə bilər"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> bu cihazın sahibidir və şəbəkə trafikinə nəzarət edə bilər"</string> @@ -1013,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Daha yaxşı selfi üçün ön displeyə çevrilsin?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Daha yüksək ayırdetmə dəqiqliyi ilə daha geniş şəkil üçün arxaya baxan kameradan istifadə edin."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Bu ekran deaktiv ediləcək"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index c7e609583a20..bd964f955a00 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -872,8 +872,7 @@ <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Zaustavi prebacivanje"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Dostupni uređaji za audio izlaz."</string> <string name="media_output_dialog_accessibility_seekbar" msgid="5332843993805568978">"Zvuk"</string> - <!-- no translation found for media_output_dialog_volume_percentage (1613984910585111798) --> - <skip /> + <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Kako funkcioniše emitovanje"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Emitovanje"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Ljudi u blizini sa kompatibilnim Bluetooth uređajima mogu da slušaju medijski sadržaj koji emitujete"</string> @@ -987,8 +986,7 @@ <string name="dream_overlay_status_bar_camera_mic_off" msgid="3199425257833773569">"Kamera i mikrofon su isključeni"</string> <string name="dream_overlay_status_bar_notification_indicator" msgid="8091389255691081711">"{count,plural, =1{# obaveštenje}one{# obaveštenje}few{# obaveštenja}other{# obaveštenja}}"</string> <string name="dream_overlay_weather_complication_desc" msgid="824503662089783824">"<xliff:g id="WEATHER_CONDITION">%1$s</xliff:g>, <xliff:g id="TEMPERATURE">%2$s</xliff:g>"</string> - <!-- no translation found for note_task_button_label (8718616095800343136) --> - <skip /> + <string name="note_task_button_label" msgid="8718616095800343136">"Pravljenje beležaka"</string> <string name="broadcasting_description_is_broadcasting" msgid="765627502786404290">"Emitovanje"</string> <string name="bt_le_audio_broadcast_dialog_title" msgid="3605428497924077811">"Želite da zaustavite emitovanje aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="7889684551194225793">"Ako emitujete aplikaciju <xliff:g id="SWITCHAPP">%1$s</xliff:g> ili promenite izlaz, aktuelno emitovanje će se zaustaviti"</string> @@ -1011,4 +1009,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Želite da obrnete na prednji ekran za bolji selfi?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Koristite zadnju kameru da biste snimili širu sliku sa višom rezolucijom."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Ovaj ekran će se isključiti"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index 39453c8ace06..31c9bcc49ebb 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -1011,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Пераключыць на пярэднюю камеру для лепшага сэлфі?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Каб зрабіць шырэйшае фота з больш высокай раздзяляльнасцю, скарыстайце заднюю камеру."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Гэты экран будзе выключаны"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index 4b50df1e4d4e..c2860e95a807 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Известията са поставени на пауза от режима „Не безпокойте“"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Стартиране сега"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Няма известия"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"Няма нови известия"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"Отключете за достъп до по-стари известия"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Това устройство се управлява от родителя ви"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"Организацията ви притежава това устройство и може да наблюдава трафика в мрежата"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> притежава това устройство и може да наблюдава трафика в мрежата"</string> @@ -1013,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Да се ползва ли предната камера за по-добро селфи?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Използвайте задната камера за по-широка снимка с по-висока разделителна способност."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Този екран ще се изключи"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index 6b66d92cfa7e..42fc489dff54 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -872,8 +872,7 @@ <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"কাস্ট করা বন্ধ করুন"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"অডিও আউটপুটের জন্য উপলভ্য ডিভাইস।"</string> <string name="media_output_dialog_accessibility_seekbar" msgid="5332843993805568978">"ভলিউম"</string> - <!-- no translation found for media_output_dialog_volume_percentage (1613984910585111798) --> - <skip /> + <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"ব্রডকাস্ট কীভাবে কাজ করে"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"সম্প্রচার করুন"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"আশপাশে লোকজন যাদের মানানসই ব্লুটুথ ডিভাইস আছে, তারা আপনার ব্রডকাস্ট করা মিডিয়া শুনতে পারবেন"</string> @@ -987,8 +986,7 @@ <string name="dream_overlay_status_bar_camera_mic_off" msgid="3199425257833773569">"ক্যামেরা ও মাইক্রোফোন বন্ধ আছে"</string> <string name="dream_overlay_status_bar_notification_indicator" msgid="8091389255691081711">"{count,plural, =1{#টি বিজ্ঞপ্তি}one{#টি বিজ্ঞপ্তি}other{#টি বিজ্ঞপ্তি}}"</string> <string name="dream_overlay_weather_complication_desc" msgid="824503662089783824">"<xliff:g id="WEATHER_CONDITION">%1$s</xliff:g>, <xliff:g id="TEMPERATURE">%2$s</xliff:g>"</string> - <!-- no translation found for note_task_button_label (8718616095800343136) --> - <skip /> + <string name="note_task_button_label" msgid="8718616095800343136">"Notetaking"</string> <string name="broadcasting_description_is_broadcasting" msgid="765627502786404290">"ব্রডকাস্ট করা হচ্ছে"</string> <string name="bt_le_audio_broadcast_dialog_title" msgid="3605428497924077811">"<xliff:g id="APP_NAME">%1$s</xliff:g> সম্প্রচার বন্ধ করবেন?"</string> <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="7889684551194225793">"আপনি <xliff:g id="SWITCHAPP">%1$s</xliff:g> সম্প্রচার করলে বা আউটপুট পরিবর্তন করলে, আপনার বর্তমান সম্প্রচার বন্ধ হয়ে যাবে"</string> @@ -1011,4 +1009,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"আরও ভাল সেলফির জন্য সামনের ক্যামেরায় পাল্টাতে চান?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"আরও ভাল রেজোলিউশন সহ আরও বেশি ওয়াইড ছবির জন্য ব্যাক-ক্যামেরা ব্যবহার করুন।"</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ এই স্ক্রিন বন্ধ হয়ে যাবে"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index 0b2c514824f6..62f0c5f9c507 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -72,7 +72,7 @@ <string name="global_action_smart_lock_disabled" msgid="9097102067802412936">"Smart Lock je onemogućen"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"je poslao/la sliku"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Spašavanje snimka ekrana..."</string> - <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Spremanje snimke zaslona na poslovni profil…"</string> + <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Pohranjivanje snimka ekrana na radni profil…"</string> <string name="screenshot_saved_title" msgid="8893267638659083153">"Snimak ekrana je sačuvan"</string> <string name="screenshot_failed_title" msgid="3259148215671936891">"Nije moguće sačuvati snimak ekrana"</string> <string name="screenshot_failed_to_save_user_locked_text" msgid="6156607948256936920">"Morate otključati uređaj da možete sačuvati snimak ekrana"</string> @@ -393,8 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Obavještenja su pauzirana načinom rada Ne ometaj"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Započni odmah"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Nema obavještenja"</string> - <string name="no_unseen_notif_text" msgid="395512586119868682">"Nema novih obavijesti"</string> - <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"Otključajte za starije obavijesti"</string> + <string name="no_unseen_notif_text" msgid="395512586119868682">"Nema novih obavještenja"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"Otključajte da vidite starija obavještenja"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Ovim uređajem upravlja tvoj roditelj"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"Vaša organizacija je vlasnik ovog uređaja i može nadzirati mrežni saobraćaj"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> upravlja ovim uređajem i može nadzirati mrežni saobraćaj"</string> @@ -872,8 +872,7 @@ <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Zaustavi emitiranje"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Dostupni uređaji za audio izlaz."</string> <string name="media_output_dialog_accessibility_seekbar" msgid="5332843993805568978">"Jačina zvuka"</string> - <!-- no translation found for media_output_dialog_volume_percentage (1613984910585111798) --> - <skip /> + <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Kako funkcionira emitiranje"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Emitirajte"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Osobe u vašoj blizini s kompatibilnim Bluetooth uređajima mogu slušati medijske sadržaje koje emitirate"</string> @@ -987,8 +986,7 @@ <string name="dream_overlay_status_bar_camera_mic_off" msgid="3199425257833773569">"Kamera i mikrofon su isključeni"</string> <string name="dream_overlay_status_bar_notification_indicator" msgid="8091389255691081711">"{count,plural, =1{# obavještenje}one{# obavještenje}few{# obavještenja}other{# obavještenja}}"</string> <string name="dream_overlay_weather_complication_desc" msgid="824503662089783824">"<xliff:g id="WEATHER_CONDITION">%1$s</xliff:g>, <xliff:g id="TEMPERATURE">%2$s</xliff:g>"</string> - <!-- no translation found for note_task_button_label (8718616095800343136) --> - <skip /> + <string name="note_task_button_label" msgid="8718616095800343136">"Pisanje bilježaka"</string> <string name="broadcasting_description_is_broadcasting" msgid="765627502786404290">"Emitiranje"</string> <string name="bt_le_audio_broadcast_dialog_title" msgid="3605428497924077811">"Zaustaviti emitiranje aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="7889684551194225793">"Ako emitirate aplikaciju <xliff:g id="SWITCHAPP">%1$s</xliff:g> ili promijenite izlaz, trenutno emitiranje će se zaustaviti"</string> @@ -1011,4 +1009,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Obrnuti na prednji ekran radi boljeg selfija?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Koristite stražnju kameru za širu fotografiju veće rezolucije."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Ekran će se isključiti"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 75739386a5e5..8f591bcb991a 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notificacions pausades pel mode No molestis"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Comença ara"</string> <string name="empty_shade_text" msgid="8935967157319717412">"No hi ha cap notificació"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"No hi ha cap notificació nova"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"Desbloq. per veure notificacions antigues"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Els teus pares gestionen aquest dispositiu"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"La teva organització és propietària del dispositiu i és possible que supervisi el trànsit de xarxa"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> és propietària d\'aquest dispositiu i és possible que supervisi el trànsit de xarxa"</string> @@ -1013,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Girar a pantalla frontal per fer millors selfies?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Utilitza la càmera posterior per obtenir una foto més àmplia amb una resolució més alta."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Aquesta pantalla s\'apagarà"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index d3a0e6eaf7f1..c417d4460d31 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Oznámení jsou pozastavena režimem Nerušit"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Spustit"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Žádná oznámení"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"Žádná nová oznámení"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"Starší oznámení se zobrazí po odemknutí"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Toto zařízení spravuje rodič"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"Toto zařízení vlastní vaše organizace, která může sledovat síťový provoz"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"Toto zařízení spravuje organizace <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>, která může sledovat síťový provoz"</string> @@ -1013,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Otočit na přední fotoaparát pro lepší selfie?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Pomocí zadního fotoaparátu pořiďte širší fotku s vyšším rozlišením."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Tato obrazovka se vypne"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index a252779e9268..d4277a7dea85 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notifikationer er sat på pause af Forstyr ikke"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Start nu"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Ingen notifikationer"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"Ingen nye notifikationer"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"Lås op for at se ældre notifikationer"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Denne enhed administreres af din forælder"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"Din organisation ejer denne enhed og overvåger muligvis netværkstrafikken"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ejer denne enhed og overvåger muligvis netværkstrafikken"</string> @@ -874,8 +872,7 @@ <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Stop med at caste"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Enheder, der er tilgængelige for lydoutput."</string> <string name="media_output_dialog_accessibility_seekbar" msgid="5332843993805568978">"Lydstyrke"</string> - <!-- no translation found for media_output_dialog_volume_percentage (1613984910585111798) --> - <skip /> + <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Sådan fungerer udsendelser"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Udsendelse"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Personer i nærheden, som har kompatible Bluetooth-enheder, kan lytte til det medie, du udsender"</string> @@ -989,8 +986,7 @@ <string name="dream_overlay_status_bar_camera_mic_off" msgid="3199425257833773569">"Kamera og mikrofon er slået fra"</string> <string name="dream_overlay_status_bar_notification_indicator" msgid="8091389255691081711">"{count,plural, =1{# notifikation}one{# notifikation}other{# notifikationer}}"</string> <string name="dream_overlay_weather_complication_desc" msgid="824503662089783824">"<xliff:g id="WEATHER_CONDITION">%1$s</xliff:g>, <xliff:g id="TEMPERATURE">%2$s</xliff:g>"</string> - <!-- no translation found for note_task_button_label (8718616095800343136) --> - <skip /> + <string name="note_task_button_label" msgid="8718616095800343136">"Notetagning"</string> <string name="broadcasting_description_is_broadcasting" msgid="765627502786404290">"Udsender"</string> <string name="bt_le_audio_broadcast_dialog_title" msgid="3605428497924077811">"Stop udsendelsen <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="7889684551194225793">"Hvis du udsender <xliff:g id="SWITCHAPP">%1$s</xliff:g> eller skifter output, stopper din aktuelle udsendelse"</string> @@ -1013,4 +1009,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Vil du bruge frontkameraet for at få bedre selfie?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Brug bagsidekameraet for at få et bredere billede med højere opløsning."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ *Denne skærm slukkes"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index af723248f703..d1c88fb65c9c 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Benachrichtigungen durch „Bitte nicht stören“ pausiert"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Jetzt starten"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Keine Benachrichtigungen"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"Keine neuen Benachrichtigungen"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"Für ältere Benachrichtigungen entsperren"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Dieses Gerät wird von deinen Eltern verwaltet"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"Deine Organisation verwaltet dieses Gerät und kann den Netzwerkverkehr überwachen"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ist der Eigentümer dieses Geräts und kann den Netzwerkverkehr überwachen"</string> @@ -1013,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Für ein besseres Selfie Frontbildschirm verwenden?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Verwende die Rückkamera, um Fotos mit einem weiteren Blickwinkel und höherer Auflösung aufzunehmen."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Dieses Display wird dann ausgeschaltet"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index 3cbba755beab..84e18f0596ed 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Οι ειδοποιήσεις τέθηκαν σε παύση από τη λειτουργία \"Μην ενοχλείτε\""</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Έναρξη τώρα"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Δεν υπάρχουν ειδοποιήσεις"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"Δεν υπάρχουν νέες ειδοποιήσεις"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"Ξεκλειδώστε για εμφάνιση παλαιότ. ειδοπ."</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Αυτή η συσκευή είναι διαχειριζόμενη από τον γονέα σου"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"Ο οργανισμός σας κατέχει αυτήν τη συσκευή και μπορεί να παρακολουθεί την επισκεψιμότητα δικτύου."</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"Ο οργανισμός <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> κατέχει αυτήν τη συσκευή και μπορεί να παρακολουθεί την επισκεψιμότητα δικτύου."</string> @@ -874,8 +872,7 @@ <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Διακοπή μετάδοσης"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Διαθέσιμες συσκευές για έξοδο ήχου."</string> <string name="media_output_dialog_accessibility_seekbar" msgid="5332843993805568978">"Ένταση ήχου"</string> - <!-- no translation found for media_output_dialog_volume_percentage (1613984910585111798) --> - <skip /> + <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Πώς λειτουργεί η μετάδοση"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Μετάδοση"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Οι άνθρωποι με συμβατές συσκευές Bluetooth που βρίσκονται κοντά σας μπορούν να ακούσουν το μέσο που μεταδίδετε."</string> @@ -989,8 +986,7 @@ <string name="dream_overlay_status_bar_camera_mic_off" msgid="3199425257833773569">"Η κάμερα και το μικρόφωνο έχουν απενεργοποιηθεί"</string> <string name="dream_overlay_status_bar_notification_indicator" msgid="8091389255691081711">"{count,plural, =1{# ειδοποίηση}other{# ειδοποιήσεις}}"</string> <string name="dream_overlay_weather_complication_desc" msgid="824503662089783824">"<xliff:g id="WEATHER_CONDITION">%1$s</xliff:g>, <xliff:g id="TEMPERATURE">%2$s</xliff:g>"</string> - <!-- no translation found for note_task_button_label (8718616095800343136) --> - <skip /> + <string name="note_task_button_label" msgid="8718616095800343136">"Δημιουργία σημειώσεων"</string> <string name="broadcasting_description_is_broadcasting" msgid="765627502786404290">"Μετάδοση"</string> <string name="bt_le_audio_broadcast_dialog_title" msgid="3605428497924077811">"Διακοπή μετάδοσης με την εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g>;"</string> <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="7889684551194225793">"Εάν κάνετε μετάδοση με την εφαρμογή <xliff:g id="SWITCHAPP">%1$s</xliff:g> ή αλλάξετε την έξοδο, η τρέχουσα μετάδοση θα σταματήσει"</string> @@ -1013,4 +1009,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Αναστροφή στην μπροστ. οθόνη για καλύτερη selfie;"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Χρησιμοποιήστε την πίσω κάμερα για να βγάλετε μια φωτογραφία με μεγαλύτερο εύρος και υψηλότερη ανάλυση."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"* Αυτή η οθόνη θα απενεργοποιηθεί"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index 212c879e45ec..133bb64ef08a 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -872,8 +872,7 @@ <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Stop casting"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Available devices for audio output."</string> <string name="media_output_dialog_accessibility_seekbar" msgid="5332843993805568978">"Volume"</string> - <!-- no translation found for media_output_dialog_volume_percentage (1613984910585111798) --> - <skip /> + <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"How broadcasting works"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Broadcast"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"People near you with compatible Bluetooth devices can listen to the media that you\'re broadcasting"</string> @@ -987,8 +986,7 @@ <string name="dream_overlay_status_bar_camera_mic_off" msgid="3199425257833773569">"Camera and mic are off"</string> <string name="dream_overlay_status_bar_notification_indicator" msgid="8091389255691081711">"{count,plural, =1{# notification}other{# notifications}}"</string> <string name="dream_overlay_weather_complication_desc" msgid="824503662089783824">"<xliff:g id="WEATHER_CONDITION">%1$s</xliff:g>, <xliff:g id="TEMPERATURE">%2$s</xliff:g>"</string> - <!-- no translation found for note_task_button_label (8718616095800343136) --> - <skip /> + <string name="note_task_button_label" msgid="8718616095800343136">"Notetaking"</string> <string name="broadcasting_description_is_broadcasting" msgid="765627502786404290">"Broadcasting"</string> <string name="bt_le_audio_broadcast_dialog_title" msgid="3605428497924077811">"Stop broadcasting <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="7889684551194225793">"If you broadcast <xliff:g id="SWITCHAPP">%1$s</xliff:g> or change the output, your current broadcast will stop"</string> @@ -1011,4 +1009,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Flip to front display for a better selfie?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Use the rear-facing camera for a wider photo with higher resolution."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ This screen will turn off"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index f87dd7f65d8b..4caf4e042258 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -1009,4 +1009,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Flip to front display for a better selfie?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Use the rear-facing camera for a wider photo with higher resolution."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ This screen will turn off"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index 212c879e45ec..133bb64ef08a 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -872,8 +872,7 @@ <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Stop casting"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Available devices for audio output."</string> <string name="media_output_dialog_accessibility_seekbar" msgid="5332843993805568978">"Volume"</string> - <!-- no translation found for media_output_dialog_volume_percentage (1613984910585111798) --> - <skip /> + <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"How broadcasting works"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Broadcast"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"People near you with compatible Bluetooth devices can listen to the media that you\'re broadcasting"</string> @@ -987,8 +986,7 @@ <string name="dream_overlay_status_bar_camera_mic_off" msgid="3199425257833773569">"Camera and mic are off"</string> <string name="dream_overlay_status_bar_notification_indicator" msgid="8091389255691081711">"{count,plural, =1{# notification}other{# notifications}}"</string> <string name="dream_overlay_weather_complication_desc" msgid="824503662089783824">"<xliff:g id="WEATHER_CONDITION">%1$s</xliff:g>, <xliff:g id="TEMPERATURE">%2$s</xliff:g>"</string> - <!-- no translation found for note_task_button_label (8718616095800343136) --> - <skip /> + <string name="note_task_button_label" msgid="8718616095800343136">"Notetaking"</string> <string name="broadcasting_description_is_broadcasting" msgid="765627502786404290">"Broadcasting"</string> <string name="bt_le_audio_broadcast_dialog_title" msgid="3605428497924077811">"Stop broadcasting <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="7889684551194225793">"If you broadcast <xliff:g id="SWITCHAPP">%1$s</xliff:g> or change the output, your current broadcast will stop"</string> @@ -1011,4 +1009,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Flip to front display for a better selfie?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Use the rear-facing camera for a wider photo with higher resolution."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ This screen will turn off"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index 212c879e45ec..133bb64ef08a 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -872,8 +872,7 @@ <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Stop casting"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Available devices for audio output."</string> <string name="media_output_dialog_accessibility_seekbar" msgid="5332843993805568978">"Volume"</string> - <!-- no translation found for media_output_dialog_volume_percentage (1613984910585111798) --> - <skip /> + <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"How broadcasting works"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Broadcast"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"People near you with compatible Bluetooth devices can listen to the media that you\'re broadcasting"</string> @@ -987,8 +986,7 @@ <string name="dream_overlay_status_bar_camera_mic_off" msgid="3199425257833773569">"Camera and mic are off"</string> <string name="dream_overlay_status_bar_notification_indicator" msgid="8091389255691081711">"{count,plural, =1{# notification}other{# notifications}}"</string> <string name="dream_overlay_weather_complication_desc" msgid="824503662089783824">"<xliff:g id="WEATHER_CONDITION">%1$s</xliff:g>, <xliff:g id="TEMPERATURE">%2$s</xliff:g>"</string> - <!-- no translation found for note_task_button_label (8718616095800343136) --> - <skip /> + <string name="note_task_button_label" msgid="8718616095800343136">"Notetaking"</string> <string name="broadcasting_description_is_broadcasting" msgid="765627502786404290">"Broadcasting"</string> <string name="bt_le_audio_broadcast_dialog_title" msgid="3605428497924077811">"Stop broadcasting <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="7889684551194225793">"If you broadcast <xliff:g id="SWITCHAPP">%1$s</xliff:g> or change the output, your current broadcast will stop"</string> @@ -1011,4 +1009,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Flip to front display for a better selfie?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Use the rear-facing camera for a wider photo with higher resolution."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ This screen will turn off"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml index 1152e1e175af..abb548b4ad6a 100644 --- a/packages/SystemUI/res/values-en-rXC/strings.xml +++ b/packages/SystemUI/res/values-en-rXC/strings.xml @@ -1009,4 +1009,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Flip to front display for a better selfie?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Use the rear-facing camera for a wider photo with higher resolution."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930">""<b>"✱ This screen will turn off"</b>""</string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 609a0154fc8b..3527aaf4cee5 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -1011,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"¿Cambiar a pantalla frontal para mejores selfies?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Usa la cámara trasera para tomar una foto más amplia y con mejor resolución."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Esta pantalla se apagará"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 3225c670dac6..dcc52b558a74 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notificaciones pausadas por el modo No molestar"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Empezar ahora"</string> <string name="empty_shade_text" msgid="8935967157319717412">"No hay notificaciones"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"No hay notificaciones nuevas"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"Desbloquea para ver notif. anteriores"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Este dispositivo lo gestionan tu padre o tu madre"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"El dispositivo pertenece a tu organización, que puede monitorizar su tráfico de red"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"El dispositivo pertenece a <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>, que puede monitorizar su tráfico de red"</string> @@ -1013,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"¿Usar pantalla frontal para hacer mejores selfies?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Usa la cámara trasera para hacer una foto más amplia y con mayor resolución."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Esta pantalla se apagará"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index 1677590c1e7b..afba616a85bd 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Režiim Mitte segada peatas märguanded"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Alusta kohe"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Märguandeid pole"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"Uusi märguandeid ei ole"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"Uute märguannete nägemiseks avage"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Seda seadet haldab sinu vanem"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"Teie organisatsioon on selle seadme omanik ja võib jälgida võrguliiklust"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> on selle seadme omanik ja võib jälgida võrguliiklust"</string> @@ -1013,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Kas kasutada parema selfi jaoks esikaamerat?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Kasutage tagakülje kaamerat, et jäädvustada suurema eraldusvõimega laiem foto."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ See ekraan lülitatakse välja"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 8f5b88a85eac..9ded73a98c26 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -529,8 +529,8 @@ <string name="notification_automatic_title" msgid="3745465364578762652">"Automatikoa"</string> <string name="notification_channel_summary_low" msgid="4860617986908931158">"Ez du tonurik jotzen edo dar-dar egiten"</string> <string name="notification_conversation_summary_low" msgid="1734433426085468009">"Ez du tonurik jotzen edo dar-dar egiten, eta elkarrizketen atalaren behealdean agertzen da"</string> - <string name="notification_channel_summary_default" msgid="3282930979307248890">"Tonua jo edo dar-dar egin dezake, telefonoaren ezarpenen arabera"</string> - <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Tonua jo edo dar-dar egin dezake, telefonoaren ezarpenen arabera. Modu lehenetsian, <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioko elkarrizketak burbuila gisa agertzen dira."</string> + <string name="notification_channel_summary_default" msgid="3282930979307248890">"Tonua joko du, edo dar-dar egingo, telefonoaren ezarpenen arabera"</string> + <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Tonua joko du, edo dar-dar egingo, telefonoaren ezarpenen arabera. Modu lehenetsian, <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioko elkarrizketak burbuila gisa agertzen dira."</string> <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Ezarri sistemak zehaztu dezala jakinarazpen honek soinua edo dardara egin behar duen ala ez"</string> <string name="notification_channel_summary_automatic_alerted" msgid="954166812246932240">"Lehenetsi gisa ezarri da <b>egoera:</b>"</string> <string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"Soinurik gabeko modura aldatu da <b>egoera:</b>"</string> @@ -948,7 +948,7 @@ <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Ezin izan da konektatu sarera"</string> <string name="wifi_wont_autoconnect_for_now" msgid="5782282612749867762">"Oraingoz ez da automatikoki konektatuko wifira"</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> + <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Sarea aldatzeko, deskonektatu Etherneta"</string> <string name="wifi_scan_notify_message" msgid="3753839537448621794">"Gailuaren funtzionamendua hobetzeko, aplikazioek eta zerbitzuek wifi-sareak bilatzen jarraituko dute, baita wifi-konexioa desaktibatuta dagoenean ere. Aukera hori aldatzeko, joan wifi-sareen bilaketaren ezarpenetara. "<annotation id="link">"Aldatu"</annotation></string> <string name="turn_off_airplane_mode" msgid="8425587763226548579">"Desaktibatu hegaldi modua"</string> <string name="qs_tile_request_dialog_text" msgid="3501359944139877694">"<xliff:g id="APPNAME">%1$s</xliff:g> aplikazioak lauza hau gehitu nahi du Ezarpen bizkorrak menuan:"</string> @@ -1011,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Telefonoa irauli nahi duzu autoargazki hobeak ateratzeko?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Erabili atzeko kamera kalitate handiagoko argazki zabalago bat ateratzeko."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Pantaila itzali egingo da"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index 0e8f2564e57b..c93803e96ce5 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"اعلانها توسط «مزاحم نشوید» موقتاً متوقف شدند"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"اکنون شروع کنید"</string> <string name="empty_shade_text" msgid="8935967157319717412">"اعلانی موجود نیست"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"اعلان جدیدی وجود ندارد"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"برای دیدن اعلانهای قبلی قفل را باز کنید"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"این دستگاه را ولیتان مدیریت میکند"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"مالک این دستگاه سازمان شما است و ممکن است ترافیک شبکه را پایش کند"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"مالک این دستگاه <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> است و ممکن است ترافیک شبکه را پایش کند"</string> @@ -1013,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"برای خویشگرفت بهتر، از نمایشگر جلو استفاده شود؟"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"برای عکسی عریضتر با وضوح بالاتر، از دوربین عقب استفاده کنید."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ این صفحهنمایش خاموش خواهد شد"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 46770602ddc3..d3b2da3577c0 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Älä häiritse ‑tila keskeytti ilmoitukset"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Aloita nyt"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Ei ilmoituksia"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"Ei uusia ilmoituksia"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"Avaa lukitus uusia ilmoituksia varten"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Vanhempasi ylläpitää tätä laitetta"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"Organisaatiosi omistaa laitteen ja voi valvoa verkkoliikennettä"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> omistaa laitteen ja voi valvoa verkkoliikennettä"</string> @@ -1013,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Käännä etunäytölle, jotta saat paremman selfien?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Voit ottaa laajemman kuvan korkeammalla resoluutiolla, kun käytät takakameraa."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Tämä näyttö sammutetaan"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index d61c1989adc9..0300e9cb4c78 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Les notifications sont suspendues par le mode Ne pas déranger"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Commencer"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Aucune notification"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"Aucune nouvelle notification"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"Déverr. pour voir les anciennes notif."</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Cet appareil est géré par ton parent"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"Votre organisation possède cet appareil et peut contrôler le trafic réseau"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> possède cet appareil et peut contrôler le trafic réseau"</string> @@ -1013,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Retourner l\'écran pour un meilleur égoportrait?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Utilisez l\'appareil photo arrière pour une photo plus large avec une résolution supérieure."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"* Cet écran va s\'éteindre"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index c0eef80fbb80..c1d58ebcaa5a 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notifications suspendues par le mode Ne pas déranger"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Commencer"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Aucune notification"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"Aucune nouvelle notification"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"Déverrouiller pour voir anciennes notifications"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Cet appareil est géré par tes parents"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"Cet appareil appartient à votre organisation, qui peut contrôler votre trafic réseau"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"Cet appareil appartient à <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>, qui peut contrôler votre trafic réseau"</string> @@ -1013,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Passer à l\'écran frontal pour un meilleur selfie ?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Utilisez la caméra arrière pour prendre une photo plus large avec une résolution supérieure."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Cet écran sera désactivé"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index 3b828cd46989..c1daa9863b60 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"O modo Non molestar puxo en pausa as notificacións"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Iniciar agora"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Non hai notificacións"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"Non hai notificacións novas"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"Desbloquea para ver notificacións"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"O teu pai ou nai xestiona este dispositivo"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"A túa organización é propietaria deste dispositivo e pode controlar o tráfico de rede"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> é a organización propietaria deste dispositivo e pode controlar o tráfico de rede"</string> @@ -1013,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Usar a cámara dianteira para unha autofoto mellor?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Usa a cámara traseira para sacar unha foto máis ampla e con maior resolución."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Desactivarase esta pantalla"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index 075be84fc308..6e306c826166 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -872,8 +872,7 @@ <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"કાસ્ટ કરવાનું રોકો"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"ઑડિયો આઉટપુટ માટે ઉપલબ્ધ ડિવાઇસ."</string> <string name="media_output_dialog_accessibility_seekbar" msgid="5332843993805568978">"વૉલ્યૂમ"</string> - <!-- no translation found for media_output_dialog_volume_percentage (1613984910585111798) --> - <skip /> + <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"બ્રોડકાસ્ટ પ્રક્રિયાની કામ કરવાની રીત"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"બ્રોડકાસ્ટ કરો"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"સુસંગત બ્લૂટૂથ ડિવાઇસ ધરાવતા નજીકના લોકો તમે જે મીડિયા બ્રોડકાસ્ટ કરી રહ્યાં છો તે સાંભળી શકે છે"</string> @@ -987,8 +986,7 @@ <string name="dream_overlay_status_bar_camera_mic_off" msgid="3199425257833773569">"કૅમેરા અને માઇક બંધ છે"</string> <string name="dream_overlay_status_bar_notification_indicator" msgid="8091389255691081711">"{count,plural, =1{# નોટિફિકેશન}one{# નોટિફિકેશન}other{# નોટિફિકેશન}}"</string> <string name="dream_overlay_weather_complication_desc" msgid="824503662089783824">"<xliff:g id="WEATHER_CONDITION">%1$s</xliff:g>, <xliff:g id="TEMPERATURE">%2$s</xliff:g>"</string> - <!-- no translation found for note_task_button_label (8718616095800343136) --> - <skip /> + <string name="note_task_button_label" msgid="8718616095800343136">"નોંધ લેવી"</string> <string name="broadcasting_description_is_broadcasting" msgid="765627502786404290">"બ્રૉડકાસ્ટ કરી રહ્યાં છે"</string> <string name="bt_le_audio_broadcast_dialog_title" msgid="3605428497924077811">"<xliff:g id="APP_NAME">%1$s</xliff:g> બ્રોડકાસ્ટ કરવાનું રોકીએ?"</string> <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="7889684551194225793">"જો તમે <xliff:g id="SWITCHAPP">%1$s</xliff:g> બ્રોડકાસ્ટ કરો અથવા આઉટપુટ બદલો, તો તમારું હાલનું બ્રોડકાસ્ટ બંધ થઈ જશે"</string> @@ -1011,4 +1009,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"બહેતર સેલ્ફી લેવા ફ્રન્ટ ડિસ્પ્લે પર ફ્લિપ કરીએ?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"વધુ ઉચ્ચ રિઝોલ્યુશનવાળો વિશાળ ફોટો લેવા માટે પાછલા કૅમેરાનો ઉપયોગ કરો."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ આ સ્ક્રીન બંધ થઈ જશે"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/layout/dream_overlay_complication_weather.xml b/packages/SystemUI/res/values-h411dp/dimens.xml index f05922fb395c..6b21353d0e55 100644 --- a/packages/SystemUI/res/layout/dream_overlay_complication_weather.xml +++ b/packages/SystemUI/res/values-h411dp/dimens.xml @@ -13,10 +13,7 @@ ~ 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. ---> -<TextView - xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/weather_view" - style="@style/clock_subtitle" - android:layout_width="wrap_content" - android:layout_height="wrap_content" /> + --> +<resources> + <dimen name="volume_row_slider_height">137dp</dimen> +</resources> diff --git a/packages/SystemUI/res/values-h700dp/dimens.xml b/packages/SystemUI/res/values-h700dp/dimens.xml index 055308f17776..39777ab56847 100644 --- a/packages/SystemUI/res/values-h700dp/dimens.xml +++ b/packages/SystemUI/res/values-h700dp/dimens.xml @@ -17,4 +17,5 @@ <resources> <!-- Margin above the ambient indication container --> <dimen name="ambient_indication_container_margin_top">15dp</dimen> -</resources>
\ No newline at end of file + <dimen name="volume_row_slider_height">177dp</dimen> +</resources> diff --git a/packages/SystemUI/res/layout/dream_overlay_complication_clock_date.xml b/packages/SystemUI/res/values-h841dp/dimens.xml index efbdd1af3644..412da199f6b6 100644 --- a/packages/SystemUI/res/layout/dream_overlay_complication_clock_date.xml +++ b/packages/SystemUI/res/values-h841dp/dimens.xml @@ -13,12 +13,7 @@ ~ 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. ---> -<TextClock - xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/date_view" - style="@style/clock_subtitle" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:format12Hour="@string/dream_date_complication_date_format" - android:format24Hour="@string/dream_date_complication_date_format"/> + --> +<resources> + <dimen name="volume_row_slider_height">237dp</dimen> +</resources> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 4179828606d0..5dba4665cac8 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\'परेशान न करें\' सुविधा के ज़रिए कुछ समय के लिए सूचनाएं दिखाना रोक दिया गया है"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"अभी शुरू करें"</string> <string name="empty_shade_text" msgid="8935967157319717412">"कोई सूचना नहीं है"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"कोई नई सूचना नहीं है"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"पुरानी सूचाएं देखने के लिए अनलॉक करें"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"इस डिवाइस का प्रबंधन आपके अभिभावक करते हैं"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"इस डिवाइस का मालिकाना हक आपके संगठन के पास है. आपका संगठन, नेटवर्क के ट्रैफ़िक की निगरानी कर सकता है"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"इस डिवाइस का मालिकाना हक <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> के पास है. आपका संगठन, नेटवर्क के ट्रैफ़िक की निगरानी कर सकता है"</string> @@ -502,8 +500,7 @@ <string name="wallet_error_generic" msgid="257704570182963611">"आपके कार्ड की जानकारी पाने में कोई समस्या हुई है. कृपया बाद में कोशिश करें"</string> <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"लॉक स्क्रीन की सेटिंग"</string> <string name="qr_code_scanner_title" msgid="1938155688725760702">"क्यूआर कोड स्कैनर"</string> - <!-- no translation found for qr_code_scanner_updating_secondary_label (8344598017007876352) --> - <skip /> + <string name="qr_code_scanner_updating_secondary_label" msgid="8344598017007876352">"अपडेट हो रहा है"</string> <string name="status_bar_work" msgid="5238641949837091056">"वर्क प्रोफ़ाइल"</string> <string name="status_bar_airplane" msgid="4848702508684541009">"हवाई जहाज़ मोड"</string> <string name="zen_alarm_warning" msgid="7844303238486849503">"आपको <xliff:g id="WHEN">%1$s</xliff:g> पर अपना अगला अलार्म नहीं सुनाई देगा"</string> @@ -1001,24 +998,21 @@ <string name="dream_date_complication_date_format" msgid="8191225366513860104">"EEE, MMM d"</string> <string name="dream_time_complication_12_hr_time_format" msgid="4691197486690291529">"h:mm"</string> <string name="dream_time_complication_24_hr_time_format" msgid="6248280719733640813">"kk:mm"</string> - <!-- no translation found for keyguard_affordance_enablement_dialog_action_template (8164857863036314664) --> - <skip /> - <!-- no translation found for keyguard_affordance_enablement_dialog_message (2790910660524887941) --> - <skip /> - <!-- no translation found for keyguard_affordance_enablement_dialog_wallet_instruction_1 (8439655049139819278) --> - <skip /> - <!-- no translation found for keyguard_affordance_enablement_dialog_wallet_instruction_2 (4321089250629477835) --> - <skip /> - <!-- no translation found for keyguard_affordance_enablement_dialog_qr_scanner_instruction (5355839079232119791) --> - <skip /> - <!-- no translation found for keyguard_affordance_enablement_dialog_home_instruction_1 (8438311171750568633) --> - <skip /> - <!-- no translation found for keyguard_affordance_enablement_dialog_home_instruction_2 (8308525385889021652) --> - <skip /> + <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"<xliff:g id="APPNAME">%1$s</xliff:g> खोलें"</string> + <string name="keyguard_affordance_enablement_dialog_message" msgid="2790910660524887941">"<xliff:g id="APPNAME">%1$s</xliff:g> ऐप्लिकेशन को शॉर्टकट के तौर पर जोड़ने के लिए, पक्का करें कि"</string> + <string name="keyguard_affordance_enablement_dialog_wallet_instruction_1" msgid="8439655049139819278">"• ऐप्लिकेशन को सेट अप किया गया है"</string> + <string name="keyguard_affordance_enablement_dialog_wallet_instruction_2" msgid="4321089250629477835">"• Wallet में कम से कम एक कार्ड जोड़ा गया है"</string> + <string name="keyguard_affordance_enablement_dialog_qr_scanner_instruction" msgid="5355839079232119791">"• कैमरा ऐप्लिकेशन इंस्टॉल किया गया है"</string> + <string name="keyguard_affordance_enablement_dialog_home_instruction_1" msgid="8438311171750568633">"• ऐप्लिकेशन को सेट अप किया गया है"</string> + <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• कम से कम एक डिवाइस उपलब्ध है"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"रद्द करें"</string> <string name="rear_display_bottom_sheet_confirm" msgid="4383356544661421206">"कैमरा अभी स्विच करें"</string> <string name="rear_display_fold_bottom_sheet_title" msgid="6081542277622721548">"बेहतर सेल्फ़ी के लिए फ़ोन को अनफ़ोल्ड करें"</string> <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"बेहतर सेल्फ़ी के लिए फ़्रंट डिसप्ले पर स्विच करें?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"वाइड ऐंगल में हाई रिज़ॉल्यूशन वाली फ़ोटो लेने के लिए, पीछे का कैमरा इस्तेमाल करें."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ यह स्क्रीन बंद हो जाएगी"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index ba83e9ae35c7..13f43be0e650 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -872,8 +872,7 @@ <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Zaustavi emitiranje"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Dostupni uređaji za audioizlaz."</string> <string name="media_output_dialog_accessibility_seekbar" msgid="5332843993805568978">"Glasnoća"</string> - <!-- no translation found for media_output_dialog_volume_percentage (1613984910585111798) --> - <skip /> + <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Kako emitiranje funkcionira"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Emitiranje"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Osobe u blizini s kompatibilnim Bluetooth uređajima mogu slušati medije koje emitirate"</string> @@ -987,8 +986,7 @@ <string name="dream_overlay_status_bar_camera_mic_off" msgid="3199425257833773569">"Fotoaparat i mikrofon su isključeni"</string> <string name="dream_overlay_status_bar_notification_indicator" msgid="8091389255691081711">"{count,plural, =1{# obavijest}one{# obavijest}few{# obavijesti}other{# obavijesti}}"</string> <string name="dream_overlay_weather_complication_desc" msgid="824503662089783824">"<xliff:g id="WEATHER_CONDITION">%1$s</xliff:g>, <xliff:g id="TEMPERATURE">%2$s</xliff:g>"</string> - <!-- no translation found for note_task_button_label (8718616095800343136) --> - <skip /> + <string name="note_task_button_label" msgid="8718616095800343136">"Pisanje bilježaka"</string> <string name="broadcasting_description_is_broadcasting" msgid="765627502786404290">"Emitiranje"</string> <string name="bt_le_audio_broadcast_dialog_title" msgid="3605428497924077811">"Zaustaviti emitiranje aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="7889684551194225793">"Ako emitirate aplikaciju <xliff:g id="SWITCHAPP">%1$s</xliff:g> ili promijenite izlaz, vaše će se trenutačno emitiranje zaustaviti"</string> @@ -1011,4 +1009,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Prebaciti na prednji zaslon za bolji selfie?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Upotrijebite stražnji fotoaparat za širu fotografiju s višom razlučivošću."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Ovaj će se zaslon isključiti"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index 759668af988b..7c816c739217 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -1011,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Átfordítja az előlapi kijelzőre a jobb szelfiért?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Használja az előlapi kamerát, hogy nagyobb felbontású, szélesebb fotót készíthessen"</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ A képernyő kikapcsol"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index c7e9b9faaaec..ea6023734fba 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Ծանուցումները չեն ցուցադրվի «Չանհանգստացնել» ռեժիմում"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Սկսել հիմա"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Ծանուցումներ չկան"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"Նոր ծանուցումներ չկան"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"Ապակողպեք՝ տեսնելու հին ծանուցումները"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Այս սարքը կառավարում է ձեր ծնողը"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"Ձեր կազմակերպությունը այս սարքի սեփականատերն է և կարող է վերահսկել ցանցային թրաֆիկը"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"«<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>» կազմակերպությունը այս սարքի սեփականատերն է և կարող է վերահսկել ցանցային թրաֆիկը"</string> @@ -1013,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Հեռախոսը էկրանով դեպի ձե՞զ շրջեցիք"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Օգտագործեք հետևի տեսախցիկը՝ ավելի բարձր լուծաչափով և ավելի լայն լուսանկար ստանալու համար։"</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Այս էկրանը կանջատվի"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index a17483fb8cbe..3cdb26e4ed5e 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -1011,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Gunakan layar depan untuk selfie yang lebih baik?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Gunakan kamera belakang untuk foto dengan resolusi lebih tinggi dan lebih lebar."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Layar ini akan dinonaktifkan"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index 40f459498208..7c715382c008 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Hlé gert á tilkynningum þar sem stillt er á „Ónáðið ekki“"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Byrja núna"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Engar tilkynningar"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"Engar nýjar tilkynningar"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"Taktu úr lás til að sjá eldri tilkynningar"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Foreldri þitt stjórnar þessu tæki"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"Fyrirtækið þitt á þetta tæki og fylgist hugsanlega með netumferð"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> á þetta tæki og fylgist hugsanlega með netumferð"</string> @@ -1013,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Snúa á framskjá til að ná betri sjálfsmynd?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Notaðu aftari myndavélina til að ná víðara sjónarhorni með meiri upplausn."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Slökkt verður á þessum skjá"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 6d3e4249fac9..f6c83543b2ff 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notifiche messe in pausa in base alla modalità Non disturbare"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Avvia adesso"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Nessuna notifica"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"Nessuna nuova notifica"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"Sblocca per notifiche meno recenti"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Questo dispositivo è gestito dai tuoi genitori"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"Questo dispositivo appartiene alla tua organizzazione, che potrebbe monitorare il traffico di rete"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"Questo dispositivo appartiene a <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>, che potrebbe monitorare il traffico di rete"</string> @@ -1013,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Girare su display frontale per un selfie migliore?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Utilizza la fotocamera posteriore per una foto più ampia con maggiore risoluzione."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Questo schermo verrà disattivato"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 37796692bb2f..8e12a0b92f24 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -1011,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"להפוך למסך הקדמי כדי לצלם תמונת סלפי טובה יותר?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"במצלמה האחורית אפשר לצלם תמונה רחבה יותר ברזולוציה גבוהה יותר."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ המסך יכבה"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index 41cdd1be3bb2..0cacdbdaa724 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -872,8 +872,7 @@ <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"キャストを停止"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"音声出力ができるデバイスです。"</string> <string name="media_output_dialog_accessibility_seekbar" msgid="5332843993805568978">"音量"</string> - <!-- no translation found for media_output_dialog_volume_percentage (1613984910585111798) --> - <skip /> + <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"ブロードキャストの仕組み"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"ブロードキャスト"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Bluetooth 対応デバイスを持っている付近のユーザーは、あなたがブロードキャストしているメディアを聴けます"</string> @@ -987,8 +986,7 @@ <string name="dream_overlay_status_bar_camera_mic_off" msgid="3199425257833773569">"カメラとマイクが OFF です"</string> <string name="dream_overlay_status_bar_notification_indicator" msgid="8091389255691081711">"{count,plural, =1{# 件の通知}other{# 件の通知}}"</string> <string name="dream_overlay_weather_complication_desc" msgid="824503662089783824">"<xliff:g id="WEATHER_CONDITION">%1$s</xliff:g>、<xliff:g id="TEMPERATURE">%2$s</xliff:g>"</string> - <!-- no translation found for note_task_button_label (8718616095800343136) --> - <skip /> + <string name="note_task_button_label" msgid="8718616095800343136">"メモ"</string> <string name="broadcasting_description_is_broadcasting" msgid="765627502786404290">"ブロードキャスト"</string> <string name="bt_le_audio_broadcast_dialog_title" msgid="3605428497924077811">"<xliff:g id="APP_NAME">%1$s</xliff:g> のブロードキャストを停止しますか?"</string> <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="7889684551194225793">"<xliff:g id="SWITCHAPP">%1$s</xliff:g> をブロードキャストしたり、出力を変更したりすると、現在のブロードキャストが停止します。"</string> @@ -1011,4 +1009,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"前面ディスプレイに切り替えて綺麗に撮りましょう"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"高解像度で広い範囲を撮影するには、背面カメラを使用してください。"</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱この画面は OFF になります"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index 8ab76d6daabc..038937dd1027 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -872,8 +872,7 @@ <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"ტრანსლირების შეწყვეტა"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"ხელმისაწვდომი მოწყობილობები გამომავალი აუდიოსთვის."</string> <string name="media_output_dialog_accessibility_seekbar" msgid="5332843993805568978">"ხმა"</string> - <!-- no translation found for media_output_dialog_volume_percentage (1613984910585111798) --> - <skip /> + <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"ტრანსლირების მუშაობის პრინციპი"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"ტრანსლაცია"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"თქვენთან ახლოს მყოფ ხალხს თავსებადი Bluetooth მოწყობილობით შეუძლიათ თქვენ მიერ ტრანსლირებული მედიის მოსმენა"</string> @@ -987,8 +986,7 @@ <string name="dream_overlay_status_bar_camera_mic_off" msgid="3199425257833773569">"კამერა და მიკროფონი გამორთულია"</string> <string name="dream_overlay_status_bar_notification_indicator" msgid="8091389255691081711">"{count,plural, =1{# შეტყობინება}other{# შეტყობინება}}"</string> <string name="dream_overlay_weather_complication_desc" msgid="824503662089783824">"<xliff:g id="WEATHER_CONDITION">%1$s</xliff:g>, <xliff:g id="TEMPERATURE">%2$s</xliff:g>"</string> - <!-- no translation found for note_task_button_label (8718616095800343136) --> - <skip /> + <string name="note_task_button_label" msgid="8718616095800343136">"შენიშვნების ჩაწერა"</string> <string name="broadcasting_description_is_broadcasting" msgid="765627502786404290">"იწყებთ მაუწყებლობას"</string> <string name="bt_le_audio_broadcast_dialog_title" msgid="3605428497924077811">"გსურთ <xliff:g id="APP_NAME">%1$s</xliff:g>-ის ტრანსლაციის შეჩერება?"</string> <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="7889684551194225793">"<xliff:g id="SWITCHAPP">%1$s</xliff:g>-ის ტრანსლაციის შემთხვევაში ან აუდიოს გამოსასვლელის შეცვლისას, მიმდინარე ტრანსლაცია შეჩერდება"</string> @@ -1011,4 +1009,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"გადააბრუნეთ წინა ეკრანზე უკეთესი სელფის მისაღებად?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"გამოიყენეთ უკანა კამერა უფრო ფართო ფოტოს გადასაღებად მაღალი გარჩევადობით."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ ეს ეკრანი გამოირთვება"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index ad984b3aec3c..91c0b3596de5 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Хабарландырулар Мазаламау режимінде кідіртілді"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Қазір бастау"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Хабарландырулар жоқ"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"Жаңа хабарландырулар жоқ"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"Ескі хабарландырулар үшін құлыпты ашыңыз"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Бұл құрылғыны ата-анаңыз басқарады."</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"Ұйымыңыз осы құрылғыны басқарады және желі трафигін бақылауы мүмкін."</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> осы құрылғыны басқарады және желі трафигін бақылауы мүмкін."</string> @@ -1013,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Жақсырақ селфи үшін алдыңғы экранға ауысасыз ба?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Ажыратымдылығы жоғары кеңірек фотосурет түсіру үшін артқы камераны пайдаланыңыз."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Бұл экран өшіріледі."</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index 13bd2c3b211f..51e5b53c7f22 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"ការជូនដំណឹងបានផ្អាកដោយមុខងារកុំរំខាន"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"ចាប់ផ្ដើមឥឡូវ"</string> <string name="empty_shade_text" msgid="8935967157319717412">"គ្មានការជូនដំណឹង"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"គ្មានការជូនដំណឹងថ្មីៗទេ"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"ដោះសោដើម្បីមើលការជូនដំណឹងចាស់ៗ"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"ឧបករណ៍នេះស្ថិតក្រោមការគ្រប់គ្រងរបស់មាតាបិតាអ្នក"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"ស្ថាប័នរបស់អ្នកជាម្ចាស់ឧបករណ៍នេះ ហើយអាចនឹងតាមដានចរាចរណ៍បណ្តាញ"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ជាម្ចាស់ឧបករណ៍នេះ ហើយអាចនឹងតាមដានចរាចរណ៍បណ្តាញ"</string> @@ -1013,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"ត្រឡប់ទៅផ្ទាំងអេក្រង់ខាងមុខ ដើម្បីថតសែលហ្វីកាន់តែបានល្អឬ?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"ប្រើកាមេរ៉ាខាងក្រោយ ដើម្បីទទួលបានរូបថតកាន់តែធំជាមួយនឹងកម្រិតគុណភាពកាន់តែខ្ពស់។"</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ អេក្រង់នេះនឹងបិទ"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index 106b78b09086..5baf68fae084 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಎನ್ನುವ ಮೂಲಕ ಅಧಿಸೂಚನೆಗಳನ್ನು ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"ಈಗ ಪ್ರಾರಂಭಿಸಿ"</string> <string name="empty_shade_text" msgid="8935967157319717412">"ಯಾವುದೇ ಅಧಿಸೂಚನೆಗಳಿಲ್ಲ"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"ಯಾವುದೇ ಹೊಸ ಅಧಿಸೂಚನೆಗಳಿಲ್ಲ"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"ಹಳೆಯ ಅಧಿಸೂಚನೆಗಳನ್ನು ನೋಡಲು ಅನ್ಲಾಕ್ ಮಾಡಿ"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"ಈ ಸಾಧನವನ್ನು ನಿಮ್ಮ ಪೋಷಕರು ನಿರ್ವಹಿಸುತ್ತಿದ್ದಾರೆ"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"ನಿಮ್ಮ ಸಂಸ್ಥೆಯು ಈ ಸಾಧನದ ಮಾಲೀಕತ್ವವನ್ನು ಹೊಂದಿದೆ ಮತ್ತು ಅದು ನೆಟ್ವರ್ಕ್ ಟ್ರಾಫಿಕ್ನ ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ಈ ಸಾಧನದ ಮಾಲೀಕತ್ವವನ್ನು ಹೊಂದಿದೆ ಮತ್ತು ಅದು ನೆಟ್ವರ್ಕ್ ಟ್ರಾಫಿಕ್ನ ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು"</string> @@ -874,8 +872,7 @@ <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"ಬಿತ್ತರಿಸುವುದನ್ನು ನಿಲ್ಲಿಸಿ"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"ಆಡಿಯೋ ಔಟ್ಪುಟ್ಗಾಗಿ ಲಭ್ಯವಿರುವ ಸಾಧನಗಳು."</string> <string name="media_output_dialog_accessibility_seekbar" msgid="5332843993805568978">"ವಾಲ್ಯೂಮ್"</string> - <!-- no translation found for media_output_dialog_volume_percentage (1613984910585111798) --> - <skip /> + <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"ಪ್ರಸಾರವು ಹೇಗೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"ಪ್ರಸಾರ"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"ಹೊಂದಾಣಿಕೆಯಾಗುವ ಬ್ಲೂಟೂತ್ ಸಾಧನಗಳನ್ನು ಹೊಂದಿರುವ ಸಮೀಪದಲ್ಲಿರುವ ಜನರು ನೀವು ಪ್ರಸಾರ ಮಾಡುತ್ತಿರುವ ಮಾಧ್ಯಮವನ್ನು ಆಲಿಸಬಹುದು"</string> @@ -989,8 +986,7 @@ <string name="dream_overlay_status_bar_camera_mic_off" msgid="3199425257833773569">"ಕ್ಯಾಮರಾ ಮತ್ತು ಮೈಕ್ ಆಫ್ ಆಗಿದೆ"</string> <string name="dream_overlay_status_bar_notification_indicator" msgid="8091389255691081711">"{count,plural, =1{# ಅಧಿಸೂಚನೆ}one{# ಅಧಿಸೂಚನೆಗಳು}other{# ಅಧಿಸೂಚನೆಗಳು}}"</string> <string name="dream_overlay_weather_complication_desc" msgid="824503662089783824">"<xliff:g id="WEATHER_CONDITION">%1$s</xliff:g>, <xliff:g id="TEMPERATURE">%2$s</xliff:g>"</string> - <!-- no translation found for note_task_button_label (8718616095800343136) --> - <skip /> + <string name="note_task_button_label" msgid="8718616095800343136">"ಟಿಪ್ಪಣಿಗಳನ್ನು ಬರೆದುಕೊಳ್ಳುವುದು"</string> <string name="broadcasting_description_is_broadcasting" msgid="765627502786404290">"ಪ್ರಸಾರ ಮಾಡಲಾಗುತ್ತಿದೆ"</string> <string name="bt_le_audio_broadcast_dialog_title" msgid="3605428497924077811">"<xliff:g id="APP_NAME">%1$s</xliff:g> ನ ಪ್ರಸಾರವನ್ನು ನಿಲ್ಲಿಸಬೇಕೆ?"</string> <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="7889684551194225793">"ನೀವು <xliff:g id="SWITCHAPP">%1$s</xliff:g> ಅನ್ನು ಪ್ರಸಾರ ಮಾಡಿದರೆ ಅಥವಾ ಔಟ್ಪುಟ್ ಅನ್ನು ಬದಲಾಯಿಸಿದರೆ, ನಿಮ್ಮ ಪ್ರಸ್ತುತ ಪ್ರಸಾರವು ಸ್ಥಗಿತಗೊಳ್ಳುತ್ತದೆ"</string> @@ -1013,4 +1009,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"ಉತ್ತಮ ಸೆಲ್ಫೀಗಾಗಿ ಮುಂಭಾಗದ ಕ್ಯಾಮರಾಗೆ ಫ್ಲಿಪ್ ಮಾಡಬೇಕೆ?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"ಹೆಚ್ಚಿನ ರೆಸಲ್ಯೂಷನ್ ಹೊಂದಿರುವ ವಿಶಾಲವಾದ ಫೋಟೋಗಾಗಿ ಹಿಂಭಾಗದ ಕ್ಯಾಮರಾವನ್ನು ಬಳಸಿ."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ ಈ ಸ್ಕ್ರೀನ್ ಆಫ್ ಆಗುತ್ತದೆ"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index dbca672b0043..9b8e46a38df0 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"방해 금지 모드로 알림이 일시중지됨"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"시작하기"</string> <string name="empty_shade_text" msgid="8935967157319717412">"알림 없음"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"새로운 알림 없음"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"잠금 해제하여 이전 알림 보기"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"부모님이 관리하는 기기입니다."</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"내 조직에서 이 기기를 소유하며 네트워크 트래픽을 모니터링할 수 있습니다."</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>에서 이 기기를 소유하며 네트워크 트래픽을 모니터링할 수 있습니다."</string> @@ -1013,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"전면 디스플레이가 보이도록 뒤집어서 더 나은 셀카를 찍어보세요"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"후면 카메라를 통해 넓은 각도로 해상도가 높은 사진을 찍어보세요."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ 이 화면이 꺼집니다."</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index 8460e32bc73f..bb55c627df73 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\"Тынчымды алба\" режиминде билдирмелер тындырылды"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Азыр баштоо"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Билдирме жок"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"Жаңы билдирмелер жок"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"Билдирмелерди көрүү үчүн кулпуну ачыңыз"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Бул түзмөктү ата-энең башкарат"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"Бул түзмөк уюмуңузга таандык. Уюмуңуз тармактын трафигин көзөмөлдөй алат"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"Бул түзмөк <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> уюмуна таандык. Уюм тармактын трафигин көзөмөлдөй алат"</string> @@ -1013,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Жакшы селфи тартуу үчүн маңдайкы экранга которосузбу?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Кең жана жогорку дааналыктагы сүрөттү тартуу үчүн негизги камераны колдонуңуз."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Бул экран өчөт"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index 126161319889..da353e644b65 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -1011,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"ປີ້ນເປັນຈໍສະແດງຜົນດ້ານໜ້າເພື່ອການຖ່າຍເຊວຟີທີ່ດີຂຶ້ນບໍ?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"ໃຊ້ກ້ອງຫຼັງເພື່ອການຖ່າຍຮູບທີ່ກວ້າງຂຶ້ນດ້ວຍຄວາມລະອຽດສູງຂຶ້ນ."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ ໜ້າຈໍນີ້ຈະປິດ"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index 8db0454162bf..96c43712a2f6 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Pranešimai pristabdyti naudojant netrukdymo režimą"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Pradėti dabar"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Nėra įspėjimų"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"Naujų pranešimų nėra"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"Atrakinę matykite senesnius pranešimus"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Šį įrenginį tvarko vienas iš tavo tėvų"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"Šis įrenginys priklauso jūsų organizacijai ir ji gali stebėti tinklo srautą"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"Šis įrenginys priklauso „<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>“ ir ji gali stebėti tinklo srautą"</string> @@ -1013,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Užfiksuoti geresnę asmenukę įjungus priekinį rodinį?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Naudokite galinį fotoaparatą, kad nuotrauka būtų platesnė ir didesnės skyros."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Šis ekranas išsijungs"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 3698c3a9968a..1c2238014b55 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -180,10 +180,10 @@ <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Lidmašīnas režīms."</string> <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN ieslēgts"</string> <string name="accessibility_battery_level" msgid="5143715405241138822">"Akumulators: <xliff:g id="NUMBER">%d</xliff:g> procenti"</string> - <string name="accessibility_battery_level_with_estimate" msgid="6548654589315074529">"Akumulatora uzlādes līmenis: <xliff:g id="PERCENTAGE">%1$d</xliff:g>%% procenti, <xliff:g id="TIME">%2$s</xliff:g>"</string> + <string name="accessibility_battery_level_with_estimate" msgid="6548654589315074529">"Akumulatora uzlādes līmenis: <xliff:g id="PERCENTAGE">%1$d</xliff:g>%%, <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="accessibility_battery_level_charging" msgid="8892191177774027364">"Notiek akumulatora uzlāde, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>%%."</string> - <string name="accessibility_battery_level_charging_paused" msgid="3560711496775146763">"Akumulatora uzlādes līmenis: <xliff:g id="PERCENTAGE">%d</xliff:g>%% procenti, uzlāde ir apturēta, lai aizsargātu akumulatoru."</string> - <string name="accessibility_battery_level_charging_paused_with_estimate" msgid="2223541217743647858">"Akumulatora uzlādes līmenis: <xliff:g id="PERCENTAGE">%1$d</xliff:g>%% procenti, <xliff:g id="TIME">%2$s</xliff:g>, uzlāde ir apturēta, lai aizsargātu akumulatoru."</string> + <string name="accessibility_battery_level_charging_paused" msgid="3560711496775146763">"Akumulatora uzlādes līmenis: <xliff:g id="PERCENTAGE">%d</xliff:g>%%, uzlāde ir apturēta, lai aizsargātu akumulatoru."</string> + <string name="accessibility_battery_level_charging_paused_with_estimate" msgid="2223541217743647858">"Akumulatora uzlādes līmenis: <xliff:g id="PERCENTAGE">%1$d</xliff:g>%%, <xliff:g id="TIME">%2$s</xliff:g>, uzlāde ir apturēta, lai aizsargātu akumulatoru."</string> <string name="accessibility_overflow_action" msgid="8555835828182509104">"Skatīt visus paziņojumus"</string> <string name="accessibility_tty_enabled" msgid="1123180388823381118">"Teletaips ir iespējots."</string> <string name="accessibility_ringer_vibrate" msgid="6261841170896561364">"Zvana signāls — vibrācija."</string> @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Paziņojumi pārtraukti, izmantojot iestatījumu “Netraucēt”"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Sākt tūlīt"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Nav paziņojumu"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"Nav jaunu paziņojumu"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"Atbloķējiet vecāku paziņojumu skatīšanai"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Šo ierīci pārvalda viens no jūsu vecākiem."</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"Šī ierīce pieder jūsu organizācijai, un jūsu organizācija var uzraudzīt tīkla datplūsmu."</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"Šī ierīce pieder organizācijai<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>, un šī organizācija var uzraudzīt tīkla datplūsmu."</string> @@ -1013,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Vai apvērst uz priekšējo kameru labākai pašbildei?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Lai uzņemtu platāku fotoattēlu ar augstāku izšķirtspēju, izmantojiet aizmugurējo kameru."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Šis ekrāns tiks izslēgts."</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index e8b779714b1b..603151fb1aea 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -872,8 +872,7 @@ <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Сопри со емитување"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Достапни уреди за аудиоизлез."</string> <string name="media_output_dialog_accessibility_seekbar" msgid="5332843993805568978">"Јачина на звук"</string> - <!-- no translation found for media_output_dialog_volume_percentage (1613984910585111798) --> - <skip /> + <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Како функционира емитувањето"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Емитување"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Луѓето во ваша близина со компатибилни уреди со Bluetooth може да ги слушаат аудиозаписите што ги емитувате"</string> @@ -987,8 +986,7 @@ <string name="dream_overlay_status_bar_camera_mic_off" msgid="3199425257833773569">"Камерата и микрофонот се исклучени"</string> <string name="dream_overlay_status_bar_notification_indicator" msgid="8091389255691081711">"{count,plural, =1{# известување}one{# известување}other{# известувања}}"</string> <string name="dream_overlay_weather_complication_desc" msgid="824503662089783824">"<xliff:g id="WEATHER_CONDITION">%1$s</xliff:g>, <xliff:g id="TEMPERATURE">%2$s</xliff:g>"</string> - <!-- no translation found for note_task_button_label (8718616095800343136) --> - <skip /> + <string name="note_task_button_label" msgid="8718616095800343136">"Фаќање белешки"</string> <string name="broadcasting_description_is_broadcasting" msgid="765627502786404290">"Емитување"</string> <string name="bt_le_audio_broadcast_dialog_title" msgid="3605428497924077811">"Да се прекине емитувањето на <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="7889684551194225793">"Ако емитувате на <xliff:g id="SWITCHAPP">%1$s</xliff:g> или го промените излезот, тековното емитување ќе запре"</string> @@ -1011,4 +1009,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Да се префрли на предниот екран за подобро селфи?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Користете ја задната камера за поширока фотографија со повисока резолуција."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Екранов ќе се исклучи"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index 1a6d70f39fd6..5df73055cef2 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\'ശല്യപ്പെടുത്തരുത്\' വഴി അറിയിപ്പുകൾ താൽക്കാലികമായി നിർത്തി"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"ഇപ്പോൾ ആരംഭിക്കുക"</string> <string name="empty_shade_text" msgid="8935967157319717412">"അറിയിപ്പുകൾ ഒന്നുമില്ല"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"പുതിയ അറിയിപ്പുകളൊന്നുമില്ല"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"പഴയ അറിയിപ്പുകൾ കാണാൻ അൺലോക്ക് ചെയ്യുക"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"ഈ ഉപകരണം മാനേജ് ചെയ്യുന്നത് നിങ്ങളുടെ രക്ഷിതാവാണ്"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"ഈ ഉപകരണം നിങ്ങളുടെ സ്ഥാപനത്തിന്റെ ഉടമസ്ഥതയിലായതിനാൽ നെറ്റ്വർക്ക് ട്രാഫിക്ക് നിരീക്ഷിച്ചേക്കാം"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"ഈ ഉപകരണം <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> എന്ന സ്ഥാപനത്തിന്റെ ഉടമസ്ഥതയിലായതിനാൽ നെറ്റ്വർക്ക് ട്രാഫിക്ക് നിരീക്ഷിച്ചേക്കാം"</string> @@ -1013,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"മികച്ച സെൽഫിക്ക് ഫ്രണ്ട് ഡിസ്പ്ലേയിലേക്ക് മാറണോ?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"ഉയർന്ന റെസല്യൂഷൻ ഉള്ള, വീതി കൂടിയ ഫോട്ടോയ്ക്ക്, പിൻഭാഗത്തെ ക്യാമറ ഉപയോഗിക്കുക."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ ഈ സ്ക്രീൻ ഓഫാകും"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index 1e1efcfeb510..aa57e815b676 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -1011,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Сайн сельфи авахаар урд талын дэлгэц рүү хөнтрөх үү?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Илүү өндөр нягтаршилтай илүү өргөн зураг авахын тулд арын камерыг ашиглана уу."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Энэ дэлгэц унтарна"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index 9e4144793fe5..7f3c28cbbf7f 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"व्यत्यय आणून नकाद्वारे सूचना थांबवल्या"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"आता सुरू करा"</string> <string name="empty_shade_text" msgid="8935967157319717412">"सूचना नाहीत"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"नवीन सूचना नाहीत"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"जुन्या सूचना पहाण्यासाठी अनलॉक करा"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"हे डिव्हाइस तुमच्या पालकाने व्यवस्थापित केले आहे"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"तुमच्या संस्थेकडे या डिव्हाइसची मालकी आहे आणि ती नेटवर्क ट्रॅफिकचे परीक्षण करू शकते"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"हे डिव्हाइस <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> च्या मालकीचे आहे आणि ती नेटवर्क ट्रॅफिकचे परीक्षण करू शकते"</string> @@ -1013,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"आणखी चांगल्या सेल्फीसाठी फ्रंट डिस्प्ले वापरायचा का?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"उच्च रेझोल्यूशन असलेल्या विस्तृत फोटोसाठी रीअर कॅमेरा वापरा."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ ही स्क्रीन बंद होईल"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index fbfee35b2b5f..bfbc8ea8a203 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -872,8 +872,7 @@ <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Berhenti menghantar"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Peranti tersedia untuk audio output."</string> <string name="media_output_dialog_accessibility_seekbar" msgid="5332843993805568978">"Kelantangan"</string> - <!-- no translation found for media_output_dialog_volume_percentage (1613984910585111798) --> - <skip /> + <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Cara siaran berfungsi"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Siarkan"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Orang berdekatan anda dengan peranti Bluetooth yang serasi boleh mendengar media yang sedang anda siarkan"</string> @@ -987,8 +986,7 @@ <string name="dream_overlay_status_bar_camera_mic_off" msgid="3199425257833773569">"Kamera dan mikrofon dimatikan"</string> <string name="dream_overlay_status_bar_notification_indicator" msgid="8091389255691081711">"{count,plural, =1{# pemberitahuan}other{# pemberitahuan}}"</string> <string name="dream_overlay_weather_complication_desc" msgid="824503662089783824">"<xliff:g id="WEATHER_CONDITION">%1$s</xliff:g>, <xliff:g id="TEMPERATURE">%2$s</xliff:g>"</string> - <!-- no translation found for note_task_button_label (8718616095800343136) --> - <skip /> + <string name="note_task_button_label" msgid="8718616095800343136">"Pengambilan nota"</string> <string name="broadcasting_description_is_broadcasting" msgid="765627502786404290">"Menyiarkan"</string> <string name="bt_le_audio_broadcast_dialog_title" msgid="3605428497924077811">"Hentikan siaran <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="7889684551194225793">"Jika anda siarkan <xliff:g id="SWITCHAPP">%1$s</xliff:g> atau tukarkan output, siaran semasa anda akan berhenti"</string> @@ -1011,4 +1009,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Balikkan ke paparan depan utk swafoto lebih baik?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Gunakan kamera menghadap belakang untuk mendapatkan foto yang lebih luas dengan resolusi yang lebih tinggi."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Skrin ini akan dimatikan"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index 3b4fd221410c..909b9ab031a7 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -1013,4 +1013,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"ပိုကောင်းသော ဆယ်လ်ဖီအတွက် ဖန်သားပြင်ကိုလှည့်မလား။"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"ပုံရိပ်ပြတ်သားကိန်း ပိုမြင့်ပြီး မြင်ကွင်းပိုကျယ်သည့် ဓာတ်ပုံအတွက် နောက်ဘက်ကင်မရာကို အသုံးပြုပါ။"</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ ဤဖန်သားပြင်ကို ပိတ်လိုက်မည်"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index 79b886d946c1..95846f05a008 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Varsler er satt på pause av «Ikke forstyrr»"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Start nå"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Ingen varsler"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"Ingen nye varsler"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"Lås opp for å se eldre varsler"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Denne enheten administreres av forelderen din"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"Organisasjonen din eier denne enheten og kan overvåke nettverkstrafikken"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> eier denne enheten og kan overvåke nettverkstrafikken"</string> @@ -1013,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Vil du bytte til frontskjermen for bedre selfier?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Bruk det bakovervendte kameraet for å ta bredere bilder med høyere oppløsning."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Denne skjermen slås av"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index aecb12abc644..b04e368b2905 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"बाधा नपुऱ्याउनुहोस् नामक मोडमार्फत पज पारिएका सूचनाहरू"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"अहिले न"</string> <string name="empty_shade_text" msgid="8935967157319717412">"कुनै सूचनाहरू छैनन्"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"कुनै पनि नयाँ सूचना छैन"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"पुराना सूचनाहरू हेर्न अनलक गर्नुहोस्"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"यो डिभाइस तपाईंका अभिभावक व्यवस्थापन गर्नुहुन्छ"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"यो डिभाइस तपाईंको सङ्गठनको स्वामित्वमा छ र उक्त सङ्गठनले यसको नेटवर्क ट्राफिक अनुगमन गर्न सक्छ"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"यो डिभाइस <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> को स्वामित्वमा छ र उक्त सङ्गठनले यसको नेटवर्क ट्राफिक अनुगमन गर्न सक्छ"</string> @@ -1021,4 +1019,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"अझ राम्रो सेल्फी खिच्न फ्लिप गरी अगाडिपट्टिको डिस्प्ले प्रयोग गर्ने हो?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"अझ बढी रिजोल्युसन भएको फराकिलो फोटो खिच्न पछाडिपट्टिको क्यामेरा प्रयोग गर्नुहोस्।"</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ यो स्क्रिन अफ हुने छ"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index 37a119320d60..0c05b12a8e6d 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -1011,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Omkeren naar scherm voorkant voor een betere selfie?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Gebruik de camera aan de achterzijde voor een bredere foto met hogere resolutie."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Dit scherm gaat uit"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index ecb863d514d6..307b7b9841e3 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ବିକଳ୍ପ ଦ୍ୱାରା ବିଜ୍ଞପ୍ତି ପଜ୍ ହୋଇଛି"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"ବର୍ତ୍ତମାନ ଆରମ୍ଭ କରନ୍ତୁ"</string> <string name="empty_shade_text" msgid="8935967157319717412">"କୌଣସି ବିଜ୍ଞପ୍ତି ନାହିଁ"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"କୌଣସି ନୂଆ ବିଜ୍ଞପ୍ତି ନାହିଁ"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"ପୁରୁଣା ବିଜ୍ଞପ୍ତି ଦେଖିବାକୁ ଅନଲକ କରନ୍ତୁ"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"ଏହି ଡିଭାଇସ୍ ଆପଣଙ୍କ ବାପାମାଙ୍କ ଦ୍ୱାରା ପରିଚାଳିତ"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"ଏହି ଡିଭାଇସର ମାଲିକାନା ଆପଣଙ୍କ ସଂସ୍ଥା ପାଖରେ ଅଛି ଏବଂ ଏହା ନେଟୱାର୍କ ଟ୍ରାଫିକର ନିରୀକ୍ଷଣ କରିପାରେ"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"ଏହି ଡିଭାଇସଟି <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>ର ଅଟେ ଏବଂ ଏହା ନେଟୱାର୍କ ଟ୍ରାଫିକକୁ ନିରୀକ୍ଷଣ କରିପାରେ"</string> @@ -1013,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"ଏକ ଉନ୍ନତ ସେଲ୍ଫି ପାଇଁ ସାମ୍ନା ଡିସପ୍ଲେକୁ ଫ୍ଲିପ କରିବେ?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"ଉଚ୍ଚ ରିଜୋଲ୍ୟୁସନ ସହ ଅଧିକ ଚଉଡ଼ାର ଏକ ଫଟୋ ନେବା ପାଇଁ ପଛ-ପଟର କେମେରା ବ୍ୟବହାର କରନ୍ତୁ।"</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ ଏହି ସ୍କ୍ରିନ ବନ୍ଦ ହୋଇଯିବ"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index 69ce9a2aba9d..ccf27d731ec0 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਵੱਲੋਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਰੋਕਿਆ ਗਿਆ"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"ਹੁਣੇ ਸ਼ੁਰੂ ਕਰੋ"</string> <string name="empty_shade_text" msgid="8935967157319717412">"ਕੋਈ ਸੂਚਨਾਵਾਂ ਨਹੀਂ"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"ਕੋਈ ਨਵੀਂ ਸੂਚਨਾ ਨਹੀਂ"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"ਪੁਰਾਣੀਆਂ ਸੂਚਨਾਵਾਂ ਦੇਖਣ ਲਈ ਅਣਲਾਕ ਕਰੋ"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"ਇਸ ਡੀਵਾਈਸ ਦਾ ਪ੍ਰਬੰਧਨ ਤੁਹਾਡੇ ਮਾਂ-ਪਿਓ ਵੱਲੋਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"ਤੁਹਾਡੀ ਸੰਸਥਾ ਕੋਲ ਇਸ ਡੀਵਾਈਸ ਦੀ ਮਲਕੀਅਤ ਹੈ ਅਤੇ ਇਹ ਨੈੱਟਵਰਕ ਟਰੈਫ਼ਿਕ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦੀ ਹੈ"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ਕੋਲ ਇਸ ਡੀਵਾਈਸ ਦੀ ਮਲਕੀਅਤ ਹੈ ਅਤੇ ਇਹ ਨੈੱਟਵਰਕ ਟਰੈਫ਼ਿਕ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦੀ ਹੈ"</string> @@ -1013,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"ਕੀ ਬਿਹਤਰ ਸੈਲਫ਼ੀ ਲਈ ਅਗਲੀ ਡਿਸਪਲੇ \'ਤੇ ਫਲਿੱਪ ਕਰਨਾ ਹੈ?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"ਉੱਚ ਰੈਜ਼ੋਲਿਊਸ਼ਨ ਵਾਲੀ ਜ਼ਿਆਦਾ ਚੌੜੀ ਫ਼ੋਟੋ ਲਈ ਪਿਛਲੇ ਕੈਮਰੇ ਦੀ ਵਰਤੋਂ ਕਰੋ।"</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ ਇਹ ਸਕ੍ਰੀਨ ਬੰਦ ਹੋ ਜਾਵੇਗੀ"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index 7944276b93f8..c82f75cd30d4 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Powiadomienia wstrzymane przez tryb Nie przeszkadzać"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Rozpocznij teraz"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Brak powiadomień"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"Brak nowych powiadomień"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"Odblokuj i zobacz starsze powiadomienia"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Tym urządzeniem zarządza Twój rodzic"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"Twoja organizacja jest właścicielem tego urządzenia i może monitorować ruch w sieci"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"Organizacja <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> jest właścicielem tego urządzenia i może monitorować ruch w sieci"</string> @@ -1013,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Przełączyć na przedni wyświetlacz?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Użyj tylnego aparatu, aby zrobić szersze zdjęcie o większej rozdzielczości."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"* Ekran się wyłączy"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index eb522e81ef3f..f6a1c5c3ac58 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -395,7 +395,7 @@ <string name="empty_shade_text" msgid="8935967157319717412">"Sem notificações"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Nenhuma notificação nova"</string> <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"Desbloqueie para conferir as notificações antigas"</string> - <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Este dispositivo é gerenciado pelo seu pai/mãe"</string> + <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Este dispositivo é gerenciado pelo seu familiar responsável"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"Sua organização é dona deste dispositivo e pode monitorar o tráfego de rede"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"A organização <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> é dona deste dispositivo e pode monitorar o tráfego de rede"</string> <string name="quick_settings_financed_disclosure_named_management" msgid="2307703784594859524">"Este dispositivo é fornecido pela <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> @@ -434,7 +434,7 @@ <string name="monitoring_description_personal_profile_named_vpn" msgid="5083909710727365452">"Seus apps pessoais estão conectados à Internet via <xliff:g id="VPN_APP">%1$s</xliff:g>. As atividades de rede, incluindo e-mails e dados de navegação, estão visíveis para o provedor de VPN."</string> <string name="monitoring_description_vpn_settings_separator" msgid="8292589617720435430">" "</string> <string name="monitoring_description_vpn_settings" msgid="5264167033247632071">"Abrir configurações de VPN"</string> - <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Este dispositivo é gerenciado pelo seu pai/mãe, que pode ver e gerenciar informações como os apps que você usa, sua localização e seu tempo de uso."</string> + <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Este dispositivo é gerenciado pelo seu familiar responsável, que pode ver e gerenciar informações como os apps que você usa, sua localização e seu tempo de uso."</string> <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string> <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Desbloqueado pelo TrustAgent"</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> @@ -872,8 +872,7 @@ <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Parar transmissão"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Dispositivos disponíveis para saída de áudio."</string> <string name="media_output_dialog_accessibility_seekbar" msgid="5332843993805568978">"Volume"</string> - <!-- no translation found for media_output_dialog_volume_percentage (1613984910585111798) --> - <skip /> + <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Como funciona a transmissão"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Transmitir"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"As pessoas próximas a você com dispositivos Bluetooth compatíveis podem ouvir a mídia que você está transmitindo"</string> @@ -987,8 +986,7 @@ <string name="dream_overlay_status_bar_camera_mic_off" msgid="3199425257833773569">"A câmera e o microfone estão desativados"</string> <string name="dream_overlay_status_bar_notification_indicator" msgid="8091389255691081711">"{count,plural, =1{# notificação}one{# notificação}many{# notificações}other{# notificações}}"</string> <string name="dream_overlay_weather_complication_desc" msgid="824503662089783824">"<xliff:g id="WEATHER_CONDITION">%1$s</xliff:g>, <xliff:g id="TEMPERATURE">%2$s</xliff:g>"</string> - <!-- no translation found for note_task_button_label (8718616095800343136) --> - <skip /> + <string name="note_task_button_label" msgid="8718616095800343136">"Anotações"</string> <string name="broadcasting_description_is_broadcasting" msgid="765627502786404290">"Transmitindo"</string> <string name="bt_le_audio_broadcast_dialog_title" msgid="3605428497924077811">"Interromper a transmissão do app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="7889684551194225793">"Se você transmitir o app <xliff:g id="SWITCHAPP">%1$s</xliff:g> ou mudar a saída, a transmissão atual será interrompida"</string> @@ -1011,4 +1009,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Usar o display frontal para tirar uma selfie melhor?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Use a câmera traseira para tirar uma foto mais ampla e com maior resolução."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Esta tela vai ser desativada"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index f9d2a73c0a7b..98b5c7695383 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -1011,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Inverter para ecrã frontal para uma selfie melhor?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Use a câmara traseira para uma foto mais ampla com uma resolução superior."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Este ecrã vai ser desligado"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index eb522e81ef3f..f6a1c5c3ac58 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -395,7 +395,7 @@ <string name="empty_shade_text" msgid="8935967157319717412">"Sem notificações"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"Nenhuma notificação nova"</string> <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"Desbloqueie para conferir as notificações antigas"</string> - <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Este dispositivo é gerenciado pelo seu pai/mãe"</string> + <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Este dispositivo é gerenciado pelo seu familiar responsável"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"Sua organização é dona deste dispositivo e pode monitorar o tráfego de rede"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"A organização <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> é dona deste dispositivo e pode monitorar o tráfego de rede"</string> <string name="quick_settings_financed_disclosure_named_management" msgid="2307703784594859524">"Este dispositivo é fornecido pela <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> @@ -434,7 +434,7 @@ <string name="monitoring_description_personal_profile_named_vpn" msgid="5083909710727365452">"Seus apps pessoais estão conectados à Internet via <xliff:g id="VPN_APP">%1$s</xliff:g>. As atividades de rede, incluindo e-mails e dados de navegação, estão visíveis para o provedor de VPN."</string> <string name="monitoring_description_vpn_settings_separator" msgid="8292589617720435430">" "</string> <string name="monitoring_description_vpn_settings" msgid="5264167033247632071">"Abrir configurações de VPN"</string> - <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Este dispositivo é gerenciado pelo seu pai/mãe, que pode ver e gerenciar informações como os apps que você usa, sua localização e seu tempo de uso."</string> + <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Este dispositivo é gerenciado pelo seu familiar responsável, que pode ver e gerenciar informações como os apps que você usa, sua localização e seu tempo de uso."</string> <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string> <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Desbloqueado pelo TrustAgent"</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> @@ -872,8 +872,7 @@ <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Parar transmissão"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Dispositivos disponíveis para saída de áudio."</string> <string name="media_output_dialog_accessibility_seekbar" msgid="5332843993805568978">"Volume"</string> - <!-- no translation found for media_output_dialog_volume_percentage (1613984910585111798) --> - <skip /> + <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Como funciona a transmissão"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Transmitir"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"As pessoas próximas a você com dispositivos Bluetooth compatíveis podem ouvir a mídia que você está transmitindo"</string> @@ -987,8 +986,7 @@ <string name="dream_overlay_status_bar_camera_mic_off" msgid="3199425257833773569">"A câmera e o microfone estão desativados"</string> <string name="dream_overlay_status_bar_notification_indicator" msgid="8091389255691081711">"{count,plural, =1{# notificação}one{# notificação}many{# notificações}other{# notificações}}"</string> <string name="dream_overlay_weather_complication_desc" msgid="824503662089783824">"<xliff:g id="WEATHER_CONDITION">%1$s</xliff:g>, <xliff:g id="TEMPERATURE">%2$s</xliff:g>"</string> - <!-- no translation found for note_task_button_label (8718616095800343136) --> - <skip /> + <string name="note_task_button_label" msgid="8718616095800343136">"Anotações"</string> <string name="broadcasting_description_is_broadcasting" msgid="765627502786404290">"Transmitindo"</string> <string name="bt_le_audio_broadcast_dialog_title" msgid="3605428497924077811">"Interromper a transmissão do app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="7889684551194225793">"Se você transmitir o app <xliff:g id="SWITCHAPP">%1$s</xliff:g> ou mudar a saída, a transmissão atual será interrompida"</string> @@ -1011,4 +1009,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Usar o display frontal para tirar uma selfie melhor?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Use a câmera traseira para tirar uma foto mais ampla e com maior resolução."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Esta tela vai ser desativada"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index e4ceb12cc7c0..e9257fb8c662 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notificări întrerupte prin „Nu deranja”"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Începe acum"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Nicio notificare"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"Nicio notificare nouă"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"Deblochează ca să vezi notificări vechi"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Dispozitivul este gestionat de unul dintre părinți"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"Organizația ta deține acest dispozitiv și poate monitoriza traficul de rețea"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> deține acest dispozitiv și poate monitoriza traficul din rețea"</string> @@ -874,8 +872,7 @@ <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Nu mai proiecta"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Dispozitive disponibile pentru ieșire audio."</string> <string name="media_output_dialog_accessibility_seekbar" msgid="5332843993805568978">"Volum"</string> - <!-- no translation found for media_output_dialog_volume_percentage (1613984910585111798) --> - <skip /> + <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Cum funcționează transmisia"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Transmite"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Persoanele din apropiere cu dispozitive Bluetooth compatibile pot asculta conținutul pe care îl transmiți"</string> @@ -989,8 +986,7 @@ <string name="dream_overlay_status_bar_camera_mic_off" msgid="3199425257833773569">"Camera și microfonul sunt dezactivate"</string> <string name="dream_overlay_status_bar_notification_indicator" msgid="8091389255691081711">"{count,plural, =1{# notificare}few{# notificări}other{# de notificări}}"</string> <string name="dream_overlay_weather_complication_desc" msgid="824503662089783824">"<xliff:g id="WEATHER_CONDITION">%1$s</xliff:g>, <xliff:g id="TEMPERATURE">%2$s</xliff:g>"</string> - <!-- no translation found for note_task_button_label (8718616095800343136) --> - <skip /> + <string name="note_task_button_label" msgid="8718616095800343136">"Notetaking"</string> <string name="broadcasting_description_is_broadcasting" msgid="765627502786404290">"Se difuzează"</string> <string name="bt_le_audio_broadcast_dialog_title" msgid="3605428497924077811">"Oprești transmisia <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="7889684551194225793">"Dacă transmiți <xliff:g id="SWITCHAPP">%1$s</xliff:g> sau schimbi ieșirea, transmisia actuală se va opri"</string> @@ -1013,4 +1009,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Comuți la ecranul frontal pentru un selfie mai bun?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Folosește camera posterioară pentru o fotografie mai lată, cu rezoluție mai mare."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Acest ecran se va dezactiva"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index eca383598b95..5128e0e0aec6 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"В режиме \"Не беспокоить\" уведомления заблокированы"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Начать"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Нет уведомлений"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"Новых уведомлений нет"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"Разблокируйте, чтобы увидеть уведомления"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Устройством управляет один из родителей."</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"Ваша организация управляет этим устройством и может отслеживать сетевой трафик"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"Организация \"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>\" управляет этим устройством и может отслеживать сетевой трафик"</string> @@ -874,8 +872,7 @@ <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Остановить трансляцию"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Доступные устройства для вывода звука."</string> <string name="media_output_dialog_accessibility_seekbar" msgid="5332843993805568978">"Громкость"</string> - <!-- no translation found for media_output_dialog_volume_percentage (1613984910585111798) --> - <skip /> + <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Как работают трансляции"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Трансляция"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Находящиеся рядом с вами люди с совместимыми устройствами Bluetooth могут слушать медиафайлы, которые вы транслируете."</string> @@ -989,8 +986,7 @@ <string name="dream_overlay_status_bar_camera_mic_off" msgid="3199425257833773569">"Камера и микрофон отключены"</string> <string name="dream_overlay_status_bar_notification_indicator" msgid="8091389255691081711">"{count,plural, =1{# уведомление}one{# уведомление}few{# уведомления}many{# уведомлений}other{# уведомления}}"</string> <string name="dream_overlay_weather_complication_desc" msgid="824503662089783824">"<xliff:g id="WEATHER_CONDITION">%1$s</xliff:g>, <xliff:g id="TEMPERATURE">%2$s</xliff:g>"</string> - <!-- no translation found for note_task_button_label (8718616095800343136) --> - <skip /> + <string name="note_task_button_label" msgid="8718616095800343136">"Создание заметок"</string> <string name="broadcasting_description_is_broadcasting" msgid="765627502786404290">"Трансляция"</string> <string name="bt_le_audio_broadcast_dialog_title" msgid="3605428497924077811">"Остановить трансляцию \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"?"</string> <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="7889684551194225793">"Если вы начнете транслировать \"<xliff:g id="SWITCHAPP">%1$s</xliff:g>\" или смените целевое устройство, текущая трансляция прервется."</string> @@ -1013,4 +1009,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Перевернули телефон передним экраном к себе?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Используйте основную камеру с широкоугольным объективом и высоким разрешением."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Этот экран отключится"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index 0969b76dfa43..f1767957a5be 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"බාධා නොකරන්න මගින් විරාම කරන ලද දැනුම්දීම්"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"දැන් අරඹන්න"</string> <string name="empty_shade_text" msgid="8935967157319717412">"දැනුම්දීම් නැත"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"නව දැනුම්දීම් නැත"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"පැරණි දැනුම්දීම් බැලීමට අගුළු හරින්න"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"මෙම උපාංගය ඔබගේ මාපියන්ගෙන් අයකු විසින් කළමනාකරණය කෙරේ"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"ඔබේ සංවිධානයට මෙම උපාංගය අයිති අතර ජාල තදබදය නිරීක්ෂණය කළ හැකිය"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> සංවිධානයට මෙම උපාංගය අයිති අතර ජාල තදබදය නිරීක්ෂණය කළ හැකිය"</string> @@ -1013,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"වඩා හොඳ සෙල්ෆියක් සඳහා ඉදිරිපස සංදර්ශකයට පෙරළන්න ද?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"ඉහළ විභේදන සහිත පුළුල් ඡායාරූපයක් සඳහා පසුපසට මුහුණලා ඇති කැමරාව භාවිතා කරන්න."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ මෙම තිරය ක්රියා විරහිත වනු ඇත"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index d5629a9bcdb8..e4c978b1f786 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -872,8 +872,7 @@ <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Zastaviť prenos"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Dostupné zariadenia pre zvukový výstup."</string> <string name="media_output_dialog_accessibility_seekbar" msgid="5332843993805568978">"Hlasitosť"</string> - <!-- no translation found for media_output_dialog_volume_percentage (1613984910585111798) --> - <skip /> + <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Ako vysielanie funguje"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Vysielanie"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Ľudia v okolí s kompatibilnými zariadeniami s rozhraním Bluetooth si môžu vypočuť médiá, ktoré vysielate"</string> @@ -987,8 +986,7 @@ <string name="dream_overlay_status_bar_camera_mic_off" msgid="3199425257833773569">"Kamera a mikrofón sú vypnuté"</string> <string name="dream_overlay_status_bar_notification_indicator" msgid="8091389255691081711">"{count,plural, =1{# upozornenie}few{# upozornenia}many{# notifications}other{# upozornení}}"</string> <string name="dream_overlay_weather_complication_desc" msgid="824503662089783824">"<xliff:g id="WEATHER_CONDITION">%1$s</xliff:g>, <xliff:g id="TEMPERATURE">%2$s</xliff:g>"</string> - <!-- no translation found for note_task_button_label (8718616095800343136) --> - <skip /> + <string name="note_task_button_label" msgid="8718616095800343136">"Zapisovanie poznámok"</string> <string name="broadcasting_description_is_broadcasting" msgid="765627502786404290">"Vysiela"</string> <string name="bt_le_audio_broadcast_dialog_title" msgid="3605428497924077811">"Chcete zastaviť vysielanie aplikácie <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="7889684551194225793">"Ak vysielate aplikáciu <xliff:g id="SWITCHAPP">%1$s</xliff:g> alebo zmeníte výstup, aktuálne vysielanie bude zastavené"</string> @@ -1011,4 +1009,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Prevrátiť na pred. obrazovku pre lepšie selfie?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Pomocou zadného fotoaparátu vytvorte širšiu fotku s vyšším rozlíšením."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Táto obrazovka sa vypne"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index b48b632ec8be..ef5e63ade170 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Prikazovanje obvestil je začasno zaustavljeno z načinom »ne moti«"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Začni zdaj"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Ni obvestil"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"Ni novih obvestil"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"Odklenite za ogled starejših obvestil"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"To napravo upravlja tvoj starš"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"Vaša organizacija je lastnica te naprave in lahko nadzira omrežni promet"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"Organizacija <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> je lastnica te naprave in lahko nadzira omrežni promet"</string> @@ -1013,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Obrnite telefon na sprednji zaslon za boljši selfi"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Uporabite hrbtni fotoaparat, da posnamete širšo sliko višje ločljivosti."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Ta zaslon se bo izklopil."</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index 9356d28ed980..24e26168a9ec 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -872,8 +872,7 @@ <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Ndalo transmetimin"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Pajisjet që ofrohen për daljen e audios."</string> <string name="media_output_dialog_accessibility_seekbar" msgid="5332843993805568978">"Volumi"</string> - <!-- no translation found for media_output_dialog_volume_percentage (1613984910585111798) --> - <skip /> + <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Si funksionon transmetimi"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Transmetimi"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Personat në afërsi me ty me pajisje të përputhshme me Bluetooth mund të dëgjojnë median që ti po transmeton"</string> @@ -987,8 +986,7 @@ <string name="dream_overlay_status_bar_camera_mic_off" msgid="3199425257833773569">"Kamera dhe mikrofoni janë joaktivë"</string> <string name="dream_overlay_status_bar_notification_indicator" msgid="8091389255691081711">"{count,plural, =1{# njoftim}other{# njoftime}}"</string> <string name="dream_overlay_weather_complication_desc" msgid="824503662089783824">"<xliff:g id="WEATHER_CONDITION">%1$s</xliff:g>, <xliff:g id="TEMPERATURE">%2$s</xliff:g>"</string> - <!-- no translation found for note_task_button_label (8718616095800343136) --> - <skip /> + <string name="note_task_button_label" msgid="8718616095800343136">"Mbajtja e shënimeve"</string> <string name="broadcasting_description_is_broadcasting" msgid="765627502786404290">"Po transmeton"</string> <string name="bt_le_audio_broadcast_dialog_title" msgid="3605428497924077811">"Të ndalohet transmetimi i <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="7889684551194225793">"Nëse transmeton <xliff:g id="SWITCHAPP">%1$s</xliff:g> ose ndryshon daljen, transmetimi yt aktual do të ndalojë"</string> @@ -1011,4 +1009,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Të kthehet tek ekrani para për selfi më të mirë?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Përdor lenten e kamerës së pasme për një fotografi më të gjerë me rezolucion më të lartë."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Ky ekran do të fiket"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index 6f694ad3d3b3..9464ac51a7f4 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -872,8 +872,7 @@ <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Заустави пребацивање"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Доступни уређаји за аудио излаз."</string> <string name="media_output_dialog_accessibility_seekbar" msgid="5332843993805568978">"Звук"</string> - <!-- no translation found for media_output_dialog_volume_percentage (1613984910585111798) --> - <skip /> + <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Како функционише емитовање"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Емитовање"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Људи у близини са компатибилним Bluetooth уређајима могу да слушају медијски садржај који емитујете"</string> @@ -987,8 +986,7 @@ <string name="dream_overlay_status_bar_camera_mic_off" msgid="3199425257833773569">"Камера и микрофон су искључени"</string> <string name="dream_overlay_status_bar_notification_indicator" msgid="8091389255691081711">"{count,plural, =1{# обавештење}one{# обавештење}few{# обавештења}other{# обавештења}}"</string> <string name="dream_overlay_weather_complication_desc" msgid="824503662089783824">"<xliff:g id="WEATHER_CONDITION">%1$s</xliff:g>, <xliff:g id="TEMPERATURE">%2$s</xliff:g>"</string> - <!-- no translation found for note_task_button_label (8718616095800343136) --> - <skip /> + <string name="note_task_button_label" msgid="8718616095800343136">"Прављење бележака"</string> <string name="broadcasting_description_is_broadcasting" msgid="765627502786404290">"Емитовање"</string> <string name="bt_le_audio_broadcast_dialog_title" msgid="3605428497924077811">"Желите да зауставите емитовање апликације <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="7889684551194225793">"Ако емитујете апликацију <xliff:g id="SWITCHAPP">%1$s</xliff:g> или промените излаз, актуелно емитовање ће се зауставити"</string> @@ -1011,4 +1009,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Желите да обрнете на предњи екран за бољи селфи?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Користите задњу камеру да бисте снимили ширу слику са вишом резолуцијом."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Овај екран ће се искључити"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index c6646960dfd0..f5cf437fb1eb 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Aviseringar har pausats via Stör ej"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Starta nu"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Inga aviseringar"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"Det finns inga nya aviseringar"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"Lås upp för att se äldre aviseringar"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Den här enheten hanteras av din förälder"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"Organisationen äger den här enheten och kan övervaka nätverkstrafiken"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> äger den här enheten och kan övervaka nätverkstrafiken"</string> @@ -1013,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Vill du ta en bättre selfie med främre skärmen?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Använd den bakre kameran för att ta ett mer vidsträckt foto med högre upplösning."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Den här skärmen inaktiveras"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index cd4fa1541a97..e0043e39b99d 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Kipengele cha Usinisumbue kimesitisha arifa"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Anza sasa"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Hakuna arifa"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"Hakuna arifa mpya"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"Fungua ili uone arifa za zamani"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Kifaa hiki kinadhibitiwa na mzazi wako"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"Shirika lako linamiliki kifaa hiki na huenda likafuatilia trafiki ya mtandao"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> inamiliki kifaa hiki na huenda ikafuatilia trafiki ya mtandao"</string> @@ -1013,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Ungependa kugeuza skrini ya mbele ili upige selfi?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Tumia kamera ya nyuma ili upige picha pana iliyo na ubora wa juu."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Skrini hii itajizima"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index 6c0a4e4479f4..f800cd0ebab9 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\'தொந்தரவு செய்ய வேண்டாம்\' அம்சத்தின் மூலம் அறிவிப்புகள் இடைநிறுத்தப்பட்டுள்ளன"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"இப்போது தொடங்கு"</string> <string name="empty_shade_text" msgid="8935967157319717412">"அறிவிப்புகள் இல்லை"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"புதிய அறிவிப்புகள் இல்லை"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"பழைய அறிவிப்பைப் பார்க்க அன்லாக் செய்க"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"இந்தச் சாதனம் உங்கள் பெற்றோரால் நிர்வகிக்கப்படுகிறது"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"இந்த சாதனம் உங்கள் நிறுவனத்துக்கு உரியது, நெட்வொர்க் ட்ராஃபிக்கையும் நிறுவனமே கண்காணிக்கக்கூடும்"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"இந்த சாதனம் <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> நிறுவனத்துக்கு உரியது, நெட்வொர்க் ட்ராஃபிக்கையும் நிறுவனமே கண்காணிக்கக்கூடும்"</string> @@ -1013,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"சிறந்த செல்ஃபிக்கு முன்புற டிஸ்பிளேவிற்கு மாற்றவா?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"அதிகத் தெளிவுத்திறனுடன் அகலக் கோணத்தில் படத்தை எடுப்பதற்குப் பின்பக்கக் கேமராவைப் பயன்படுத்துங்கள்."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ இந்தத் திரை ஆஃப் ஆகிவிடும்"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index 68f547a7312c..f707088ccef5 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"అంతరాయం కలిగించవద్దు ద్వారా నోటిఫికేషన్లు పాజ్ చేయబడ్డాయి"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"ఇప్పుడే ప్రారంభించు"</string> <string name="empty_shade_text" msgid="8935967157319717412">"నోటిఫికేషన్లు లేవు"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"కొత్త నోటిఫికేషన్లు ఏవీ లేవు"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"పాత నోటిఫికేషన్ల కోసం అన్లాక్ చేయండి"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"ఈ పరికరాన్ని మీ తల్లి/తండ్రి మేనేజ్ చేస్తున్నారు"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"ఈ పరికరం మీ సంస్థకు చెందినది, కాబట్టి అది నెట్వర్క్ ట్రాఫిక్ను పర్యవేక్షించవచ్చు"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"మీ పరికరం <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>కు చెందినది, కాబట్టి అది నెట్వర్క్ ట్రాఫిక్ను పర్యవేక్షించవచ్చు"</string> @@ -1013,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"మంచి సెల్ఫీ కోసం ముందు వైపు డిస్ప్లేకు తిప్పాలా?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"అధిక రిజల్యూషన్తో పెద్ద ఫోటో కోసం వెనుక వైపున ఉన్న కెమెరాను ఉపయోగించండి."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ ఈ స్క్రీన్ ఆఫ్ అవుతుంది"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index b335a69cad89..40b997d3e55b 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -1011,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"พลิกเป็นหน้าจอด้านหน้าเพื่อภาพเซลฟีที่ดีขึ้นไหม"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"ใช้กล้องหลังเพื่อถ่ายภาพกว้างขึ้นด้วยความละเอียดสูงขึ้น"</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ หน้าจอนี้จะปิดไป"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index 79b10b2f4990..a0b4e29a7e5e 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Mga notification na na-pause ng Huwag Istorbohin"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Magsimula ngayon"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Walang mga notification"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"Walang bagong notification"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"I-unlock para makita ang mga mas lumang notification"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Pinapamahalaan ng magulang mo itong device"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"Pagmamay-ari ng organisasyon mo ang device na ito at puwede nitong subaybayan ang trapiko sa network"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"Pagmamay-ari ng <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ang device na ito at puwede nitong subaybayan ang trapiko sa network"</string> @@ -1013,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"I-flip sa front display para sa magandang selfie?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Gamitin ang camera sa harap para sa mas malawak na larawan na may mas mataas na resolution."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Mag-o-off ang screen na ito"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 308acb35dce8..4fb45b182daf 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Bildirimler, Rahatsız Etmeyin özelliği tarafından duraklatıldı"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Şimdi başlat"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Bildirim yok"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"Yeni bildirim yok"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"Eski bildirimler için kilidi açın"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Bu cihaz ebeveyniniz tarafından yönetiliyor"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"Bu cihaz, kuruluşunuza ait olup ağ trafiği kuruluşunuz tarafından izlenebilir"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"Bu cihaz, <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> adlı kuruluşa ait olup ağ trafiği bu kuruluş tarafından izlenebilir"</string> @@ -1013,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Daha iyi bir selfie için ön ekrana geçilsin mi?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Daha yüksek çözünürlüğe sahip daha büyük bir fotoğraf için arka yüz kamerasını kullanın."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ * Bu ekran kapatılacak"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index d4465e86ebd6..5992b015a951 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Режим \"Не турбувати\" призупинив сповіщення"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Почати зараз"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Сповіщень немає"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"Немає нових сповіщень"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"Розблокуйте, щоб переглянути старіші"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Цим пристроєм керує батько або мати"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"Цей пристрій належить вашій організації. Її адміністратор може відстежувати мережевий трафік"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"Цей пристрій належить організації \"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>\". Її адміністратор може відстежувати мережевий трафік"</string> @@ -1013,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Перемкнути на фронтальну камеру для кращого селфі?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Використовуйте камеру на задній панелі, щоб зробити знімок із ширшим кутом і вищою роздільною здатністю."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Цей екран вимкнеться"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index 91558d84503e..1a0ce6f21126 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\'ڈسٹرب نہ کریں\' کے ذریعے اطلاعات کو موقوف کیا گیا"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"ابھی شروع کریں"</string> <string name="empty_shade_text" msgid="8935967157319717412">"کوئی اطلاعات نہیں ہیں"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"کوئی نئی اطلاعات نہیں"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"پرانی اطلاعات دیکھنے کیلئے غیر مقفل کریں"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"یہ آلہ آپ کے والدین کے زیر انتظام ہے"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"آپ کی تنظیم اس آلے کی مالک ہے اور نیٹ ورک ٹریفک کی نگرانی کر سکتی ہے"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> اس آلے کی مالک ہے اور نیٹ ورک ٹریفک کی نگرانی کر سکتی ہے"</string> @@ -874,8 +872,7 @@ <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"کاسٹ کرنا بند کریں"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"آڈیو آؤٹ پٹ کے لیے دستیاب آلات۔"</string> <string name="media_output_dialog_accessibility_seekbar" msgid="5332843993805568978">"والیوم"</string> - <!-- no translation found for media_output_dialog_volume_percentage (1613984910585111798) --> - <skip /> + <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"%%<xliff:g id="PERCENTAGE">%1$d</xliff:g>"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"براڈکاسٹنگ کیسے کام کرتا ہے"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"براڈکاسٹ"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"موافق بلوٹوتھ آلات کے ساتھ آپ کے قریبی لوگ آپ کے نشر کردہ میڈیا کو سن سکتے ہیں"</string> @@ -989,8 +986,7 @@ <string name="dream_overlay_status_bar_camera_mic_off" msgid="3199425257833773569">"کیمرا اور مائیک آف ہیں"</string> <string name="dream_overlay_status_bar_notification_indicator" msgid="8091389255691081711">"{count,plural, =1{# اطلاع}other{# اطلاعات}}"</string> <string name="dream_overlay_weather_complication_desc" msgid="824503662089783824">"<xliff:g id="WEATHER_CONDITION">%1$s</xliff:g>، <xliff:g id="TEMPERATURE">%2$s</xliff:g>"</string> - <!-- no translation found for note_task_button_label (8718616095800343136) --> - <skip /> + <string name="note_task_button_label" msgid="8718616095800343136">"نوٹ لینا"</string> <string name="broadcasting_description_is_broadcasting" msgid="765627502786404290">"نشریات"</string> <string name="bt_le_audio_broadcast_dialog_title" msgid="3605428497924077811">"<xliff:g id="APP_NAME">%1$s</xliff:g> براڈکاسٹنگ روکیں؟"</string> <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="7889684551194225793">"اگر آپ <xliff:g id="SWITCHAPP">%1$s</xliff:g> براڈکاسٹ کرتے ہیں یا آؤٹ پٹ کو تبدیل کرتے ہیں تو آپ کا موجودہ براڈکاسٹ رک جائے گا"</string> @@ -1013,4 +1009,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"بہتر سیلفی کے لیے سامنے والے ڈسپلے پر پلٹائیں؟"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"اعلی ریزولیوشن والی وسیع تصویر کے لیے ییچھے والا کیمرا استعمال کریں۔"</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ یہ اسکرین آف ہو جائے گی"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index 13a57d48e8e1..257edd4b46cb 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Bezovta qilinmasin rejimida bildirishnomalar pauza qilinadi"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Boshlash"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Bildirishnomalar yo‘q"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"Yangi bildirishoma yoʻq"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"Eskilarini koʻrish uchun qulfni yeching"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Bu qurilmani ota-onangiz boshqaradi"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"Bu qurilma tashkilotingizga tegishli va tarmoq trafigi tashkilotingiz tomonidan kuzatilishi mumkin"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"Bu qurilma <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> tashkilotiga tegishli va tarmoq trafigi tashkilot tomonidan kuzatilishi mumkin"</string> @@ -874,8 +872,7 @@ <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Toʻxtatish"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Audio chiqish uchun mavjud qurilmalar."</string> <string name="media_output_dialog_accessibility_seekbar" msgid="5332843993805568978">"Tovush balandligi"</string> - <!-- no translation found for media_output_dialog_volume_percentage (1613984910585111798) --> - <skip /> + <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Translatsiya qanday ishlaydi"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Translatsiya"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Atrofingizdagi mos Bluetooth qurilmasiga ega foydalanuvchilar siz translatsiya qilayotgan mediani tinglay olishadi"</string> @@ -989,8 +986,7 @@ <string name="dream_overlay_status_bar_camera_mic_off" msgid="3199425257833773569">"Kamera va mikrofon yoqilmagan"</string> <string name="dream_overlay_status_bar_notification_indicator" msgid="8091389255691081711">"{count,plural, =1{# ta bildirishnoma}other{# ta bildirishnoma}}"</string> <string name="dream_overlay_weather_complication_desc" msgid="824503662089783824">"<xliff:g id="WEATHER_CONDITION">%1$s</xliff:g>, <xliff:g id="TEMPERATURE">%2$s</xliff:g>"</string> - <!-- no translation found for note_task_button_label (8718616095800343136) --> - <skip /> + <string name="note_task_button_label" msgid="8718616095800343136">"Eslatma yozish"</string> <string name="broadcasting_description_is_broadcasting" msgid="765627502786404290">"Signal uzatish"</string> <string name="bt_le_audio_broadcast_dialog_title" msgid="3605428497924077811">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasiga translatsiya toʻxtatilsinmi?"</string> <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="7889684551194225793">"Agar <xliff:g id="SWITCHAPP">%1$s</xliff:g> ilovasiga translatsiya qilsangiz yoki ovoz chiqishini oʻzgartirsangiz, joriy translatsiya toʻxtab qoladi"</string> @@ -1013,4 +1009,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Old ekran sizga qaragan holda aylantirdingizmi?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Keng va yuqori tiniqlikdagi suratga olish uchun orqa kameradan foydalaning."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Bu ekran oʻchiriladi"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 7bba2f8df1ec..53efd2d07987 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Chế độ Không làm phiền đã tạm dừng thông báo"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Bắt đầu ngay"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Không có thông báo nào"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"Không có thông báo mới"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"Mở khoá để xem thông báo cũ"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Thiết bị này do cha mẹ của bạn quản lý"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"Tổ chức của bạn sở hữu thiết bị này và có thể giám sát lưu lượng truy cập mạng"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> sở hữu thiết bị này và có thể giám sát lưu lượng truy cập mạng"</string> @@ -1013,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Lật sang màn hình ngoài để tự chụp ảnh chân dung đẹp hơn?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Sử dụng máy ảnh sau để chụp ảnh góc rộng hơn với độ phân giải cao hơn."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Màn hình này sẽ tắt"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index def5cf881e1b..c339e8dc9a5a 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"勿扰模式暂停的通知"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"立即开始"</string> <string name="empty_shade_text" msgid="8935967157319717412">"没有通知"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"没有新通知"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"解锁即可查看旧通知"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"此设备由您的家长管理"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"贵单位拥有此设备,且可能会监控网络流量"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>拥有此设备,且可能会监控网络流量"</string> @@ -1013,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"要翻转到外屏以拍出更好的自拍照吗?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"您可以使用后置摄像头拍摄视角更广、分辨率更高的照片。"</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ 此屏幕将会关闭"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index c222ea54592d..6ed283538a5c 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -1011,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"要翻轉至前方螢幕拍攝更出色的自拍嗎?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"使用後置鏡頭,拍攝更廣角、解像度更高的相片。"</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ 此螢幕將關閉"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 7123c4c8fb42..b1698d52e16d 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -1011,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"要翻轉到前螢幕拍攝更優質的自拍照嗎?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"使用後置鏡頭可拍攝視角較寬廣、解析度較高的相片。"</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ 這麼做會關閉這個螢幕"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index b9c44e502b32..38a61365932f 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -393,10 +393,8 @@ <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Izaziso zimiswe okwesikhashana ukungaphazamisi"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Qala manje"</string> <string name="empty_shade_text" msgid="8935967157319717412">"Azikho izaziso"</string> - <!-- no translation found for no_unseen_notif_text (395512586119868682) --> - <skip /> - <!-- no translation found for unlock_to_see_notif_text (7439033907167561227) --> - <skip /> + <string name="no_unseen_notif_text" msgid="395512586119868682">"Azikho izaziso ezintsha"</string> + <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"Vula ukuze ubone izaziso ezindala"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Le divayisi iphethwe ngumzali wakho"</string> <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"Inhlangano yakho ingumnikazi wale divayisi futhi ingaqapha ithrafikhi yenethiwekhi"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"I-<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ingumnikazi wale divayisi futhi ingaqapha ithrafikhi yenethiwekhi"</string> @@ -1013,4 +1011,8 @@ <string name="rear_display_unfold_bottom_sheet_title" msgid="2137403802960396357">"Phendulela kwisibonisi sangaphambili ukuba nesithombe ozishuthe sona esingcono?"</string> <string name="rear_display_bottom_sheet_description" msgid="1852662982816810352">"Sebenzisa ikhamera ebheke ngemuva ukuze uthole isithombe esibanzi esinokucaca okuphezulu."</string> <string name="rear_display_bottom_sheet_warning" msgid="800995919558238930"><b>"✱ Lesi sikrini sizovala"</b></string> + <!-- no translation found for rear_display_accessibility_folded_animation (1538121649587978179) --> + <skip /> + <!-- no translation found for rear_display_accessibility_unfolded_animation (1946153682258289040) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml index bc88bee41df8..ca4217f64b60 100644 --- a/packages/SystemUI/res/values/colors.xml +++ b/packages/SystemUI/res/values/colors.xml @@ -236,15 +236,6 @@ <color name="dream_overlay_camera_mic_off_dot_color">#FCBE03</color> - <!-- Air Quality --> - <color name="dream_overlay_aqi_good">#689F38</color> - <color name="dream_overlay_aqi_moderate">#FBC02D</color> - <color name="dream_overlay_aqi_unhealthy_sensitive">#F57C00</color> - <color name="dream_overlay_aqi_unhealthy">#C53929</color> - <color name="dream_overlay_aqi_very_unhealthy">#AD1457</color> - <color name="dream_overlay_aqi_hazardous">#880E4F</color> - <color name="dream_overlay_aqi_unknown">#BDC1C6</color> - <!-- Dream overlay text shadows --> <color name="dream_overlay_clock_key_text_shadow_color">#4D000000</color> <color name="dream_overlay_clock_ambient_text_shadow_color">#4D000000</color> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index f3d2638c4ee7..c10e75289cf2 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -1560,10 +1560,6 @@ <dimen name="dream_overlay_y_offset">80dp</dimen> <dimen name="dream_overlay_exit_y_offset">40dp</dimen> - <dimen name="dream_aqi_badge_corner_radius">28dp</dimen> - <dimen name="dream_aqi_badge_padding_vertical">6dp</dimen> - <dimen name="dream_aqi_badge_padding_horizontal">16dp</dimen> - <dimen name="status_view_margin_horizontal">0dp</dimen> <!-- Media output broadcast dialog QR code picture size --> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 084a0e0cb62d..643f831c7f94 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -2688,9 +2688,6 @@ <!-- [CHAR LIMIT=NONE] Le audio broadcast dialog, media app is unknown --> <string name="bt_le_audio_broadcast_dialog_unknown_name">Unknown</string> - <!-- Date format for the Dream Date Complication [CHAR LIMIT=NONE] --> - <string name="dream_date_complication_date_format">EEE, MMM d</string> - <!-- Time format for the Dream Time Complication for 12-hour time format [CHAR LIMIT=NONE] --> <string name="dream_time_complication_12_hr_time_format">h:mm</string> diff --git a/packages/SystemUI/res/xml/combined_qs_header_scene.xml b/packages/SystemUI/res/xml/combined_qs_header_scene.xml index c32de70771d0..38c164023315 100644 --- a/packages/SystemUI/res/xml/combined_qs_header_scene.xml +++ b/packages/SystemUI/res/xml/combined_qs_header_scene.xml @@ -124,6 +124,11 @@ </KeyFrameSet> </Transition> + <Transition + android:id="@+id/large_screen_header_transition" + app:constraintSetStart="@id/large_screen_header_constraint" + app:constraintSetEnd="@id/large_screen_header_constraint"/> + <Include app:constraintSet="@xml/large_screen_shade_header"/> <Include app:constraintSet="@xml/qs_header"/> diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginActionManager.java b/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginActionManager.java index e226d58203f4..b057fe422fc4 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginActionManager.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginActionManager.java @@ -362,8 +362,7 @@ public class PluginActionManager<T extends Plugin> { nb.addAction(new Action.Builder(null, "Disable plugin", pi).build()); mNotificationManager.notify(SystemMessage.NOTE_PLUGIN, nb.build()); // TODO: Warn user. - Log.w(TAG, "Plugin has invalid interface version " + e.getActualVersion() - + ", expected " + e.getExpectedVersion()); + Log.w(TAG, "Error loading plugin; " + e.getMessage()); } /** diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/utilities/PreviewPositionHelper.java b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/utilities/PreviewPositionHelper.java index 5883b6c0e723..b92715516a75 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/utilities/PreviewPositionHelper.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/utilities/PreviewPositionHelper.java @@ -39,7 +39,6 @@ public class PreviewPositionHelper { private boolean mIsOrientationChanged; private SplitBounds mSplitBounds; private int mDesiredStagePosition; - private boolean mTaskbarInApp; public Matrix getMatrix() { return mMatrix; @@ -58,10 +57,6 @@ public class PreviewPositionHelper { mDesiredStagePosition = desiredStagePosition; } - public void setTaskbarInApp(boolean taskbarInApp) { - mTaskbarInApp = taskbarInApp; - } - /** * Updates the matrix based on the provided parameters */ @@ -79,34 +74,21 @@ public class PreviewPositionHelper { float scaledTaskbarSize; float canvasScreenRatio; if (mSplitBounds != null) { - float fullscreenTaskWidth; - float fullscreenTaskHeight; - - float taskPercent; if (mSplitBounds.appsStackedVertically) { - taskPercent = mDesiredStagePosition != STAGE_POSITION_TOP_OR_LEFT - ? mSplitBounds.topTaskPercent - : (1 - (mSplitBounds.topTaskPercent + mSplitBounds.dividerHeightPercent)); - // Scale portrait height to that of the actual screen - fullscreenTaskHeight = screenHeightPx * taskPercent; - if (mTaskbarInApp) { - canvasScreenRatio = canvasHeight / fullscreenTaskHeight; + if (mDesiredStagePosition == STAGE_POSITION_TOP_OR_LEFT) { + // Top app isn't cropped at all by taskbar + canvasScreenRatio = 0; } else { - if (mDesiredStagePosition == STAGE_POSITION_TOP_OR_LEFT) { - // Top app isn't cropped at all by taskbar - canvasScreenRatio = 0; - } else { - // Same as fullscreen ratio - canvasScreenRatio = (float) canvasWidth / screenWidthPx; - } + // Same as fullscreen ratio + canvasScreenRatio = (float) canvasWidth / screenWidthPx; } } else { // For landscape, scale the width - taskPercent = mDesiredStagePosition == STAGE_POSITION_TOP_OR_LEFT + float taskPercent = mDesiredStagePosition == STAGE_POSITION_TOP_OR_LEFT ? mSplitBounds.leftTaskPercent : (1 - (mSplitBounds.leftTaskPercent + mSplitBounds.dividerWidthPercent)); // Scale landscape width to that of actual screen - fullscreenTaskWidth = screenWidthPx * taskPercent; + float fullscreenTaskWidth = screenWidthPx * taskPercent; canvasScreenRatio = canvasWidth / fullscreenTaskWidth; } } else { diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputViewController.java index 860c8e3a9f77..7da27b1d6898 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputViewController.java @@ -260,7 +260,8 @@ public abstract class KeyguardAbsKeyInputViewController<T extends KeyguardAbsKey if (reason != PROMPT_REASON_NONE) { int promtReasonStringRes = mView.getPromptReasonStringRes(reason); if (promtReasonStringRes != 0) { - mMessageAreaController.setMessage(promtReasonStringRes); + mMessageAreaController.setMessage( + mView.getResources().getString(promtReasonStringRes), false); } } } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java index 789f6218caf9..788f1200d603 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java @@ -78,6 +78,7 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS private int mCurrentClockSize = SMALL; private int mKeyguardSmallClockTopMargin = 0; + private int mKeyguardLargeClockTopMargin = 0; private final ClockRegistry.ClockChangeListener mClockChangedListener; private ViewGroup mStatusArea; @@ -164,6 +165,8 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS mClockEventController.registerListeners(mView); mKeyguardSmallClockTopMargin = mView.getResources().getDimensionPixelSize(R.dimen.keyguard_clock_top_margin); + mKeyguardLargeClockTopMargin = + mView.getResources().getDimensionPixelSize(R.dimen.keyguard_large_clock_top_margin); if (mOnlyClock) { View ksv = mView.findViewById(R.id.keyguard_slice_view); @@ -246,6 +249,8 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS mView.onDensityOrFontScaleChanged(); mKeyguardSmallClockTopMargin = mView.getResources().getDimensionPixelSize(R.dimen.keyguard_clock_top_margin); + mKeyguardLargeClockTopMargin = + mView.getResources().getDimensionPixelSize(R.dimen.keyguard_large_clock_top_margin); mView.updateClockTargetRegions(); } @@ -324,10 +329,18 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS } if (mLargeClockFrame.getVisibility() == View.VISIBLE) { + // This gets the expected clock bottom if mLargeClockFrame had a top margin, but it's + // top margin only contributed to height and didn't move the top of the view (as this + // was the computation previously). As we no longer have a margin, we add this back + // into the computation manually. int frameHeight = mLargeClockFrame.getHeight(); int clockHeight = clock.getLargeClock().getView().getHeight(); - return frameHeight / 2 + clockHeight / 2; + return frameHeight / 2 + clockHeight / 2 + mKeyguardLargeClockTopMargin / -2; } else { + // This is only called if we've never shown the large clock as the frame is inflated + // with 'gone', but then the visibility is never set when it is animated away by + // KeyguardClockSwitch, instead it is removed from the view hierarchy. + // TODO(b/261755021): Cleanup Large Frame Visibility int clockHeight = clock.getSmallClock().getView().getHeight(); return clockHeight + statusBarHeaderHeight + mKeyguardSmallClockTopMargin; } @@ -345,11 +358,15 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS if (mLargeClockFrame.getVisibility() == View.VISIBLE) { return clock.getLargeClock().getView().getHeight(); } else { + // Is not called except in certain edge cases, see comment in getClockBottom + // TODO(b/261755021): Cleanup Large Frame Visibility return clock.getSmallClock().getView().getHeight(); } } boolean isClockTopAligned() { + // Returns false except certain edge cases, see comment in getClockBottom + // TODO(b/261755021): Cleanup Large Frame Visibility return mLargeClockFrame.getVisibility() != View.VISIBLE; } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java index 2e9ad5868eba..d1c9a3090860 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java @@ -142,8 +142,11 @@ public abstract class KeyguardInputViewController<T extends KeyguardInputView> } public void startAppearAnimation() { - if (TextUtils.isEmpty(mMessageAreaController.getMessage())) { - mMessageAreaController.setMessage(getInitialMessageResId()); + if (TextUtils.isEmpty(mMessageAreaController.getMessage()) + && getInitialMessageResId() != 0) { + mMessageAreaController.setMessage( + mView.getResources().getString(getInitialMessageResId()), + /* animate= */ false); } mView.startAppearAnimation(); } @@ -163,9 +166,7 @@ public abstract class KeyguardInputViewController<T extends KeyguardInputView> } /** Determines the message to show in the bouncer when it first appears. */ - protected int getInitialMessageResId() { - return 0; - } + protected abstract int getInitialMessageResId(); /** Factory for a {@link KeyguardInputViewController}. */ public static class Factory { diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java index 5d86ccd5409e..67e3400670ba 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java @@ -52,6 +52,7 @@ public class KeyguardPINView extends KeyguardPinBasedInputView { private int mYTransOffset; private View mBouncerMessageView; @DevicePostureInt private int mLastDevicePosture = DEVICE_POSTURE_UNKNOWN; + public static final long ANIMATION_DURATION = 650; public KeyguardPINView(Context context) { this(context, null); @@ -181,7 +182,7 @@ public class KeyguardPINView extends KeyguardPinBasedInputView { if (mAppearAnimator.isRunning()) { mAppearAnimator.cancel(); } - mAppearAnimator.setDuration(650); + mAppearAnimator.setDuration(ANIMATION_DURATION); mAppearAnimator.addUpdateListener(animation -> animate(animation.getAnimatedFraction())); mAppearAnimator.start(); } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputViewController.java index f7423ed12e68..8011efdc1ae7 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputViewController.java @@ -139,4 +139,9 @@ public abstract class KeyguardPinBasedInputViewController<T extends KeyguardPinB super.startErrorAnimation(); mView.startErrorAnimation(); } + + @Override + protected int getInitialMessageResId() { + return R.string.keyguard_enter_your_pin; + } } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java index f51ac325c9c1..35b2db27d879 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java @@ -74,9 +74,4 @@ public class KeyguardPinViewController return mView.startDisappearAnimation( mKeyguardUpdateMonitor.needsSlowUnlockTransition(), finishRunnable); } - - @Override - protected int getInitialMessageResId() { - return R.string.keyguard_enter_your_pin; - } } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java index 8f3484a0c99b..5d7a6f122e69 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java @@ -36,8 +36,11 @@ import static com.android.systemui.plugins.FalsingManager.LOW_PENALTY; import static java.lang.Integer.max; +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; +import android.animation.ValueAnimator; import android.app.Activity; import android.app.AlertDialog; import android.app.admin.DevicePolicyManager; @@ -967,11 +970,23 @@ public class KeyguardSecurityContainer extends ConstraintLayout { } mUserSwitcherViewGroup.setAlpha(0f); - ObjectAnimator alphaAnim = ObjectAnimator.ofFloat(mUserSwitcherViewGroup, View.ALPHA, - 1f); - alphaAnim.setInterpolator(Interpolators.ALPHA_IN); - alphaAnim.setDuration(500); - alphaAnim.start(); + ValueAnimator animator = ValueAnimator.ofFloat(0f, 1f); + int yTrans = mView.getResources().getDimensionPixelSize(R.dimen.pin_view_trans_y_entry); + animator.setInterpolator(Interpolators.STANDARD_DECELERATE); + animator.setDuration(650); + animator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mUserSwitcherViewGroup.setAlpha(1f); + mUserSwitcherViewGroup.setTranslationY(0f); + } + }); + animator.addUpdateListener(animation -> { + float value = (float) animation.getAnimatedValue(); + mUserSwitcherViewGroup.setAlpha(value); + mUserSwitcherViewGroup.setTranslationY(yTrans - yTrans * value); + }); + animator.start(); } @Override diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityViewFlipperController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityViewFlipperController.java index a5c8c7881e3b..39b567fd21b9 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityViewFlipperController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityViewFlipperController.java @@ -156,5 +156,10 @@ public class KeyguardSecurityViewFlipperController @Override public void onStartingToHide() { } + + @Override + protected int getInitialMessageResId() { + return 0; + } } } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index 71d5bf57baf6..ec4b78065c63 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -1660,7 +1660,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab @Override public void onAuthenticationFailed() { - requestActiveUnlock( + requestActiveUnlockDismissKeyguard( ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN.BIOMETRIC_FAIL, "fingerprintFailure"); handleFingerprintAuthFailed(); @@ -2591,6 +2591,18 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab } /** + * Attempts to trigger active unlock from trust agent with a request to dismiss the keyguard. + */ + public void requestActiveUnlockDismissKeyguard( + @NonNull ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN requestOrigin, + String extraReason + ) { + requestActiveUnlock( + requestOrigin, + extraReason + "-dismissKeyguard", true); + } + + /** * Whether the UDFPS bouncer is showing. */ public void setUdfpsBouncerShowing(boolean showing) { diff --git a/packages/SystemUI/src/com/android/keyguard/logging/KeyguardLogger.kt b/packages/SystemUI/src/com/android/keyguard/logging/KeyguardLogger.kt index 9e58500c7206..886d110de369 100644 --- a/packages/SystemUI/src/com/android/keyguard/logging/KeyguardLogger.kt +++ b/packages/SystemUI/src/com/android/keyguard/logging/KeyguardLogger.kt @@ -54,35 +54,6 @@ class KeyguardLogger @Inject constructor(@KeyguardLog private val buffer: LogBuf buffer.log(TAG, INFO, { str1 = arg.toString() }, { "$msg: $str1" }) } - // TODO: remove after b/237743330 is fixed - fun logStatusBarCalculatedAlpha(alpha: Float) { - buffer.log(TAG, DEBUG, { double1 = alpha.toDouble() }, { "Calculated new alpha: $double1" }) - } - - // TODO: remove after b/237743330 is fixed - fun logStatusBarExplicitAlpha(alpha: Float) { - buffer.log( - TAG, - DEBUG, - { double1 = alpha.toDouble() }, - { "new mExplicitAlpha value: $double1" } - ) - } - - // TODO: remove after b/237743330 is fixed - fun logStatusBarAlphaVisibility(visibility: Int, alpha: Float, state: String) { - buffer.log( - TAG, - DEBUG, - { - int1 = visibility - double1 = alpha.toDouble() - str1 = state - }, - { "changing visibility to $int1 with alpha $double1 in state: $str1" } - ) - } - @JvmOverloads fun logBiometricMessage( @CompileTimeConstant context: String, diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIInitializer.java b/packages/SystemUI/src/com/android/systemui/SystemUIInitializer.java index 632fcdc16259..0fc9ef96f6e9 100644 --- a/packages/SystemUI/src/com/android/systemui/SystemUIInitializer.java +++ b/packages/SystemUI/src/com/android/systemui/SystemUIInitializer.java @@ -22,6 +22,8 @@ import android.os.Handler; import android.os.HandlerThread; import android.util.Log; +import androidx.annotation.Nullable; + import com.android.systemui.dagger.GlobalRootComponent; import com.android.systemui.dagger.SysUIComponent; import com.android.systemui.dagger.WMComponent; @@ -53,6 +55,7 @@ public abstract class SystemUIInitializer { mContext = context; } + @Nullable protected abstract GlobalRootComponent.Builder getGlobalRootComponentBuilder(); /** @@ -69,6 +72,11 @@ public abstract class SystemUIInitializer { * Starts the initialization process. This stands up the Dagger graph. */ public void init(boolean fromTest) throws ExecutionException, InterruptedException { + GlobalRootComponent.Builder globalBuilder = getGlobalRootComponentBuilder(); + if (globalBuilder == null) { + return; + } + mRootComponent = getGlobalRootComponentBuilder() .context(mContext) .instrumentationTest(fromTest) @@ -119,6 +127,7 @@ public abstract class SystemUIInitializer { .setBackAnimation(Optional.ofNullable(null)) .setDesktopMode(Optional.ofNullable(null)); } + mSysUIComponent = builder.build(); if (initializeComponents) { mSysUIComponent.init(); diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIInitializerImpl.kt b/packages/SystemUI/src/com/android/systemui/SystemUIInitializerImpl.kt index 8aa3040c6015..55c095b0be25 100644 --- a/packages/SystemUI/src/com/android/systemui/SystemUIInitializerImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/SystemUIInitializerImpl.kt @@ -16,6 +16,7 @@ package com.android.systemui +import android.app.Application import android.content.Context import com.android.systemui.dagger.DaggerReferenceGlobalRootComponent import com.android.systemui.dagger.GlobalRootComponent @@ -24,7 +25,17 @@ import com.android.systemui.dagger.GlobalRootComponent * {@link SystemUIInitializer} that stands up AOSP SystemUI. */ class SystemUIInitializerImpl(context: Context) : SystemUIInitializer(context) { - override fun getGlobalRootComponentBuilder(): GlobalRootComponent.Builder { - return DaggerReferenceGlobalRootComponent.builder() + + override fun getGlobalRootComponentBuilder(): GlobalRootComponent.Builder? { + return when (Application.getProcessName()) { + SCREENSHOT_CROSS_PROFILE_PROCESS -> null + else -> DaggerReferenceGlobalRootComponent.builder() + } + } + + companion object { + private const val SYSTEMUI_PROCESS = "com.android.systemui" + private const val SCREENSHOT_CROSS_PROFILE_PROCESS = + "$SYSTEMUI_PROCESS:screenshot_cross_profile" } } diff --git a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsAnimations.kt b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsAnimations.kt index 4aa597ef3d28..8d0edf829416 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsAnimations.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsAnimations.kt @@ -50,7 +50,12 @@ object ControlsAnimations { * Setup an activity to handle enter/exit animations. [view] should be the root of the content. * Fade and translate together. */ - fun observerForAnimations(view: ViewGroup, window: Window, intent: Intent): LifecycleObserver { + fun observerForAnimations( + view: ViewGroup, + window: Window, + intent: Intent, + animateY: Boolean = true + ): LifecycleObserver { return object : LifecycleObserver { var showAnimation = intent.getBooleanExtra(ControlsUiController.EXTRA_ANIMATE, false) @@ -61,8 +66,12 @@ object ControlsAnimations { view.transitionAlpha = 0.0f if (translationY == -1f) { - translationY = view.context.resources.getDimensionPixelSize( - R.dimen.global_actions_controls_y_translation).toFloat() + if (animateY) { + translationY = view.context.resources.getDimensionPixelSize( + R.dimen.global_actions_controls_y_translation).toFloat() + } else { + translationY = 0f + } } } diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsActivity.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsActivity.kt index 5d611c4c8212..d8d8c0ead06a 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsActivity.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsActivity.kt @@ -70,7 +70,8 @@ class ControlsActivity @Inject constructor( ControlsAnimations.observerForAnimations( requireViewById<ViewGroup>(R.id.control_detail_root), window, - intent + intent, + !featureFlags.isEnabled(Flags.USE_APP_PANELS) ) ) diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt index fb678aa420bf..1e3e5cd1c31c 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt @@ -186,7 +186,7 @@ class ControlsUiControllerImpl @Inject constructor ( val allStructures = controlsController.get().getFavorites() val selected = getPreferredSelectedItem(allStructures) val anyPanels = controlsListingController.get().getCurrentServices() - .none { it.panelActivity != null } + .any { it.panelActivity != null } return if (controlsController.get().addSeedingFavoritesCallback(onSeedingComplete)) { ControlsActivity::class.java diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/PanelTaskViewController.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/PanelTaskViewController.kt index 7143be298a9d..f5764c2fdc04 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/PanelTaskViewController.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/PanelTaskViewController.kt @@ -24,6 +24,10 @@ import android.app.PendingIntent import android.content.ComponentName import android.content.Context import android.content.Intent +import android.graphics.Color +import android.graphics.drawable.ShapeDrawable +import android.graphics.drawable.shapes.RoundRectShape +import com.android.systemui.R import com.android.systemui.util.boundsOnScreen import com.android.wm.shell.TaskView import java.util.concurrent.Executor @@ -64,6 +68,16 @@ class PanelTaskViewController( options.taskAlwaysOnTop = true taskView.post { + val roundedCorner = + activityContext.resources.getDimensionPixelSize( + R.dimen.notification_corner_radius + ) + val radii = FloatArray(8) { roundedCorner.toFloat() } + taskView.background = + ShapeDrawable(RoundRectShape(radii, null, null)).apply { + setTint(Color.TRANSPARENT) + } + taskView.clipToOutline = true taskView.startActivity( pendingIntent, fillInIntent, diff --git a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayRegistrant.java b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayRegistrant.java index d145f5c14917..87c5f51ce13a 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayRegistrant.java +++ b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayRegistrant.java @@ -16,6 +16,8 @@ package com.android.systemui.dreams; +import static com.android.systemui.dreams.dagger.DreamModule.DREAM_OVERLAY_SERVICE_COMPONENT; + import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; @@ -35,6 +37,7 @@ import com.android.systemui.CoreStartable; import com.android.systemui.dagger.qualifiers.Main; import javax.inject.Inject; +import javax.inject.Named; /** * {@link DreamOverlayRegistrant} is responsible for telling system server that SystemUI should be @@ -98,12 +101,13 @@ public class DreamOverlayRegistrant implements CoreStartable { } @Inject - public DreamOverlayRegistrant(Context context, @Main Resources resources) { + public DreamOverlayRegistrant(Context context, @Main Resources resources, + @Named(DREAM_OVERLAY_SERVICE_COMPONENT) ComponentName dreamOverlayServiceComponent) { mContext = context; mResources = resources; mDreamManager = IDreamManager.Stub.asInterface( ServiceManager.getService(DreamService.DREAM_SERVICE)); - mOverlayServiceComponent = new ComponentName(mContext, DreamOverlayService.class); + mOverlayServiceComponent = dreamOverlayServiceComponent; } @Override diff --git a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayStateController.java b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayStateController.java index 5f942b6fb834..ccfdd0966e98 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayStateController.java +++ b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayStateController.java @@ -16,6 +16,8 @@ package com.android.systemui.dreams; +import static com.android.systemui.dreams.dagger.DreamModule.DREAM_OVERLAY_ENABLED; + import android.service.dreams.DreamService; import android.util.Log; @@ -37,6 +39,7 @@ import java.util.function.Consumer; import java.util.stream.Collectors; import javax.inject.Inject; +import javax.inject.Named; /** * {@link DreamOverlayStateController} is the source of truth for Dream overlay configurations and @@ -83,6 +86,7 @@ public class DreamOverlayStateController implements } private final Executor mExecutor; + private final boolean mOverlayEnabled; private final ArrayList<Callback> mCallbacks = new ArrayList<>(); @Complication.ComplicationType @@ -94,14 +98,27 @@ public class DreamOverlayStateController implements @VisibleForTesting @Inject - public DreamOverlayStateController(@Main Executor executor) { + public DreamOverlayStateController(@Main Executor executor, + @Named(DREAM_OVERLAY_ENABLED) boolean overlayEnabled) { mExecutor = executor; + mOverlayEnabled = overlayEnabled; + if (DEBUG) { + Log.d(TAG, "Dream overlay enabled:" + mOverlayEnabled); + } } /** * Adds a complication to be included on the dream overlay. */ public void addComplication(Complication complication) { + if (!mOverlayEnabled) { + if (DEBUG) { + Log.d(TAG, + "Ignoring adding complication due to overlay disabled:" + complication); + } + return; + } + mExecutor.execute(() -> { if (mComplications.add(complication)) { if (DEBUG) { @@ -116,6 +133,14 @@ public class DreamOverlayStateController implements * Removes a complication from inclusion on the dream overlay. */ public void removeComplication(Complication complication) { + if (!mOverlayEnabled) { + if (DEBUG) { + Log.d(TAG, + "Ignoring removing complication due to overlay disabled:" + complication); + } + return; + } + mExecutor.execute(() -> { if (mComplications.remove(complication)) { if (DEBUG) { @@ -193,7 +218,7 @@ public class DreamOverlayStateController implements * @return {@code true} if overlay is active, {@code false} otherwise. */ public boolean isOverlayActive() { - return containsState(STATE_DREAM_OVERLAY_ACTIVE); + return mOverlayEnabled && containsState(STATE_DREAM_OVERLAY_ACTIVE); } /** diff --git a/packages/SystemUI/src/com/android/systemui/dreams/complication/ComplicationHostViewController.java b/packages/SystemUI/src/com/android/systemui/dreams/complication/ComplicationHostViewController.java index 100ccc35e638..a2e11b21ea59 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/complication/ComplicationHostViewController.java +++ b/packages/SystemUI/src/com/android/systemui/dreams/complication/ComplicationHostViewController.java @@ -138,19 +138,27 @@ public class ComplicationHostViewController extends ViewController<ConstraintLay final ComplicationId id = complication.getId(); final Complication.ViewHolder viewHolder = complication.getComplication() .createView(complication); + + final View view = viewHolder.getView(); + + if (view == null) { + Log.e(TAG, "invalid complication view. null view supplied by ViewHolder"); + return; + } + // Complications to be added before dream entry animations are finished are set // to invisible and are animated in. if (!mEntryAnimationsFinished) { - viewHolder.getView().setVisibility(View.INVISIBLE); + view.setVisibility(View.INVISIBLE); } mComplications.put(id, viewHolder); - if (viewHolder.getView().getParent() != null) { + if (view.getParent() != null) { Log.e(TAG, "View for complication " + complication.getComplication().getClass() + " already has a parent. Make sure not to reuse complication " + "views!"); } - mLayoutEngine.addComplication(id, viewHolder.getView(), + mLayoutEngine.addComplication(id, view, viewHolder.getLayoutParams(), viewHolder.getCategory()); }); } diff --git a/packages/SystemUI/src/com/android/systemui/dreams/complication/DreamHomeControlsComplication.java b/packages/SystemUI/src/com/android/systemui/dreams/complication/DreamHomeControlsComplication.java index ee0051220787..1065b94508f8 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/complication/DreamHomeControlsComplication.java +++ b/packages/SystemUI/src/com/android/systemui/dreams/complication/DreamHomeControlsComplication.java @@ -136,8 +136,15 @@ public class DreamHomeControlsComplication implements Complication { final boolean hasFavorites = mControlsComponent.getControlsController() .map(c -> !c.getFavorites().isEmpty()) .orElse(false); + boolean hasPanels = false; + for (int i = 0; i < controlsServices.size(); i++) { + if (controlsServices.get(i).getPanelActivity() != null) { + hasPanels = true; + break; + } + } final ControlsComponent.Visibility visibility = mControlsComponent.getVisibility(); - return hasFavorites && visibility != UNAVAILABLE; + return (hasFavorites || hasPanels) && visibility != UNAVAILABLE; } } diff --git a/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamModule.java b/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamModule.java index 101f4a450071..e7b29bb84b3d 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamModule.java +++ b/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamModule.java @@ -16,7 +16,9 @@ package com.android.systemui.dreams.dagger; +import android.content.ComponentName; import android.content.Context; +import android.content.pm.PackageManager; import android.content.res.Resources; import com.android.dream.lowlight.dagger.LowLightDreamModule; @@ -24,6 +26,7 @@ import com.android.settingslib.dream.DreamBackend; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dreams.DreamOverlayNotificationCountProvider; +import com.android.systemui.dreams.DreamOverlayService; import com.android.systemui.dreams.complication.dagger.RegisteredComplicationsModule; import java.util.Optional; @@ -45,10 +48,35 @@ import dagger.Provides; }) public interface DreamModule { String DREAM_ONLY_ENABLED_FOR_DOCK_USER = "dream_only_enabled_for_dock_user"; + String DREAM_OVERLAY_SERVICE_COMPONENT = "dream_overlay_service_component"; + String DREAM_OVERLAY_ENABLED = "dream_overlay_enabled"; String DREAM_SUPPORTED = "dream_supported"; /** + * Provides the dream component + */ + @Provides + @Named(DREAM_OVERLAY_SERVICE_COMPONENT) + static ComponentName providesDreamOverlayService(Context context) { + return new ComponentName(context, DreamOverlayService.class); + } + + /** + * Provides whether dream overlay is enabled. + */ + @Provides + @Named(DREAM_OVERLAY_ENABLED) + static Boolean providesDreamOverlayEnabled(PackageManager packageManager, + @Named(DREAM_OVERLAY_SERVICE_COMPONENT) ComponentName component) { + try { + return packageManager.getServiceInfo(component, PackageManager.GET_META_DATA).enabled; + } catch (PackageManager.NameNotFoundException e) { + return false; + } + } + + /** * Provides an instance of the dream backend. */ @Provides diff --git a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt index 8dc0371447d9..efb513d57db6 100644 --- a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt +++ b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt @@ -83,7 +83,7 @@ object Flags { val STABILITY_INDEX_FIX = releasedFlag(114, "stability_index_fix") // TODO(b/259559750): Tracking Bug - val SEMI_STABLE_SORT = unreleasedFlag(115, "semi_stable_sort", teamfood = true) + val SEMI_STABLE_SORT = releasedFlag(115, "semi_stable_sort") @JvmField val USE_ROUNDNESS_SOURCETYPES = unreleasedFlag(116, "use_roundness_sourcetype", teamfood = true) @@ -254,10 +254,6 @@ object Flags { // TODO(b/254512848): Tracking Bug val REGION_SAMPLING = unreleasedFlag(801, "region_sampling", teamfood = true) - // 802 - wallpaper rendering - // TODO(b/254512923): Tracking Bug - @JvmField val USE_CANVAS_RENDERER = unreleasedFlag(802, "use_canvas_renderer") - // 803 - screen contents translation // TODO(b/254513187): Tracking Bug val SCREEN_CONTENTS_TRANSLATION = unreleasedFlag(803, "screen_contents_translation") @@ -289,7 +285,11 @@ object Flags { // TODO(b/254513168): Tracking Bug @JvmField val UMO_SURFACE_RIPPLE = unreleasedFlag(907, "umo_surface_ripple") - @JvmField val MEDIA_FALSING_PENALTY = unreleasedFlag(908, "media_falsing_media") + @JvmField + val MEDIA_FALSING_PENALTY = unreleasedFlag(908, "media_falsing_media", teamfood = true) + + // TODO(b/261734857): Tracking Bug + @JvmField val UMO_TURBULENCE_NOISE = unreleasedFlag(909, "umo_turbulence_noise") // 1000 - dock val SIMULATE_DOCK_THROUGH_CHARGING = releasedFlag(1000, "simulate_dock_through_charging") @@ -436,6 +436,8 @@ object Flags { // 2300 - stylus @JvmField val TRACK_STYLUS_EVER_USED = unreleasedFlag(2300, "track_stylus_ever_used") @JvmField val ENABLE_STYLUS_CHARGING_UI = unreleasedFlag(2301, "enable_stylus_charging_ui") + @JvmField + val ENABLE_USI_BATTERY_NOTIFICATIONS = unreleasedFlag(2302, "enable_usi_battery_notifications") // 2400 - performance tools and debugging info // TODO(b/238923086): Tracking Bug diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 306e92e6c96c..d4b6386ff706 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -1613,7 +1613,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, // TODO: Rename all screen off/on references to interactive/sleeping synchronized (this) { mDeviceInteractive = true; - if (mPendingLock && !cameraGestureTriggered) { + if (mPendingLock && !cameraGestureTriggered && !mWakeAndUnlocking) { doKeyguardLocked(null); } mAnimatingScreenOff = false; diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/HomeControlsKeyguardQuickAffordanceConfig.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/HomeControlsKeyguardQuickAffordanceConfig.kt index 2558fab216a0..394426df5552 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/HomeControlsKeyguardQuickAffordanceConfig.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/HomeControlsKeyguardQuickAffordanceConfig.kt @@ -130,6 +130,7 @@ constructor( state( isFeatureEnabled = component.isEnabled(), hasFavorites = favorites?.isNotEmpty() == true, + hasPanels = serviceInfos.any { it.panelActivity != null }, hasServiceInfos = serviceInfos.isNotEmpty(), iconResourceId = component.getTileImageId(), visibility = component.getVisibility(), @@ -148,13 +149,14 @@ constructor( private fun state( isFeatureEnabled: Boolean, hasFavorites: Boolean, + hasPanels: Boolean, hasServiceInfos: Boolean, visibility: ControlsComponent.Visibility, @DrawableRes iconResourceId: Int?, ): KeyguardQuickAffordanceConfig.LockScreenState { return if ( isFeatureEnabled && - hasFavorites && + (hasFavorites || hasPanels) && hasServiceInfos && iconResourceId != null && visibility == ControlsComponent.Visibility.AVAILABLE diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardBouncerRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardBouncerRepository.kt index 783f752cbd20..90f3c7d88c8f 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardBouncerRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardBouncerRepository.kt @@ -16,23 +16,36 @@ package com.android.systemui.keyguard.data.repository -import com.android.keyguard.KeyguardUpdateMonitor +import android.os.Build import com.android.keyguard.ViewMediatorCallback import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.keyguard.shared.model.BouncerShowMessageModel import com.android.systemui.keyguard.shared.model.KeyguardBouncerModel +import com.android.systemui.log.dagger.BouncerLog +import com.android.systemui.log.table.TableLogBuffer +import com.android.systemui.log.table.logDiffsForTable import com.android.systemui.statusbar.phone.KeyguardBouncer import javax.inject.Inject +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.filterNotNull +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.map -/** Encapsulates app state for the lock screen primary and alternate bouncer. */ +/** + * Encapsulates app state for the lock screen primary and alternate bouncer. + * + * Make sure to add newly added flows to the logger. + */ @SysUISingleton class KeyguardBouncerRepository @Inject constructor( private val viewMediatorCallback: ViewMediatorCallback, - keyguardUpdateMonitor: KeyguardUpdateMonitor, + @Application private val applicationScope: CoroutineScope, + @BouncerLog private val buffer: TableLogBuffer, ) { /** Values associated with the PrimaryBouncer (pin/pattern/password) input. */ private val _primaryBouncerVisible = MutableStateFlow(false) @@ -77,6 +90,10 @@ constructor( val bouncerErrorMessage: CharSequence? get() = viewMediatorCallback.consumeCustomMessage() + init { + setUpLogging() + } + fun setPrimaryScrimmed(isScrimmed: Boolean) { _primaryBouncerScrimmed.value = isScrimmed } @@ -132,4 +149,57 @@ constructor( fun setOnScreenTurnedOff(onScreenTurnedOff: Boolean) { _onScreenTurnedOff.value = onScreenTurnedOff } + + /** Sets up logs for state flows. */ + private fun setUpLogging() { + if (!Build.IS_DEBUGGABLE) { + return + } + + primaryBouncerVisible + .logDiffsForTable(buffer, "", "PrimaryBouncerVisible", false) + .launchIn(applicationScope) + primaryBouncerShow + .map { it != null } + .logDiffsForTable(buffer, "", "PrimaryBouncerShow", false) + .launchIn(applicationScope) + primaryBouncerShowingSoon + .logDiffsForTable(buffer, "", "PrimaryBouncerShowingSoon", false) + .launchIn(applicationScope) + primaryBouncerHide + .logDiffsForTable(buffer, "", "PrimaryBouncerHide", false) + .launchIn(applicationScope) + primaryBouncerStartingToHide + .logDiffsForTable(buffer, "", "PrimaryBouncerStartingToHide", false) + .launchIn(applicationScope) + primaryBouncerStartingDisappearAnimation + .map { it != null } + .logDiffsForTable(buffer, "", "PrimaryBouncerStartingDisappearAnimation", false) + .launchIn(applicationScope) + primaryBouncerScrimmed + .logDiffsForTable(buffer, "", "PrimaryBouncerScrimmed", false) + .launchIn(applicationScope) + panelExpansionAmount + .map { (it * 1000).toInt() } + .logDiffsForTable(buffer, "", "PanelExpansionAmountMillis", -1) + .launchIn(applicationScope) + keyguardPosition + .map { it.toInt() } + .logDiffsForTable(buffer, "", "KeyguardPosition", -1) + .launchIn(applicationScope) + onScreenTurnedOff + .logDiffsForTable(buffer, "", "OnScreenTurnedOff", false) + .launchIn(applicationScope) + isBackButtonEnabled + .filterNotNull() + .logDiffsForTable(buffer, "", "IsBackButtonEnabled", false) + .launchIn(applicationScope) + showMessage + .map { it?.message } + .logDiffsForTable(buffer, "", "ShowMessage", null) + .launchIn(applicationScope) + resourceUpdateRequests + .logDiffsForTable(buffer, "", "ResourceUpdateRequests", false) + .launchIn(applicationScope) + } } diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/BouncerLog.kt b/packages/SystemUI/src/com/android/systemui/log/dagger/BouncerLog.kt new file mode 100644 index 000000000000..2251a7b243aa --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/log/dagger/BouncerLog.kt @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.log.dagger + +import java.lang.annotation.Documented +import java.lang.annotation.Retention +import java.lang.annotation.RetentionPolicy +import javax.inject.Qualifier + +/** Logger for the primary and alternative bouncers. */ +@Qualifier @Documented @Retention(RetentionPolicy.RUNTIME) annotation class BouncerLog diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java b/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java index 74d50433b9a7..ec2e340762a3 100644 --- a/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java +++ b/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java @@ -23,6 +23,8 @@ import android.os.Looper; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.log.LogBufferFactory; +import com.android.systemui.log.table.TableLogBuffer; +import com.android.systemui.log.table.TableLogBufferFactory; import com.android.systemui.plugins.log.LogBuffer; import com.android.systemui.plugins.log.LogcatEchoTracker; import com.android.systemui.plugins.log.LogcatEchoTrackerDebug; @@ -345,6 +347,14 @@ public class LogModule { return factory.create("BluetoothLog", 50); } + /** Provides a logging buffer for the primary bouncer. */ + @Provides + @SysUISingleton + @BouncerLog + public static TableLogBuffer provideBouncerLogBuffer(TableLogBufferFactory factory) { + return factory.create("BouncerLog", 250); + } + /** * Provides a {@link LogBuffer} for general keyguard-related logs. */ diff --git a/packages/SystemUI/src/com/android/systemui/log/table/Diffable.kt b/packages/SystemUI/src/com/android/systemui/log/table/Diffable.kt index bb04b6b41a33..348d941d22cf 100644 --- a/packages/SystemUI/src/com/android/systemui/log/table/Diffable.kt +++ b/packages/SystemUI/src/com/android/systemui/log/table/Diffable.kt @@ -100,3 +100,46 @@ fun Flow<Boolean>.logDiffsForTable( newVal } } +/** + * Each time the Int flow is updated with a new value that's different from the previous value, logs + * the new value to the given [tableLogBuffer]. + */ +fun Flow<Int>.logDiffsForTable( + tableLogBuffer: TableLogBuffer, + columnPrefix: String, + columnName: String, + initialValue: Int, +): Flow<Int> { + val initialValueFun = { + tableLogBuffer.logChange(columnPrefix, columnName, initialValue) + initialValue + } + return this.pairwiseBy(initialValueFun) { prevVal, newVal: Int -> + if (prevVal != newVal) { + tableLogBuffer.logChange(columnPrefix, columnName, newVal) + } + newVal + } +} + +/** + * Each time the String? flow is updated with a new value that's different from the previous value, + * logs the new value to the given [tableLogBuffer]. + */ +fun Flow<String?>.logDiffsForTable( + tableLogBuffer: TableLogBuffer, + columnPrefix: String, + columnName: String, + initialValue: String?, +): Flow<String?> { + val initialValueFun = { + tableLogBuffer.logChange(columnPrefix, columnName, initialValue) + initialValue + } + return this.pairwiseBy(initialValueFun) { prevVal, newVal: String? -> + if (prevVal != newVal) { + tableLogBuffer.logChange(columnPrefix, columnName, newVal) + } + newVal + } +} diff --git a/packages/SystemUI/src/com/android/systemui/log/table/TableLogBuffer.kt b/packages/SystemUI/src/com/android/systemui/log/table/TableLogBuffer.kt index 9d0b833d26cc..2c299d67022d 100644 --- a/packages/SystemUI/src/com/android/systemui/log/table/TableLogBuffer.kt +++ b/packages/SystemUI/src/com/android/systemui/log/table/TableLogBuffer.kt @@ -127,11 +127,21 @@ class TableLogBuffer( rowInitializer(row) } + /** Logs a String? change. */ + fun logChange(prefix: String, columnName: String, value: String?) { + logChange(systemClock.currentTimeMillis(), prefix, columnName, value) + } + /** Logs a boolean change. */ fun logChange(prefix: String, columnName: String, value: Boolean) { logChange(systemClock.currentTimeMillis(), prefix, columnName, value) } + /** Logs a Int change. */ + fun logChange(prefix: String, columnName: String, value: Int) { + logChange(systemClock.currentTimeMillis(), prefix, columnName, value) + } + // Keep these individual [logChange] methods private (don't let clients give us their own // timestamps.) diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaControlPanel.java b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaControlPanel.java index df8fb9149f30..db7a145e2ade 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaControlPanel.java +++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaControlPanel.java @@ -224,6 +224,8 @@ public class MediaControlPanel { private TurbulenceNoiseController mTurbulenceNoiseController; private FeatureFlags mFeatureFlags; private TurbulenceNoiseAnimationConfig mTurbulenceNoiseAnimationConfig = null; + @VisibleForTesting + MultiRippleController.Companion.RipplesFinishedListener mRipplesFinishedListener = null; /** * Initialize a new control panel @@ -404,15 +406,17 @@ public class MediaControlPanel { MultiRippleView multiRippleView = vh.getMultiRippleView(); mMultiRippleController = new MultiRippleController(multiRippleView); mTurbulenceNoiseController = new TurbulenceNoiseController(vh.getTurbulenceNoiseView()); - multiRippleView.addRipplesFinishedListener( - () -> { - if (mTurbulenceNoiseAnimationConfig == null) { - mTurbulenceNoiseAnimationConfig = createLingeringNoiseAnimation(); - } - // Color will be correctly updated in ColorSchemeTransition. - mTurbulenceNoiseController.play(mTurbulenceNoiseAnimationConfig); + if (mFeatureFlags.isEnabled(Flags.UMO_TURBULENCE_NOISE)) { + mRipplesFinishedListener = () -> { + if (mTurbulenceNoiseAnimationConfig == null) { + mTurbulenceNoiseAnimationConfig = createLingeringNoiseAnimation(); } - ); + // Color will be correctly updated in ColorSchemeTransition. + mTurbulenceNoiseController.play(mTurbulenceNoiseAnimationConfig); + }; + mMultiRippleController.addRipplesFinishedListener(mRipplesFinishedListener); + } + mColorSchemeTransition = new ColorSchemeTransition( mContext, mMediaViewHolder, mMultiRippleController, mTurbulenceNoiseController); mMetadataAnimationHandler = new MetadataAnimationHandler(exit, enter); diff --git a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java index f92bbf75d027..8ceee1a950ea 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java +++ b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java @@ -741,6 +741,14 @@ public class PagedTileLayout extends ViewPager implements QSTileLayout { } }; + /** + * Force all tiles to be redistributed across pages. + * Should be called when one of the following changes: rows, columns, number of tiles. + */ + public void forceTilesRedistribution() { + mDistributeTiles = true; + } + public interface PageListener { int INVALID_PAGE = -1; diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java index 1827eaf3fad1..b2ca6b728113 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java @@ -148,6 +148,11 @@ public class QSPanelController extends QSPanelControllerBase<QSPanel> { } } + @Override + protected void onSplitShadeChanged() { + ((PagedTileLayout) mView.getOrCreateTileLayout()).forceTilesRedistribution(); + } + /** */ public void setVisibility(int visibility) { mView.setVisibility(visibility); diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java index dd88c83949fb..60d2c177c7cd 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java @@ -96,17 +96,23 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr /* newOrientation= */ newConfig.orientation, /* containerName= */ mView.getDumpableTag()); + boolean previousSplitShadeState = mShouldUseSplitNotificationShade; mShouldUseSplitNotificationShade = LargeScreenUtils.shouldUseSplitNotificationShade(getResources()); mLastOrientation = newConfig.orientation; switchTileLayoutIfNeeded(); onConfigurationChanged(); + if (previousSplitShadeState != mShouldUseSplitNotificationShade) { + onSplitShadeChanged(); + } } }; protected void onConfigurationChanged() { } + protected void onSplitShadeChanged() { } + private final Function1<Boolean, Unit> mMediaHostVisibilityListener = (visible) -> { if (mMediaVisibilityChangedListener != null) { mMediaVisibilityChangedListener.accept(visible); @@ -264,14 +270,6 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr } } } - protected QSTile getTile(String subPanel) { - for (int i = 0; i < mRecords.size(); i++) { - if (subPanel.equals(mRecords.get(i).tile.getTileSpec())) { - return mRecords.get(i).tile; - } - } - return mHost.createTile(subPanel); - } boolean areThereTiles() { return !mRecords.isEmpty(); 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 ee3b13091d00..1ed18c3df332 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 @@ -363,6 +363,9 @@ public class InternetDialog extends SystemUIDialog implements if (!isChecked && shouldShowMobileDialog()) { showTurnOffMobileDialog(); } else if (!shouldShowMobileDialog()) { + if (mInternetDialogController.isMobileDataEnabled() == isChecked) { + return; + } mInternetDialogController.setMobileDataEnabled(mContext, mDefaultDataSubId, isChecked, false); } diff --git a/packages/SystemUI/src/com/android/systemui/shade/LargeScreenShadeHeaderController.kt b/packages/SystemUI/src/com/android/systemui/shade/LargeScreenShadeHeaderController.kt index b511b5463cbf..7fc0a5f6d4bf 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/LargeScreenShadeHeaderController.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/LargeScreenShadeHeaderController.kt @@ -101,6 +101,8 @@ class LargeScreenShadeHeaderController @Inject constructor( @VisibleForTesting internal val HEADER_TRANSITION_ID = R.id.header_transition @VisibleForTesting + internal val LARGE_SCREEN_HEADER_TRANSITION_ID = R.id.large_screen_header_transition + @VisibleForTesting internal val QQS_HEADER_CONSTRAINT = R.id.qqs_header_constraint @VisibleForTesting internal val QS_HEADER_CONSTRAINT = R.id.qs_header_constraint @@ -429,8 +431,11 @@ class LargeScreenShadeHeaderController @Inject constructor( } header as MotionLayout if (largeScreenActive) { - header.getConstraintSet(LARGE_SCREEN_HEADER_CONSTRAINT).applyTo(header) + logInstantEvent("Large screen constraints set") + header.setTransition(HEADER_TRANSITION_ID) + header.transitionToStart() } else { + logInstantEvent("Small screen constraints set") header.setTransition(HEADER_TRANSITION_ID) header.transitionToStart() updatePosition() @@ -440,15 +445,19 @@ class LargeScreenShadeHeaderController @Inject constructor( private fun updatePosition() { if (header is MotionLayout && !largeScreenActive && visible) { - Trace.instantForTrack( - TRACE_TAG_APP, - "LargeScreenHeaderController - updatePosition", - "position: $qsExpandedFraction" - ) + logInstantEvent("updatePosition: $qsExpandedFraction") header.progress = qsExpandedFraction } } + private fun logInstantEvent(message: String) { + Trace.instantForTrack( + TRACE_TAG_APP, + "LargeScreenHeaderController", + message + ) + } + private fun updateListeners() { qsCarrierGroupController.setListening(visible) if (visible) { diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java index e33248cc5a2b..bfc810be85df 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java @@ -2325,7 +2325,7 @@ public final class NotificationPanelViewController implements Dumpable { private boolean handleQsTouch(MotionEvent event) { - if (mSplitShadeEnabled && touchXOutsideOfQs(event.getX())) { + if (isSplitShadeAndTouchXOutsideQs(event.getX())) { return false; } final int action = event.getActionMasked(); @@ -2382,12 +2382,14 @@ public final class NotificationPanelViewController implements Dumpable { return false; } - private boolean touchXOutsideOfQs(float touchX) { - return touchX < mQsFrame.getX() || touchX > mQsFrame.getX() + mQsFrame.getWidth(); + /** Returns whether split shade is enabled and an x coordinate is outside of the QS frame. */ + private boolean isSplitShadeAndTouchXOutsideQs(float touchX) { + return mSplitShadeEnabled && (touchX < mQsFrame.getX() + || touchX > mQsFrame.getX() + mQsFrame.getWidth()); } private boolean isInQsArea(float x, float y) { - if (touchXOutsideOfQs(x)) { + if (isSplitShadeAndTouchXOutsideQs(x)) { return false; } // Let's reject anything at the very bottom around the home handle in gesture nav @@ -4720,6 +4722,7 @@ public final class NotificationPanelViewController implements Dumpable { if (!openingWithTouch || !mHasVibratedOnOpen) { mVibratorHelper.vibrate(VibrationEffect.EFFECT_TICK); mHasVibratedOnOpen = true; + mShadeLog.v("Vibrating on opening, mHasVibratedOnOpen=true"); } } } @@ -5316,7 +5319,7 @@ public final class NotificationPanelViewController implements Dumpable { @Override public void flingTopOverscroll(float velocity, boolean open) { // in split shade mode we want to expand/collapse QS only when touch happens within QS - if (mSplitShadeEnabled && touchXOutsideOfQs(mInitialTouchX)) { + if (isSplitShadeAndTouchXOutsideQs(mInitialTouchX)) { return; } mLastOverscroll = 0f; @@ -6120,6 +6123,7 @@ public final class NotificationPanelViewController implements Dumpable { if (isFullyCollapsed()) { // If panel is fully collapsed, reset haptic effect before adding movement. mHasVibratedOnOpen = false; + mShadeLog.logHasVibrated(mHasVibratedOnOpen, mExpandedFraction); } addMovement(event); if (!isFullyCollapsed()) { diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeLogger.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeLogger.kt index 0b59af3435ca..5fedbeb556c2 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ShadeLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeLogger.kt @@ -140,6 +140,15 @@ class ShadeLogger @Inject constructor(@ShadeLog private val buffer: LogBuffer) { }) } + fun logHasVibrated(hasVibratedOnOpen: Boolean, fraction: Float) { + log(LogLevel.VERBOSE, { + bool1 = hasVibratedOnOpen + double1 = fraction.toDouble() + }, { + "hasVibratedOnOpen=$bool1, expansionFraction=$double1" + }) + } + fun logQsExpansionChanged( message: String, qsExpanded: Boolean, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotifPipelineFlags.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotifPipelineFlags.kt index 39daa13ae168..3072c810d31b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotifPipelineFlags.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotifPipelineFlags.kt @@ -33,6 +33,8 @@ class NotifPipelineFlags @Inject constructor( fun fullScreenIntentRequiresKeyguard(): Boolean = featureFlags.isEnabled(Flags.FSI_REQUIRES_KEYGUARD) + fun fsiOnDNDUpdate(): Boolean = featureFlags.isEnabled(Flags.FSI_ON_DND_UPDATE) + val isStabilityIndexFixEnabled: Boolean by lazy { featureFlags.isEnabled(Flags.STABILITY_INDEX_FIX) } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt index 3e2dd053d938..aeae89cb3223 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt @@ -244,7 +244,7 @@ class NotificationWakeUpCoordinator @Inject constructor( } override fun onDozeAmountChanged(linear: Float, eased: Float) { - logger.logOnDozeAmountChanged(linear, eased) + logger.logOnDozeAmountChanged(linear = linear, eased = eased) if (overrideDozeAmountIfAnimatingScreenOff(linear)) { return } @@ -263,6 +263,7 @@ class NotificationWakeUpCoordinator @Inject constructor( fun setDozeAmount(linear: Float, eased: Float, source: String) { val changed = linear != mLinearDozeAmount + logger.logSetDozeAmount(linear, eased, source, statusBarStateController.state, changed) mLinearDozeAmount = linear mDozeAmount = eased mDozeAmountSource = source @@ -276,7 +277,7 @@ class NotificationWakeUpCoordinator @Inject constructor( } override fun onStateChanged(newState: Int) { - logger.logOnStateChanged(newState) + logger.logOnStateChanged(newState = newState, storedState = state) if (state == StatusBarState.SHADE && newState == StatusBarState.SHADE) { // The SHADE -> SHADE transition is only possible as part of cancelling the screen-off // animation (e.g. by fingerprint unlock). This is done because the system is in an @@ -324,12 +325,8 @@ class NotificationWakeUpCoordinator @Inject constructor( private fun overrideDozeAmountIfBypass(): Boolean { if (bypassController.bypassEnabled) { if (statusBarStateController.state == StatusBarState.KEYGUARD) { - logger.logSetDozeAmount("1.0", "1.0", - "Override: bypass (keyguard)", StatusBarState.KEYGUARD) setDozeAmount(1f, 1f, source = "Override: bypass (keyguard)") } else { - logger.logSetDozeAmount("0.0", "0.0", - "Override: bypass (shade)", statusBarStateController.state) setDozeAmount(0f, 0f, source = "Override: bypass (shade)") } return true diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorLogger.kt index b40ce25c58d2..de18b0c4307d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorLogger.kt @@ -16,22 +16,33 @@ package com.android.systemui.statusbar.notification import com.android.systemui.log.dagger.NotificationLog import com.android.systemui.plugins.log.LogBuffer import com.android.systemui.plugins.log.LogLevel.DEBUG +import com.android.systemui.statusbar.StatusBarState import javax.inject.Inject class NotificationWakeUpCoordinatorLogger @Inject constructor(@NotificationLog private val buffer: LogBuffer) { - fun logSetDozeAmount(linear: String, eased: String, source: String, state: Int) { + fun logSetDozeAmount( + linear: Float, + eased: Float, + source: String, + state: Int, + changed: Boolean, + ) { buffer.log( TAG, DEBUG, { - str1 = linear - str2 = eased + double1 = linear.toDouble() + str2 = eased.toString() str3 = source int1 = state + bool1 = changed }, - { "setDozeAmount: linear: $str1, eased: $str2, source: $str3, state: $int1" } + { + "setDozeAmount(linear=$double1, eased=$str2, source=$str3)" + + " state=${StatusBarState.toString(int1)} changed=$bool1" + } ) } @@ -43,12 +54,23 @@ constructor(@NotificationLog private val buffer: LogBuffer) { double1 = linear.toDouble() str2 = eased.toString() }, - { "onDozeAmountChanged($double1, $str2)" } + { "onDozeAmountChanged(linear=$double1, eased=$str2)" } ) } - fun logOnStateChanged(newState: Int) { - buffer.log(TAG, DEBUG, { int1 = newState }, { "onStateChanged($int1)" }) + fun logOnStateChanged(newState: Int, storedState: Int) { + buffer.log( + TAG, + DEBUG, + { + int1 = newState + int2 = storedState + }, + { + "onStateChanged(newState=${StatusBarState.toString(int1)})" + + " stored=${StatusBarState.toString(int2)}" + } + ) } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinator.kt index 5dbb4f9d70df..1004ec195493 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinator.kt @@ -22,6 +22,7 @@ import android.util.ArraySet import com.android.internal.annotations.VisibleForTesting import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.statusbar.NotificationRemoteInputManager +import com.android.systemui.statusbar.notification.NotifPipelineFlags import com.android.systemui.statusbar.notification.collection.GroupEntry import com.android.systemui.statusbar.notification.collection.ListEntry import com.android.systemui.statusbar.notification.collection.NotifPipeline @@ -38,6 +39,7 @@ import com.android.systemui.statusbar.notification.collection.render.NodeControl import com.android.systemui.statusbar.notification.dagger.IncomingHeader import com.android.systemui.statusbar.notification.interruption.HeadsUpViewBinder import com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProvider +import com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProvider.FullScreenIntentDecision import com.android.systemui.statusbar.notification.logKey import com.android.systemui.statusbar.notification.stack.BUCKET_HEADS_UP import com.android.systemui.statusbar.policy.HeadsUpManager @@ -70,11 +72,13 @@ class HeadsUpCoordinator @Inject constructor( private val mNotificationInterruptStateProvider: NotificationInterruptStateProvider, private val mRemoteInputManager: NotificationRemoteInputManager, private val mLaunchFullScreenIntentProvider: LaunchFullScreenIntentProvider, + private val mFlags: NotifPipelineFlags, @IncomingHeader private val mIncomingHeaderController: NodeController, @Main private val mExecutor: DelayableExecutor, ) : Coordinator { private val mEntriesBindingUntil = ArrayMap<String, Long>() private val mEntriesUpdateTimes = ArrayMap<String, Long>() + private val mFSIUpdateCandidates = ArrayMap<String, Long>() private var mEndLifetimeExtension: OnEndLifetimeExtensionCallback? = null private lateinit var mNotifPipeline: NotifPipeline private var mNow: Long = -1 @@ -278,7 +282,7 @@ class HeadsUpCoordinator @Inject constructor( mPostedEntries.clear() // Also take this opportunity to clean up any stale entry update times - cleanUpEntryUpdateTimes() + cleanUpEntryTimes() } /** @@ -384,8 +388,15 @@ class HeadsUpCoordinator @Inject constructor( override fun onEntryAdded(entry: NotificationEntry) { // First check whether this notification should launch a full screen intent, and // launch it if needed. - if (mNotificationInterruptStateProvider.shouldLaunchFullScreenIntentWhenAdded(entry)) { + val fsiDecision = mNotificationInterruptStateProvider.getFullScreenIntentDecision(entry) + if (fsiDecision != null && fsiDecision.shouldLaunch) { + mNotificationInterruptStateProvider.logFullScreenIntentDecision(entry, fsiDecision) mLaunchFullScreenIntentProvider.launchFullScreenIntent(entry) + } else if (mFlags.fsiOnDNDUpdate() && + fsiDecision.equals(FullScreenIntentDecision.NO_FSI_SUPPRESSED_ONLY_BY_DND)) { + // If DND was the only reason this entry was suppressed, note it for potential + // reconsideration on later ranking updates. + addForFSIReconsideration(entry, mSystemClock.currentTimeMillis()) } // shouldHeadsUp includes check for whether this notification should be filtered @@ -488,11 +499,32 @@ class HeadsUpCoordinator @Inject constructor( if (!isNewEnoughForRankingUpdate(entry)) continue // The only entries we consider alerting for here are entries that have never - // interrupted and that now say they should heads up; if they've alerted in the - // past, we don't want to incorrectly alert a second time if there wasn't an + // interrupted and that now say they should heads up or FSI; if they've alerted in + // the past, we don't want to incorrectly alert a second time if there wasn't an // explicit notification update. if (entry.hasInterrupted()) continue + // Before potentially allowing heads-up, check for any candidates for a FSI launch. + // Any entry that is a candidate meets two criteria: + // - was suppressed from FSI launch only by a DND suppression + // - is within the recency window for reconsideration + // If any of these entries are no longer suppressed, launch the FSI now. + if (mFlags.fsiOnDNDUpdate() && isCandidateForFSIReconsideration(entry)) { + val decision = + mNotificationInterruptStateProvider.getFullScreenIntentDecision(entry) + if (decision.shouldLaunch) { + // Log both the launch of the full screen and also that this was via a + // ranking update. + mLogger.logEntryUpdatedToFullScreen(entry.key) + mNotificationInterruptStateProvider.logFullScreenIntentDecision( + entry, decision) + mLaunchFullScreenIntentProvider.launchFullScreenIntent(entry) + + // if we launch the FSI then this is no longer a candidate for HUN + continue + } + } + // The cases where we should consider this notification to be updated: // - if this entry is not present in PostedEntries, and is now in a shouldHeadsUp // state @@ -528,6 +560,15 @@ class HeadsUpCoordinator @Inject constructor( } /** + * Add the entry to the list of entries potentially considerable for FSI ranking update, where + * the provided time is the time the entry was added. + */ + @VisibleForTesting + fun addForFSIReconsideration(entry: NotificationEntry, time: Long) { + mFSIUpdateCandidates[entry.key] = time + } + + /** * Checks whether the entry is new enough to be updated via ranking update. * We want to avoid updating an entry too long after it was originally posted/updated when we're * only reacting to a ranking change, as relevant ranking updates are expected to come in @@ -541,17 +582,38 @@ class HeadsUpCoordinator @Inject constructor( return (mSystemClock.currentTimeMillis() - updateTime) <= MAX_RANKING_UPDATE_DELAY_MS } - private fun cleanUpEntryUpdateTimes() { + /** + * Checks whether the entry is present new enough for reconsideration for full screen launch. + * The time window is the same as for ranking update, but this doesn't allow a potential update + * to an entry with full screen intent to count for timing purposes. + */ + private fun isCandidateForFSIReconsideration(entry: NotificationEntry): Boolean { + val addedTime = mFSIUpdateCandidates[entry.key] ?: return false + return (mSystemClock.currentTimeMillis() - addedTime) <= MAX_RANKING_UPDATE_DELAY_MS + } + + private fun cleanUpEntryTimes() { // Because we won't update entries that are older than this amount of time anyway, clean - // up any entries that are too old to notify. + // up any entries that are too old to notify from both the general and FSI specific lists. + + // Anything newer than this time is still within the window. + val timeThreshold = mSystemClock.currentTimeMillis() - MAX_RANKING_UPDATE_DELAY_MS + val toRemove = ArraySet<String>() for ((key, updateTime) in mEntriesUpdateTimes) { - if (updateTime == null || - (mSystemClock.currentTimeMillis() - updateTime) > MAX_RANKING_UPDATE_DELAY_MS) { + if (updateTime == null || timeThreshold > updateTime) { toRemove.add(key) } } mEntriesUpdateTimes.removeAll(toRemove) + + val toRemoveForFSI = ArraySet<String>() + for ((key, addedTime) in mFSIUpdateCandidates) { + if (addedTime == null || timeThreshold > addedTime) { + toRemoveForFSI.add(key) + } + } + mFSIUpdateCandidates.removeAll(toRemoveForFSI) } /** When an action is pressed on a notification, end HeadsUp lifetime extension. */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorLogger.kt index 473c35d6095a..2c6bf6b51451 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorLogger.kt @@ -70,6 +70,14 @@ class HeadsUpCoordinatorLogger constructor( }) } + fun logEntryUpdatedToFullScreen(key: String) { + buffer.log(TAG, LogLevel.DEBUG, { + str1 = key + }, { + "updating entry to launch full screen intent: $str1" + }) + } + fun logSummaryMarkedInterrupted(summaryKey: String, childKey: String) { buffer.log(TAG, LogLevel.DEBUG, { str1 = summaryKey diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java index 556431114ff1..5e98f5419e84 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java @@ -161,7 +161,6 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp private KeyguardViewController mKeyguardViewController; private DozeScrimController mDozeScrimController; private KeyguardViewMediator mKeyguardViewMediator; - private ScrimController mScrimController; private PendingAuthenticated mPendingAuthenticated = null; private boolean mHasScreenTurnedOnSinceAuthenticating; private boolean mFadedAwayAfterWakeAndUnlock; @@ -261,7 +260,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp @Inject public BiometricUnlockController( DozeScrimController dozeScrimController, - KeyguardViewMediator keyguardViewMediator, ScrimController scrimController, + KeyguardViewMediator keyguardViewMediator, ShadeController shadeController, NotificationShadeWindowController notificationShadeWindowController, KeyguardStateController keyguardStateController, Handler handler, @@ -293,7 +292,6 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp mNotificationShadeWindowController = notificationShadeWindowController; mDozeScrimController = dozeScrimController; mKeyguardViewMediator = keyguardViewMediator; - mScrimController = scrimController; mKeyguardStateController = keyguardStateController; mHandler = handler; mConsecutiveFpFailureThreshold = resources.getInteger( @@ -375,12 +373,6 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp Trace.endSection(); } - private boolean pulsingOrAod() { - final ScrimState scrimState = mScrimController.getState(); - return scrimState == ScrimState.AOD - || scrimState == ScrimState.PULSING; - } - @Override public void onBiometricAuthenticated(int userId, BiometricSourceType biometricSourceType, boolean isStrongBiometric) { @@ -425,7 +417,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp boolean wasDeviceInteractive = mUpdateMonitor.isDeviceInteractive(); mMode = mode; mHasScreenTurnedOnSinceAuthenticating = false; - if (mMode == MODE_WAKE_AND_UNLOCK_PULSING && pulsingOrAod()) { + if (mMode == MODE_WAKE_AND_UNLOCK_PULSING) { // If we are waking the device up while we are pulsing the clock and the // notifications would light up first, creating an unpleasant animation. // Defer changing the screen brightness by forcing doze brightness on our window diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java index c217ab3b42e3..69f7c71dafba 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java @@ -22,6 +22,8 @@ import android.graphics.Rect; import android.util.MathUtils; import android.view.View; +import androidx.annotation.NonNull; + import com.android.internal.annotations.VisibleForTesting; import com.android.internal.widget.ViewClippingUtil; import com.android.systemui.R; @@ -197,6 +199,11 @@ public class HeadsUpAppearanceController extends ViewController<HeadsUpStatusBar updateHeadsUpAndPulsingRoundness(entry); } + @Override + public void onHeadsUpStateChanged(@NonNull NotificationEntry entry, boolean isHeadsUp) { + updateHeadsUpAndPulsingRoundness(entry); + } + private void updateTopEntry() { NotificationEntry newEntry = null; if (shouldBeVisible()) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java index d4dc1dc197a5..348357445223 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java @@ -475,9 +475,6 @@ public class KeyguardStatusBarViewController extends ViewController<KeyguardStat newAlpha = Math.min(getKeyguardContentsAlpha(), alphaQsExpansion) * mKeyguardStatusBarAnimateAlpha * (1.0f - mKeyguardHeadsUpShowingAmount); - if (newAlpha != mView.getAlpha() && (newAlpha == 0 || newAlpha == 1)) { - mLogger.logStatusBarCalculatedAlpha(newAlpha); - } } boolean hideForBypass = @@ -500,10 +497,6 @@ public class KeyguardStatusBarViewController extends ViewController<KeyguardStat if (mDisableStateTracker.isDisabled()) { visibility = View.INVISIBLE; } - if (visibility != mView.getVisibility()) { - mLogger.logStatusBarAlphaVisibility(visibility, alpha, - StatusBarState.toString(mStatusBarState)); - } mView.setAlpha(alpha); mView.setVisibility(visibility); } @@ -608,10 +601,6 @@ public class KeyguardStatusBarViewController extends ViewController<KeyguardStat * @param alpha a value between 0 and 1. -1 if the value is to be reset/ignored. */ public void setAlpha(float alpha) { - if (mExplicitAlpha != alpha && (mExplicitAlpha == -1 || alpha == -1)) { - // logged if value changed to ignored or from ignored - mLogger.logStatusBarExplicitAlpha(alpha); - } mExplicitAlpha = alpha; updateViewState(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/binder/WifiViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/binder/WifiViewBinder.kt index f5b5950d33a8..cc67c84772a5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/binder/WifiViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/binder/WifiViewBinder.kt @@ -46,6 +46,7 @@ import kotlinx.coroutines.launch * view-model to be reused for multiple view/view-binder bindings. */ @OptIn(InternalCoroutinesApi::class) +@Suppress("EXPERIMENTAL_IS_NOT_ENABLED") object WifiViewBinder { /** @@ -59,6 +60,12 @@ object WifiViewBinder { /** Notifies that the visibility state has changed. */ fun onVisibilityStateChanged(@StatusBarIconView.VisibleState state: Int) + + /** Notifies that the icon tint has been updated. */ + fun onIconTintChanged(newTint: Int) + + /** Notifies that the decor tint has been updated (used only for the dot). */ + fun onDecorTintChanged(newTint: Int) } /** Binds the view to the view-model, continuing to update the former based on the latter. */ @@ -82,6 +89,9 @@ object WifiViewBinder { @StatusBarIconView.VisibleState val visibilityState: MutableStateFlow<Int> = MutableStateFlow(STATE_HIDDEN) + val iconTint: MutableStateFlow<Int> = MutableStateFlow(viewModel.defaultColor) + val decorTint: MutableStateFlow<Int> = MutableStateFlow(viewModel.defaultColor) + view.repeatWhenAttached { repeatOnLifecycle(Lifecycle.State.STARTED) { launch { @@ -101,7 +111,7 @@ object WifiViewBinder { } launch { - viewModel.tint.collect { tint -> + iconTint.collect { tint -> val tintList = ColorStateList.valueOf(tint) iconView.imageTintList = tintList activityInView.imageTintList = tintList @@ -110,6 +120,8 @@ object WifiViewBinder { } } + launch { decorTint.collect { tint -> dotView.setDecorColor(tint) } } + launch { viewModel.isActivityInViewVisible.distinctUntilChanged().collect { visible -> activityInView.isVisible = visible @@ -144,6 +156,20 @@ object WifiViewBinder { override fun onVisibilityStateChanged(@StatusBarIconView.VisibleState state: Int) { visibilityState.value = state } + + override fun onIconTintChanged(newTint: Int) { + if (viewModel.useDebugColoring) { + return + } + iconTint.value = newTint + } + + override fun onDecorTintChanged(newTint: Int) { + if (viewModel.useDebugColoring) { + return + } + decorTint.value = newTint + } } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/view/ModernStatusBarWifiView.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/view/ModernStatusBarWifiView.kt index a45076b53356..be7782c37cfd 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/view/ModernStatusBarWifiView.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/view/ModernStatusBarWifiView.kt @@ -22,6 +22,7 @@ import android.util.AttributeSet import android.view.Gravity import android.view.LayoutInflater import com.android.systemui.R +import com.android.systemui.plugins.DarkIconDispatcher import com.android.systemui.statusbar.BaseStatusBarFrameLayout import com.android.systemui.statusbar.StatusBarIconView import com.android.systemui.statusbar.StatusBarIconView.STATE_DOT @@ -51,18 +52,20 @@ class ModernStatusBarWifiView( binding.onVisibilityStateChanged(value) } + override fun getSlot() = slot + override fun onDarkChanged(areas: ArrayList<Rect>?, darkIntensity: Float, tint: Int) { - // TODO(b/238425913) + val newTint = DarkIconDispatcher.getTint(areas, this, tint) + binding.onIconTintChanged(newTint) + binding.onDecorTintChanged(newTint) } - override fun getSlot() = slot - override fun setStaticDrawableColor(color: Int) { - // TODO(b/238425913) + binding.onIconTintChanged(color) } override fun setDecorColor(color: Int) { - // TODO(b/238425913) + binding.onDecorTintChanged(color) } override fun setVisibleState(@StatusBarIconView.VisibleState state: Int, animate: Boolean) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/LocationBasedWifiViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/LocationBasedWifiViewModel.kt index e35a8fef4528..a4615cc897cf 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/LocationBasedWifiViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/LocationBasedWifiViewModel.kt @@ -21,7 +21,6 @@ import com.android.systemui.statusbar.pipeline.StatusBarPipelineFlags import com.android.systemui.statusbar.pipeline.wifi.ui.model.WifiIcon import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.flowOf /** * A view model for a wifi icon in a specific location. This allows us to control parameters that @@ -48,24 +47,12 @@ abstract class LocationBasedWifiViewModel( /** True if the airplane spacer view should be visible. */ val isAirplaneSpacerVisible: Flow<Boolean>, ) { - /** The color that should be used to tint the icon. */ - val tint: Flow<Int> = - flowOf( - if (statusBarPipelineFlags.useWifiDebugColoring()) { - debugTint - } else { - DEFAULT_TINT - } - ) - - companion object { - /** - * A default icon tint. - * - * TODO(b/238425913): The tint is actually controlled by - * [com.android.systemui.statusbar.phone.StatusBarIconController.TintedIconManager]. We - * should use that logic instead of white as a default. - */ - private const val DEFAULT_TINT = Color.WHITE - } + val useDebugColoring: Boolean = statusBarPipelineFlags.useWifiDebugColoring() + + val defaultColor: Int = + if (useDebugColoring) { + debugTint + } else { + Color.WHITE + } } diff --git a/packages/SystemUI/src/com/android/systemui/wallpapers/ImageWallpaper.java b/packages/SystemUI/src/com/android/systemui/wallpapers/ImageWallpaper.java index ef43702e97b8..1f1b32c1c63a 100644 --- a/packages/SystemUI/src/com/android/systemui/wallpapers/ImageWallpaper.java +++ b/packages/SystemUI/src/com/android/systemui/wallpapers/ImageWallpaper.java @@ -16,8 +16,6 @@ package com.android.systemui.wallpapers; -import static com.android.systemui.flags.Flags.USE_CANVAS_RENDERER; - import android.app.WallpaperColors; import android.app.WallpaperManager; import android.graphics.Bitmap; @@ -27,16 +25,10 @@ import android.graphics.Rect; import android.graphics.RectF; import android.hardware.display.DisplayManager; import android.hardware.display.DisplayManager.DisplayListener; -import android.os.Handler; -import android.os.HandlerThread; -import android.os.SystemClock; import android.os.Trace; import android.os.UserHandle; import android.service.wallpaper.WallpaperService; -import android.util.ArraySet; import android.util.Log; -import android.util.MathUtils; -import android.util.Size; import android.view.Surface; import android.view.SurfaceHolder; import android.view.WindowManager; @@ -45,16 +37,10 @@ import androidx.annotation.NonNull; import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.dagger.qualifiers.Background; -import com.android.systemui.flags.FeatureFlags; import com.android.systemui.util.concurrency.DelayableExecutor; -import com.android.systemui.wallpapers.canvas.WallpaperLocalColorExtractor; -import com.android.systemui.wallpapers.gl.EglHelper; -import com.android.systemui.wallpapers.gl.ImageWallpaperRenderer; import java.io.FileDescriptor; -import java.io.IOException; import java.io.PrintWriter; -import java.util.ArrayList; import java.util.List; import javax.inject.Inject; @@ -64,455 +50,32 @@ import javax.inject.Inject; */ @SuppressWarnings({"UnusedDeclaration"}) public class ImageWallpaper extends WallpaperService { + private static final String TAG = ImageWallpaper.class.getSimpleName(); - // We delayed destroy render context that subsequent render requests have chance to cancel it. - // This is to avoid destroying then recreating render context in a very short time. - private static final int DELAY_FINISH_RENDERING = 1000; - private static final @android.annotation.NonNull RectF LOCAL_COLOR_BOUNDS = - new RectF(0, 0, 1, 1); private static final boolean DEBUG = false; - private final ArrayList<RectF> mLocalColorsToAdd = new ArrayList<>(); - private final ArraySet<RectF> mColorAreas = new ArraySet<>(); + // keep track of the number of pages of the launcher for local color extraction purposes private volatile int mPages = 1; private boolean mPagesComputed = false; - private HandlerThread mWorker; - // scaled down version - private Bitmap mMiniBitmap; - private final FeatureFlags mFeatureFlags; - // used in canvasEngine to load/unload the bitmap and extract the colors + // used for most tasks (call canvas.drawBitmap, load/unload the bitmap) @Background private final DelayableExecutor mBackgroundExecutor; + + // wait at least this duration before unloading the bitmap private static final int DELAY_UNLOAD_BITMAP = 2000; @Inject - public ImageWallpaper(FeatureFlags featureFlags, - @Background DelayableExecutor backgroundExecutor) { + public ImageWallpaper(@Background DelayableExecutor backgroundExecutor) { super(); - mFeatureFlags = featureFlags; mBackgroundExecutor = backgroundExecutor; } @Override - public void onCreate() { - super.onCreate(); - mWorker = new HandlerThread(TAG); - mWorker.start(); - } - - @Override public Engine onCreateEngine() { - return mFeatureFlags.isEnabled(USE_CANVAS_RENDERER) ? new CanvasEngine() : new GLEngine(); + return new CanvasEngine(); } - @Override - public void onDestroy() { - super.onDestroy(); - mWorker.quitSafely(); - mWorker = null; - mMiniBitmap = null; - } - - class GLEngine extends Engine implements DisplayListener { - // Surface is rejected if size below a threshold on some devices (ie. 8px on elfin) - // set min to 64 px (CTS covers this), please refer to ag/4867989 for detail. - @VisibleForTesting - static final int MIN_SURFACE_WIDTH = 128; - @VisibleForTesting - static final int MIN_SURFACE_HEIGHT = 128; - - private ImageWallpaperRenderer mRenderer; - private EglHelper mEglHelper; - private final Runnable mFinishRenderingTask = this::finishRendering; - private boolean mNeedRedraw; - - private boolean mDisplaySizeValid = false; - private int mDisplayWidth = 1; - private int mDisplayHeight = 1; - - private int mImgWidth = 1; - private int mImgHeight = 1; - - GLEngine() { } - - @VisibleForTesting - GLEngine(Handler handler) { - super(SystemClock::elapsedRealtime, handler); - } - - @Override - public void onCreate(SurfaceHolder surfaceHolder) { - Trace.beginSection("ImageWallpaper.Engine#onCreate"); - mEglHelper = getEglHelperInstance(); - // Deferred init renderer because we need to get wallpaper by display context. - mRenderer = getRendererInstance(); - setFixedSizeAllowed(true); - updateSurfaceSize(); - setShowForAllUsers(true); - - mRenderer.setOnBitmapChanged(b -> { - mLocalColorsToAdd.addAll(mColorAreas); - if (mLocalColorsToAdd.size() > 0) { - updateMiniBitmapAndNotify(b); - } - }); - getDisplayContext().getSystemService(DisplayManager.class) - .registerDisplayListener(this, mWorker.getThreadHandler()); - Trace.endSection(); - } - - @Override - public void onDisplayAdded(int displayId) { } - - @Override - public void onDisplayRemoved(int displayId) { } - - @Override - public void onDisplayChanged(int displayId) { - if (displayId == getDisplayContext().getDisplayId()) { - mDisplaySizeValid = false; - } - } - - EglHelper getEglHelperInstance() { - return new EglHelper(); - } - - ImageWallpaperRenderer getRendererInstance() { - return new ImageWallpaperRenderer(getDisplayContext()); - } - - @Override - public void onOffsetsChanged(float xOffset, float yOffset, - float xOffsetStep, float yOffsetStep, - int xPixelOffset, int yPixelOffset) { - final int pages; - if (xOffsetStep > 0 && xOffsetStep <= 1) { - pages = (int) Math.round(1 / xOffsetStep) + 1; - } else { - pages = 1; - } - if (pages == mPages) return; - mPages = pages; - if (mMiniBitmap == null || mMiniBitmap.isRecycled()) return; - mWorker.getThreadHandler().post(() -> - computeAndNotifyLocalColors(new ArrayList<>(mColorAreas), mMiniBitmap)); - } - - private void updateMiniBitmapAndNotify(Bitmap b) { - if (b == null) return; - int size = Math.min(b.getWidth(), b.getHeight()); - float scale = 1.0f; - if (size > MIN_SURFACE_WIDTH) { - scale = (float) MIN_SURFACE_WIDTH / (float) size; - } - mImgHeight = b.getHeight(); - mImgWidth = b.getWidth(); - mMiniBitmap = Bitmap.createScaledBitmap(b, (int) Math.max(scale * b.getWidth(), 1), - (int) Math.max(scale * b.getHeight(), 1), false); - computeAndNotifyLocalColors(mLocalColorsToAdd, mMiniBitmap); - mLocalColorsToAdd.clear(); - } - - private void updateSurfaceSize() { - Trace.beginSection("ImageWallpaper#updateSurfaceSize"); - SurfaceHolder holder = getSurfaceHolder(); - Size frameSize = mRenderer.reportSurfaceSize(); - int width = Math.max(MIN_SURFACE_WIDTH, frameSize.getWidth()); - int height = Math.max(MIN_SURFACE_HEIGHT, frameSize.getHeight()); - holder.setFixedSize(width, height); - Trace.endSection(); - } - - @Override - public boolean shouldZoomOutWallpaper() { - return true; - } - - @Override - public boolean shouldWaitForEngineShown() { - return true; - } - - @Override - public void onDestroy() { - getDisplayContext().getSystemService(DisplayManager.class) - .unregisterDisplayListener(this); - mMiniBitmap = null; - mWorker.getThreadHandler().post(() -> { - mRenderer.finish(); - mRenderer = null; - mEglHelper.finish(); - mEglHelper = null; - }); - } - - @Override - public boolean supportsLocalColorExtraction() { - return true; - } - - @Override - public void addLocalColorsAreas(@NonNull List<RectF> regions) { - mWorker.getThreadHandler().post(() -> { - if (mColorAreas.size() + mLocalColorsToAdd.size() == 0) { - setOffsetNotificationsEnabled(true); - } - Bitmap bitmap = mMiniBitmap; - if (bitmap == null) { - mLocalColorsToAdd.addAll(regions); - if (mRenderer != null) mRenderer.use(this::updateMiniBitmapAndNotify); - } else { - computeAndNotifyLocalColors(regions, bitmap); - } - }); - } - - private void computeAndNotifyLocalColors(@NonNull List<RectF> regions, Bitmap b) { - List<WallpaperColors> colors = getLocalWallpaperColors(regions, b); - mColorAreas.addAll(regions); - try { - notifyLocalColorsChanged(regions, colors); - } catch (RuntimeException e) { - Log.e(TAG, e.getMessage(), e); - } - } - - @Override - public void removeLocalColorsAreas(@NonNull List<RectF> regions) { - mWorker.getThreadHandler().post(() -> { - mColorAreas.removeAll(regions); - mLocalColorsToAdd.removeAll(regions); - if (mColorAreas.size() + mLocalColorsToAdd.size() == 0) { - setOffsetNotificationsEnabled(false); - } - }); - } - - /** - * Transform the logical coordinates into wallpaper coordinates. - * - * Logical coordinates are organised such that the various pages are non-overlapping. So, - * if there are n pages, the first page will have its X coordinate on the range [0-1/n]. - * - * The real pages are overlapping. If the Wallpaper are a width Ww and the screen a width - * Ws, the relative width of a page Wr is Ws/Ww. This does not change if the number of - * pages increase. - * If there are n pages, the page k starts at the offset k * (1 - Wr) / (n - 1), as the - * last page is at position (1-Wr) and the others are regularly spread on the range [0- - * (1-Wr)]. - */ - private RectF pageToImgRect(RectF area) { - if (!mDisplaySizeValid) { - Rect window = getDisplayContext() - .getSystemService(WindowManager.class) - .getCurrentWindowMetrics() - .getBounds(); - mDisplayWidth = window.width(); - mDisplayHeight = window.height(); - mDisplaySizeValid = true; - } - - // Width of a page for the caller of this API. - float virtualPageWidth = 1f / (float) mPages; - float leftPosOnPage = (area.left % virtualPageWidth) / virtualPageWidth; - float rightPosOnPage = (area.right % virtualPageWidth) / virtualPageWidth; - int currentPage = (int) Math.floor(area.centerX() / virtualPageWidth); - - RectF imgArea = new RectF(); - - if (mImgWidth == 0 || mImgHeight == 0 || mDisplayWidth <= 0 || mDisplayHeight <= 0) { - return imgArea; - } - - imgArea.bottom = area.bottom; - imgArea.top = area.top; - - float imageScale = Math.min(((float) mImgHeight) / mDisplayHeight, 1); - float mappedScreenWidth = mDisplayWidth * imageScale; - float pageWidth = Math.min(1.0f, - mImgWidth > 0 ? mappedScreenWidth / (float) mImgWidth : 1.f); - float pageOffset = (1 - pageWidth) / (float) (mPages - 1); - - imgArea.left = MathUtils.constrain( - leftPosOnPage * pageWidth + currentPage * pageOffset, 0, 1); - imgArea.right = MathUtils.constrain( - rightPosOnPage * pageWidth + currentPage * pageOffset, 0, 1); - if (imgArea.left > imgArea.right) { - // take full page - imgArea.left = 0; - imgArea.right = 1; - } - return imgArea; - } - - private List<WallpaperColors> getLocalWallpaperColors(@NonNull List<RectF> areas, - Bitmap b) { - List<WallpaperColors> colors = new ArrayList<>(areas.size()); - for (int i = 0; i < areas.size(); i++) { - RectF area = pageToImgRect(areas.get(i)); - if (area == null || !LOCAL_COLOR_BOUNDS.contains(area)) { - colors.add(null); - continue; - } - Rect subImage = new Rect( - (int) Math.floor(area.left * b.getWidth()), - (int) Math.floor(area.top * b.getHeight()), - (int) Math.ceil(area.right * b.getWidth()), - (int) Math.ceil(area.bottom * b.getHeight())); - if (subImage.isEmpty()) { - // Do not notify client. treat it as too small to sample - colors.add(null); - continue; - } - Bitmap colorImg = Bitmap.createBitmap(b, - subImage.left, subImage.top, subImage.width(), subImage.height()); - WallpaperColors color = WallpaperColors.fromBitmap(colorImg); - colors.add(color); - } - return colors; - } - - @Override - public void onSurfaceCreated(SurfaceHolder holder) { - if (mWorker == null) return; - mWorker.getThreadHandler().post(() -> { - Trace.beginSection("ImageWallpaper#onSurfaceCreated"); - mEglHelper.init(holder, needSupportWideColorGamut()); - mRenderer.onSurfaceCreated(); - Trace.endSection(); - }); - } - - @Override - public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) { - if (mWorker == null) return; - mWorker.getThreadHandler().post(() -> mRenderer.onSurfaceChanged(width, height)); - } - - @Override - public void onSurfaceRedrawNeeded(SurfaceHolder holder) { - if (mWorker == null) return; - mWorker.getThreadHandler().post(this::drawFrame); - } - - private void drawFrame() { - Trace.beginSection("ImageWallpaper#drawFrame"); - preRender(); - requestRender(); - postRender(); - Trace.endSection(); - } - - public void preRender() { - // This method should only be invoked from worker thread. - Trace.beginSection("ImageWallpaper#preRender"); - preRenderInternal(); - Trace.endSection(); - } - - private void preRenderInternal() { - boolean contextRecreated = false; - Rect frame = getSurfaceHolder().getSurfaceFrame(); - cancelFinishRenderingTask(); - - // Check if we need to recreate egl context. - if (!mEglHelper.hasEglContext()) { - mEglHelper.destroyEglSurface(); - if (!mEglHelper.createEglContext()) { - Log.w(TAG, "recreate egl context failed!"); - } else { - contextRecreated = true; - } - } - - // Check if we need to recreate egl surface. - if (mEglHelper.hasEglContext() && !mEglHelper.hasEglSurface()) { - if (!mEglHelper.createEglSurface(getSurfaceHolder(), needSupportWideColorGamut())) { - Log.w(TAG, "recreate egl surface failed!"); - } - } - - // If we recreate egl context, notify renderer to setup again. - if (mEglHelper.hasEglContext() && mEglHelper.hasEglSurface() && contextRecreated) { - mRenderer.onSurfaceCreated(); - mRenderer.onSurfaceChanged(frame.width(), frame.height()); - } - } - - public void requestRender() { - // This method should only be invoked from worker thread. - Trace.beginSection("ImageWallpaper#requestRender"); - requestRenderInternal(); - Trace.endSection(); - } - - private void requestRenderInternal() { - Rect frame = getSurfaceHolder().getSurfaceFrame(); - boolean readyToRender = mEglHelper.hasEglContext() && mEglHelper.hasEglSurface() - && frame.width() > 0 && frame.height() > 0; - - if (readyToRender) { - mRenderer.onDrawFrame(); - if (!mEglHelper.swapBuffer()) { - Log.e(TAG, "drawFrame failed!"); - } - } else { - Log.e(TAG, "requestRender: not ready, has context=" + mEglHelper.hasEglContext() - + ", has surface=" + mEglHelper.hasEglSurface() - + ", frame=" + frame); - } - } - - public void postRender() { - // This method should only be invoked from worker thread. - scheduleFinishRendering(); - reportEngineShown(false /* waitForEngineShown */); - } - - private void cancelFinishRenderingTask() { - if (mWorker == null) return; - mWorker.getThreadHandler().removeCallbacks(mFinishRenderingTask); - } - - private void scheduleFinishRendering() { - if (mWorker == null) return; - cancelFinishRenderingTask(); - mWorker.getThreadHandler().postDelayed(mFinishRenderingTask, DELAY_FINISH_RENDERING); - } - - private void finishRendering() { - Trace.beginSection("ImageWallpaper#finishRendering"); - if (mEglHelper != null) { - mEglHelper.destroyEglSurface(); - mEglHelper.destroyEglContext(); - } - Trace.endSection(); - } - - private boolean needSupportWideColorGamut() { - return mRenderer.isWcgContent(); - } - - @Override - protected void dump(String prefix, FileDescriptor fd, PrintWriter out, String[] args) { - super.dump(prefix, fd, out, args); - out.print(prefix); out.print("Engine="); out.println(this); - out.print(prefix); out.print("valid surface="); - out.println(getSurfaceHolder() != null && getSurfaceHolder().getSurface() != null - ? getSurfaceHolder().getSurface().isValid() - : "null"); - - out.print(prefix); out.print("surface frame="); - out.println(getSurfaceHolder() != null ? getSurfaceHolder().getSurfaceFrame() : "null"); - - mEglHelper.dump(prefix, fd, out, args); - mRenderer.dump(prefix, fd, out, args); - } - } - - class CanvasEngine extends WallpaperService.Engine implements DisplayListener { private WallpaperManager mWallpaperManager; private final WallpaperLocalColorExtractor mWallpaperLocalColorExtractor; @@ -736,13 +299,8 @@ public class ImageWallpaper extends WallpaperService { // be loaded, we will go into a cycle. Don't do a build where the // default wallpaper can't be loaded. Log.w(TAG, "Unable to load wallpaper!", exception); - try { - mWallpaperManager.clear(WallpaperManager.FLAG_SYSTEM); - } catch (IOException ex) { - // now we're really screwed. - Log.w(TAG, "Unable reset to default wallpaper!", ex); - } - + mWallpaperManager.clearWallpaper( + WallpaperManager.FLAG_SYSTEM, UserHandle.USER_CURRENT); try { bitmap = mWallpaperManager.getBitmapAsUser(UserHandle.USER_CURRENT, false); } catch (RuntimeException | OutOfMemoryError e) { @@ -868,7 +426,6 @@ public class ImageWallpaper extends WallpaperService { mWallpaperLocalColorExtractor.setDisplayDimensions(window.width(), window.height()); } - @Override protected void dump(String prefix, FileDescriptor fd, PrintWriter out, String[] args) { super.dump(prefix, fd, out, args); diff --git a/packages/SystemUI/src/com/android/systemui/wallpapers/canvas/WallpaperLocalColorExtractor.java b/packages/SystemUI/src/com/android/systemui/wallpapers/WallpaperLocalColorExtractor.java index 6cac5c952b7c..988fd710d2dc 100644 --- a/packages/SystemUI/src/com/android/systemui/wallpapers/canvas/WallpaperLocalColorExtractor.java +++ b/packages/SystemUI/src/com/android/systemui/wallpapers/WallpaperLocalColorExtractor.java @@ -15,7 +15,7 @@ */ -package com.android.systemui.wallpapers.canvas; +package com.android.systemui.wallpapers; import android.app.WallpaperColors; import android.graphics.Bitmap; @@ -31,7 +31,6 @@ import androidx.annotation.VisibleForTesting; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.util.Assert; -import com.android.systemui.wallpapers.ImageWallpaper; import java.io.FileDescriptor; import java.io.PrintWriter; diff --git a/packages/SystemUI/src/com/android/systemui/wallpapers/gl/EglHelper.java b/packages/SystemUI/src/com/android/systemui/wallpapers/gl/EglHelper.java deleted file mode 100644 index f9ddce8e3b2e..000000000000 --- a/packages/SystemUI/src/com/android/systemui/wallpapers/gl/EglHelper.java +++ /dev/null @@ -1,380 +0,0 @@ -/* - * Copyright (C) 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.wallpapers.gl; - -import static android.opengl.EGL14.EGL_ALPHA_SIZE; -import static android.opengl.EGL14.EGL_BLUE_SIZE; -import static android.opengl.EGL14.EGL_CONFIG_CAVEAT; -import static android.opengl.EGL14.EGL_CONTEXT_CLIENT_VERSION; -import static android.opengl.EGL14.EGL_DEFAULT_DISPLAY; -import static android.opengl.EGL14.EGL_DEPTH_SIZE; -import static android.opengl.EGL14.EGL_EXTENSIONS; -import static android.opengl.EGL14.EGL_GREEN_SIZE; -import static android.opengl.EGL14.EGL_NONE; -import static android.opengl.EGL14.EGL_NO_CONTEXT; -import static android.opengl.EGL14.EGL_NO_DISPLAY; -import static android.opengl.EGL14.EGL_NO_SURFACE; -import static android.opengl.EGL14.EGL_OPENGL_ES2_BIT; -import static android.opengl.EGL14.EGL_RED_SIZE; -import static android.opengl.EGL14.EGL_RENDERABLE_TYPE; -import static android.opengl.EGL14.EGL_STENCIL_SIZE; -import static android.opengl.EGL14.EGL_SUCCESS; -import static android.opengl.EGL14.eglChooseConfig; -import static android.opengl.EGL14.eglCreateContext; -import static android.opengl.EGL14.eglCreateWindowSurface; -import static android.opengl.EGL14.eglDestroyContext; -import static android.opengl.EGL14.eglDestroySurface; -import static android.opengl.EGL14.eglGetDisplay; -import static android.opengl.EGL14.eglGetError; -import static android.opengl.EGL14.eglInitialize; -import static android.opengl.EGL14.eglMakeCurrent; -import static android.opengl.EGL14.eglQueryString; -import static android.opengl.EGL14.eglSwapBuffers; -import static android.opengl.EGL14.eglTerminate; - -import android.opengl.EGLConfig; -import android.opengl.EGLContext; -import android.opengl.EGLDisplay; -import android.opengl.EGLSurface; -import android.opengl.GLUtils; -import android.text.TextUtils; -import android.util.Log; -import android.view.SurfaceHolder; - -import java.io.FileDescriptor; -import java.io.PrintWriter; -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; - -/** - * A helper class to handle EGL management. - */ -public class EglHelper { - private static final String TAG = EglHelper.class.getSimpleName(); - private static final int OPENGLES_VERSION = 2; - // Below two constants make drawing at low priority, so other things can preempt our drawing. - private static final int EGL_CONTEXT_PRIORITY_LEVEL_IMG = 0x3100; - private static final int EGL_CONTEXT_PRIORITY_LOW_IMG = 0x3103; - private static final boolean DEBUG = true; - - private static final int EGL_GL_COLORSPACE_KHR = 0x309D; - private static final int EGL_GL_COLORSPACE_DISPLAY_P3_PASSTHROUGH_EXT = 0x3490; - - private static final String EGL_IMG_CONTEXT_PRIORITY = "EGL_IMG_context_priority"; - - /** - * https://www.khronos.org/registry/EGL/extensions/KHR/EGL_KHR_gl_colorspace.txt - */ - private static final String KHR_GL_COLOR_SPACE = "EGL_KHR_gl_colorspace"; - - /** - * https://www.khronos.org/registry/EGL/extensions/EXT/EGL_EXT_gl_colorspace_display_p3_passthrough.txt - */ - private static final String EXT_GL_COLORSPACE_DISPLAY_P3_PASSTHROUGH = - "EGL_EXT_gl_colorspace_display_p3_passthrough"; - - private EGLDisplay mEglDisplay; - private EGLConfig mEglConfig; - private EGLContext mEglContext; - private EGLSurface mEglSurface; - private final int[] mEglVersion = new int[2]; - private boolean mEglReady; - private final Set<String> mExts; - - public EglHelper() { - mExts = new HashSet<>(); - connectDisplay(); - } - - /** - * Initialize render context. - * @param surfaceHolder surface holder. - * @param wideColorGamut claim if a wcg surface is necessary. - * @return true if the render context is ready. - */ - public boolean init(SurfaceHolder surfaceHolder, boolean wideColorGamut) { - if (!hasEglDisplay() && !connectDisplay()) { - Log.w(TAG, "Can not connect display, abort!"); - return false; - } - - if (!eglInitialize(mEglDisplay, mEglVersion, 0 /* majorOffset */, - mEglVersion, 1 /* minorOffset */)) { - Log.w(TAG, "eglInitialize failed: " + GLUtils.getEGLErrorString(eglGetError())); - return false; - } - - mEglConfig = chooseEglConfig(); - if (mEglConfig == null) { - Log.w(TAG, "eglConfig not initialized!"); - return false; - } - - if (!createEglContext()) { - Log.w(TAG, "Can't create EGLContext!"); - return false; - } - - if (!createEglSurface(surfaceHolder, wideColorGamut)) { - Log.w(TAG, "Can't create EGLSurface!"); - return false; - } - - mEglReady = true; - return true; - } - - private boolean connectDisplay() { - mExts.clear(); - mEglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY); - if (!hasEglDisplay()) { - Log.w(TAG, "eglGetDisplay failed: " + GLUtils.getEGLErrorString(eglGetError())); - return false; - } - String queryString = eglQueryString(mEglDisplay, EGL_EXTENSIONS); - if (!TextUtils.isEmpty(queryString)) { - Collections.addAll(mExts, queryString.split(" ")); - } - return true; - } - - boolean checkExtensionCapability(String extName) { - return mExts.contains(extName); - } - - int getWcgCapability() { - if (checkExtensionCapability(EXT_GL_COLORSPACE_DISPLAY_P3_PASSTHROUGH)) { - return EGL_GL_COLORSPACE_DISPLAY_P3_PASSTHROUGH_EXT; - } - return 0; - } - - private EGLConfig chooseEglConfig() { - int[] configsCount = new int[1]; - EGLConfig[] configs = new EGLConfig[1]; - int[] configSpec = getConfig(); - if (!eglChooseConfig(mEglDisplay, configSpec, 0, configs, 0, 1, configsCount, 0)) { - Log.w(TAG, "eglChooseConfig failed: " + GLUtils.getEGLErrorString(eglGetError())); - return null; - } else { - if (configsCount[0] <= 0) { - Log.w(TAG, "eglChooseConfig failed, invalid configs count: " + configsCount[0]); - return null; - } else { - return configs[0]; - } - } - } - - private int[] getConfig() { - return new int[] { - EGL_RED_SIZE, 8, - EGL_GREEN_SIZE, 8, - EGL_BLUE_SIZE, 8, - EGL_ALPHA_SIZE, 0, - EGL_DEPTH_SIZE, 0, - EGL_STENCIL_SIZE, 0, - EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, - EGL_CONFIG_CAVEAT, EGL_NONE, - EGL_NONE - }; - } - - /** - * Prepare an EglSurface. - * @param surfaceHolder surface holder. - * @param wcg if need to support wcg. - * @return true if EglSurface is ready. - */ - public boolean createEglSurface(SurfaceHolder surfaceHolder, boolean wcg) { - if (DEBUG) { - Log.d(TAG, "createEglSurface start"); - } - - if (hasEglDisplay() && surfaceHolder.getSurface().isValid()) { - int[] attrs = null; - int wcgCapability = getWcgCapability(); - if (wcg && checkExtensionCapability(KHR_GL_COLOR_SPACE) && wcgCapability > 0) { - attrs = new int[] {EGL_GL_COLORSPACE_KHR, wcgCapability, EGL_NONE}; - } - mEglSurface = askCreatingEglWindowSurface(surfaceHolder, attrs, 0 /* offset */); - } else { - Log.w(TAG, "Create EglSurface failed: hasEglDisplay=" + hasEglDisplay() - + ", has valid surface=" + surfaceHolder.getSurface().isValid()); - return false; - } - - if (!hasEglSurface()) { - Log.w(TAG, "createWindowSurface failed: " + GLUtils.getEGLErrorString(eglGetError())); - return false; - } - - if (!eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, mEglContext)) { - Log.w(TAG, "eglMakeCurrent failed: " + GLUtils.getEGLErrorString(eglGetError())); - return false; - } - - if (DEBUG) { - Log.d(TAG, "createEglSurface done"); - } - return true; - } - - EGLSurface askCreatingEglWindowSurface(SurfaceHolder holder, int[] attrs, int offset) { - return eglCreateWindowSurface(mEglDisplay, mEglConfig, holder, attrs, offset); - } - - /** - * Destroy EglSurface. - */ - public void destroyEglSurface() { - if (hasEglSurface()) { - eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); - eglDestroySurface(mEglDisplay, mEglSurface); - mEglSurface = EGL_NO_SURFACE; - } - } - - /** - * Check if we have a valid EglSurface. - * @return true if EglSurface is ready. - */ - public boolean hasEglSurface() { - return mEglSurface != null && mEglSurface != EGL_NO_SURFACE; - } - - /** - * Prepare EglContext. - * @return true if EglContext is ready. - */ - public boolean createEglContext() { - if (DEBUG) { - Log.d(TAG, "createEglContext start"); - } - - int[] attrib_list = new int[5]; - int idx = 0; - attrib_list[idx++] = EGL_CONTEXT_CLIENT_VERSION; - attrib_list[idx++] = OPENGLES_VERSION; - if (checkExtensionCapability(EGL_IMG_CONTEXT_PRIORITY)) { - attrib_list[idx++] = EGL_CONTEXT_PRIORITY_LEVEL_IMG; - attrib_list[idx++] = EGL_CONTEXT_PRIORITY_LOW_IMG; - } - attrib_list[idx] = EGL_NONE; - if (hasEglDisplay()) { - mEglContext = eglCreateContext(mEglDisplay, mEglConfig, EGL_NO_CONTEXT, attrib_list, 0); - } else { - Log.w(TAG, "mEglDisplay is null"); - return false; - } - - if (!hasEglContext()) { - Log.w(TAG, "eglCreateContext failed: " + GLUtils.getEGLErrorString(eglGetError())); - return false; - } - - if (DEBUG) { - Log.d(TAG, "createEglContext done"); - } - return true; - } - - /** - * Destroy EglContext. - */ - public void destroyEglContext() { - if (hasEglContext()) { - eglDestroyContext(mEglDisplay, mEglContext); - mEglContext = EGL_NO_CONTEXT; - } - } - - /** - * Check if we have EglContext. - * @return true if EglContext is ready. - */ - public boolean hasEglContext() { - return mEglContext != null && mEglContext != EGL_NO_CONTEXT; - } - - /** - * Check if we have EglDisplay. - * @return true if EglDisplay is ready. - */ - public boolean hasEglDisplay() { - return mEglDisplay != null && mEglDisplay != EGL_NO_DISPLAY; - } - - /** - * Swap buffer to display. - * @return true if swap successfully. - */ - public boolean swapBuffer() { - boolean status = eglSwapBuffers(mEglDisplay, mEglSurface); - int error = eglGetError(); - if (error != EGL_SUCCESS) { - Log.w(TAG, "eglSwapBuffers failed: " + GLUtils.getEGLErrorString(error)); - } - return status; - } - - /** - * Destroy EglSurface and EglContext, then terminate EGL. - */ - public void finish() { - if (hasEglSurface()) { - destroyEglSurface(); - } - if (hasEglContext()) { - destroyEglContext(); - } - if (hasEglDisplay()) { - terminateEglDisplay(); - } - mEglReady = false; - } - - void terminateEglDisplay() { - eglTerminate(mEglDisplay); - mEglDisplay = EGL_NO_DISPLAY; - } - - /** - * Called to dump current state. - * @param prefix prefix. - * @param fd fd. - * @param out out. - * @param args args. - */ - public void dump(String prefix, FileDescriptor fd, PrintWriter out, String[] args) { - String eglVersion = mEglVersion[0] + "." + mEglVersion[1]; - out.print(prefix); out.print("EGL version="); out.print(eglVersion); - out.print(", "); out.print("EGL ready="); out.print(mEglReady); - out.print(", "); out.print("has EglContext="); out.print(hasEglContext()); - out.print(", "); out.print("has EglSurface="); out.println(hasEglSurface()); - - int[] configs = getConfig(); - StringBuilder sb = new StringBuilder(); - sb.append('{'); - for (int egl : configs) { - sb.append("0x").append(Integer.toHexString(egl)).append(","); - } - sb.setCharAt(sb.length() - 1, '}'); - out.print(prefix); out.print("EglConfig="); out.println(sb.toString()); - } -} diff --git a/packages/SystemUI/src/com/android/systemui/wallpapers/gl/GLWallpaperRenderer.java b/packages/SystemUI/src/com/android/systemui/wallpapers/gl/GLWallpaperRenderer.java deleted file mode 100644 index 692ced08f613..000000000000 --- a/packages/SystemUI/src/com/android/systemui/wallpapers/gl/GLWallpaperRenderer.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (C) 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.wallpapers.gl; - -import android.util.Size; - -import java.io.FileDescriptor; -import java.io.PrintWriter; - -/** - * A renderer which is responsible for making OpenGL calls to render a frame. - */ -public interface GLWallpaperRenderer { - - /** - * Check if the content to render is a WCG content. - */ - boolean isWcgContent(); - - /** - * Called when the surface is created or recreated. - */ - void onSurfaceCreated(); - - /** - * Called when the surface changed size. - * @param width surface width. - * @param height surface height. - */ - void onSurfaceChanged(int width, int height); - - /** - * Called to draw the current frame. - */ - void onDrawFrame(); - - /** - * Ask renderer to report the surface size it needs. - */ - Size reportSurfaceSize(); - - /** - * Called when no need to render any more. - */ - void finish(); - - /** - * Called to dump current state. - * @param prefix prefix. - * @param fd fd. - * @param out out. - * @param args args. - */ - void dump(String prefix, FileDescriptor fd, PrintWriter out, String[] args); - -} diff --git a/packages/SystemUI/src/com/android/systemui/wallpapers/gl/ImageGLProgram.java b/packages/SystemUI/src/com/android/systemui/wallpapers/gl/ImageGLProgram.java deleted file mode 100644 index d34eca4831db..000000000000 --- a/packages/SystemUI/src/com/android/systemui/wallpapers/gl/ImageGLProgram.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright (C) 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.wallpapers.gl; - -import static android.opengl.GLES20.GL_FRAGMENT_SHADER; -import static android.opengl.GLES20.GL_VERTEX_SHADER; -import static android.opengl.GLES20.glAttachShader; -import static android.opengl.GLES20.glCompileShader; -import static android.opengl.GLES20.glCreateProgram; -import static android.opengl.GLES20.glCreateShader; -import static android.opengl.GLES20.glGetAttribLocation; -import static android.opengl.GLES20.glGetUniformLocation; -import static android.opengl.GLES20.glLinkProgram; -import static android.opengl.GLES20.glShaderSource; -import static android.opengl.GLES20.glUseProgram; - -import android.content.Context; -import android.content.res.Resources; -import android.util.Log; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; - -/** - * This class takes charge of linking shader codes and then return a handle for OpenGL ES program. - */ -class ImageGLProgram { - private static final String TAG = ImageGLProgram.class.getSimpleName(); - - private Context mContext; - private int mProgramHandle; - - ImageGLProgram(Context context) { - mContext = context.getApplicationContext(); - } - - private int loadShaderProgram(int vertexId, int fragmentId) { - final String vertexSrc = getShaderResource(vertexId); - final String fragmentSrc = getShaderResource(fragmentId); - final int vertexHandle = getShaderHandle(GL_VERTEX_SHADER, vertexSrc); - final int fragmentHandle = getShaderHandle(GL_FRAGMENT_SHADER, fragmentSrc); - return getProgramHandle(vertexHandle, fragmentHandle); - } - - private String getShaderResource(int shaderId) { - Resources res = mContext.getResources(); - StringBuilder code = new StringBuilder(); - - try (BufferedReader reader = new BufferedReader( - new InputStreamReader(res.openRawResource(shaderId)))) { - String nextLine; - while ((nextLine = reader.readLine()) != null) { - code.append(nextLine).append("\n"); - } - } catch (IOException | Resources.NotFoundException ex) { - Log.d(TAG, "Can not read the shader source", ex); - code = null; - } - - return code == null ? "" : code.toString(); - } - - private int getShaderHandle(int type, String src) { - final int shader = glCreateShader(type); - if (shader == 0) { - Log.d(TAG, "Create shader failed, type=" + type); - return 0; - } - glShaderSource(shader, src); - glCompileShader(shader); - return shader; - } - - private int getProgramHandle(int vertexHandle, int fragmentHandle) { - final int program = glCreateProgram(); - if (program == 0) { - Log.d(TAG, "Can not create OpenGL ES program"); - return 0; - } - - glAttachShader(program, vertexHandle); - glAttachShader(program, fragmentHandle); - glLinkProgram(program); - return program; - } - - boolean useGLProgram(int vertexResId, int fragmentResId) { - mProgramHandle = loadShaderProgram(vertexResId, fragmentResId); - glUseProgram(mProgramHandle); - return true; - } - - int getAttributeHandle(String name) { - return glGetAttribLocation(mProgramHandle, name); - } - - int getUniformHandle(String name) { - return glGetUniformLocation(mProgramHandle, name); - } -} diff --git a/packages/SystemUI/src/com/android/systemui/wallpapers/gl/ImageGLWallpaper.java b/packages/SystemUI/src/com/android/systemui/wallpapers/gl/ImageGLWallpaper.java deleted file mode 100644 index f1659b9a8723..000000000000 --- a/packages/SystemUI/src/com/android/systemui/wallpapers/gl/ImageGLWallpaper.java +++ /dev/null @@ -1,183 +0,0 @@ -/* - * Copyright (C) 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.wallpapers.gl; - -import static android.opengl.GLES20.GL_FLOAT; -import static android.opengl.GLES20.GL_LINEAR; -import static android.opengl.GLES20.GL_TEXTURE0; -import static android.opengl.GLES20.GL_TEXTURE_2D; -import static android.opengl.GLES20.GL_TEXTURE_MAG_FILTER; -import static android.opengl.GLES20.GL_TEXTURE_MIN_FILTER; -import static android.opengl.GLES20.GL_TRIANGLES; -import static android.opengl.GLES20.glActiveTexture; -import static android.opengl.GLES20.glBindTexture; -import static android.opengl.GLES20.glDrawArrays; -import static android.opengl.GLES20.glEnableVertexAttribArray; -import static android.opengl.GLES20.glGenTextures; -import static android.opengl.GLES20.glTexParameteri; -import static android.opengl.GLES20.glUniform1i; -import static android.opengl.GLES20.glVertexAttribPointer; - -import android.graphics.Bitmap; -import android.opengl.GLUtils; -import android.util.Log; - -import java.io.FileDescriptor; -import java.io.PrintWriter; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.nio.FloatBuffer; - -/** - * This class takes charge of the geometry data like vertices and texture coordinates. - * It delivers these data to opengl runtime and triggers draw calls if necessary. - */ -class ImageGLWallpaper { - private static final String TAG = ImageGLWallpaper.class.getSimpleName(); - - private static final String A_POSITION = "aPosition"; - private static final String A_TEXTURE_COORDINATES = "aTextureCoordinates"; - private static final String U_TEXTURE = "uTexture"; - private static final int POSITION_COMPONENT_COUNT = 2; - private static final int TEXTURE_COMPONENT_COUNT = 2; - private static final int BYTES_PER_FLOAT = 4; - - // Vertices to define the square with 2 triangles. - private static final float[] VERTICES = { - -1.0f, -1.0f, - +1.0f, -1.0f, - +1.0f, +1.0f, - +1.0f, +1.0f, - -1.0f, +1.0f, - -1.0f, -1.0f - }; - - // Texture coordinates that maps to vertices. - private static final float[] TEXTURES = { - 0f, 1f, - 1f, 1f, - 1f, 0f, - 1f, 0f, - 0f, 0f, - 0f, 1f - }; - - private final FloatBuffer mVertexBuffer; - private final FloatBuffer mTextureBuffer; - private final ImageGLProgram mProgram; - - private int mAttrPosition; - private int mAttrTextureCoordinates; - private int mUniTexture; - private int mTextureId; - - ImageGLWallpaper(ImageGLProgram program) { - mProgram = program; - - // Create an float array in opengles runtime (native) and put vertex data. - mVertexBuffer = ByteBuffer.allocateDirect(VERTICES.length * BYTES_PER_FLOAT) - .order(ByteOrder.nativeOrder()) - .asFloatBuffer(); - mVertexBuffer.put(VERTICES); - mVertexBuffer.position(0); - - // Create an float array in opengles runtime (native) and put texture data. - mTextureBuffer = ByteBuffer.allocateDirect(TEXTURES.length * BYTES_PER_FLOAT) - .order(ByteOrder.nativeOrder()) - .asFloatBuffer(); - mTextureBuffer.put(TEXTURES); - mTextureBuffer.position(0); - } - - void setup(Bitmap bitmap) { - setupAttributes(); - setupUniforms(); - setupTexture(bitmap); - } - - private void setupAttributes() { - mAttrPosition = mProgram.getAttributeHandle(A_POSITION); - mVertexBuffer.position(0); - glVertexAttribPointer(mAttrPosition, POSITION_COMPONENT_COUNT, GL_FLOAT, - false, 0, mVertexBuffer); - glEnableVertexAttribArray(mAttrPosition); - - mAttrTextureCoordinates = mProgram.getAttributeHandle(A_TEXTURE_COORDINATES); - mTextureBuffer.position(0); - glVertexAttribPointer(mAttrTextureCoordinates, TEXTURE_COMPONENT_COUNT, GL_FLOAT, - false, 0, mTextureBuffer); - glEnableVertexAttribArray(mAttrTextureCoordinates); - } - - private void setupUniforms() { - mUniTexture = mProgram.getUniformHandle(U_TEXTURE); - } - - void draw() { - glDrawArrays(GL_TRIANGLES, 0, VERTICES.length / 2); - } - - private void setupTexture(Bitmap bitmap) { - final int[] tids = new int[1]; - - if (bitmap == null || bitmap.isRecycled()) { - Log.w(TAG, "setupTexture: invalid bitmap"); - return; - } - - // Generate one texture object and store the id in tids[0]. - glGenTextures(1, tids, 0); - if (tids[0] == 0) { - Log.w(TAG, "setupTexture: glGenTextures() failed"); - return; - } - - try { - // Bind a named texture to a target. - glBindTexture(GL_TEXTURE_2D, tids[0]); - // Load the bitmap data and copy it over into the texture object - // that is currently bound. - GLUtils.texImage2D(GL_TEXTURE_2D, 0, bitmap, 0); - // Use bilinear texture filtering when minification. - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - // Use bilinear texture filtering when magnification. - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - mTextureId = tids[0]; - } catch (IllegalArgumentException e) { - Log.w(TAG, "Failed uploading texture: " + e.getLocalizedMessage()); - } - } - - void useTexture() { - // Set the active texture unit to texture unit 0. - glActiveTexture(GL_TEXTURE0); - // Bind the texture to this unit. - glBindTexture(GL_TEXTURE_2D, mTextureId); - // Let the texture sampler in fragment shader to read form this texture unit. - glUniform1i(mUniTexture, 0); - } - - /** - * Called to dump current state. - * @param prefix prefix. - * @param fd fd. - * @param out out. - * @param args args. - */ - public void dump(String prefix, FileDescriptor fd, PrintWriter out, String[] args) { - } -} diff --git a/packages/SystemUI/src/com/android/systemui/wallpapers/gl/ImageWallpaperRenderer.java b/packages/SystemUI/src/com/android/systemui/wallpapers/gl/ImageWallpaperRenderer.java deleted file mode 100644 index e393786e29d9..000000000000 --- a/packages/SystemUI/src/com/android/systemui/wallpapers/gl/ImageWallpaperRenderer.java +++ /dev/null @@ -1,195 +0,0 @@ -/* - * Copyright (C) 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.wallpapers.gl; - -import static android.opengl.GLES20.GL_COLOR_BUFFER_BIT; -import static android.opengl.GLES20.glClear; -import static android.opengl.GLES20.glClearColor; -import static android.opengl.GLES20.glViewport; - -import android.app.WallpaperManager; -import android.content.Context; -import android.graphics.Bitmap; -import android.graphics.Rect; -import android.os.UserHandle; -import android.util.Log; -import android.util.Size; - -import com.android.systemui.R; - -import java.io.FileDescriptor; -import java.io.PrintWriter; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.function.Consumer; - -/** - * A GL renderer for image wallpaper. - */ -public class ImageWallpaperRenderer implements GLWallpaperRenderer { - private static final String TAG = ImageWallpaperRenderer.class.getSimpleName(); - private static final boolean DEBUG = false; - - private final ImageGLProgram mProgram; - private final ImageGLWallpaper mWallpaper; - private final Rect mSurfaceSize = new Rect(); - private final WallpaperTexture mTexture; - private Consumer<Bitmap> mOnBitmapUpdated; - - public ImageWallpaperRenderer(Context context) { - final WallpaperManager wpm = context.getSystemService(WallpaperManager.class); - if (wpm == null) { - Log.w(TAG, "WallpaperManager not available"); - } - - mTexture = new WallpaperTexture(wpm); - mProgram = new ImageGLProgram(context); - mWallpaper = new ImageGLWallpaper(mProgram); - } - - /** - * @hide - */ - public void setOnBitmapChanged(Consumer<Bitmap> c) { - mOnBitmapUpdated = c; - } - - /** - * @hide - */ - public void use(Consumer<Bitmap> c) { - mTexture.use(c); - } - - @Override - public boolean isWcgContent() { - return mTexture.isWcgContent(); - } - - @Override - public void onSurfaceCreated() { - glClearColor(0f, 0f, 0f, 1.0f); - mProgram.useGLProgram( - R.raw.image_wallpaper_vertex_shader, R.raw.image_wallpaper_fragment_shader); - - mTexture.use(bitmap -> { - if (bitmap == null) { - Log.w(TAG, "reload texture failed!"); - } else if (mOnBitmapUpdated != null) { - mOnBitmapUpdated.accept(bitmap); - } - mWallpaper.setup(bitmap); - }); - } - - @Override - public void onSurfaceChanged(int width, int height) { - glViewport(0, 0, width, height); - } - - @Override - public void onDrawFrame() { - glClear(GL_COLOR_BUFFER_BIT); - glViewport(0, 0, mSurfaceSize.width(), mSurfaceSize.height()); - mWallpaper.useTexture(); - mWallpaper.draw(); - } - - @Override - public Size reportSurfaceSize() { - mSurfaceSize.set(mTexture.getTextureDimensions()); - return new Size(mSurfaceSize.width(), mSurfaceSize.height()); - } - - @Override - public void finish() { - } - - @Override - public void dump(String prefix, FileDescriptor fd, PrintWriter out, String[] args) { - out.print(prefix); out.print("mSurfaceSize="); out.print(mSurfaceSize); - out.print(prefix); out.print("mWcgContent="); out.print(isWcgContent()); - mWallpaper.dump(prefix, fd, out, args); - } - - static class WallpaperTexture { - private final AtomicInteger mRefCount; - private final Rect mDimensions; - private final WallpaperManager mWallpaperManager; - private Bitmap mBitmap; - private boolean mWcgContent; - private boolean mTextureUsed; - - private WallpaperTexture(WallpaperManager wallpaperManager) { - mWallpaperManager = wallpaperManager; - mRefCount = new AtomicInteger(); - mDimensions = new Rect(); - } - - public void use(Consumer<Bitmap> consumer) { - mRefCount.incrementAndGet(); - synchronized (mRefCount) { - if (mBitmap == null) { - mBitmap = mWallpaperManager.getBitmapAsUser(UserHandle.USER_CURRENT, - false /* hardware */); - mWcgContent = mWallpaperManager.wallpaperSupportsWcg( - WallpaperManager.FLAG_SYSTEM); - mWallpaperManager.forgetLoadedWallpaper(); - if (mBitmap != null) { - mDimensions.set(0, 0, mBitmap.getWidth(), mBitmap.getHeight()); - mTextureUsed = true; - } else { - Log.w(TAG, "Can't get bitmap"); - } - } - } - if (consumer != null) { - consumer.accept(mBitmap); - } - synchronized (mRefCount) { - final int count = mRefCount.decrementAndGet(); - if (count == 0 && mBitmap != null) { - if (DEBUG) { - Log.v(TAG, "WallpaperTexture: release 0x" + getHash() - + ", refCount=" + count); - } - mBitmap.recycle(); - mBitmap = null; - } - } - } - - private boolean isWcgContent() { - return mWcgContent; - } - - private String getHash() { - return mBitmap != null ? Integer.toHexString(mBitmap.hashCode()) : "null"; - } - - private Rect getTextureDimensions() { - if (!mTextureUsed) { - mDimensions.set(mWallpaperManager.peekBitmapDimensions()); - } - return mDimensions; - } - - @Override - public String toString() { - return "{" + getHash() + ", " + mRefCount.get() + "}"; - } - } -} diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardAbsKeyInputViewControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardAbsKeyInputViewControllerTest.java index 8bbaf3dff1e5..10595439200a 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardAbsKeyInputViewControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardAbsKeyInputViewControllerTest.java @@ -19,6 +19,7 @@ package com.android.keyguard; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyZeroInteractions; @@ -87,6 +88,7 @@ public class KeyguardAbsKeyInputViewControllerTest extends SysuiTestCase { when(mAbsKeyInputView.isAttachedToWindow()).thenReturn(true); when(mAbsKeyInputView.requireViewById(R.id.bouncer_message_area)) .thenReturn(mKeyguardMessageArea); + when(mAbsKeyInputView.getResources()).thenReturn(getContext().getResources()); mKeyguardAbsKeyInputViewController = new KeyguardAbsKeyInputViewController(mAbsKeyInputView, mKeyguardUpdateMonitor, mSecurityMode, mLockPatternUtils, mKeyguardSecurityCallback, mKeyguardMessageAreaControllerFactory, mLatencyTracker, mFalsingCollector, @@ -99,6 +101,11 @@ public class KeyguardAbsKeyInputViewControllerTest extends SysuiTestCase { public void onResume(int reason) { super.onResume(reason); } + + @Override + protected int getInitialMessageResId() { + return 0; + } }; mKeyguardAbsKeyInputViewController.init(); reset(mKeyguardMessageAreaController); // Clear out implicit call to init. @@ -125,4 +132,22 @@ public class KeyguardAbsKeyInputViewControllerTest extends SysuiTestCase { verifyZeroInteractions(mKeyguardSecurityCallback); verifyZeroInteractions(mKeyguardMessageAreaController); } + + @Test + public void onPromptReasonNone_doesNotSetMessage() { + mKeyguardAbsKeyInputViewController.showPromptReason(0); + verify(mKeyguardMessageAreaController, never()).setMessage( + getContext().getResources().getString(R.string.kg_prompt_reason_restart_password), + false); + } + + @Test + public void onPromptReason_setsMessage() { + when(mAbsKeyInputView.getPromptReasonStringRes(1)).thenReturn( + R.string.kg_prompt_reason_restart_password); + mKeyguardAbsKeyInputViewController.showPromptReason(1); + verify(mKeyguardMessageAreaController).setMessage( + getContext().getResources().getString(R.string.kg_prompt_reason_restart_password), + false); + } } diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java index 61c7bb500e6a..c8e753844c64 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java @@ -29,7 +29,6 @@ import static org.mockito.Mockito.when; import android.content.res.Resources; import android.database.ContentObserver; -import android.graphics.Rect; import android.net.Uri; import android.os.UserHandle; import android.provider.Settings; @@ -47,6 +46,8 @@ import com.android.systemui.dump.DumpManager; import com.android.systemui.keyguard.KeyguardUnlockAnimationController; import com.android.systemui.plugins.ClockAnimations; import com.android.systemui.plugins.ClockController; +import com.android.systemui.plugins.ClockEvents; +import com.android.systemui.plugins.ClockFaceController; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.shared.clocks.AnimatableClockView; import com.android.systemui.shared.clocks.ClockRegistry; @@ -88,7 +89,15 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase { @Mock KeyguardUnlockAnimationController mKeyguardUnlockAnimationController; @Mock - private ClockController mClock; + private ClockController mClockController; + @Mock + private ClockFaceController mLargeClockController; + @Mock + private ClockFaceController mSmallClockController; + @Mock + private ClockAnimations mClockAnimations; + @Mock + private ClockEvents mClockEvents; @Mock DumpManager mDumpManager; @Mock @@ -97,10 +106,12 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase { @Mock private NotificationIconContainer mNotificationIcons; @Mock - private AnimatableClockView mClockView; + private AnimatableClockView mSmallClockView; @Mock private AnimatableClockView mLargeClockView; @Mock + private FrameLayout mSmallClockFrame; + @Mock private FrameLayout mLargeClockFrame; @Mock private SecureSettings mSecureSettings; @@ -121,9 +132,14 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase { mock(RelativeLayout.LayoutParams.class)); when(mView.getContext()).thenReturn(getContext()); when(mView.getResources()).thenReturn(mResources); + when(mResources.getDimensionPixelSize(R.dimen.keyguard_clock_top_margin)) + .thenReturn(100); + when(mResources.getDimensionPixelSize(R.dimen.keyguard_large_clock_top_margin)) + .thenReturn(-200); when(mView.findViewById(R.id.lockscreen_clock_view_large)).thenReturn(mLargeClockFrame); - when(mClockView.getContext()).thenReturn(getContext()); + when(mView.findViewById(R.id.lockscreen_clock_view)).thenReturn(mSmallClockFrame); + when(mSmallClockView.getContext()).thenReturn(getContext()); when(mLargeClockView.getContext()).thenReturn(getContext()); when(mView.isAttachedToWindow()).thenReturn(true); @@ -144,7 +160,14 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase { ); when(mStatusBarStateController.getState()).thenReturn(StatusBarState.SHADE); - when(mClockRegistry.createCurrentClock()).thenReturn(mClock); + when(mLargeClockController.getView()).thenReturn(mLargeClockView); + when(mSmallClockController.getView()).thenReturn(mSmallClockView); + when(mClockController.getLargeClock()).thenReturn(mLargeClockController); + when(mClockController.getSmallClock()).thenReturn(mSmallClockController); + when(mClockController.getEvents()).thenReturn(mClockEvents); + when(mClockController.getAnimations()).thenReturn(mClockAnimations); + when(mClockRegistry.createCurrentClock()).thenReturn(mClockController); + when(mClockEventController.getClock()).thenReturn(mClockController); mSliceView = new View(getContext()); when(mView.findViewById(R.id.keyguard_slice_view)).thenReturn(mSliceView); @@ -203,8 +226,8 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase { verify(mClockRegistry).registerClockChangeListener(listenerArgumentCaptor.capture()); listenerArgumentCaptor.getValue().onClockChanged(); - verify(mView, times(2)).setClock(mClock, StatusBarState.SHADE); - verify(mClockEventController, times(2)).setClock(mClock); + verify(mView, times(2)).setClock(mClockController, StatusBarState.SHADE); + verify(mClockEventController, times(2)).setClock(mClockController); } @Test @@ -262,17 +285,40 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase { @Test public void testGetClockAnimationsForwardsToClock() { - ClockController mockClockController = mock(ClockController.class); - ClockAnimations mockClockAnimations = mock(ClockAnimations.class); - when(mClockEventController.getClock()).thenReturn(mockClockController); - when(mockClockController.getAnimations()).thenReturn(mockClockAnimations); - - Rect r1 = new Rect(1, 2, 3, 4); - Rect r2 = new Rect(5, 6, 7, 8); - mController.getClockAnimations().onPositionUpdated(r1, r2, 0.2f); - verify(mockClockAnimations).onPositionUpdated(r1, r2, 0.2f); + assertEquals(mClockAnimations, mController.getClockAnimations()); + } + + @Test + public void testGetLargeClockBottom_returnsExpectedValue() { + when(mLargeClockFrame.getVisibility()).thenReturn(View.VISIBLE); + when(mLargeClockFrame.getHeight()).thenReturn(100); + when(mSmallClockFrame.getHeight()).thenReturn(50); + when(mLargeClockView.getHeight()).thenReturn(40); + when(mSmallClockView.getHeight()).thenReturn(20); + mController.init(); + + assertEquals(170, mController.getClockBottom(1000)); } + @Test + public void testGetSmallLargeClockBottom_returnsExpectedValue() { + when(mLargeClockFrame.getVisibility()).thenReturn(View.GONE); + when(mLargeClockFrame.getHeight()).thenReturn(100); + when(mSmallClockFrame.getHeight()).thenReturn(50); + when(mLargeClockView.getHeight()).thenReturn(40); + when(mSmallClockView.getHeight()).thenReturn(20); + mController.init(); + + assertEquals(1120, mController.getClockBottom(1000)); + } + + @Test + public void testGetClockBottom_nullClock_returnsZero() { + when(mClockEventController.getClock()).thenReturn(null); + assertEquals(0, mController.getClockBottom(10)); + } + + private void verifyAttachment(VerificationMode times) { verify(mClockRegistry, times).registerClockChangeListener( any(ClockRegistry.ClockChangeListener.class)); diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPasswordViewControllerTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPasswordViewControllerTest.kt index d20be56d6c6b..d91279399341 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPasswordViewControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPasswordViewControllerTest.kt @@ -30,64 +30,54 @@ import com.android.systemui.util.concurrency.DelayableExecutor import org.junit.Before import org.junit.Test import org.junit.runner.RunWith +import org.mockito.ArgumentMatchers.anyBoolean +import org.mockito.ArgumentMatchers.anyString import org.mockito.Mock import org.mockito.Mockito -import org.mockito.Mockito.`when` import org.mockito.Mockito.never import org.mockito.Mockito.verify +import org.mockito.Mockito.`when` import org.mockito.MockitoAnnotations @SmallTest @RunWith(AndroidTestingRunner::class) @TestableLooper.RunWithLooper class KeyguardPasswordViewControllerTest : SysuiTestCase() { - @Mock - private lateinit var keyguardPasswordView: KeyguardPasswordView - @Mock - private lateinit var passwordEntry: EditText - @Mock - lateinit var keyguardUpdateMonitor: KeyguardUpdateMonitor - @Mock - lateinit var securityMode: KeyguardSecurityModel.SecurityMode - @Mock - lateinit var lockPatternUtils: LockPatternUtils - @Mock - lateinit var keyguardSecurityCallback: KeyguardSecurityCallback - @Mock - lateinit var messageAreaControllerFactory: KeyguardMessageAreaController.Factory - @Mock - lateinit var latencyTracker: LatencyTracker - @Mock - lateinit var inputMethodManager: InputMethodManager - @Mock - lateinit var emergencyButtonController: EmergencyButtonController - @Mock - lateinit var mainExecutor: DelayableExecutor - @Mock - lateinit var falsingCollector: FalsingCollector - @Mock - lateinit var keyguardViewController: KeyguardViewController - @Mock - private lateinit var mKeyguardMessageArea: BouncerKeyguardMessageArea - @Mock - private lateinit var mKeyguardMessageAreaController: - KeyguardMessageAreaController<BouncerKeyguardMessageArea> + @Mock private lateinit var keyguardPasswordView: KeyguardPasswordView + @Mock private lateinit var passwordEntry: EditText + @Mock lateinit var keyguardUpdateMonitor: KeyguardUpdateMonitor + @Mock lateinit var securityMode: KeyguardSecurityModel.SecurityMode + @Mock lateinit var lockPatternUtils: LockPatternUtils + @Mock lateinit var keyguardSecurityCallback: KeyguardSecurityCallback + @Mock lateinit var messageAreaControllerFactory: KeyguardMessageAreaController.Factory + @Mock lateinit var latencyTracker: LatencyTracker + @Mock lateinit var inputMethodManager: InputMethodManager + @Mock lateinit var emergencyButtonController: EmergencyButtonController + @Mock lateinit var mainExecutor: DelayableExecutor + @Mock lateinit var falsingCollector: FalsingCollector + @Mock lateinit var keyguardViewController: KeyguardViewController + @Mock private lateinit var mKeyguardMessageArea: BouncerKeyguardMessageArea + @Mock + private lateinit var mKeyguardMessageAreaController: + KeyguardMessageAreaController<BouncerKeyguardMessageArea> - private lateinit var keyguardPasswordViewController: KeyguardPasswordViewController + private lateinit var keyguardPasswordViewController: KeyguardPasswordViewController - @Before - fun setup() { - MockitoAnnotations.initMocks(this) - Mockito.`when`( - keyguardPasswordView - .requireViewById<BouncerKeyguardMessageArea>(R.id.bouncer_message_area) - ).thenReturn(mKeyguardMessageArea) - Mockito.`when`(messageAreaControllerFactory.create(mKeyguardMessageArea)) - .thenReturn(mKeyguardMessageAreaController) - Mockito.`when`(keyguardPasswordView.passwordTextViewId).thenReturn(R.id.passwordEntry) - Mockito.`when`(keyguardPasswordView.findViewById<EditText>(R.id.passwordEntry) - ).thenReturn(passwordEntry) - keyguardPasswordViewController = KeyguardPasswordViewController( + @Before + fun setup() { + MockitoAnnotations.initMocks(this) + Mockito.`when`( + keyguardPasswordView.requireViewById<BouncerKeyguardMessageArea>( + R.id.bouncer_message_area)) + .thenReturn(mKeyguardMessageArea) + Mockito.`when`(messageAreaControllerFactory.create(mKeyguardMessageArea)) + .thenReturn(mKeyguardMessageAreaController) + Mockito.`when`(keyguardPasswordView.passwordTextViewId).thenReturn(R.id.passwordEntry) + Mockito.`when`(keyguardPasswordView.findViewById<EditText>(R.id.passwordEntry)) + .thenReturn(passwordEntry) + `when`(keyguardPasswordView.resources).thenReturn(context.resources) + keyguardPasswordViewController = + KeyguardPasswordViewController( keyguardPasswordView, keyguardUpdateMonitor, securityMode, @@ -100,51 +90,48 @@ class KeyguardPasswordViewControllerTest : SysuiTestCase() { mainExecutor, mContext.resources, falsingCollector, - keyguardViewController - ) - } + keyguardViewController) + } - @Test - fun testFocusWhenBouncerIsShown() { - Mockito.`when`(keyguardViewController.isBouncerShowing).thenReturn(true) - Mockito.`when`(keyguardPasswordView.isShown).thenReturn(true) - keyguardPasswordViewController.onResume(KeyguardSecurityView.VIEW_REVEALED) - keyguardPasswordView.post { - verify(keyguardPasswordView).requestFocus() - verify(keyguardPasswordView).showKeyboard() - } + @Test + fun testFocusWhenBouncerIsShown() { + Mockito.`when`(keyguardViewController.isBouncerShowing).thenReturn(true) + Mockito.`when`(keyguardPasswordView.isShown).thenReturn(true) + keyguardPasswordViewController.onResume(KeyguardSecurityView.VIEW_REVEALED) + keyguardPasswordView.post { + verify(keyguardPasswordView).requestFocus() + verify(keyguardPasswordView).showKeyboard() } + } - @Test - fun testDoNotFocusWhenBouncerIsHidden() { - Mockito.`when`(keyguardViewController.isBouncerShowing).thenReturn(false) - Mockito.`when`(keyguardPasswordView.isShown).thenReturn(true) - keyguardPasswordViewController.onResume(KeyguardSecurityView.VIEW_REVEALED) - verify(keyguardPasswordView, never()).requestFocus() - } + @Test + fun testDoNotFocusWhenBouncerIsHidden() { + Mockito.`when`(keyguardViewController.isBouncerShowing).thenReturn(false) + Mockito.`when`(keyguardPasswordView.isShown).thenReturn(true) + keyguardPasswordViewController.onResume(KeyguardSecurityView.VIEW_REVEALED) + verify(keyguardPasswordView, never()).requestFocus() + } - @Test - fun testHideKeyboardWhenOnPause() { - keyguardPasswordViewController.onPause() - keyguardPasswordView.post { - verify(keyguardPasswordView).clearFocus() - verify(keyguardPasswordView).hideKeyboard() - } + @Test + fun testHideKeyboardWhenOnPause() { + keyguardPasswordViewController.onPause() + keyguardPasswordView.post { + verify(keyguardPasswordView).clearFocus() + verify(keyguardPasswordView).hideKeyboard() } + } - @Test - fun startAppearAnimation() { - keyguardPasswordViewController.startAppearAnimation() - verify(mKeyguardMessageAreaController).setMessage(R.string.keyguard_enter_your_password) - } + @Test + fun startAppearAnimation() { + keyguardPasswordViewController.startAppearAnimation() + verify(mKeyguardMessageAreaController) + .setMessage(context.resources.getString(R.string.keyguard_enter_your_password), false) + } - @Test - fun startAppearAnimation_withExistingMessage() { - `when`(mKeyguardMessageAreaController.message).thenReturn("Unlock to continue.") - keyguardPasswordViewController.startAppearAnimation() - verify( - mKeyguardMessageAreaController, - never() - ).setMessage(R.string.keyguard_enter_your_password) - } + @Test + fun startAppearAnimation_withExistingMessage() { + `when`(mKeyguardMessageAreaController.message).thenReturn("Unlock to continue.") + keyguardPasswordViewController.startAppearAnimation() + verify(mKeyguardMessageAreaController, never()).setMessage(anyString(), anyBoolean()) + } } diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPatternViewControllerTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPatternViewControllerTest.kt index b3d1c8f909d8..85dbdb8330a3 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPatternViewControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPatternViewControllerTest.kt @@ -30,97 +30,93 @@ import com.android.systemui.statusbar.policy.DevicePostureController import org.junit.Before import org.junit.Test import org.junit.runner.RunWith +import org.mockito.ArgumentMatchers.anyBoolean +import org.mockito.ArgumentMatchers.anyString import org.mockito.Mock +import org.mockito.Mockito.never import org.mockito.Mockito.verify import org.mockito.Mockito.`when` -import org.mockito.Mockito.never import org.mockito.MockitoAnnotations @SmallTest @RunWith(AndroidTestingRunner::class) @TestableLooper.RunWithLooper class KeyguardPatternViewControllerTest : SysuiTestCase() { - @Mock - private lateinit var mKeyguardPatternView: KeyguardPatternView + @Mock private lateinit var mKeyguardPatternView: KeyguardPatternView - @Mock - private lateinit var mKeyguardUpdateMonitor: KeyguardUpdateMonitor + @Mock private lateinit var mKeyguardUpdateMonitor: KeyguardUpdateMonitor - @Mock - private lateinit var mSecurityMode: KeyguardSecurityModel.SecurityMode + @Mock private lateinit var mSecurityMode: KeyguardSecurityModel.SecurityMode - @Mock - private lateinit var mLockPatternUtils: LockPatternUtils + @Mock private lateinit var mLockPatternUtils: LockPatternUtils - @Mock - private lateinit var mKeyguardSecurityCallback: KeyguardSecurityCallback + @Mock private lateinit var mKeyguardSecurityCallback: KeyguardSecurityCallback - @Mock - private lateinit var mLatencyTracker: LatencyTracker - private var mFalsingCollector: FalsingCollector = FalsingCollectorFake() + @Mock private lateinit var mLatencyTracker: LatencyTracker + private var mFalsingCollector: FalsingCollector = FalsingCollectorFake() - @Mock - private lateinit var mEmergencyButtonController: EmergencyButtonController + @Mock private lateinit var mEmergencyButtonController: EmergencyButtonController - @Mock - private lateinit - var mKeyguardMessageAreaControllerFactory: KeyguardMessageAreaController.Factory + @Mock + private lateinit var mKeyguardMessageAreaControllerFactory: KeyguardMessageAreaController.Factory - @Mock - private lateinit var mKeyguardMessageArea: BouncerKeyguardMessageArea + @Mock private lateinit var mKeyguardMessageArea: BouncerKeyguardMessageArea - @Mock - private lateinit var mKeyguardMessageAreaController: - KeyguardMessageAreaController<BouncerKeyguardMessageArea> + @Mock + private lateinit var mKeyguardMessageAreaController: + KeyguardMessageAreaController<BouncerKeyguardMessageArea> - @Mock - private lateinit var mLockPatternView: LockPatternView + @Mock private lateinit var mLockPatternView: LockPatternView - @Mock - private lateinit var mPostureController: DevicePostureController + @Mock private lateinit var mPostureController: DevicePostureController - private lateinit var mKeyguardPatternViewController: KeyguardPatternViewController + private lateinit var mKeyguardPatternViewController: KeyguardPatternViewController - @Before - fun setup() { - MockitoAnnotations.initMocks(this) - `when`(mKeyguardPatternView.isAttachedToWindow).thenReturn(true) - `when`(mKeyguardPatternView - .requireViewById<BouncerKeyguardMessageArea>(R.id.bouncer_message_area)) - .thenReturn(mKeyguardMessageArea) - `when`(mKeyguardPatternView.findViewById<LockPatternView>(R.id.lockPatternView)) - .thenReturn(mLockPatternView) - `when`(mKeyguardMessageAreaControllerFactory.create(mKeyguardMessageArea)) - .thenReturn(mKeyguardMessageAreaController) - mKeyguardPatternViewController = KeyguardPatternViewController( + @Before + fun setup() { + MockitoAnnotations.initMocks(this) + `when`(mKeyguardPatternView.isAttachedToWindow).thenReturn(true) + `when`( + mKeyguardPatternView.requireViewById<BouncerKeyguardMessageArea>( + R.id.bouncer_message_area)) + .thenReturn(mKeyguardMessageArea) + `when`(mKeyguardPatternView.findViewById<LockPatternView>(R.id.lockPatternView)) + .thenReturn(mLockPatternView) + `when`(mKeyguardMessageAreaControllerFactory.create(mKeyguardMessageArea)) + .thenReturn(mKeyguardMessageAreaController) + `when`(mKeyguardPatternView.resources).thenReturn(context.resources) + mKeyguardPatternViewController = + KeyguardPatternViewController( mKeyguardPatternView, - mKeyguardUpdateMonitor, mSecurityMode, mLockPatternUtils, mKeyguardSecurityCallback, - mLatencyTracker, mFalsingCollector, mEmergencyButtonController, - mKeyguardMessageAreaControllerFactory, mPostureController - ) - } - - @Test - fun onPause_resetsText() { - mKeyguardPatternViewController.init() - mKeyguardPatternViewController.onPause() - verify(mKeyguardMessageAreaController).setMessage(R.string.keyguard_enter_your_pattern) - } - - - @Test - fun startAppearAnimation() { - mKeyguardPatternViewController.startAppearAnimation() - verify(mKeyguardMessageAreaController).setMessage(R.string.keyguard_enter_your_pattern) - } - - @Test - fun startAppearAnimation_withExistingMessage() { - `when`(mKeyguardMessageAreaController.message).thenReturn("Unlock to continue.") - mKeyguardPatternViewController.startAppearAnimation() - verify( - mKeyguardMessageAreaController, - never() - ).setMessage(R.string.keyguard_enter_your_password) - } + mKeyguardUpdateMonitor, + mSecurityMode, + mLockPatternUtils, + mKeyguardSecurityCallback, + mLatencyTracker, + mFalsingCollector, + mEmergencyButtonController, + mKeyguardMessageAreaControllerFactory, + mPostureController) + } + + @Test + fun onPause_resetsText() { + mKeyguardPatternViewController.init() + mKeyguardPatternViewController.onPause() + verify(mKeyguardMessageAreaController).setMessage(R.string.keyguard_enter_your_pattern) + } + + @Test + fun startAppearAnimation() { + mKeyguardPatternViewController.startAppearAnimation() + verify(mKeyguardMessageAreaController) + .setMessage(context.resources.getString(R.string.keyguard_enter_your_pattern), false) + } + + @Test + fun startAppearAnimation_withExistingMessage() { + `when`(mKeyguardMessageAreaController.message).thenReturn("Unlock to continue.") + mKeyguardPatternViewController.startAppearAnimation() + verify(mKeyguardMessageAreaController, never()).setMessage(anyString(), anyBoolean()) + } } diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPinBasedInputViewControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPinBasedInputViewControllerTest.java index ce1101f389c0..b7421001b57e 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPinBasedInputViewControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPinBasedInputViewControllerTest.java @@ -16,6 +16,8 @@ package com.android.keyguard; +import static com.google.common.truth.Truth.assertThat; + import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -113,4 +115,9 @@ public class KeyguardPinBasedInputViewControllerTest extends SysuiTestCase { mKeyguardPinViewController.onResume(KeyguardSecurityView.SCREEN_ON); verify(mPasswordEntry).requestFocus(); } + + @Test + public void testGetInitialMessageResId() { + assertThat(mKeyguardPinViewController.getInitialMessageResId()).isNotEqualTo(0); + } } diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPinViewControllerTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPinViewControllerTest.kt index 8bcfe6f2b6f5..cdb7bbb9f823 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPinViewControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPinViewControllerTest.kt @@ -31,10 +31,13 @@ import com.android.systemui.statusbar.policy.DevicePostureController import org.junit.Before import org.junit.Test import org.junit.runner.RunWith +import org.mockito.ArgumentMatchers.anyBoolean +import org.mockito.ArgumentMatchers.anyString import org.mockito.Mock import org.mockito.Mockito import org.mockito.Mockito.any import org.mockito.Mockito.verify +import org.mockito.Mockito.`when` import org.mockito.MockitoAnnotations @SmallTest @@ -79,6 +82,7 @@ class KeyguardPinViewControllerTest : SysuiTestCase() { keyguardMessageAreaControllerFactory.create(any(KeyguardMessageArea::class.java)) ) .thenReturn(keyguardMessageAreaController) + `when`(keyguardPinView.resources).thenReturn(context.resources) pinViewController = KeyguardPinViewController( keyguardPinView, @@ -98,14 +102,14 @@ class KeyguardPinViewControllerTest : SysuiTestCase() { @Test fun startAppearAnimation() { pinViewController.startAppearAnimation() - verify(keyguardMessageAreaController).setMessage(R.string.keyguard_enter_your_pin) + verify(keyguardMessageAreaController) + .setMessage(context.resources.getString(R.string.keyguard_enter_your_pin), false) } @Test fun startAppearAnimation_withExistingMessage() { Mockito.`when`(keyguardMessageAreaController.message).thenReturn("Unlock to continue.") pinViewController.startAppearAnimation() - verify(keyguardMessageAreaController, Mockito.never()) - .setMessage(R.string.keyguard_enter_your_password) + verify(keyguardMessageAreaController, Mockito.never()).setMessage(anyString(), anyBoolean()) } } diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java index 40542d25689d..849ff08ac84c 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java @@ -2084,6 +2084,96 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { assertThat(mKeyguardUpdateMonitor.shouldListenForFace()).isFalse(); } + @Test + public void fingerprintFailure_requestActiveUnlock_dismissKeyguard() + throws RemoteException { + // GIVEN shouldTriggerActiveUnlock + bouncerFullyVisible(); + when(mLockPatternUtils.isSecure(KeyguardUpdateMonitor.getCurrentUser())).thenReturn(true); + + // GIVEN active unlock triggers on biometric failures + when(mActiveUnlockConfig.shouldAllowActiveUnlockFromOrigin( + ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN.BIOMETRIC_FAIL)) + .thenReturn(true); + + // WHEN fingerprint fails + mKeyguardUpdateMonitor.mFingerprintAuthenticationCallback.onAuthenticationFailed(); + + // ALWAYS request unlock with a keyguard dismissal + verify(mTrustManager).reportUserRequestedUnlock(eq(KeyguardUpdateMonitor.getCurrentUser()), + eq(true)); + } + + @Test + public void faceNonBypassFailure_requestActiveUnlock_doesNotDismissKeyguard() + throws RemoteException { + // GIVEN shouldTriggerActiveUnlock + when(mAuthController.isUdfpsFingerDown()).thenReturn(false); + keyguardIsVisible(); + keyguardNotGoingAway(); + statusBarShadeIsNotLocked(); + when(mLockPatternUtils.isSecure(KeyguardUpdateMonitor.getCurrentUser())).thenReturn(true); + + // GIVEN active unlock triggers on biometric failures + when(mActiveUnlockConfig.shouldAllowActiveUnlockFromOrigin( + ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN.BIOMETRIC_FAIL)) + .thenReturn(true); + + // WHEN face fails & bypass is not allowed + lockscreenBypassIsNotAllowed(); + mKeyguardUpdateMonitor.mFaceAuthenticationCallback.onAuthenticationFailed(); + + // THEN request unlock with NO keyguard dismissal + verify(mTrustManager).reportUserRequestedUnlock(eq(KeyguardUpdateMonitor.getCurrentUser()), + eq(false)); + } + + @Test + public void faceBypassFailure_requestActiveUnlock_dismissKeyguard() + throws RemoteException { + // GIVEN shouldTriggerActiveUnlock + when(mAuthController.isUdfpsFingerDown()).thenReturn(false); + keyguardIsVisible(); + keyguardNotGoingAway(); + statusBarShadeIsNotLocked(); + when(mLockPatternUtils.isSecure(KeyguardUpdateMonitor.getCurrentUser())).thenReturn(true); + + // GIVEN active unlock triggers on biometric failures + when(mActiveUnlockConfig.shouldAllowActiveUnlockFromOrigin( + ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN.BIOMETRIC_FAIL)) + .thenReturn(true); + + // WHEN face fails & bypass is not allowed + lockscreenBypassIsAllowed(); + mKeyguardUpdateMonitor.mFaceAuthenticationCallback.onAuthenticationFailed(); + + // THEN request unlock with a keyguard dismissal + verify(mTrustManager).reportUserRequestedUnlock(eq(KeyguardUpdateMonitor.getCurrentUser()), + eq(true)); + } + + @Test + public void faceNonBypassFailure_requestActiveUnlock_dismissKeyguard() + throws RemoteException { + // GIVEN shouldTriggerActiveUnlock + when(mAuthController.isUdfpsFingerDown()).thenReturn(false); + lockscreenBypassIsNotAllowed(); + when(mLockPatternUtils.isSecure(KeyguardUpdateMonitor.getCurrentUser())).thenReturn(true); + + // GIVEN active unlock triggers on biometric failures + when(mActiveUnlockConfig.shouldAllowActiveUnlockFromOrigin( + ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN.BIOMETRIC_FAIL)) + .thenReturn(true); + + // WHEN face fails & on the bouncer + bouncerFullyVisible(); + mKeyguardUpdateMonitor.mFaceAuthenticationCallback.onAuthenticationFailed(); + + // THEN request unlock with a keyguard dismissal + verify(mTrustManager).reportUserRequestedUnlock(eq(KeyguardUpdateMonitor.getCurrentUser()), + eq(true)); + } + private void userDeviceLockDown() { when(mStrongAuthTracker.isUnlockingWithBiometricAllowed(anyBoolean())).thenReturn(false); when(mStrongAuthTracker.getStrongAuthForUser(mCurrentUserId)) @@ -2101,6 +2191,9 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { } private void mockCanBypassLockscreen(boolean canBypass) { + // force update the isFaceEnrolled cache: + mKeyguardUpdateMonitor.isFaceAuthEnabledForUser(getCurrentUser()); + mKeyguardUpdateMonitor.setKeyguardBypassController(mKeyguardBypassController); when(mKeyguardBypassController.canBypass()).thenReturn(canBypass); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerWithCoroutinesTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerWithCoroutinesTest.kt index 517e27a3ce2f..2d412dcaa909 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerWithCoroutinesTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerWithCoroutinesTest.kt @@ -27,16 +27,19 @@ import com.android.systemui.keyguard.data.BouncerView import com.android.systemui.keyguard.data.repository.KeyguardBouncerRepository import com.android.systemui.keyguard.domain.interactor.PrimaryBouncerCallbackInteractor import com.android.systemui.keyguard.domain.interactor.PrimaryBouncerInteractor +import com.android.systemui.log.table.TableLogBuffer import com.android.systemui.statusbar.StatusBarState import com.android.systemui.statusbar.phone.KeyguardBouncer import com.android.systemui.statusbar.phone.KeyguardBypassController import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.test.TestCoroutineScope import kotlinx.coroutines.yield import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Test import org.junit.runner.RunWith +import org.mockito.Mock import org.mockito.Mockito.mock import org.mockito.MockitoAnnotations @@ -45,6 +48,7 @@ import org.mockito.MockitoAnnotations @TestableLooper.RunWithLooper class UdfpsKeyguardViewControllerWithCoroutinesTest : UdfpsKeyguardViewControllerBaseTest() { lateinit var keyguardBouncerRepository: KeyguardBouncerRepository + @Mock private lateinit var bouncerLogger: TableLogBuffer @Before override fun setUp() { @@ -53,7 +57,8 @@ class UdfpsKeyguardViewControllerWithCoroutinesTest : UdfpsKeyguardViewControlle keyguardBouncerRepository = KeyguardBouncerRepository( mock(com.android.keyguard.ViewMediatorCallback::class.java), - mKeyguardUpdateMonitor + TestCoroutineScope(), + bouncerLogger, ) super.setUp() } diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlsUiControllerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlsUiControllerImplTest.kt index 779788aa0075..d172c9a2e630 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlsUiControllerImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlsUiControllerImplTest.kt @@ -38,6 +38,7 @@ import com.android.systemui.controls.CustomIconCache import com.android.systemui.controls.controller.ControlsController import com.android.systemui.controls.controller.StructureInfo import com.android.systemui.controls.management.ControlsListingController +import com.android.systemui.controls.management.ControlsProviderSelectorActivity import com.android.systemui.controls.settings.FakeControlsSettingsRepository import com.android.systemui.dump.DumpManager import com.android.systemui.plugins.ActivityStarter @@ -53,6 +54,7 @@ import com.android.systemui.util.mockito.argumentCaptor import com.android.systemui.util.mockito.capture import com.android.systemui.util.mockito.eq import com.android.systemui.util.mockito.mock +import com.android.systemui.util.mockito.whenever import com.android.systemui.util.time.FakeSystemClock import com.android.wm.shell.TaskView import com.android.wm.shell.TaskViewFactory @@ -322,6 +324,45 @@ class ControlsUiControllerImplTest : SysuiTestCase() { .isFalse() } + @Test + fun testResolveActivityWhileSeeding_ControlsActivity() { + whenever(controlsController.addSeedingFavoritesCallback(any())).thenReturn(true) + assertThat(underTest.resolveActivity()).isEqualTo(ControlsActivity::class.java) + } + + @Test + fun testResolveActivityNotSeedingNoFavoritesNoPanels_ControlsProviderSelectorActivity() { + whenever(controlsController.addSeedingFavoritesCallback(any())).thenReturn(false) + whenever(controlsController.getFavorites()).thenReturn(emptyList()) + + val selectedItems = + listOf( + SelectedItem.StructureItem( + StructureInfo(ComponentName.unflattenFromString("pkg/.cls1"), "a", ArrayList()) + ), + ) + sharedPreferences + .edit() + .putString("controls_component", selectedItems[0].componentName.flattenToString()) + .putString("controls_structure", selectedItems[0].name.toString()) + .commit() + + assertThat(underTest.resolveActivity()) + .isEqualTo(ControlsProviderSelectorActivity::class.java) + } + + @Test + fun testResolveActivityNotSeedingNoDefaultNoFavoritesPanel_ControlsActivity() { + val panel = SelectedItem.PanelItem("App name", ComponentName("pkg", "cls")) + val activity = ComponentName("pkg", "activity") + val csi = ControlsServiceInfo(panel.componentName, panel.appName, activity) + whenever(controlsController.addSeedingFavoritesCallback(any())).thenReturn(true) + whenever(controlsController.getFavorites()).thenReturn(emptyList()) + whenever(controlsListingController.getCurrentServices()).thenReturn(listOf(csi)) + + assertThat(underTest.resolveActivity()).isEqualTo(ControlsActivity::class.java) + } + private fun setUpPanel(panel: SelectedItem.PanelItem): ControlsServiceInfo { val activity = ComponentName("pkg", "activity") sharedPreferences diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/ui/PanelTaskViewControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/ui/PanelTaskViewControllerTest.kt index 5cd2ace4604a..de04ef810dd0 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/controls/ui/PanelTaskViewControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/controls/ui/PanelTaskViewControllerTest.kt @@ -75,6 +75,7 @@ class PanelTaskViewControllerTest : SysuiTestCase() { uiExecutor.execute(it.arguments[0] as Runnable) true } + whenever(activityContext.resources).thenReturn(context.resources) uiExecutor = FakeExecutor(FakeSystemClock()) diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayStateControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayStateControllerTest.java index c21c7a2aacbe..ee989d1ddab6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayStateControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayStateControllerTest.java @@ -63,7 +63,7 @@ public class DreamOverlayStateControllerTest extends SysuiTestCase { @Test public void testStateChange_overlayActive() { final DreamOverlayStateController stateController = new DreamOverlayStateController( - mExecutor); + mExecutor, true); stateController.addCallback(mCallback); stateController.setOverlayActive(true); mExecutor.runAllReady(); @@ -85,7 +85,7 @@ public class DreamOverlayStateControllerTest extends SysuiTestCase { @Test public void testCallback() { final DreamOverlayStateController stateController = new DreamOverlayStateController( - mExecutor); + mExecutor, true); stateController.addCallback(mCallback); // Add complication and verify callback is notified. @@ -111,7 +111,7 @@ public class DreamOverlayStateControllerTest extends SysuiTestCase { @Test public void testNotifyOnCallbackAdd() { final DreamOverlayStateController stateController = - new DreamOverlayStateController(mExecutor); + new DreamOverlayStateController(mExecutor, true); stateController.addComplication(mComplication); mExecutor.runAllReady(); @@ -123,9 +123,24 @@ public class DreamOverlayStateControllerTest extends SysuiTestCase { } @Test + public void testNotifyOnCallbackAddOverlayDisabled() { + final DreamOverlayStateController stateController = + new DreamOverlayStateController(mExecutor, false); + + stateController.addComplication(mComplication); + mExecutor.runAllReady(); + + // Verify callback occurs on add when an overlay is already present. + stateController.addCallback(mCallback); + mExecutor.runAllReady(); + verify(mCallback, never()).onComplicationsChanged(); + } + + + @Test public void testComplicationFilteringWhenShouldShowComplications() { final DreamOverlayStateController stateController = - new DreamOverlayStateController(mExecutor); + new DreamOverlayStateController(mExecutor, true); stateController.setShouldShowComplications(true); final Complication alwaysAvailableComplication = Mockito.mock(Complication.class); @@ -165,7 +180,7 @@ public class DreamOverlayStateControllerTest extends SysuiTestCase { @Test public void testComplicationFilteringWhenShouldHideComplications() { final DreamOverlayStateController stateController = - new DreamOverlayStateController(mExecutor); + new DreamOverlayStateController(mExecutor, true); stateController.setShouldShowComplications(true); final Complication alwaysAvailableComplication = Mockito.mock(Complication.class); @@ -212,7 +227,7 @@ public class DreamOverlayStateControllerTest extends SysuiTestCase { public void testComplicationWithNoTypeNotFiltered() { final Complication complication = Mockito.mock(Complication.class); final DreamOverlayStateController stateController = - new DreamOverlayStateController(mExecutor); + new DreamOverlayStateController(mExecutor, true); stateController.addComplication(complication); mExecutor.runAllReady(); assertThat(stateController.getComplications(true).contains(complication)) @@ -222,7 +237,7 @@ public class DreamOverlayStateControllerTest extends SysuiTestCase { @Test public void testNotifyLowLightChanged() { final DreamOverlayStateController stateController = - new DreamOverlayStateController(mExecutor); + new DreamOverlayStateController(mExecutor, true); stateController.addCallback(mCallback); mExecutor.runAllReady(); @@ -238,7 +253,7 @@ public class DreamOverlayStateControllerTest extends SysuiTestCase { @Test public void testNotifyEntryAnimationsFinishedChanged() { final DreamOverlayStateController stateController = - new DreamOverlayStateController(mExecutor); + new DreamOverlayStateController(mExecutor, true); stateController.addCallback(mCallback); mExecutor.runAllReady(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/complication/ComplicationHostViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/dreams/complication/ComplicationHostViewControllerTest.java index b477592f8fbc..dcd8736711f6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/dreams/complication/ComplicationHostViewControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/dreams/complication/ComplicationHostViewControllerTest.java @@ -15,6 +15,8 @@ */ package com.android.systemui.dreams.complication; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; @@ -139,6 +141,21 @@ public class ComplicationHostViewControllerTest extends SysuiTestCase { } @Test + public void testMalformedComplicationAddition() { + final Observer<Collection<ComplicationViewModel>> observer = + captureComplicationViewModelsObserver(); + + // Add a complication and ensure it is added to the view. + final HashSet<ComplicationViewModel> complications = new HashSet<>( + Collections.singletonList(mComplicationViewModel)); + when(mViewHolder.getView()).thenReturn(null); + observer.onChanged(complications); + + verify(mLayoutEngine, never()).addComplication(any(), any(), any(), anyInt()); + + } + + @Test public void testNewComplicationsBeforeEntryAnimationsFinishSetToInvisible() { final Observer<Collection<ComplicationViewModel>> observer = captureComplicationViewModelsObserver(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/complication/DreamHomeControlsComplicationTest.java b/packages/SystemUI/tests/src/com/android/systemui/dreams/complication/DreamHomeControlsComplicationTest.java index e6d3a69593cd..89c728082cc5 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/dreams/complication/DreamHomeControlsComplicationTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/dreams/complication/DreamHomeControlsComplicationTest.java @@ -27,6 +27,7 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.content.ComponentName; import android.content.Context; import android.testing.AndroidTestingRunner; import android.view.View; @@ -54,6 +55,7 @@ import org.mockito.Captor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -147,6 +149,19 @@ public class DreamHomeControlsComplicationTest extends SysuiTestCase { } @Test + public void complicationAvailability_serviceAvailable_noFavorites_panel_addComplication() { + final DreamHomeControlsComplication.Registrant registrant = + new DreamHomeControlsComplication.Registrant(mComplication, + mDreamOverlayStateController, mControlsComponent); + registrant.start(); + + setHaveFavorites(false); + setServiceWithPanel(); + + verify(mDreamOverlayStateController).addComplication(mComplication); + } + + @Test public void complicationAvailability_serviceNotAvailable_haveFavorites_doNotAddComplication() { final DreamHomeControlsComplication.Registrant registrant = new DreamHomeControlsComplication.Registrant(mComplication, @@ -232,6 +247,15 @@ public class DreamHomeControlsComplicationTest extends SysuiTestCase { triggerControlsListingCallback(serviceInfos); } + private void setServiceWithPanel() { + final List<ControlsServiceInfo> serviceInfos = new ArrayList<>(); + ControlsServiceInfo csi = mock(ControlsServiceInfo.class); + serviceInfos.add(csi); + when(csi.getPanelActivity()).thenReturn(new ComponentName("a", "b")); + when(mControlsListingController.getCurrentServices()).thenReturn(serviceInfos); + triggerControlsListingCallback(serviceInfos); + } + private void setDreamOverlayActive(boolean value) { when(mDreamOverlayStateController.isOverlayActive()).thenReturn(value); verify(mDreamOverlayStateController).addCallback(mStateCallbackCaptor.capture()); diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java index 798839dcc1f6..804960dc3b18 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java @@ -168,6 +168,45 @@ public class KeyguardViewMediatorTest extends SysuiTestCase { } @Test + @TestableLooper.RunWithLooper(setAsMainLooper = true) + public void testOnStartedWakingUp_whileSleeping_ifWakeAndUnlocking_doesNotShowKeyguard() { + when(mLockPatternUtils.isLockScreenDisabled(anyInt())).thenReturn(false); + when(mLockPatternUtils.getPowerButtonInstantlyLocks(anyInt())).thenReturn(true); + mViewMediator.onSystemReady(); + TestableLooper.get(this).processAllMessages(); + + mViewMediator.setShowingLocked(false); + TestableLooper.get(this).processAllMessages(); + + mViewMediator.onStartedGoingToSleep(OFF_BECAUSE_OF_USER); + mViewMediator.onWakeAndUnlocking(); + mViewMediator.onStartedWakingUp(OFF_BECAUSE_OF_USER, false); + TestableLooper.get(this).processAllMessages(); + + assertFalse(mViewMediator.isShowingAndNotOccluded()); + verify(mKeyguardStateController, never()).notifyKeyguardState(eq(true), anyBoolean()); + } + + @Test + @TestableLooper.RunWithLooper(setAsMainLooper = true) + public void testOnStartedWakingUp_whileSleeping_ifNotWakeAndUnlocking_showsKeyguard() { + when(mLockPatternUtils.isLockScreenDisabled(anyInt())).thenReturn(false); + when(mLockPatternUtils.getPowerButtonInstantlyLocks(anyInt())).thenReturn(true); + mViewMediator.onSystemReady(); + TestableLooper.get(this).processAllMessages(); + + mViewMediator.setShowingLocked(false); + TestableLooper.get(this).processAllMessages(); + + mViewMediator.onStartedGoingToSleep(OFF_BECAUSE_OF_USER); + mViewMediator.onStartedWakingUp(OFF_BECAUSE_OF_USER, false); + + TestableLooper.get(this).processAllMessages(); + + assertTrue(mViewMediator.isShowingAndNotOccluded()); + } + + @Test public void testRegisterDumpable() { verify(mDumpManager).registerDumpable(KeyguardViewMediator.class.getName(), mViewMediator); verify(mStatusBarKeyguardViewManager, never()).setKeyguardGoingAwayState(anyBoolean()); diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/HomeControlsKeyguardQuickAffordanceConfigParameterizedStateTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/HomeControlsKeyguardQuickAffordanceConfigParameterizedStateTest.kt index 322014a61a73..f8cb40885d21 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/HomeControlsKeyguardQuickAffordanceConfigParameterizedStateTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/HomeControlsKeyguardQuickAffordanceConfigParameterizedStateTest.kt @@ -20,13 +20,14 @@ package com.android.systemui.keyguard.data.quickaffordance import androidx.test.filters.SmallTest import com.android.systemui.R import com.android.systemui.SysuiTestCase +import com.android.systemui.controls.ControlsServiceInfo import com.android.systemui.controls.controller.ControlsController import com.android.systemui.controls.dagger.ControlsComponent import com.android.systemui.controls.management.ControlsListingController import com.android.systemui.util.mockito.mock import com.android.systemui.util.mockito.whenever import com.google.common.truth.Truth.assertThat -import java.util.* +import java.util.Optional import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach @@ -50,20 +51,22 @@ class HomeControlsKeyguardQuickAffordanceConfigParameterizedStateTest : SysuiTes companion object { @Parameters( name = - "feature enabled = {0}, has favorites = {1}, has service infos = {2}, can show" + - " while locked = {3}, visibility is AVAILABLE {4} - expected visible = {5}" + "feature enabled = {0}, has favorites = {1}, has panels = {2}, " + + "has service infos = {3}, can show while locked = {4}, " + + "visibility is AVAILABLE {5} - expected visible = {6}" ) @JvmStatic fun data() = - (0 until 32) + (0 until 64) .map { combination -> arrayOf( - /* isFeatureEnabled= */ combination and 0b10000 != 0, - /* hasFavorites= */ combination and 0b01000 != 0, - /* hasServiceInfos= */ combination and 0b00100 != 0, - /* canShowWhileLocked= */ combination and 0b00010 != 0, - /* visibilityAvailable= */ combination and 0b00001 != 0, - /* isVisible= */ combination == 0b11111, + /* isFeatureEnabled= */ combination and 0b100000 != 0, + /* hasFavorites = */ combination and 0b010000 != 0, + /* hasPanels = */ combination and 0b001000 != 0, + /* hasServiceInfos= */ combination and 0b000100 != 0, + /* canShowWhileLocked= */ combination and 0b000010 != 0, + /* visibilityAvailable= */ combination and 0b000001 != 0, + /* isVisible= */ combination in setOf(0b111111, 0b110111, 0b101111), ) } .toList() @@ -72,6 +75,7 @@ class HomeControlsKeyguardQuickAffordanceConfigParameterizedStateTest : SysuiTes @Mock private lateinit var component: ControlsComponent @Mock private lateinit var controlsController: ControlsController @Mock private lateinit var controlsListingController: ControlsListingController + @Mock private lateinit var controlsServiceInfo: ControlsServiceInfo @Captor private lateinit var callbackCaptor: ArgumentCaptor<ControlsListingController.ControlsListingCallback> @@ -80,10 +84,11 @@ class HomeControlsKeyguardQuickAffordanceConfigParameterizedStateTest : SysuiTes @JvmField @Parameter(0) var isFeatureEnabled: Boolean = false @JvmField @Parameter(1) var hasFavorites: Boolean = false - @JvmField @Parameter(2) var hasServiceInfos: Boolean = false - @JvmField @Parameter(3) var canShowWhileLocked: Boolean = false - @JvmField @Parameter(4) var isVisibilityAvailable: Boolean = false - @JvmField @Parameter(5) var isVisibleExpected: Boolean = false + @JvmField @Parameter(2) var hasPanels: Boolean = false + @JvmField @Parameter(3) var hasServiceInfos: Boolean = false + @JvmField @Parameter(4) var canShowWhileLocked: Boolean = false + @JvmField @Parameter(5) var isVisibilityAvailable: Boolean = false + @JvmField @Parameter(6) var isVisibleExpected: Boolean = false @Before fun setUp() { @@ -93,10 +98,13 @@ class HomeControlsKeyguardQuickAffordanceConfigParameterizedStateTest : SysuiTes whenever(component.getControlsController()).thenReturn(Optional.of(controlsController)) whenever(component.getControlsListingController()) .thenReturn(Optional.of(controlsListingController)) + if (hasPanels) { + whenever(controlsServiceInfo.panelActivity).thenReturn(mock()) + } whenever(controlsListingController.getCurrentServices()) .thenReturn( if (hasServiceInfos) { - listOf(mock(), mock()) + listOf(controlsServiceInfo, mock()) } else { emptyList() } @@ -134,10 +142,15 @@ class HomeControlsKeyguardQuickAffordanceConfigParameterizedStateTest : SysuiTes val job = underTest.lockScreenState.onEach(values::add).launchIn(this) if (canShowWhileLocked) { + val serviceInfoMock: ControlsServiceInfo = mock { + if (hasPanels) { + whenever(panelActivity).thenReturn(mock()) + } + } verify(controlsListingController).addCallback(callbackCaptor.capture()) callbackCaptor.value.onServicesUpdated( if (hasServiceInfos) { - listOf(mock()) + listOf(serviceInfoMock) } else { emptyList() } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardBouncerRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardBouncerRepositoryTest.kt new file mode 100644 index 000000000000..9970a6796ed6 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardBouncerRepositoryTest.kt @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.keyguard.data.repository + +import androidx.test.filters.SmallTest +import com.android.keyguard.ViewMediatorCallback +import com.android.systemui.SysuiTestCase +import com.android.systemui.log.table.TableLogBuffer +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.test.TestCoroutineScope +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.JUnit4 +import org.mockito.Mock +import org.mockito.Mockito.verify +import org.mockito.MockitoAnnotations + +@SmallTest +@RunWith(JUnit4::class) +class KeyguardBouncerRepositoryTest : SysuiTestCase() { + + @Mock private lateinit var viewMediatorCallback: ViewMediatorCallback + @Mock private lateinit var bouncerLogger: TableLogBuffer + lateinit var underTest: KeyguardBouncerRepository + + @Before + fun setup() { + MockitoAnnotations.initMocks(this) + val testCoroutineScope = TestCoroutineScope() + underTest = + KeyguardBouncerRepository(viewMediatorCallback, testCoroutineScope, bouncerLogger) + } + + @Test + fun changingFlowValueTriggersLogging() = runBlocking { + underTest.setPrimaryHide(true) + verify(bouncerLogger).logChange("", "PrimaryBouncerHide", false) + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaControlPanelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaControlPanelTest.kt index fdef34449adf..b65f5cb51aaf 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaControlPanelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaControlPanelTest.kt @@ -214,6 +214,7 @@ public class MediaControlPanelTest : SysuiTestCase() { private val fakeFeatureFlag = FakeFeatureFlags().apply { this.set(Flags.UMO_SURFACE_RIPPLE, false) + this.set(Flags.UMO_TURBULENCE_NOISE, false) this.set(Flags.MEDIA_FALSING_PENALTY, true) } @@ -2062,6 +2063,26 @@ public class MediaControlPanelTest : SysuiTestCase() { assertThat(viewHolder.multiRippleView.ripples.size).isEqualTo(0) } + @Test + fun onButtonClick_turbulenceNoiseFlagEnabled_createsRipplesFinishedListener() { + fakeFeatureFlag.set(Flags.UMO_SURFACE_RIPPLE, true) + fakeFeatureFlag.set(Flags.UMO_TURBULENCE_NOISE, true) + + player.attachPlayer(viewHolder) + + assertThat(player.mRipplesFinishedListener).isNotNull() + } + + @Test + fun onButtonClick_turbulenceNoiseFlagDisabled_doesNotCreateRipplesFinishedListener() { + fakeFeatureFlag.set(Flags.UMO_SURFACE_RIPPLE, true) + fakeFeatureFlag.set(Flags.UMO_TURBULENCE_NOISE, false) + + player.attachPlayer(viewHolder) + + assertThat(player.mRipplesFinishedListener).isNull() + } + private fun getScrubbingChangeListener(): SeekBarViewModel.ScrubbingChangeListener = withArgCaptor { verify(seekBarViewModel).setScrubbingChangeListener(capture()) diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.kt index 9f28708a388e..5e082f686ea3 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.kt @@ -1,9 +1,12 @@ package com.android.systemui.qs +import android.content.res.Configuration import android.test.suitebuilder.annotation.SmallTest import android.testing.AndroidTestingRunner +import android.testing.TestableResources import com.android.internal.logging.MetricsLogger import com.android.internal.logging.UiEventLogger +import com.android.systemui.R import com.android.systemui.SysuiTestCase import com.android.systemui.dump.DumpManager import com.android.systemui.flags.FeatureFlags @@ -26,10 +29,11 @@ import org.mockito.ArgumentMatchers.anyBoolean import org.mockito.Mock import org.mockito.Mockito import org.mockito.Mockito.any +import org.mockito.Mockito.never import org.mockito.Mockito.reset import org.mockito.Mockito.verify -import org.mockito.Mockito.`when` as whenever import org.mockito.MockitoAnnotations +import org.mockito.Mockito.`when` as whenever @SmallTest @RunWith(AndroidTestingRunner::class) @@ -54,8 +58,11 @@ class QSPanelControllerTest : SysuiTestCase() { @Mock private lateinit var otherTile: QSTile @Mock private lateinit var statusBarKeyguardViewManager: StatusBarKeyguardViewManager @Mock private lateinit var featureFlags: FeatureFlags + @Mock private lateinit var configuration: Configuration + @Mock private lateinit var pagedTileLayout: PagedTileLayout private lateinit var controller: QSPanelController + private val testableResources: TestableResources = mContext.orCreateTestableResources @Before fun setUp() { @@ -63,7 +70,9 @@ class QSPanelControllerTest : SysuiTestCase() { whenever(brightnessSliderFactory.create(any(), any())).thenReturn(brightnessSlider) whenever(brightnessControllerFactory.create(any())).thenReturn(brightnessController) - whenever(qsPanel.resources).thenReturn(mContext.orCreateTestableResources.resources) + testableResources.addOverride(R.bool.config_use_split_notification_shade, false) + whenever(qsPanel.resources).thenReturn(testableResources.resources) + whenever(qsPanel.getOrCreateTileLayout()).thenReturn(pagedTileLayout) whenever(statusBarKeyguardViewManager.isPrimaryBouncerInTransit()).thenReturn(false) whenever(qsPanel.setListening(anyBoolean())).then { whenever(qsPanel.isListening).thenReturn(it.getArgument(0)) @@ -121,4 +130,15 @@ class QSPanelControllerTest : SysuiTestCase() { whenever(statusBarKeyguardViewManager.isPrimaryBouncerInTransit()).thenReturn(false) assertThat(controller.isBouncerInTransit()).isEqualTo(false) } + + @Test + fun configurationChange_onlySplitShadeConfigChanges_tileAreRedistributed() { + testableResources.addOverride(R.bool.config_use_split_notification_shade, false) + controller.mOnConfigurationChangedListener.onConfigurationChange(configuration) + verify(pagedTileLayout, never()).forceTilesRedistribution() + + testableResources.addOverride(R.bool.config_use_split_notification_shade, true) + controller.mOnConfigurationChangedListener.onConfigurationChange(configuration) + verify(pagedTileLayout).forceTilesRedistribution() + } } 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 8c8fdc5bf126..be0ad6e19a02 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 @@ -84,7 +84,8 @@ public class InternetDialogTest extends SysuiTestCase { private View mDialogView; private View mSubTitle; private LinearLayout mEthernet; - private LinearLayout mMobileDataToggle; + private LinearLayout mMobileDataLayout; + private Switch mMobileToggleSwitch; private LinearLayout mWifiToggle; private Switch mWifiToggleSwitch; private TextView mWifiToggleSummary; @@ -133,7 +134,8 @@ 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); + mMobileDataLayout = mDialogView.requireViewById(R.id.mobile_network_layout); + mMobileToggleSwitch = mDialogView.requireViewById(R.id.mobile_toggle); mWifiToggle = mDialogView.requireViewById(R.id.turn_on_wifi_layout); mWifiToggleSwitch = mDialogView.requireViewById(R.id.wifi_toggle); mWifiToggleSummary = mDialogView.requireViewById(R.id.wifi_toggle_summary); @@ -234,7 +236,7 @@ public class InternetDialogTest extends SysuiTestCase { mInternetDialog.updateDialog(true); - assertThat(mMobileDataToggle.getVisibility()).isEqualTo(View.GONE); + assertThat(mMobileDataLayout.getVisibility()).isEqualTo(View.GONE); } @Test @@ -246,7 +248,7 @@ public class InternetDialogTest extends SysuiTestCase { mInternetDialog.updateDialog(true); - assertThat(mMobileDataToggle.getVisibility()).isEqualTo(View.GONE); + assertThat(mMobileDataLayout.getVisibility()).isEqualTo(View.GONE); // Carrier network should be visible if airplane mode ON and Wi-Fi is ON. when(mInternetDialogController.isCarrierNetworkActive()).thenReturn(true); @@ -255,7 +257,7 @@ public class InternetDialogTest extends SysuiTestCase { mInternetDialog.updateDialog(true); - assertThat(mMobileDataToggle.getVisibility()).isEqualTo(View.VISIBLE); + assertThat(mMobileDataLayout.getVisibility()).isEqualTo(View.VISIBLE); } @Test @@ -265,7 +267,7 @@ public class InternetDialogTest extends SysuiTestCase { mInternetDialog.updateDialog(true); - assertThat(mMobileDataToggle.getVisibility()).isEqualTo(View.GONE); + assertThat(mMobileDataLayout.getVisibility()).isEqualTo(View.GONE); } @Test @@ -277,7 +279,7 @@ public class InternetDialogTest extends SysuiTestCase { mInternetDialog.updateDialog(true); - assertThat(mMobileDataToggle.getVisibility()).isEqualTo(View.VISIBLE); + assertThat(mMobileDataLayout.getVisibility()).isEqualTo(View.VISIBLE); assertThat(mAirplaneModeSummaryText.getVisibility()).isEqualTo(View.VISIBLE); } @@ -314,6 +316,30 @@ public class InternetDialogTest extends SysuiTestCase { } @Test + public void updateDialog_mobileDataIsEnabled_checkMobileDataSwitch() { + doReturn(true).when(mInternetDialogController).hasActiveSubId(); + when(mInternetDialogController.isCarrierNetworkActive()).thenReturn(true); + when(mInternetDialogController.isMobileDataEnabled()).thenReturn(true); + mMobileToggleSwitch.setChecked(false); + + mInternetDialog.updateDialog(true); + + assertThat(mMobileToggleSwitch.isChecked()).isTrue(); + } + + @Test + public void updateDialog_mobileDataIsNotChanged_checkMobileDataSwitch() { + doReturn(true).when(mInternetDialogController).hasActiveSubId(); + when(mInternetDialogController.isCarrierNetworkActive()).thenReturn(true); + when(mInternetDialogController.isMobileDataEnabled()).thenReturn(false); + mMobileToggleSwitch.setChecked(false); + + mInternetDialog.updateDialog(true); + + assertThat(mMobileToggleSwitch.isChecked()).isFalse(); + } + + @Test public void updateDialog_wifiOnAndHasInternetWifi_showConnectedWifi() { mInternetDialog.dismissDialog(); doReturn(true).when(mInternetDialogController).hasActiveSubId(); @@ -694,7 +720,7 @@ public class InternetDialogTest extends SysuiTestCase { private void setNetworkVisible(boolean ethernetVisible, boolean mobileDataVisible, boolean connectedWifiVisible) { mEthernet.setVisibility(ethernetVisible ? View.VISIBLE : View.GONE); - mMobileDataToggle.setVisibility(mobileDataVisible ? View.VISIBLE : View.GONE); + mMobileDataLayout.setVisibility(mobileDataVisible ? View.VISIBLE : View.GONE); mConnectedWifi.setVisibility(connectedWifiVisible ? View.VISIBLE : View.GONE); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorTest.kt index aa1114b8736e..cb4f119dce0a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorTest.kt @@ -23,6 +23,7 @@ import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.dump.logcatLogBuffer import com.android.systemui.statusbar.NotificationRemoteInputManager +import com.android.systemui.statusbar.notification.NotifPipelineFlags import com.android.systemui.statusbar.notification.collection.GroupEntryBuilder import com.android.systemui.statusbar.notification.collection.NotifPipeline import com.android.systemui.statusbar.notification.collection.NotificationEntry @@ -38,6 +39,7 @@ import com.android.systemui.statusbar.notification.collection.provider.LaunchFul import com.android.systemui.statusbar.notification.collection.render.NodeController import com.android.systemui.statusbar.notification.interruption.HeadsUpViewBinder import com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProvider +import com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProvider.FullScreenIntentDecision import com.android.systemui.statusbar.notification.row.NotifBindPipeline.BindCallback import com.android.systemui.statusbar.phone.NotificationGroupTestHelper import com.android.systemui.statusbar.policy.HeadsUpManager @@ -88,6 +90,7 @@ class HeadsUpCoordinatorTest : SysuiTestCase() { private val mEndLifetimeExtension: OnEndLifetimeExtensionCallback = mock() private val mHeaderController: NodeController = mock() private val mLaunchFullScreenIntentProvider: LaunchFullScreenIntentProvider = mock() + private val mFlags: NotifPipelineFlags = mock() private lateinit var mEntry: NotificationEntry private lateinit var mGroupSummary: NotificationEntry @@ -113,6 +116,7 @@ class HeadsUpCoordinatorTest : SysuiTestCase() { mNotificationInterruptStateProvider, mRemoteInputManager, mLaunchFullScreenIntentProvider, + mFlags, mHeaderController, mExecutor) mCoordinator.attach(mNotifPipeline) @@ -246,14 +250,14 @@ class HeadsUpCoordinatorTest : SysuiTestCase() { @Test fun testOnEntryAdded_shouldFullScreen() { - setShouldFullScreen(mEntry) + setShouldFullScreen(mEntry, FullScreenIntentDecision.FSI_EXPECTED_NOT_TO_HUN) mCollectionListener.onEntryAdded(mEntry) verify(mLaunchFullScreenIntentProvider).launchFullScreenIntent(mEntry) } @Test fun testOnEntryAdded_shouldNotFullScreen() { - setShouldFullScreen(mEntry, should = false) + setShouldFullScreen(mEntry, FullScreenIntentDecision.NO_FULL_SCREEN_INTENT) mCollectionListener.onEntryAdded(mEntry) verify(mLaunchFullScreenIntentProvider, never()).launchFullScreenIntent(any()) } @@ -805,15 +809,96 @@ class HeadsUpCoordinatorTest : SysuiTestCase() { verify(mHeadsUpManager, never()).showNotification(any()) } + @Test + fun testOnRankingApplied_noFSIOnUpdateWhenFlagOff() { + // Ensure the feature flag is off + whenever(mFlags.fsiOnDNDUpdate()).thenReturn(false) + + // GIVEN that mEntry was previously suppressed from full-screen only by DND + setShouldFullScreen(mEntry, FullScreenIntentDecision.NO_FSI_SUPPRESSED_ONLY_BY_DND) + mCollectionListener.onEntryAdded(mEntry) + + // and it is then updated to allow full screen + setShouldFullScreen(mEntry, FullScreenIntentDecision.FSI_DEVICE_NOT_INTERACTIVE) + whenever(mNotifPipeline.allNotifs).thenReturn(listOf(mEntry)) + mCollectionListener.onRankingApplied() + + // THEN it should not full screen because the feature is off + verify(mLaunchFullScreenIntentProvider, never()).launchFullScreenIntent(mEntry) + } + + @Test + fun testOnRankingApplied_updateToFullScreen() { + // Turn on the feature + whenever(mFlags.fsiOnDNDUpdate()).thenReturn(true) + + // GIVEN that mEntry was previously suppressed from full-screen only by DND + setShouldFullScreen(mEntry, FullScreenIntentDecision.NO_FSI_SUPPRESSED_ONLY_BY_DND) + mCollectionListener.onEntryAdded(mEntry) + + // at this point, it should not have full screened + verify(mLaunchFullScreenIntentProvider, never()).launchFullScreenIntent(mEntry) + + // and it is then updated to allow full screen AND HUN + setShouldFullScreen(mEntry, FullScreenIntentDecision.FSI_DEVICE_NOT_INTERACTIVE) + setShouldHeadsUp(mEntry) + whenever(mNotifPipeline.allNotifs).thenReturn(listOf(mEntry)) + mCollectionListener.onRankingApplied() + mBeforeTransformGroupsListener.onBeforeTransformGroups(listOf(mEntry)) + mBeforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(mEntry)) + + // THEN it should full screen but it should NOT HUN + verify(mLaunchFullScreenIntentProvider).launchFullScreenIntent(mEntry) + verify(mHeadsUpViewBinder, never()).bindHeadsUpView(any(), any()) + verify(mHeadsUpManager, never()).showNotification(any()) + } + + @Test + fun testOnRankingApplied_noFSIWhenAlsoSuppressedForOtherReasons() { + // Feature on + whenever(mFlags.fsiOnDNDUpdate()).thenReturn(true) + + // GIVEN that mEntry is suppressed by DND (functionally), but not *only* DND + setShouldFullScreen(mEntry, FullScreenIntentDecision.NO_FSI_SUPPRESSED_BY_DND) + mCollectionListener.onEntryAdded(mEntry) + + // and it is updated to full screen later + setShouldFullScreen(mEntry, FullScreenIntentDecision.FSI_DEVICE_NOT_INTERACTIVE) + mCollectionListener.onRankingApplied() + + // THEN it should still not full screen because something else was blocking it before + verify(mLaunchFullScreenIntentProvider, never()).launchFullScreenIntent(mEntry) + } + + @Test + fun testOnRankingApplied_noFSIWhenTooOld() { + // Feature on + whenever(mFlags.fsiOnDNDUpdate()).thenReturn(true) + + // GIVEN that mEntry is suppressed only by DND + setShouldFullScreen(mEntry, FullScreenIntentDecision.NO_FSI_SUPPRESSED_ONLY_BY_DND) + mCollectionListener.onEntryAdded(mEntry) + + // but it's >10s old + mCoordinator.addForFSIReconsideration(mEntry, mSystemClock.currentTimeMillis() - 10000) + + // and it is updated to full screen later + setShouldFullScreen(mEntry, FullScreenIntentDecision.FSI_EXPECTED_NOT_TO_HUN) + mCollectionListener.onRankingApplied() + + // THEN it should still not full screen because it's too old + verify(mLaunchFullScreenIntentProvider, never()).launchFullScreenIntent(mEntry) + } + private fun setShouldHeadsUp(entry: NotificationEntry, should: Boolean = true) { whenever(mNotificationInterruptStateProvider.shouldHeadsUp(entry)).thenReturn(should) whenever(mNotificationInterruptStateProvider.checkHeadsUp(eq(entry), any())) .thenReturn(should) } - private fun setShouldFullScreen(entry: NotificationEntry, should: Boolean = true) { - whenever(mNotificationInterruptStateProvider.shouldLaunchFullScreenIntentWhenAdded(entry)) - .thenReturn(should) + private fun setShouldFullScreen(entry: NotificationEntry, decision: FullScreenIntentDecision) { + whenever(mNotificationInterruptStateProvider.getFullScreenIntentDecision(entry)) + .thenReturn(decision) } private fun finishBind(entry: NotificationEntry) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java index d1957acb9fd5..74f8c61ad186 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java @@ -89,8 +89,6 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { @Mock private KeyguardViewMediator mKeyguardViewMediator; @Mock - private ScrimController mScrimController; - @Mock private BiometricUnlockController.BiometricModeListener mBiometricModeListener; @Mock private ShadeController mShadeController; @@ -140,7 +138,7 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { when(mVibratorHelper.hasVibrator()).thenReturn(true); mDependency.injectTestDependency(NotificationMediaManager.class, mMediaManager); mBiometricUnlockController = new BiometricUnlockController(mDozeScrimController, - mKeyguardViewMediator, mScrimController, mShadeController, + mKeyguardViewMediator, mShadeController, mNotificationShadeWindowController, mKeyguardStateController, mHandler, mUpdateMonitor, res.getResources(), mKeyguardBypassController, mMetricsLogger, mDumpManager, mPowerManager, mLogger, diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java index 9727b6c5eb83..e5e5d94ab595 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java @@ -16,6 +16,8 @@ package com.android.systemui.statusbar.phone; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.isNull; import static org.mockito.Mockito.mock; @@ -33,12 +35,14 @@ import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; import com.android.systemui.flags.FeatureFlags; +import com.android.systemui.flags.Flags; import com.android.systemui.plugins.DarkIconDispatcher; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.shade.NotificationPanelViewController; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.HeadsUpStatusBarView; import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator; +import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; import com.android.systemui.statusbar.notification.row.NotificationTestHelper; import com.android.systemui.statusbar.notification.stack.NotificationRoundnessManager; @@ -64,7 +68,9 @@ public class HeadsUpAppearanceControllerTest extends SysuiTestCase { mock(NotificationPanelViewController.class); private final DarkIconDispatcher mDarkIconDispatcher = mock(DarkIconDispatcher.class); private HeadsUpAppearanceController mHeadsUpAppearanceController; - private ExpandableNotificationRow mFirst; + private NotificationTestHelper mTestHelper; + private ExpandableNotificationRow mRow; + private NotificationEntry mEntry; private HeadsUpStatusBarView mHeadsUpStatusBarView; private HeadsUpManagerPhone mHeadsUpManager; private View mOperatorNameView; @@ -79,11 +85,12 @@ public class HeadsUpAppearanceControllerTest extends SysuiTestCase { @Before public void setUp() throws Exception { allowTestableLooperAsMainThread(); - NotificationTestHelper testHelper = new NotificationTestHelper( + mTestHelper = new NotificationTestHelper( mContext, mDependency, TestableLooper.get(this)); - mFirst = testHelper.createRow(); + mRow = mTestHelper.createRow(); + mEntry = mRow.getEntry(); mHeadsUpStatusBarView = new HeadsUpStatusBarView(mContext, mock(View.class), mock(TextView.class)); mHeadsUpManager = mock(HeadsUpManagerPhone.class); @@ -95,6 +102,7 @@ public class HeadsUpAppearanceControllerTest extends SysuiTestCase { mCommandQueue = mock(CommandQueue.class); mNotificationRoundnessManager = mock(NotificationRoundnessManager.class); mFeatureFlag = mock(FeatureFlags.class); + when(mFeatureFlag.isEnabled(Flags.USE_ROUNDNESS_SOURCETYPES)).thenReturn(true); mHeadsUpAppearanceController = new HeadsUpAppearanceController( mock(NotificationIconAreaController.class), mHeadsUpManager, @@ -116,60 +124,60 @@ public class HeadsUpAppearanceControllerTest extends SysuiTestCase { @Test public void testShowinEntryUpdated() { - mFirst.setPinned(true); + mRow.setPinned(true); when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(true); - when(mHeadsUpManager.getTopEntry()).thenReturn(mFirst.getEntry()); - mHeadsUpAppearanceController.onHeadsUpPinned(mFirst.getEntry()); - Assert.assertEquals(mFirst.getEntry(), mHeadsUpStatusBarView.getShowingEntry()); + when(mHeadsUpManager.getTopEntry()).thenReturn(mEntry); + mHeadsUpAppearanceController.onHeadsUpPinned(mEntry); + assertEquals(mRow.getEntry(), mHeadsUpStatusBarView.getShowingEntry()); - mFirst.setPinned(false); + mRow.setPinned(false); when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(false); - mHeadsUpAppearanceController.onHeadsUpUnPinned(mFirst.getEntry()); - Assert.assertEquals(null, mHeadsUpStatusBarView.getShowingEntry()); + mHeadsUpAppearanceController.onHeadsUpUnPinned(mEntry); + assertEquals(null, mHeadsUpStatusBarView.getShowingEntry()); } @Test public void testShownUpdated() { - mFirst.setPinned(true); + mRow.setPinned(true); when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(true); - when(mHeadsUpManager.getTopEntry()).thenReturn(mFirst.getEntry()); - mHeadsUpAppearanceController.onHeadsUpPinned(mFirst.getEntry()); - Assert.assertTrue(mHeadsUpAppearanceController.isShown()); + when(mHeadsUpManager.getTopEntry()).thenReturn(mEntry); + mHeadsUpAppearanceController.onHeadsUpPinned(mEntry); + assertTrue(mHeadsUpAppearanceController.isShown()); - mFirst.setPinned(false); + mRow.setPinned(false); when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(false); - mHeadsUpAppearanceController.onHeadsUpUnPinned(mFirst.getEntry()); + mHeadsUpAppearanceController.onHeadsUpUnPinned(mEntry); Assert.assertFalse(mHeadsUpAppearanceController.isShown()); } @Test public void testHeaderUpdated() { - mFirst.setPinned(true); + mRow.setPinned(true); when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(true); - when(mHeadsUpManager.getTopEntry()).thenReturn(mFirst.getEntry()); - mHeadsUpAppearanceController.onHeadsUpPinned(mFirst.getEntry()); - Assert.assertEquals(mFirst.getHeaderVisibleAmount(), 0.0f, 0.0f); + when(mHeadsUpManager.getTopEntry()).thenReturn(mEntry); + mHeadsUpAppearanceController.onHeadsUpPinned(mEntry); + assertEquals(mRow.getHeaderVisibleAmount(), 0.0f, 0.0f); - mFirst.setPinned(false); + mRow.setPinned(false); when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(false); - mHeadsUpAppearanceController.onHeadsUpUnPinned(mFirst.getEntry()); - Assert.assertEquals(mFirst.getHeaderVisibleAmount(), 1.0f, 0.0f); + mHeadsUpAppearanceController.onHeadsUpUnPinned(mEntry); + assertEquals(mRow.getHeaderVisibleAmount(), 1.0f, 0.0f); } @Test public void testOperatorNameViewUpdated() { mHeadsUpAppearanceController.setAnimationsEnabled(false); - mFirst.setPinned(true); + mRow.setPinned(true); when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(true); - when(mHeadsUpManager.getTopEntry()).thenReturn(mFirst.getEntry()); - mHeadsUpAppearanceController.onHeadsUpPinned(mFirst.getEntry()); - Assert.assertEquals(View.INVISIBLE, mOperatorNameView.getVisibility()); + when(mHeadsUpManager.getTopEntry()).thenReturn(mEntry); + mHeadsUpAppearanceController.onHeadsUpPinned(mEntry); + assertEquals(View.INVISIBLE, mOperatorNameView.getVisibility()); - mFirst.setPinned(false); + mRow.setPinned(false); when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(false); - mHeadsUpAppearanceController.onHeadsUpUnPinned(mFirst.getEntry()); - Assert.assertEquals(View.VISIBLE, mOperatorNameView.getVisibility()); + mHeadsUpAppearanceController.onHeadsUpUnPinned(mEntry); + assertEquals(View.VISIBLE, mOperatorNameView.getVisibility()); } @Test @@ -196,8 +204,8 @@ public class HeadsUpAppearanceControllerTest extends SysuiTestCase { new Clock(mContext, null), Optional.empty()); - Assert.assertEquals(expandedHeight, newController.mExpandedHeight, 0.0f); - Assert.assertEquals(appearFraction, newController.mAppearFraction, 0.0f); + assertEquals(expandedHeight, newController.mExpandedHeight, 0.0f); + assertEquals(appearFraction, newController.mAppearFraction, 0.0f); } @Test @@ -215,4 +223,68 @@ public class HeadsUpAppearanceControllerTest extends SysuiTestCase { verify(mPanelView).setHeadsUpAppearanceController(isNull()); verify(mStackScrollerController).removeOnExpandedHeightChangedListener(any()); } + + @Test + public void testPulsingRoundness_onUpdateHeadsUpAndPulsingRoundness() { + // Pulsing: Enable flag and dozing + when(mNotificationRoundnessManager.shouldRoundNotificationPulsing()).thenReturn(true); + when(mTestHelper.getStatusBarStateController().isDozing()).thenReturn(true); + + // Pulsing: Enabled + mRow.setHeadsUp(true); + mHeadsUpAppearanceController.updateHeadsUpAndPulsingRoundness(mEntry); + + String debugString = mRow.getRoundableState().debugString(); + assertEquals( + "If Pulsing is enabled, roundness should be set to 1. Value: " + debugString, + /* expected = */ 1, + /* actual = */ mRow.getTopRoundness(), + /* delta = */ 0.001 + ); + assertTrue(debugString.contains("Pulsing")); + + // Pulsing: Disabled + mRow.setHeadsUp(false); + mHeadsUpAppearanceController.updateHeadsUpAndPulsingRoundness(mEntry); + + assertEquals( + "If Pulsing is disabled, roundness should be set to 0. Value: " + + mRow.getRoundableState().debugString(), + /* expected = */ 0, + /* actual = */ mRow.getTopRoundness(), + /* delta = */ 0.001 + ); + } + + @Test + public void testPulsingRoundness_onHeadsUpStateChanged() { + // Pulsing: Enable flag and dozing + when(mNotificationRoundnessManager.shouldRoundNotificationPulsing()).thenReturn(true); + when(mTestHelper.getStatusBarStateController().isDozing()).thenReturn(true); + + // Pulsing: Enabled + mEntry.setHeadsUp(true); + mHeadsUpAppearanceController.onHeadsUpStateChanged(mEntry, true); + + String debugString = mRow.getRoundableState().debugString(); + assertEquals( + "If Pulsing is enabled, roundness should be set to 1. Value: " + debugString, + /* expected = */ 1, + /* actual = */ mRow.getTopRoundness(), + /* delta = */ 0.001 + ); + assertTrue(debugString.contains("Pulsing")); + + // Pulsing: Disabled + mEntry.setHeadsUp(false); + mHeadsUpAppearanceController.onHeadsUpStateChanged(mEntry, false); + + assertEquals( + "If Pulsing is disabled, roundness should be set to 0. Value: " + + mRow.getRoundableState().debugString(), + /* expected = */ 0, + /* actual = */ mRow.getTopRoundness(), + /* delta = */ 0.001 + ); + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/view/ModernStatusBarWifiViewTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/view/ModernStatusBarWifiViewTest.kt index 3d9fd961222f..22c0ea117b66 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/view/ModernStatusBarWifiViewTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/view/ModernStatusBarWifiViewTest.kt @@ -16,11 +16,14 @@ package com.android.systemui.statusbar.pipeline.wifi.ui.view +import android.content.res.ColorStateList +import android.graphics.Rect import android.testing.AndroidTestingRunner import android.testing.TestableLooper import android.testing.TestableLooper.RunWithLooper import android.testing.ViewUtils import android.view.View +import android.widget.ImageView import androidx.test.filters.SmallTest import com.android.systemui.R import com.android.systemui.SysuiTestCase @@ -44,6 +47,7 @@ import com.android.systemui.statusbar.pipeline.wifi.domain.interactor.WifiIntera import com.android.systemui.statusbar.pipeline.wifi.shared.WifiConstants import com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel.LocationBasedWifiViewModel import com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel.WifiViewModel +import com.android.systemui.util.mockito.whenever import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -229,10 +233,43 @@ class ModernStatusBarWifiViewTest : SysuiTestCase() { ViewUtils.detachView(view) } + @Test + fun onDarkChanged_iconHasNewColor() { + whenever(statusBarPipelineFlags.useWifiDebugColoring()).thenReturn(false) + val view = ModernStatusBarWifiView.constructAndBind(context, SLOT_NAME, viewModel) + ViewUtils.attachView(view) + testableLooper.processAllMessages() + + val areas = ArrayList(listOf(Rect(0, 0, 1000, 1000))) + val color = 0x12345678 + view.onDarkChanged(areas, 1.0f, color) + testableLooper.processAllMessages() + + assertThat(view.getIconView().imageTintList).isEqualTo(ColorStateList.valueOf(color)) + } + + @Test + fun setStaticDrawableColor_iconHasNewColor() { + whenever(statusBarPipelineFlags.useWifiDebugColoring()).thenReturn(false) + val view = ModernStatusBarWifiView.constructAndBind(context, SLOT_NAME, viewModel) + ViewUtils.attachView(view) + testableLooper.processAllMessages() + + val color = 0x23456789 + view.setStaticDrawableColor(color) + testableLooper.processAllMessages() + + assertThat(view.getIconView().imageTintList).isEqualTo(ColorStateList.valueOf(color)) + } + private fun View.getIconGroupView(): View { return this.requireViewById(R.id.wifi_group) } + private fun View.getIconView(): ImageView { + return this.requireViewById(R.id.wifi_signal) + } + private fun View.getDotView(): View { return this.requireViewById(R.id.status_bar_dot) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/surfaceeffects/ripple/MultiRippleControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/surfaceeffects/ripple/MultiRippleControllerTest.kt index 0d19ab1db390..056e3863f70e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/surfaceeffects/ripple/MultiRippleControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/surfaceeffects/ripple/MultiRippleControllerTest.kt @@ -101,4 +101,52 @@ class MultiRippleControllerTest : SysuiTestCase() { assertThat(multiRippleView.ripples.size).isEqualTo(0) } } + + @Test + fun play_onFinishesAllRipples_triggersRipplesFinished() { + var isTriggered = false + val listener = + object : MultiRippleController.Companion.RipplesFinishedListener { + override fun onRipplesFinish() { + isTriggered = true + } + } + multiRippleController.addRipplesFinishedListener(listener) + + fakeExecutor.execute { + multiRippleController.play(RippleAnimation(RippleAnimationConfig(duration = 1000))) + multiRippleController.play(RippleAnimation(RippleAnimationConfig(duration = 2000))) + + assertThat(multiRippleView.ripples.size).isEqualTo(2) + + fakeSystemClock.advanceTime(2000L) + + assertThat(multiRippleView.ripples.size).isEqualTo(0) + assertThat(isTriggered).isTrue() + } + } + + @Test + fun play_notAllRipplesFinished_doesNotTriggerRipplesFinished() { + var isTriggered = false + val listener = + object : MultiRippleController.Companion.RipplesFinishedListener { + override fun onRipplesFinish() { + isTriggered = true + } + } + multiRippleController.addRipplesFinishedListener(listener) + + fakeExecutor.execute { + multiRippleController.play(RippleAnimation(RippleAnimationConfig(duration = 1000))) + multiRippleController.play(RippleAnimation(RippleAnimationConfig(duration = 2000))) + + assertThat(multiRippleView.ripples.size).isEqualTo(2) + + fakeSystemClock.advanceTime(1000L) + + assertThat(multiRippleView.ripples.size).isEqualTo(1) + assertThat(isTriggered).isFalse() + } + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/surfaceeffects/ripple/MultiRippleViewTest.kt b/packages/SystemUI/tests/src/com/android/systemui/surfaceeffects/ripple/MultiRippleViewTest.kt deleted file mode 100644 index 2024d53b0212..000000000000 --- a/packages/SystemUI/tests/src/com/android/systemui/surfaceeffects/ripple/MultiRippleViewTest.kt +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2022 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.android.systemui.surfaceeffects.ripple - -import android.testing.AndroidTestingRunner -import androidx.test.filters.SmallTest -import com.android.systemui.SysuiTestCase -import com.android.systemui.util.concurrency.FakeExecutor -import com.android.systemui.util.time.FakeSystemClock -import com.google.common.truth.Truth.assertThat -import org.junit.Test -import org.junit.runner.RunWith - -@SmallTest -@RunWith(AndroidTestingRunner::class) -class MultiRippleViewTest : SysuiTestCase() { - private val fakeSystemClock = FakeSystemClock() - // FakeExecutor is needed to run animator. - private val fakeExecutor = FakeExecutor(fakeSystemClock) - - @Test - fun onRippleFinishes_triggersRippleFinished() { - val multiRippleView = MultiRippleView(context, null) - val multiRippleController = MultiRippleController(multiRippleView) - val rippleAnimationConfig = RippleAnimationConfig(duration = 1000L) - - var isTriggered = false - val listener = - object : MultiRippleView.Companion.RipplesFinishedListener { - override fun onRipplesFinish() { - isTriggered = true - } - } - multiRippleView.addRipplesFinishedListener(listener) - - fakeExecutor.execute { - val rippleAnimation = RippleAnimation(rippleAnimationConfig) - multiRippleController.play(rippleAnimation) - - fakeSystemClock.advanceTime(rippleAnimationConfig.duration) - - assertThat(isTriggered).isTrue() - } - } -} diff --git a/packages/SystemUI/tests/src/com/android/systemui/wallpapers/ImageWallpaperTest.java b/packages/SystemUI/tests/src/com/android/systemui/wallpapers/ImageWallpaperTest.java index 30dc0d20600f..0fdcb95b3eed 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/wallpapers/ImageWallpaperTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/wallpapers/ImageWallpaperTest.java @@ -19,15 +19,13 @@ package com.android.systemui.wallpapers; import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertWithMessage; -import static org.hamcrest.Matchers.greaterThanOrEqualTo; +import static org.hamcrest.Matchers.equalTo; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.eq; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -36,19 +34,13 @@ import static org.mockito.hamcrest.MockitoHamcrest.intThat; import android.app.WallpaperManager; import android.content.Context; -import android.content.res.Configuration; -import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.ColorSpace; import android.graphics.Rect; import android.hardware.display.DisplayManager; -import android.hardware.display.DisplayManagerGlobal; -import android.os.Handler; import android.os.UserHandle; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; -import android.view.Display; -import android.view.DisplayInfo; import android.view.Surface; import android.view.SurfaceHolder; import android.view.WindowManager; @@ -57,28 +49,21 @@ import android.view.WindowMetrics; import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; -import com.android.systemui.flags.FeatureFlags; import com.android.systemui.util.concurrency.FakeExecutor; import com.android.systemui.util.time.FakeSystemClock; -import com.android.systemui.wallpapers.gl.ImageWallpaperRenderer; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import java.util.concurrent.CountDownLatch; - @SmallTest @RunWith(AndroidTestingRunner.class) @TestableLooper.RunWithLooper public class ImageWallpaperTest extends SysuiTestCase { private static final int LOW_BMP_WIDTH = 128; private static final int LOW_BMP_HEIGHT = 128; - private static final int INVALID_BMP_WIDTH = 1; - private static final int INVALID_BMP_HEIGHT = 1; private static final int DISPLAY_WIDTH = 1920; private static final int DISPLAY_HEIGHT = 1080; @@ -99,19 +84,9 @@ public class ImageWallpaperTest extends SysuiTestCase { @Mock private Bitmap mWallpaperBitmap; - private int mBitmapWidth = 1; - private int mBitmapHeight = 1; - - @Mock - private Handler mHandler; - @Mock - private FeatureFlags mFeatureFlags; - FakeSystemClock mFakeSystemClock = new FakeSystemClock(); FakeExecutor mFakeBackgroundExecutor = new FakeExecutor(mFakeSystemClock); - private CountDownLatch mEventCountdown; - @Before public void setUp() throws Exception { allowTestableLooperAsMainThread(); @@ -131,12 +106,8 @@ public class ImageWallpaperTest extends SysuiTestCase { // set up bitmap when(mWallpaperBitmap.getColorSpace()).thenReturn(ColorSpace.get(ColorSpace.Named.SRGB)); when(mWallpaperBitmap.getConfig()).thenReturn(Bitmap.Config.ARGB_8888); - when(mWallpaperBitmap.getWidth()).thenReturn(mBitmapWidth); - when(mWallpaperBitmap.getHeight()).thenReturn(mBitmapHeight); // set up wallpaper manager - when(mWallpaperManager.peekBitmapDimensions()) - .thenReturn(new Rect(0, 0, mBitmapWidth, mBitmapHeight)); when(mWallpaperManager.getBitmapAsUser(eq(UserHandle.USER_CURRENT), anyBoolean())) .thenReturn(mWallpaperBitmap); when(mMockContext.getSystemService(WallpaperManager.class)).thenReturn(mWallpaperManager); @@ -144,104 +115,62 @@ public class ImageWallpaperTest extends SysuiTestCase { // set up surface when(mSurfaceHolder.getSurface()).thenReturn(mSurface); doNothing().when(mSurface).hwuiDestroy(); - - // TODO remove code below. Outdated, used in only in old GL tests (that are ignored) - Resources resources = mock(Resources.class); - when(resources.getConfiguration()).thenReturn(mock(Configuration.class)); - when(mMockContext.getResources()).thenReturn(resources); - DisplayInfo displayInfo = new DisplayInfo(); - displayInfo.logicalWidth = DISPLAY_WIDTH; - displayInfo.logicalHeight = DISPLAY_HEIGHT; - when(mMockContext.getDisplay()).thenReturn( - new Display(mock(DisplayManagerGlobal.class), 0, displayInfo, (Resources) null)); - } - - private void setBitmapDimensions(int bitmapWidth, int bitmapHeight) { - mBitmapWidth = bitmapWidth; - mBitmapHeight = bitmapHeight; - } - - private ImageWallpaper createImageWallpaper() { - return new ImageWallpaper(mFeatureFlags, mFakeBackgroundExecutor) { - @Override - public Engine onCreateEngine() { - return new GLEngine(mHandler) { - @Override - public Context getDisplayContext() { - return mMockContext; - } - - @Override - public SurfaceHolder getSurfaceHolder() { - return mSurfaceHolder; - } - - @Override - public void setFixedSizeAllowed(boolean allowed) { - super.setFixedSizeAllowed(allowed); - assertWithMessage("mFixedSizeAllowed should be true").that( - allowed).isTrue(); - mEventCountdown.countDown(); - } - }; - } - }; } @Test - @Ignore public void testBitmapWallpaper_normal() { // Will use a image wallpaper with dimensions DISPLAY_WIDTH x DISPLAY_WIDTH. // Then we expect the surface size will be also DISPLAY_WIDTH x DISPLAY_WIDTH. - verifySurfaceSize(DISPLAY_WIDTH /* bmpWidth */, - DISPLAY_WIDTH /* bmpHeight */, - DISPLAY_WIDTH /* surfaceWidth */, - DISPLAY_WIDTH /* surfaceHeight */); + int bitmapSide = DISPLAY_WIDTH; + testSurfaceHelper( + bitmapSide /* bitmapWidth */, + bitmapSide /* bitmapHeight */, + bitmapSide /* expectedSurfaceWidth */, + bitmapSide /* expectedSurfaceHeight */); } @Test - @Ignore public void testBitmapWallpaper_low_resolution() { // Will use a image wallpaper with dimensions BMP_WIDTH x BMP_HEIGHT. // Then we expect the surface size will be also BMP_WIDTH x BMP_HEIGHT. - verifySurfaceSize(LOW_BMP_WIDTH /* bmpWidth */, - LOW_BMP_HEIGHT /* bmpHeight */, - LOW_BMP_WIDTH /* surfaceWidth */, - LOW_BMP_HEIGHT /* surfaceHeight */); + testSurfaceHelper(LOW_BMP_WIDTH /* bitmapWidth */, + LOW_BMP_HEIGHT /* bitmapHeight */, + LOW_BMP_WIDTH /* expectedSurfaceWidth */, + LOW_BMP_HEIGHT /* expectedSurfaceHeight */); } @Test - @Ignore public void testBitmapWallpaper_too_small() { - // Will use a image wallpaper with dimensions INVALID_BMP_WIDTH x INVALID_BMP_HEIGHT. - // Then we expect the surface size will be also MIN_SURFACE_WIDTH x MIN_SURFACE_HEIGHT. - verifySurfaceSize(INVALID_BMP_WIDTH /* bmpWidth */, - INVALID_BMP_HEIGHT /* bmpHeight */, - ImageWallpaper.GLEngine.MIN_SURFACE_WIDTH /* surfaceWidth */, - ImageWallpaper.GLEngine.MIN_SURFACE_HEIGHT /* surfaceHeight */); - } - private void verifySurfaceSize(int bmpWidth, int bmpHeight, - int surfaceWidth, int surfaceHeight) { - ImageWallpaper.GLEngine wallpaperEngine = - (ImageWallpaper.GLEngine) createImageWallpaper().onCreateEngine(); + // test that the surface is always at least MIN_SURFACE_WIDTH x MIN_SURFACE_HEIGHT + testMinSurfaceHelper(8, 8); + testMinSurfaceHelper(100, 2000); + testMinSurfaceHelper(200, 1); + } - ImageWallpaper.GLEngine engineSpy = spy(wallpaperEngine); + @Test + public void testLoadDrawAndUnloadBitmap() { + setBitmapDimensions(LOW_BMP_WIDTH, LOW_BMP_HEIGHT); - setBitmapDimensions(bmpWidth, bmpHeight); + ImageWallpaper.CanvasEngine spyEngine = getSpyEngine(); + spyEngine.onCreate(mSurfaceHolder); + spyEngine.onSurfaceRedrawNeeded(mSurfaceHolder); + assertThat(mFakeBackgroundExecutor.numPending()).isAtLeast(1); - ImageWallpaperRenderer renderer = new ImageWallpaperRenderer(mMockContext); - doReturn(renderer).when(engineSpy).getRendererInstance(); - engineSpy.onCreate(engineSpy.getSurfaceHolder()); + int n = 0; + while (mFakeBackgroundExecutor.numPending() >= 1) { + n++; + assertThat(n).isAtMost(10); + mFakeBackgroundExecutor.runNextReady(); + mFakeSystemClock.advanceTime(1000); + } - verify(mSurfaceHolder, times(1)).setFixedSize(surfaceWidth, surfaceHeight); - assertWithMessage("setFixedSizeAllowed should have been called.").that( - mEventCountdown.getCount()).isEqualTo(0); + verify(spyEngine, times(1)).drawFrameOnCanvas(mWallpaperBitmap); + assertThat(spyEngine.isBitmapLoaded()).isFalse(); } - - private ImageWallpaper createImageWallpaperCanvas() { - return new ImageWallpaper(mFeatureFlags, mFakeBackgroundExecutor) { + private ImageWallpaper createImageWallpaper() { + return new ImageWallpaper(mFakeBackgroundExecutor) { @Override public Engine onCreateEngine() { return new CanvasEngine() { @@ -267,7 +196,7 @@ public class ImageWallpaperTest extends SysuiTestCase { } private ImageWallpaper.CanvasEngine getSpyEngine() { - ImageWallpaper imageWallpaper = createImageWallpaperCanvas(); + ImageWallpaper imageWallpaper = createImageWallpaper(); ImageWallpaper.CanvasEngine engine = (ImageWallpaper.CanvasEngine) imageWallpaper.onCreateEngine(); ImageWallpaper.CanvasEngine spyEngine = spy(engine); @@ -280,48 +209,32 @@ public class ImageWallpaperTest extends SysuiTestCase { return spyEngine; } - @Test - public void testMinSurface() { - - // test that the surface is always at least MIN_SURFACE_WIDTH x MIN_SURFACE_HEIGHT - testMinSurfaceHelper(8, 8); - testMinSurfaceHelper(100, 2000); - testMinSurfaceHelper(200, 1); + private void setBitmapDimensions(int bitmapWidth, int bitmapHeight) { + when(mWallpaperManager.peekBitmapDimensions()) + .thenReturn(new Rect(0, 0, bitmapWidth, bitmapHeight)); + when(mWallpaperBitmap.getWidth()).thenReturn(bitmapWidth); + when(mWallpaperBitmap.getHeight()).thenReturn(bitmapHeight); } private void testMinSurfaceHelper(int bitmapWidth, int bitmapHeight) { + testSurfaceHelper(bitmapWidth, bitmapHeight, + Math.max(ImageWallpaper.CanvasEngine.MIN_SURFACE_WIDTH, bitmapWidth), + Math.max(ImageWallpaper.CanvasEngine.MIN_SURFACE_HEIGHT, bitmapHeight)); + } + + private void testSurfaceHelper(int bitmapWidth, int bitmapHeight, + int expectedSurfaceWidth, int expectedSurfaceHeight) { clearInvocations(mSurfaceHolder); setBitmapDimensions(bitmapWidth, bitmapHeight); - ImageWallpaper imageWallpaper = createImageWallpaperCanvas(); + ImageWallpaper imageWallpaper = createImageWallpaper(); ImageWallpaper.CanvasEngine engine = (ImageWallpaper.CanvasEngine) imageWallpaper.onCreateEngine(); engine.onCreate(mSurfaceHolder); verify(mSurfaceHolder, times(1)).setFixedSize( - intThat(greaterThanOrEqualTo(ImageWallpaper.CanvasEngine.MIN_SURFACE_WIDTH)), - intThat(greaterThanOrEqualTo(ImageWallpaper.CanvasEngine.MIN_SURFACE_HEIGHT))); - } - - @Test - public void testLoadDrawAndUnloadBitmap() { - setBitmapDimensions(LOW_BMP_WIDTH, LOW_BMP_HEIGHT); - - ImageWallpaper.CanvasEngine spyEngine = getSpyEngine(); - spyEngine.onCreate(mSurfaceHolder); - spyEngine.onSurfaceRedrawNeeded(mSurfaceHolder); - assertThat(mFakeBackgroundExecutor.numPending()).isAtLeast(1); - - int n = 0; - while (mFakeBackgroundExecutor.numPending() >= 1) { - n++; - assertThat(n).isAtMost(10); - mFakeBackgroundExecutor.runNextReady(); - mFakeSystemClock.advanceTime(1000); - } - - verify(spyEngine, times(1)).drawFrameOnCanvas(mWallpaperBitmap); - assertThat(spyEngine.isBitmapLoaded()).isFalse(); + intThat(equalTo(expectedSurfaceWidth)), + intThat(equalTo(expectedSurfaceHeight))); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/wallpapers/canvas/WallpaperLocalColorExtractorTest.java b/packages/SystemUI/tests/src/com/android/systemui/wallpapers/WallpaperLocalColorExtractorTest.java index 7e8ffeb7f9e1..fc5f78228f2b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/wallpapers/canvas/WallpaperLocalColorExtractorTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/wallpapers/WallpaperLocalColorExtractorTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.systemui.wallpapers.canvas; +package com.android.systemui.wallpapers; import static com.google.common.truth.Truth.assertThat; diff --git a/packages/SystemUI/tests/src/com/android/systemui/wallpapers/gl/EglHelperTest.java b/packages/SystemUI/tests/src/com/android/systemui/wallpapers/gl/EglHelperTest.java deleted file mode 100644 index a42badeb228f..000000000000 --- a/packages/SystemUI/tests/src/com/android/systemui/wallpapers/gl/EglHelperTest.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright (C) 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.wallpapers.gl; - -import static com.google.common.truth.Truth.assertThat; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.atMost; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import android.graphics.PixelFormat; -import android.testing.AndroidTestingRunner; -import android.view.Surface; -import android.view.SurfaceControl; -import android.view.SurfaceHolder; -import android.view.SurfaceSession; - -import androidx.test.filters.SmallTest; - -import com.android.systemui.SysuiTestCase; - -import org.junit.After; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.ArgumentCaptor; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.mockito.Spy; - -@SmallTest -@RunWith(AndroidTestingRunner.class) -@Ignore -public class EglHelperTest extends SysuiTestCase { - - @Spy - private EglHelper mEglHelper; - - @Mock - private SurfaceHolder mSurfaceHolder; - - @Before - public void setUp() throws Exception { - MockitoAnnotations.initMocks(this); - prepareSurface(); - } - - @After - public void tearDown() { - mSurfaceHolder.getSurface().destroy(); - mSurfaceHolder = null; - } - - private void prepareSurface() { - final SurfaceSession session = new SurfaceSession(); - final SurfaceControl control = new SurfaceControl.Builder(session) - .setName("Test") - .setBufferSize(100, 100) - .setFormat(PixelFormat.RGB_888) - .build(); - final Surface surface = new Surface(); - surface.copyFrom(control); - when(mSurfaceHolder.getSurface()).thenReturn(surface); - assertThat(mSurfaceHolder.getSurface()).isNotNull(); - assertThat(mSurfaceHolder.getSurface().isValid()).isTrue(); - } - - @Test - public void testInit_normal() { - mEglHelper.init(mSurfaceHolder, false /* wideColorGamut */); - assertThat(mEglHelper.hasEglDisplay()).isTrue(); - assertThat(mEglHelper.hasEglContext()).isTrue(); - assertThat(mEglHelper.hasEglSurface()).isTrue(); - verify(mEglHelper).askCreatingEglWindowSurface( - any(SurfaceHolder.class), eq(null), anyInt()); - } - - @Test - public void testInit_wide_gamut() { - // In EglHelper, EGL_GL_COLORSPACE_DISPLAY_P3_PASSTHROUGH_EXT = 0x3490; - doReturn(0x3490).when(mEglHelper).getWcgCapability(); - // In EglHelper, KHR_GL_COLOR_SPACE = "EGL_KHR_gl_colorspace"; - doReturn(true).when(mEglHelper).checkExtensionCapability("EGL_KHR_gl_colorspace"); - ArgumentCaptor<int[]> ac = ArgumentCaptor.forClass(int[].class); - // {EGL_GL_COLORSPACE_KHR, EGL_GL_COLORSPACE_DISPLAY_P3_PASSTHROUGH_EXT, EGL_NONE} - final int[] expectedArgument = new int[] {0x309D, 0x3490, 0x3038}; - - mEglHelper.init(mSurfaceHolder, true /* wideColorGamut */); - verify(mEglHelper) - .askCreatingEglWindowSurface(any(SurfaceHolder.class), ac.capture(), anyInt()); - assertThat(ac.getValue()).isNotNull(); - assertThat(ac.getValue()).isEqualTo(expectedArgument); - } - - @Test - @Ignore - public void testFinish_shouldNotCrash() { - mEglHelper.terminateEglDisplay(); - assertThat(mEglHelper.hasEglDisplay()).isFalse(); - assertThat(mEglHelper.hasEglSurface()).isFalse(); - assertThat(mEglHelper.hasEglContext()).isFalse(); - - mEglHelper.finish(); - verify(mEglHelper, never()).destroyEglContext(); - verify(mEglHelper, never()).destroyEglSurface(); - verify(mEglHelper, atMost(1)).terminateEglDisplay(); - } -} diff --git a/packages/SystemUI/tests/src/com/android/systemui/wallpapers/gl/ImageWallpaperRendererTest.java b/packages/SystemUI/tests/src/com/android/systemui/wallpapers/gl/ImageWallpaperRendererTest.java deleted file mode 100644 index 89b2222df69e..000000000000 --- a/packages/SystemUI/tests/src/com/android/systemui/wallpapers/gl/ImageWallpaperRendererTest.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (C) 2020 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.wallpapers.gl; - -import static com.google.common.truth.Truth.assertThat; - -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.spy; - -import android.app.WallpaperManager; -import android.app.WallpaperManager.ColorManagementProxy; -import android.graphics.Bitmap; -import android.graphics.ColorSpace; -import android.testing.AndroidTestingRunner; -import android.testing.TestableLooper; - -import androidx.test.filters.SmallTest; - -import com.android.systemui.SysuiTestCase; - -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.io.IOException; -import java.util.HashSet; -import java.util.Set; - -@SmallTest -@RunWith(AndroidTestingRunner.class) -@TestableLooper.RunWithLooper(setAsMainLooper = true) -@Ignore -public class ImageWallpaperRendererTest extends SysuiTestCase { - - private WallpaperManager mWpmSpy; - - @Before - public void setUp() throws Exception { - final WallpaperManager wpm = mContext.getSystemService(WallpaperManager.class); - mWpmSpy = spy(wpm); - mContext.addMockSystemService(WallpaperManager.class, mWpmSpy); - } - - @Test - public void testWcgContent() throws IOException { - final Bitmap srgbBitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888); - final Bitmap p3Bitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888, - false /* hasAlpha */, ColorSpace.get(ColorSpace.Named.DISPLAY_P3)); - - final ColorManagementProxy proxy = new ColorManagementProxy(mContext); - final ColorManagementProxy cmProxySpy = spy(proxy); - final Set<ColorSpace> supportedWideGamuts = new HashSet<>(); - supportedWideGamuts.add(ColorSpace.get(ColorSpace.Named.DISPLAY_P3)); - - try { - doReturn(true).when(mWpmSpy).shouldEnableWideColorGamut(); - doReturn(cmProxySpy).when(mWpmSpy).getColorManagementProxy(); - doReturn(supportedWideGamuts).when(cmProxySpy).getSupportedColorSpaces(); - - mWpmSpy.setBitmap(p3Bitmap); - ImageWallpaperRenderer rendererP3 = new ImageWallpaperRenderer(mContext); - rendererP3.reportSurfaceSize(); - assertThat(rendererP3.isWcgContent()).isTrue(); - - mWpmSpy.setBitmap(srgbBitmap); - ImageWallpaperRenderer renderer = new ImageWallpaperRenderer(mContext); - assertThat(renderer.isWcgContent()).isFalse(); - } finally { - srgbBitmap.recycle(); - p3Bitmap.recycle(); - } - } - -} diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index b7b332621e7f..1ea09849cf61 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -3211,6 +3211,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService return isPackageDeviceAdmin(packageName, UserHandle.USER_ALL); } + // TODO(b/261957226): centralise this logic in DPM boolean isPackageDeviceAdmin(String packageName, int userId) { final IDevicePolicyManager dpm = getDevicePolicyManager(); try { @@ -3237,6 +3238,9 @@ public class PackageManagerService implements PackageSender, TestUtilityService if (dpm.packageHasActiveAdmins(packageName, users[i])) { return true; } + if (isDeviceManagementRoleHolder(packageName, users[i])) { + return true; + } } } } catch (RemoteException e) { @@ -3244,6 +3248,24 @@ public class PackageManagerService implements PackageSender, TestUtilityService return false; } + private boolean isDeviceManagementRoleHolder(String packageName, int userId) { + return Objects.equals(packageName, getDevicePolicyManagementRoleHolderPackageName(userId)); + } + + @Nullable + private String getDevicePolicyManagementRoleHolderPackageName(int userId) { + return Binder.withCleanCallingIdentity(() -> { + RoleManager roleManager = mContext.getSystemService(RoleManager.class); + List<String> roleHolders = + roleManager.getRoleHoldersAsUser( + RoleManager.ROLE_DEVICE_POLICY_MANAGEMENT, UserHandle.of(userId)); + if (roleHolders.isEmpty()) { + return null; + } + return roleHolders.get(0); + }); + } + /** Returns the device policy manager interface. */ private IDevicePolicyManager getDevicePolicyManager() { if (mDevicePolicyManager == null) { diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java index 15ba760dbca3..714be185c972 100644 --- a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java +++ b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java @@ -41,6 +41,7 @@ import android.compat.annotation.ChangeId; import android.compat.annotation.EnabledSince; import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.ComponentInfo; @@ -1133,9 +1134,14 @@ public class PackageManagerServiceUtils { continue; } - final boolean match = comp.getIntents().stream().anyMatch( - f -> IntentResolver.intentMatchesFilter(f.getIntentFilter(), intent, - resolvedType)); + boolean match = false; + for (int j = 0, size = comp.getIntents().size(); j < size; ++j) { + IntentFilter intentFilter = comp.getIntents().get(j).getIntentFilter(); + if (IntentResolver.intentMatchesFilter(intentFilter, intent, resolvedType)) { + match = true; + break; + } + } if (!match) { Slog.w(TAG, "Intent does not match component's intent filter: " + intent); Slog.w(TAG, "Access blocked: " + comp.getComponentName()); diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java index dd870a8905cc..79a4acf55fef 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java @@ -599,6 +599,13 @@ public class WallpaperManagerService extends IWallpaperManager.Stub * for display. */ void generateCrop(WallpaperData wallpaper) { + TimingsTraceAndSlog t = new TimingsTraceAndSlog(TAG); + t.traceBegin("WPMS.generateCrop"); + generateCropInternal(wallpaper); + t.traceEnd(); + } + + private void generateCropInternal(WallpaperData wallpaper) { boolean success = false; // Only generate crop for default display. diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index cdc8c017b823..e639866a6bab 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -671,7 +671,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A private boolean mCurrentLaunchCanTurnScreenOn = true; /** Whether our surface was set to be showing in the last call to {@link #prepareSurfaces} */ - private boolean mLastSurfaceShowing = true; + private boolean mLastSurfaceShowing; /** * The activity is opaque and fills the entire space of this task. @@ -1239,8 +1239,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A pw.println(prefix + "supportsEnterPipOnTaskSwitch: " + supportsEnterPipOnTaskSwitch); } - if (info.getMaxAspectRatio() != 0) { - pw.println(prefix + "maxAspectRatio=" + info.getMaxAspectRatio()); + if (getMaxAspectRatio() != 0) { + pw.println(prefix + "maxAspectRatio=" + getMaxAspectRatio()); } final float minAspectRatio = getMinAspectRatio(); if (minAspectRatio != 0) { @@ -1590,6 +1590,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A newParent.setResumedActivity(this, "onParentChanged"); mImeInsetsFrozenUntilStartInput = false; } + mLetterboxUiController.onActivityParentChanged(newParent); } if (rootTask != null && rootTask.topRunningActivity() == this) { @@ -5499,7 +5500,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // no animation but there will still be a transition set. // We still need to delay hiding the surface such that it // can be synchronized with showing the next surface in the transition. - if (!isVisible() && !delayed && !displayContent.mAppTransition.isTransitionSet()) { + if (!usingShellTransitions && !isVisible() && !delayed + && !displayContent.mAppTransition.isTransitionSet()) { SurfaceControl.openTransaction(); try { forAllWindows(win -> { @@ -7438,6 +7440,11 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } @Override + boolean showSurfaceOnCreation() { + return false; + } + + @Override void prepareSurfaces() { final boolean show = isVisible() || isAnimating(PARENTS, ANIMATION_TYPE_APP_TRANSITION | ANIMATION_TYPE_RECENTS); @@ -7676,6 +7683,15 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A @Configuration.Orientation @Override int getRequestedConfigurationOrientation(boolean forDisplay) { + if (mLetterboxUiController.hasInheritedOrientation()) { + final RootDisplayArea root = getRootDisplayArea(); + if (forDisplay && root != null && root.isOrientationDifferentFromDisplay()) { + return ActivityInfo.reverseOrientation( + mLetterboxUiController.getInheritedOrientation()); + } else { + return mLetterboxUiController.getInheritedOrientation(); + } + } if (mOrientation == SCREEN_ORIENTATION_BEHIND && task != null) { // We use Task here because we want to be consistent with what happens in // multi-window mode where other tasks orientations are ignored. @@ -7803,6 +7819,9 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A @Nullable CompatDisplayInsets getCompatDisplayInsets() { + if (mLetterboxUiController.hasInheritedLetterboxBehavior()) { + return mLetterboxUiController.getInheritedCompatDisplayInsets(); + } return mCompatDisplayInsets; } @@ -7885,6 +7904,10 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // TODO(b/36505427): Consider moving this method and similar ones to ConfigurationContainer. private void updateCompatDisplayInsets() { + if (mLetterboxUiController.hasInheritedLetterboxBehavior()) { + mCompatDisplayInsets = mLetterboxUiController.getInheritedCompatDisplayInsets(); + return; + } if (mCompatDisplayInsets != null || !shouldCreateCompatDisplayInsets()) { // The override configuration is set only once in size compatibility mode. return; @@ -7946,6 +7969,9 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A @Override float getCompatScale() { + if (mLetterboxUiController.hasInheritedLetterboxBehavior()) { + return mLetterboxUiController.getInheritedSizeCompatScale(); + } return hasSizeCompatBounds() ? mSizeCompatScale : super.getCompatScale(); } @@ -8055,6 +8081,16 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } /** + * @return The orientation to use to understand if reachability is enabled. + */ + @ActivityInfo.ScreenOrientation + int getOrientationForReachability() { + return mLetterboxUiController.hasInheritedLetterboxBehavior() + ? mLetterboxUiController.getInheritedOrientation() + : getRequestedConfigurationOrientation(); + } + + /** * Returns whether activity bounds are letterboxed. * * <p>Note that letterbox UI may not be shown even when this returns {@code true}. See {@link @@ -8094,6 +8130,10 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A if (!ignoreVisibility && !mVisibleRequested) { return APP_COMPAT_STATE_CHANGED__STATE__NOT_VISIBLE; } + // TODO(b/256564921): Investigate if we need new metrics for translucent activities + if (mLetterboxUiController.hasInheritedLetterboxBehavior()) { + return mLetterboxUiController.getInheritedAppCompatState(); + } if (mInSizeCompatModeForBounds) { return APP_COMPAT_STATE_CHANGED__STATE__LETTERBOXED_FOR_SIZE_COMPAT_MODE; } @@ -8564,6 +8604,11 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } private boolean isInSizeCompatModeForBounds(final Rect appBounds, final Rect containerBounds) { + if (mLetterboxUiController.hasInheritedLetterboxBehavior()) { + // To avoid wrong app behaviour, we decided to disable SCM when a translucent activity + // is letterboxed. + return false; + } final int appWidth = appBounds.width(); final int appHeight = appBounds.height(); final int containerAppWidth = containerBounds.width(); @@ -8584,10 +8629,11 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // The rest of the condition is that only one side is smaller than the container, but it // still needs to exclude the cases where the size is limited by the fixed aspect ratio. - if (info.getMaxAspectRatio() > 0) { + final float maxAspectRatio = getMaxAspectRatio(); + if (maxAspectRatio > 0) { final float aspectRatio = (0.5f + Math.max(appWidth, appHeight)) / Math.min(appWidth, appHeight); - if (aspectRatio >= info.getMaxAspectRatio()) { + if (aspectRatio >= maxAspectRatio) { // The current size has reached the max aspect ratio. return false; } @@ -8809,7 +8855,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // TODO(b/36505427): Consider moving this method and similar ones to ConfigurationContainer. private boolean applyAspectRatio(Rect outBounds, Rect containingAppBounds, Rect containingBounds, float desiredAspectRatio) { - final float maxAspectRatio = info.getMaxAspectRatio(); + final float maxAspectRatio = getMaxAspectRatio(); final Task rootTask = getRootTask(); final float minAspectRatio = getMinAspectRatio(); final TaskFragment organizedTf = getOrganizedTaskFragment(); @@ -8916,6 +8962,9 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A * Returns the min aspect ratio of this activity. */ float getMinAspectRatio() { + if (mLetterboxUiController.hasInheritedLetterboxBehavior()) { + return mLetterboxUiController.getInheritedMinAspectRatio(); + } if (info.applicationInfo == null) { return info.getMinAspectRatio(); } @@ -8960,11 +9009,18 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A && parent.getWindowConfiguration().getWindowingMode() == WINDOWING_MODE_FULLSCREEN; } + float getMaxAspectRatio() { + if (mLetterboxUiController.hasInheritedLetterboxBehavior()) { + return mLetterboxUiController.getInheritedMaxAspectRatio(); + } + return info.getMaxAspectRatio(); + } + /** * Returns true if the activity has maximum or minimum aspect ratio. */ private boolean hasFixedAspectRatio() { - return info.getMaxAspectRatio() != 0 || getMinAspectRatio() != 0; + return getMaxAspectRatio() != 0 || getMinAspectRatio() != 0; } /** diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index 4fa7095b3282..c6e0cd2846dc 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -209,8 +209,6 @@ class ActivityStarter { @VisibleForTesting ActivityRecord mMovedToTopActivity; - private ActivityInfo mNewTaskInfo; - private Intent mNewTaskIntent; private Task mSourceRootTask; private Task mTargetRootTask; // The task that the last activity was started into. We currently reset the actual start @@ -621,8 +619,6 @@ class ActivityStarter { mInTaskFragment = starter.mInTaskFragment; mAddingToTask = starter.mAddingToTask; - mNewTaskInfo = starter.mNewTaskInfo; - mNewTaskIntent = starter.mNewTaskIntent; mSourceRootTask = starter.mSourceRootTask; mTargetTask = starter.mTargetTask; @@ -1826,9 +1822,6 @@ class ActivityStarter { voiceSession, voiceInteractor, restrictedBgActivity); computeLaunchingTaskFlags(); - - computeSourceRootTask(); - mIntent.setFlags(mLaunchFlags); boolean dreamStopping = false; @@ -2479,8 +2472,6 @@ class ActivityStarter { mAddingToTaskFragment = null; mAddingToTask = false; - mNewTaskInfo = null; - mNewTaskIntent = null; mSourceRootTask = null; mTargetRootTask = null; @@ -2514,6 +2505,7 @@ class ActivityStarter { mOptions = options; mCallingUid = r.launchedFromUid; mSourceRecord = sourceRecord; + mSourceRootTask = mSourceRecord != null ? mSourceRecord.getRootTask() : null; mVoiceSession = voiceSession; mVoiceInteractor = voiceInteractor; mRestrictedBgActivity = restrictedBgActivity; @@ -2761,39 +2753,6 @@ class ActivityStarter { } } - private void computeSourceRootTask() { - if (mSourceRecord == null) { - mSourceRootTask = null; - return; - } - if (!mSourceRecord.finishing) { - mSourceRootTask = mSourceRecord.getRootTask(); - return; - } - - // If the source is finishing, we can't further count it as our source. This is because the - // task it is associated with may now be empty and on its way out, so we don't want to - // blindly throw it in to that task. Instead we will take the NEW_TASK flow and try to find - // a task for it. But save the task information so it can be used when creating the new task. - if ((mLaunchFlags & FLAG_ACTIVITY_NEW_TASK) == 0) { - Slog.w(TAG, "startActivity called from finishing " + mSourceRecord - + "; forcing " + "Intent.FLAG_ACTIVITY_NEW_TASK for: " + mIntent); - mLaunchFlags |= FLAG_ACTIVITY_NEW_TASK; - - // It is not guaranteed that the source record will have a task associated with it. - // For example, if this method is being called for processing a pending activity - // launch, it is possible that the activity has been removed from the task after the - // launch was enqueued. - final Task sourceTask = mSourceRecord.getTask(); - if (sourceTask == null || sourceTask.getTopNonFinishingActivity() == null) { - mNewTaskInfo = mSourceRecord.info; - mNewTaskIntent = sourceTask != null ? sourceTask.intent : null; - } - } - mSourceRecord = null; - mSourceRootTask = null; - } - /** * Decide whether the new activity should be inserted into an existing task. Returns null * if not or an ActivityRecord with the task into which the new activity should be added. @@ -2991,8 +2950,7 @@ class ActivityStarter { private void setNewTask(Task taskToAffiliate) { final boolean toTop = !mLaunchTaskBehind && !mAvoidMoveToFront; final Task task = mTargetRootTask.reuseOrCreateTask( - mNewTaskInfo != null ? mNewTaskInfo : mStartActivity.info, - mNewTaskIntent != null ? mNewTaskIntent : mIntent, mVoiceSession, + mStartActivity.info, mIntent, mVoiceSession, mVoiceInteractor, toTop, mStartActivity, mSourceRecord, mOptions); task.mTransitionController.collectExistenceChange(task); addOrReparentStartingActivity(task, "setTaskFromReuseOrCreateNewTask"); diff --git a/services/core/java/com/android/server/wm/LetterboxConfiguration.java b/services/core/java/com/android/server/wm/LetterboxConfiguration.java index c19353cb2676..127a7bf1c9a5 100644 --- a/services/core/java/com/android/server/wm/LetterboxConfiguration.java +++ b/services/core/java/com/android/server/wm/LetterboxConfiguration.java @@ -21,6 +21,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; import android.graphics.Color; +import android.provider.DeviceConfig; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; @@ -103,6 +104,10 @@ final class LetterboxConfiguration { final Context mContext; + // Responsible for the persistence of letterbox[Horizontal|Vertical]PositionMultiplier + @NonNull + private final LetterboxConfigurationPersister mLetterboxConfigurationPersister; + // Aspect ratio of letterbox for fixed orientation, values <= // MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO will be ignored. private float mFixedOrientationLetterboxAspectRatio; @@ -165,9 +170,12 @@ final class LetterboxConfiguration { // Whether using split screen aspect ratio as a default aspect ratio for unresizable apps. private boolean mIsSplitScreenAspectRatioForUnresizableAppsEnabled; - // Responsible for the persistence of letterbox[Horizontal|Vertical]PositionMultiplier - @NonNull - private final LetterboxConfigurationPersister mLetterboxConfigurationPersister; + // Whether letterboxing strategy is enabled for translucent activities. If {@value false} + // all the feature is disabled + private boolean mTranslucentLetterboxingEnabled; + + // Allows to enable letterboxing strategy for translucent activities ignoring flags. + private boolean mTranslucentLetterboxingOverrideEnabled; LetterboxConfiguration(Context systemUiContext) { this(systemUiContext, new LetterboxConfigurationPersister(systemUiContext, @@ -206,6 +214,8 @@ final class LetterboxConfiguration { R.dimen.config_letterboxDefaultMinAspectRatioForUnresizableApps)); mIsSplitScreenAspectRatioForUnresizableAppsEnabled = mContext.getResources().getBoolean( R.bool.config_letterboxIsSplitScreenAspectRatioForUnresizableAppsEnabled); + mTranslucentLetterboxingEnabled = mContext.getResources().getBoolean( + R.bool.config_letterboxIsEnabledForTranslucentActivities); mLetterboxConfigurationPersister = letterboxConfigurationPersister; mLetterboxConfigurationPersister.start(); } @@ -817,6 +827,32 @@ final class LetterboxConfiguration { R.bool.config_letterboxIsSplitScreenAspectRatioForUnresizableAppsEnabled); } + boolean isTranslucentLetterboxingEnabled() { + return mTranslucentLetterboxingOverrideEnabled || (mTranslucentLetterboxingEnabled + && isTranslucentLetterboxingAllowed()); + } + + void setTranslucentLetterboxingEnabled(boolean translucentLetterboxingEnabled) { + mTranslucentLetterboxingEnabled = translucentLetterboxingEnabled; + } + + void setTranslucentLetterboxingOverrideEnabled( + boolean translucentLetterboxingOverrideEnabled) { + mTranslucentLetterboxingOverrideEnabled = translucentLetterboxingOverrideEnabled; + setTranslucentLetterboxingEnabled(translucentLetterboxingOverrideEnabled); + } + + /** + * Resets whether we use the constraints override strategy for letterboxing when dealing + * with translucent activities {@link R.bool.config_letterboxIsEnabledForTranslucentActivities}. + */ + void resetTranslucentLetterboxingEnabled() { + final boolean newValue = mContext.getResources().getBoolean( + R.bool.config_letterboxIsEnabledForTranslucentActivities); + setTranslucentLetterboxingEnabled(newValue); + setTranslucentLetterboxingOverrideEnabled(false); + } + /** Calculates a new letterboxPositionForHorizontalReachability value and updates the store */ private void updatePositionForHorizontalReachability( Function<Integer, Integer> newHorizonalPositionFun) { @@ -839,4 +875,9 @@ final class LetterboxConfiguration { nextVerticalPosition); } + // TODO(b/262378106): Cache runtime flag and implement DeviceConfig.OnPropertiesChangedListener + static boolean isTranslucentLetterboxingAllowed() { + return DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_WINDOW_MANAGER, + "enable_translucent_activity_letterbox", false); + } } diff --git a/services/core/java/com/android/server/wm/LetterboxUiController.java b/services/core/java/com/android/server/wm/LetterboxUiController.java index bcea6f4db1dc..a53a5fc00b0c 100644 --- a/services/core/java/com/android/server/wm/LetterboxUiController.java +++ b/services/core/java/com/android/server/wm/LetterboxUiController.java @@ -17,6 +17,7 @@ package com.android.server.wm; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; +import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; import static android.content.res.Configuration.ORIENTATION_LANDSCAPE; import static android.content.res.Configuration.ORIENTATION_PORTRAIT; import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; @@ -27,6 +28,7 @@ import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANG import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANGED__LETTERBOX_POSITION__RIGHT; import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANGED__LETTERBOX_POSITION__TOP; import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANGED__LETTERBOX_POSITION__UNKNOWN_POSITION; +import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANGED__STATE__UNKNOWN; import static com.android.internal.util.FrameworkStatsLog.LETTERBOX_POSITION_CHANGED__POSITION_CHANGE__BOTTOM_TO_CENTER; import static com.android.internal.util.FrameworkStatsLog.LETTERBOX_POSITION_CHANGED__POSITION_CHANGE__CENTER_TO_BOTTOM; import static com.android.internal.util.FrameworkStatsLog.LETTERBOX_POSITION_CHANGED__POSITION_CHANGE__CENTER_TO_LEFT; @@ -82,13 +84,44 @@ final class LetterboxUiController { private static final String TAG = TAG_WITH_CLASS_NAME ? "LetterboxUiController" : TAG_ATM; + private static final float UNDEFINED_ASPECT_RATIO = 0f; + private final Point mTmpPoint = new Point(); private final LetterboxConfiguration mLetterboxConfiguration; + private final ActivityRecord mActivityRecord; + /* + * WindowContainerListener responsible to make translucent activities inherit + * constraints from the first opaque activity beneath them. It's null for not + * translucent activities. + */ + @Nullable + private WindowContainerListener mLetterboxConfigListener; + private boolean mShowWallpaperForLetterboxBackground; + // In case of transparent activities we might need to access the aspectRatio of the + // first opaque activity beneath. + private float mInheritedMinAspectRatio = UNDEFINED_ASPECT_RATIO; + private float mInheritedMaxAspectRatio = UNDEFINED_ASPECT_RATIO; + + @Configuration.Orientation + private int mInheritedOrientation = Configuration.ORIENTATION_UNDEFINED; + + // The app compat state for the opaque activity if any + private int mInheritedAppCompatState = APP_COMPAT_STATE_CHANGED__STATE__UNKNOWN; + + // If true it means that the opaque activity beneath a translucent one is in SizeCompatMode. + private boolean mIsInheritedInSizeCompatMode; + + // This is the SizeCompatScale of the opaque activity beneath a translucent one + private float mInheritedSizeCompatScale; + + // The CompatDisplayInsets of the opaque activity beneath the translucent one. + private ActivityRecord.CompatDisplayInsets mInheritedCompatDisplayInsets; + @Nullable private Letterbox mLetterbox; @@ -220,7 +253,9 @@ final class LetterboxUiController { : mActivityRecord.inMultiWindowMode() ? mActivityRecord.getTask().getBounds() : mActivityRecord.getRootTask().getParent().getBounds(); - mLetterbox.layout(spaceToFill, w.getFrame(), mTmpPoint); + final Rect innerFrame = hasInheritedLetterboxBehavior() + ? mActivityRecord.getWindowConfiguration().getBounds() : w.getFrame(); + mLetterbox.layout(spaceToFill, innerFrame, mTmpPoint); } else if (mLetterbox != null) { mLetterbox.hide(); } @@ -305,7 +340,9 @@ final class LetterboxUiController { } private void handleHorizontalDoubleTap(int x) { - if (!isHorizontalReachabilityEnabled() || mActivityRecord.isInTransition()) { + // TODO(b/260857308): Investigate if enabling reachability for translucent activity + if (hasInheritedLetterboxBehavior() || !isHorizontalReachabilityEnabled() + || mActivityRecord.isInTransition()) { return; } @@ -341,7 +378,9 @@ final class LetterboxUiController { } private void handleVerticalDoubleTap(int y) { - if (!isVerticalReachabilityEnabled() || mActivityRecord.isInTransition()) { + // TODO(b/260857308): Investigate if enabling reachability for translucent activity + if (hasInheritedLetterboxBehavior() || !isVerticalReachabilityEnabled() + || mActivityRecord.isInTransition()) { return; } @@ -390,7 +429,7 @@ final class LetterboxUiController { && parentConfiguration.windowConfiguration.getWindowingMode() == WINDOWING_MODE_FULLSCREEN && (parentConfiguration.orientation == ORIENTATION_LANDSCAPE - && mActivityRecord.getRequestedConfigurationOrientation() == ORIENTATION_PORTRAIT); + && mActivityRecord.getOrientationForReachability() == ORIENTATION_PORTRAIT); } private boolean isHorizontalReachabilityEnabled() { @@ -412,7 +451,7 @@ final class LetterboxUiController { && parentConfiguration.windowConfiguration.getWindowingMode() == WINDOWING_MODE_FULLSCREEN && (parentConfiguration.orientation == ORIENTATION_PORTRAIT - && mActivityRecord.getRequestedConfigurationOrientation() == ORIENTATION_LANDSCAPE); + && mActivityRecord.getOrientationForReachability() == ORIENTATION_LANDSCAPE); } private boolean isVerticalReachabilityEnabled() { @@ -576,9 +615,7 @@ final class LetterboxUiController { // Rounded corners should be displayed above the taskbar. bounds.bottom = Math.min(bounds.bottom, getTaskbarInsetsSource(mainWindow).getFrame().top); - if (mActivityRecord.inSizeCompatMode() && mActivityRecord.getCompatScale() < 1.0f) { - bounds.scale(1.0f / mActivityRecord.getCompatScale()); - } + scaleIfNeeded(bounds); } private int getInsetsStateCornerRadius( @@ -788,4 +825,144 @@ final class LetterboxUiController { w.mAttrs.insetsFlags.appearance ); } + + /** + * Handles translucent activities letterboxing inheriting constraints from the + * first opaque activity beneath. + * @param parent The parent container. + */ + void onActivityParentChanged(WindowContainer<?> parent) { + if (!mLetterboxConfiguration.isTranslucentLetterboxingEnabled()) { + return; + } + if (mLetterboxConfigListener != null) { + mLetterboxConfigListener.onRemoved(); + clearInheritedConfig(); + } + // In case mActivityRecord.getCompatDisplayInsets() is not null we don't apply the + // opaque activity constraints because we're expecting the activity is already letterboxed. + if (mActivityRecord.getTask() == null || mActivityRecord.getCompatDisplayInsets() != null + || mActivityRecord.fillsParent()) { + return; + } + final ActivityRecord firstOpaqueActivityBeneath = mActivityRecord.getTask().getActivity( + ActivityRecord::fillsParent, mActivityRecord, false /* includeBoundary */, + true /* traverseTopToBottom */); + if (firstOpaqueActivityBeneath == null + || mActivityRecord.launchedFromUid != firstOpaqueActivityBeneath.getUid()) { + // We skip letterboxing if the translucent activity doesn't have any opaque + // activities beneath of if it's launched from a different user (e.g. notification) + return; + } + inheritConfiguration(firstOpaqueActivityBeneath); + mLetterboxConfigListener = WindowContainer.overrideConfigurationPropagation( + mActivityRecord, firstOpaqueActivityBeneath, + (opaqueConfig, transparentConfig) -> { + final Configuration mutatedConfiguration = new Configuration(); + final Rect parentBounds = parent.getWindowConfiguration().getBounds(); + final Rect bounds = mutatedConfiguration.windowConfiguration.getBounds(); + final Rect letterboxBounds = opaqueConfig.windowConfiguration.getBounds(); + // We cannot use letterboxBounds directly here because the position relies on + // letterboxing. Using letterboxBounds directly, would produce a double offset. + bounds.set(parentBounds.left, parentBounds.top, + parentBounds.left + letterboxBounds.width(), + parentBounds.top + letterboxBounds.height()); + // We need to initialize appBounds to avoid NPE. The actual value will + // be set ahead when resolving the Configuration for the activity. + mutatedConfiguration.windowConfiguration.setAppBounds(new Rect()); + return mutatedConfiguration; + }); + } + + /** + * @return {@code true} if the current activity is translucent with an opaque activity + * beneath. In this case it will inherit bounds, orientation and aspect ratios from + * the first opaque activity beneath. + */ + boolean hasInheritedLetterboxBehavior() { + return mLetterboxConfigListener != null && !mActivityRecord.matchParentBounds(); + } + + /** + * @return {@code true} if the current activity is translucent with an opaque activity + * beneath and needs to inherit its orientation. + */ + boolean hasInheritedOrientation() { + // To force a different orientation, the transparent one needs to have an explicit one + // otherwise the existing one is fine and the actual orientation will depend on the + // bounds. + // To avoid wrong behaviour, we're not forcing orientation for activities with not + // fixed orientation (e.g. permission dialogs). + return hasInheritedLetterboxBehavior() + && mActivityRecord.mOrientation != SCREEN_ORIENTATION_UNSPECIFIED; + } + + float getInheritedMinAspectRatio() { + return mInheritedMinAspectRatio; + } + + float getInheritedMaxAspectRatio() { + return mInheritedMaxAspectRatio; + } + + int getInheritedAppCompatState() { + return mInheritedAppCompatState; + } + + float getInheritedSizeCompatScale() { + return mInheritedSizeCompatScale; + } + + @Configuration.Orientation + int getInheritedOrientation() { + return mInheritedOrientation; + } + + public ActivityRecord.CompatDisplayInsets getInheritedCompatDisplayInsets() { + return mInheritedCompatDisplayInsets; + } + + private void inheritConfiguration(ActivityRecord firstOpaque) { + // To avoid wrong behaviour, we're not forcing a specific aspet ratio to activities + // which are not already providing one (e.g. permission dialogs) and presumably also + // not resizable. + if (mActivityRecord.getMinAspectRatio() != UNDEFINED_ASPECT_RATIO) { + mInheritedMinAspectRatio = firstOpaque.getMinAspectRatio(); + } + if (mActivityRecord.getMaxAspectRatio() != UNDEFINED_ASPECT_RATIO) { + mInheritedMaxAspectRatio = firstOpaque.getMaxAspectRatio(); + } + mInheritedOrientation = firstOpaque.getRequestedConfigurationOrientation(); + mInheritedAppCompatState = firstOpaque.getAppCompatState(); + mIsInheritedInSizeCompatMode = firstOpaque.inSizeCompatMode(); + mInheritedSizeCompatScale = firstOpaque.getCompatScale(); + mInheritedCompatDisplayInsets = firstOpaque.getCompatDisplayInsets(); + } + + private void clearInheritedConfig() { + mLetterboxConfigListener = null; + mInheritedMinAspectRatio = UNDEFINED_ASPECT_RATIO; + mInheritedMaxAspectRatio = UNDEFINED_ASPECT_RATIO; + mInheritedOrientation = Configuration.ORIENTATION_UNDEFINED; + mInheritedAppCompatState = APP_COMPAT_STATE_CHANGED__STATE__UNKNOWN; + mIsInheritedInSizeCompatMode = false; + mInheritedSizeCompatScale = 1f; + mInheritedCompatDisplayInsets = null; + } + + private void scaleIfNeeded(Rect bounds) { + if (boundsNeedToScale()) { + bounds.scale(1.0f / mActivityRecord.getCompatScale()); + } + } + + private boolean boundsNeedToScale() { + if (hasInheritedLetterboxBehavior()) { + return mIsInheritedInSizeCompatMode + && mInheritedSizeCompatScale < 1.0f; + } else { + return mActivityRecord.inSizeCompatMode() + && mActivityRecord.getCompatScale() < 1.0f; + } + } } diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index 7b16cccb928b..5c893de6b920 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -635,7 +635,6 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< if (showSurfaceOnCreation()) { getSyncTransaction().show(mSurfaceControl); } - onSurfaceShown(getSyncTransaction()); updateSurfacePositionNonOrganized(); } @@ -687,13 +686,6 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< scheduleAnimation(); } - /** - * Called when the surface is shown for the first time. - */ - void onSurfaceShown(Transaction t) { - // do nothing - } - // Temp. holders for a chain of containers we are currently processing. private final LinkedList<WindowContainer> mTmpChain1 = new LinkedList<>(); private final LinkedList<WindowContainer> mTmpChain2 = new LinkedList<>(); @@ -3946,27 +3938,54 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< unregisterConfigurationChangeListener(listener); } + static void overrideConfigurationPropagation(WindowContainer<?> receiver, + WindowContainer<?> supplier) { + overrideConfigurationPropagation(receiver, supplier, null /* configurationMerger */); + } + /** * Forces the receiver container to always use the configuration of the supplier container as * its requested override configuration. It allows to propagate configuration without changing * the relationship between child and parent. + * + * @param receiver The {@link WindowContainer<?>} which will receive the {@link + * Configuration} result of the merging operation. + * @param supplier The {@link WindowContainer<?>} which provides the initial {@link + * Configuration}. + * @param configurationMerger A {@link ConfigurationMerger} which combines the {@link + * Configuration} of the receiver and the supplier. */ - static void overrideConfigurationPropagation(WindowContainer<?> receiver, - WindowContainer<?> supplier) { + static WindowContainerListener overrideConfigurationPropagation(WindowContainer<?> receiver, + WindowContainer<?> supplier, @Nullable ConfigurationMerger configurationMerger) { final ConfigurationContainerListener listener = new ConfigurationContainerListener() { @Override public void onMergedOverrideConfigurationChanged(Configuration mergedOverrideConfig) { - receiver.onRequestedOverrideConfigurationChanged(supplier.getConfiguration()); + final Configuration mergedConfiguration = + configurationMerger != null + ? configurationMerger.merge(mergedOverrideConfig, + receiver.getConfiguration()) + : supplier.getConfiguration(); + receiver.onRequestedOverrideConfigurationChanged(mergedConfiguration); } }; supplier.registerConfigurationChangeListener(listener); - receiver.registerWindowContainerListener(new WindowContainerListener() { + final WindowContainerListener wcListener = new WindowContainerListener() { @Override public void onRemoved() { receiver.unregisterWindowContainerListener(this); supplier.unregisterConfigurationChangeListener(listener); } - }); + }; + receiver.registerWindowContainerListener(wcListener); + return wcListener; + } + + /** + * Abstraction for functions merging two {@link Configuration} objects into one. + */ + @FunctionalInterface + interface ConfigurationMerger { + Configuration merge(Configuration first, Configuration second); } /** diff --git a/services/core/java/com/android/server/wm/WindowManagerShellCommand.java b/services/core/java/com/android/server/wm/WindowManagerShellCommand.java index b8cf0ad2e774..4e692e2d212a 100644 --- a/services/core/java/com/android/server/wm/WindowManagerShellCommand.java +++ b/services/core/java/com/android/server/wm/WindowManagerShellCommand.java @@ -963,6 +963,29 @@ public class WindowManagerShellCommand extends ShellCommand { return 0; } + private int runSetTranslucentLetterboxingEnabled(PrintWriter pw) { + String arg = getNextArg(); + final boolean enabled; + switch (arg) { + case "true": + case "1": + enabled = true; + break; + case "false": + case "0": + enabled = false; + break; + default: + getErrPrintWriter().println("Error: expected true, 1, false, 0, but got " + arg); + return -1; + } + + synchronized (mInternal.mGlobalLock) { + mLetterboxConfiguration.setTranslucentLetterboxingOverrideEnabled(enabled); + } + return 0; + } + private int runSetLetterboxStyle(PrintWriter pw) throws RemoteException { if (peekNextArg() == null) { getErrPrintWriter().println("Error: No arguments provided."); @@ -1018,6 +1041,9 @@ public class WindowManagerShellCommand extends ShellCommand { case "--isSplitScreenAspectRatioForUnresizableAppsEnabled": runSetLetterboxIsSplitScreenAspectRatioForUnresizableAppsEnabled(pw); break; + case "--isTranslucentLetterboxingEnabled": + runSetTranslucentLetterboxingEnabled(pw); + break; default: getErrPrintWriter().println( "Error: Unrecognized letterbox style option: " + arg); @@ -1081,6 +1107,9 @@ public class WindowManagerShellCommand extends ShellCommand { mLetterboxConfiguration .getIsSplitScreenAspectRatioForUnresizableAppsEnabled(); break; + case "isTranslucentLetterboxingEnabled": + mLetterboxConfiguration.resetTranslucentLetterboxingEnabled(); + break; default: getErrPrintWriter().println( "Error: Unrecognized letterbox style option: " + arg); @@ -1181,6 +1210,7 @@ public class WindowManagerShellCommand extends ShellCommand { mLetterboxConfiguration.resetDefaultPositionForVerticalReachability(); mLetterboxConfiguration.resetIsEducationEnabled(); mLetterboxConfiguration.resetIsSplitScreenAspectRatioForUnresizableAppsEnabled(); + mLetterboxConfiguration.resetTranslucentLetterboxingEnabled(); } } @@ -1217,7 +1247,6 @@ public class WindowManagerShellCommand extends ShellCommand { pw.println("Is using split screen aspect ratio as aspect ratio for unresizable apps: " + mLetterboxConfiguration .getIsSplitScreenAspectRatioForUnresizableAppsEnabled()); - pw.println("Background type: " + LetterboxConfiguration.letterboxBackgroundTypeToString( mLetterboxConfiguration.getLetterboxBackgroundType())); @@ -1227,6 +1256,12 @@ public class WindowManagerShellCommand extends ShellCommand { + mLetterboxConfiguration.getLetterboxBackgroundWallpaperBlurRadius()); pw.println(" Wallpaper dark scrim alpha: " + mLetterboxConfiguration.getLetterboxBackgroundWallpaperDarkScrimAlpha()); + + if (mLetterboxConfiguration.isTranslucentLetterboxingEnabled()) { + pw.println("Letterboxing for translucent activities: enabled"); + } else { + pw.println("Letterboxing for translucent activities: disabled"); + } } return 0; } @@ -1419,12 +1454,16 @@ public class WindowManagerShellCommand extends ShellCommand { pw.println(" --isSplitScreenAspectRatioForUnresizableAppsEnabled [true|1|false|0]"); pw.println(" Whether using split screen aspect ratio as a default aspect ratio for"); pw.println(" unresizable apps."); + pw.println(" --isTranslucentLetterboxingEnabled [true|1|false|0]"); + pw.println(" Whether letterboxing for translucent activities is enabled."); + pw.println(" reset-letterbox-style [aspectRatio|cornerRadius|backgroundType"); pw.println(" |backgroundColor|wallpaperBlurRadius|wallpaperDarkScrimAlpha"); pw.println(" |horizontalPositionMultiplier|verticalPositionMultiplier"); pw.println(" |isHorizontalReachabilityEnabled|isVerticalReachabilityEnabled"); - pw.println(" isEducationEnabled||defaultPositionMultiplierForHorizontalReachability"); - pw.println(" ||defaultPositionMultiplierForVerticalReachability]"); + pw.println(" |isEducationEnabled||defaultPositionMultiplierForHorizontalReachability"); + pw.println(" |isTranslucentLetterboxingEnabled"); + pw.println(" |defaultPositionMultiplierForVerticalReachability]"); pw.println(" Resets overrides to default values for specified properties separated"); pw.println(" by space, e.g. 'reset-letterbox-style aspectRatio cornerRadius'."); pw.println(" If no arguments provided, all values will be reset."); diff --git a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java index babad4d4d744..94c33f27f651 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java @@ -164,6 +164,114 @@ public class SizeCompatTests extends WindowTestsBase { } @Test + public void testApplyStrategyToTranslucentActivities() { + mWm.mLetterboxConfiguration.setTranslucentLetterboxingOverrideEnabled(true); + setUpDisplaySizeWithApp(2000, 1000); + prepareUnresizable(mActivity, 1.5f /* maxAspect */, SCREEN_ORIENTATION_PORTRAIT); + mActivity.info.setMinAspectRatio(1.2f); + mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); + // Translucent Activity + final ActivityRecord translucentActivity = new ActivityBuilder(mAtm) + .setLaunchedFromUid(mActivity.getUid()) + .setScreenOrientation(SCREEN_ORIENTATION_LANDSCAPE) + .setMinAspectRatio(1.1f) + .setMaxAspectRatio(3f) + .build(); + doReturn(false).when(translucentActivity).fillsParent(); + mTask.addChild(translucentActivity); + // We check bounds + final Rect opaqueBounds = mActivity.getConfiguration().windowConfiguration.getBounds(); + final Rect translucentRequestedBounds = translucentActivity.getRequestedOverrideBounds(); + assertEquals(opaqueBounds, translucentRequestedBounds); + // We check orientation + final int translucentOrientation = + translucentActivity.getRequestedConfigurationOrientation(); + assertEquals(ORIENTATION_PORTRAIT, translucentOrientation); + // We check aspect ratios + assertEquals(1.2f, translucentActivity.getMinAspectRatio(), 0.00001f); + assertEquals(1.5f, translucentActivity.getMaxAspectRatio(), 0.00001f); + } + + @Test + public void testNotApplyStrategyToTranslucentActivitiesWithDifferentUid() { + mWm.mLetterboxConfiguration.setTranslucentLetterboxingOverrideEnabled(true); + setUpDisplaySizeWithApp(2000, 1000); + prepareUnresizable(mActivity, 1.5f /* maxAspect */, SCREEN_ORIENTATION_PORTRAIT); + mActivity.info.setMinAspectRatio(1.2f); + mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); + // Translucent Activity + final ActivityRecord translucentActivity = new ActivityBuilder(mAtm) + .setScreenOrientation(SCREEN_ORIENTATION_LANDSCAPE) + .setMinAspectRatio(1.1f) + .setMaxAspectRatio(3f) + .build(); + doReturn(false).when(translucentActivity).fillsParent(); + mTask.addChild(translucentActivity); + // We check bounds + final Rect opaqueBounds = mActivity.getConfiguration().windowConfiguration.getBounds(); + final Rect translucentRequestedBounds = translucentActivity.getRequestedOverrideBounds(); + assertNotEquals(opaqueBounds, translucentRequestedBounds); + } + + @Test + public void testApplyStrategyToMultipleTranslucentActivities() { + mWm.mLetterboxConfiguration.setTranslucentLetterboxingOverrideEnabled(true); + setUpDisplaySizeWithApp(2000, 1000); + prepareUnresizable(mActivity, 1.5f /* maxAspect */, SCREEN_ORIENTATION_PORTRAIT); + mActivity.info.setMinAspectRatio(1.2f); + mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); + // Translucent Activity + final ActivityRecord translucentActivity = new ActivityBuilder(mAtm) + .setLaunchedFromUid(mActivity.getUid()) + .setScreenOrientation(SCREEN_ORIENTATION_LANDSCAPE) + .setMinAspectRatio(1.1f) + .setMaxAspectRatio(3f) + .build(); + doReturn(false).when(translucentActivity).fillsParent(); + mTask.addChild(translucentActivity); + // We check bounds + final Rect opaqueBounds = mActivity.getConfiguration().windowConfiguration.getBounds(); + final Rect translucentRequestedBounds = translucentActivity.getRequestedOverrideBounds(); + assertEquals(opaqueBounds, translucentRequestedBounds); + // Launch another translucent activity + final ActivityRecord translucentActivity2 = new ActivityBuilder(mAtm) + .setLaunchedFromUid(mActivity.getUid()) + .setScreenOrientation(SCREEN_ORIENTATION_LANDSCAPE) + .build(); + doReturn(false).when(translucentActivity2).fillsParent(); + mTask.addChild(translucentActivity2); + // We check bounds + final Rect translucent2RequestedBounds = translucentActivity2.getRequestedOverrideBounds(); + assertEquals(opaqueBounds, translucent2RequestedBounds); + } + + @Test + public void testTranslucentActivitiesDontGoInSizeCompactMode() { + mWm.mLetterboxConfiguration.setTranslucentLetterboxingOverrideEnabled(true); + setUpDisplaySizeWithApp(2800, 1400); + mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); + prepareUnresizable(mActivity, -1f /* maxAspect */, SCREEN_ORIENTATION_PORTRAIT); + // Rotate to put activity in size compat mode. + rotateDisplay(mActivity.mDisplayContent, ROTATION_90); + assertTrue(mActivity.inSizeCompatMode()); + // Rotate back + rotateDisplay(mActivity.mDisplayContent, ROTATION_0); + assertFalse(mActivity.inSizeCompatMode()); + // We launch a transparent activity + final ActivityRecord translucentActivity = new ActivityBuilder(mAtm) + .setLaunchedFromUid(mActivity.getUid()) + .setScreenOrientation(SCREEN_ORIENTATION_PORTRAIT) + .build(); + doReturn(true).when(translucentActivity).fillsParent(); + mTask.addChild(translucentActivity); + // It should not be in SCM + assertFalse(translucentActivity.inSizeCompatMode()); + // We rotate again + rotateDisplay(translucentActivity.mDisplayContent, ROTATION_90); + assertFalse(translucentActivity.inSizeCompatMode()); + } + + @Test public void testRestartProcessIfVisible() { setUpDisplaySizeWithApp(1000, 2500); doNothing().when(mSupervisor).scheduleRestartTimeout(mActivity); diff --git a/telephony/java/android/telephony/euicc/EuiccManager.java b/telephony/java/android/telephony/euicc/EuiccManager.java index 1252dc178cb9..7991dfd6ee9f 100644 --- a/telephony/java/android/telephony/euicc/EuiccManager.java +++ b/telephony/java/android/telephony/euicc/EuiccManager.java @@ -1569,8 +1569,8 @@ public class EuiccManager { /** * Returns whether the passing portIndex is available. - * A port is available if it is active without enabled profile on it or - * calling app has carrier privilege over the profile installed on the selected port. + * A port is available if it is active without an enabled profile on it or calling app can + * activate a new profile on the selected port without any user interaction. * Always returns false if the cardId is a physical card. * * @param portIndex is an enumeration of the ports available on the UICC. |