diff options
613 files changed, 8474 insertions, 3724 deletions
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index 06635eedeb9a..5d076d487b30 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -683,7 +683,7 @@ public abstract class Context { public static final int BIND_EXTERNAL_SERVICE = 0x80000000; /** - * Works in the same way as {@link #BIND_EXTERNAL_SERVICE}, but it's defined as a (@code long) + * Works in the same way as {@link #BIND_EXTERNAL_SERVICE}, but it's defined as a {@code long} * value that is compatible to {@link BindServiceFlags}. */ public static final long BIND_EXTERNAL_SERVICE_LONG = 1L << 62; diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java index 885060f19efa..c3d5b71e7349 100644 --- a/core/java/android/content/res/Resources.java +++ b/core/java/android/content/res/Resources.java @@ -2003,13 +2003,25 @@ public class Resources { private int mHashCode = 0; - private boolean containsValue(int resId, boolean force) { + private int findValue(int resId, boolean force) { for (int i = 0; i < mCount; ++i) { if (mResId[i] == resId && mForce[i] == force) { - return true; + return i; } } - return false; + return -1; + } + + private void moveToLast(int index) { + if (index < 0 || index >= mCount - 1) { + return; + } + final int id = mResId[index]; + final boolean force = mForce[index]; + System.arraycopy(mResId, index + 1, mResId, index, mCount - index - 1); + mResId[mCount - 1] = id; + System.arraycopy(mForce, index + 1, mForce, index, mCount - index - 1); + mForce[mCount - 1] = force; } public void append(int resId, boolean force) { @@ -2022,15 +2034,17 @@ public class Resources { } // Some apps tend to keep adding same resources over and over, let's protect from it. - if (containsValue(resId, force)) { - return; + // Note: the order still matters, as the values that come later override the earlier + // ones. + final int index = findValue(resId, force); + if (index >= 0) { + moveToLast(index); + } else { + mResId = GrowingArrayUtils.append(mResId, mCount, resId); + mForce = GrowingArrayUtils.append(mForce, mCount, force); + mCount++; + mHashCode = 31 * (31 * mHashCode + resId) + (force ? 1 : 0); } - - mResId = GrowingArrayUtils.append(mResId, mCount, resId); - mForce = GrowingArrayUtils.append(mForce, mCount, force); - mCount++; - - mHashCode = 31 * (31 * mHashCode + resId) + (force ? 1 : 0); } /** diff --git a/core/java/android/hardware/fingerprint/FingerprintManager.java b/core/java/android/hardware/fingerprint/FingerprintManager.java index 619544366b02..f59437795b9c 100644 --- a/core/java/android/hardware/fingerprint/FingerprintManager.java +++ b/core/java/android/hardware/fingerprint/FingerprintManager.java @@ -980,23 +980,6 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing } /** - * @hide - */ - @RequiresPermission(USE_BIOMETRIC_INTERNAL) - public void setUdfpsOverlay(@NonNull IUdfpsOverlay controller) { - if (mService == null) { - Slog.w(TAG, "setUdfpsOverlay: no fingerprint service"); - return; - } - - try { - mService.setUdfpsOverlay(controller); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } - } - - /** * Forwards BiometricStateListener to FingerprintService * @param listener new BiometricStateListener being added * @hide diff --git a/core/java/android/hardware/fingerprint/IFingerprintService.aidl b/core/java/android/hardware/fingerprint/IFingerprintService.aidl index ff2f313ac3df..99758525e5ff 100644 --- a/core/java/android/hardware/fingerprint/IFingerprintService.aidl +++ b/core/java/android/hardware/fingerprint/IFingerprintService.aidl @@ -27,7 +27,6 @@ import android.hardware.fingerprint.IFingerprintAuthenticatorsRegisteredCallback import android.hardware.fingerprint.IFingerprintServiceReceiver; import android.hardware.fingerprint.IUdfpsOverlayController; import android.hardware.fingerprint.ISidefpsController; -import android.hardware.fingerprint.IUdfpsOverlay; import android.hardware.fingerprint.Fingerprint; import android.hardware.fingerprint.FingerprintAuthenticateOptions; import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; @@ -203,10 +202,6 @@ interface IFingerprintService { @EnforcePermission("USE_BIOMETRIC_INTERNAL") void setSidefpsController(in ISidefpsController controller); - // Sets the controller for managing the UDFPS overlay. - @EnforcePermission("USE_BIOMETRIC_INTERNAL") - void setUdfpsOverlay(in IUdfpsOverlay controller); - // Registers BiometricStateListener. @EnforcePermission("USE_BIOMETRIC_INTERNAL") void registerBiometricStateListener(IBiometricStateListener listener); diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index d2c6a765d9be..9316dbf8a458 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -3820,7 +3820,7 @@ public final class ViewRootImpl implements ViewParent, } mPendingTransitions.clear(); } - if (!performDraw() && mActiveSurfaceSyncGroup != null) { + if (!performDraw(mActiveSurfaceSyncGroup) && mActiveSurfaceSyncGroup != null) { mActiveSurfaceSyncGroup.markSyncReady(); } } @@ -4583,6 +4583,10 @@ public final class ViewRootImpl implements ViewParent, }); } + /** + * These callbacks check if the draw failed for any reason and apply + * those transactions directly so they don't get stuck forever. + */ private void registerCallbackForPendingTransactions() { Transaction t = new Transaction(); t.merge(mPendingTransaction); @@ -4611,7 +4615,7 @@ public final class ViewRootImpl implements ViewParent, }); } - private boolean performDraw() { + private boolean performDraw(@Nullable SurfaceSyncGroup surfaceSyncGroup) { mLastPerformDrawSkippedReason = null; if (mAttachInfo.mDisplayState == Display.STATE_OFF && !mReportNextDraw) { mLastPerformDrawSkippedReason = "screen_off"; @@ -4621,7 +4625,7 @@ public final class ViewRootImpl implements ViewParent, return false; } - final boolean fullRedrawNeeded = mFullRedrawNeeded || mActiveSurfaceSyncGroup != null; + final boolean fullRedrawNeeded = mFullRedrawNeeded || surfaceSyncGroup != null; mFullRedrawNeeded = false; mIsDrawing = true; @@ -4629,22 +4633,12 @@ public final class ViewRootImpl implements ViewParent, addFrameCommitCallbackIfNeeded(); - boolean usingAsyncReport = isHardwareEnabled() && mActiveSurfaceSyncGroup != null; - if (usingAsyncReport) { - registerCallbacksForSync(mSyncBuffer, mActiveSurfaceSyncGroup); - } else if (mHasPendingTransactions) { - // These callbacks are only needed if there's no sync involved and there were calls to - // applyTransactionOnDraw. These callbacks check if the draw failed for any reason and - // apply those transactions directly so they don't get stuck forever. - registerCallbackForPendingTransactions(); - } - mHasPendingTransactions = false; + boolean usingAsyncReport; try { - boolean canUseAsync = draw(fullRedrawNeeded, usingAsyncReport && mSyncBuffer); - if (usingAsyncReport && !canUseAsync) { + usingAsyncReport = draw(fullRedrawNeeded, surfaceSyncGroup, mSyncBuffer); + if (mAttachInfo.mThreadedRenderer != null && !usingAsyncReport) { mAttachInfo.mThreadedRenderer.setFrameCallback(null); - usingAsyncReport = false; } } finally { mIsDrawing = false; @@ -4682,10 +4676,12 @@ public final class ViewRootImpl implements ViewParent, } if (mSurfaceHolder != null && mSurface.isValid()) { - final SurfaceSyncGroup surfaceSyncGroup = mActiveSurfaceSyncGroup; - SurfaceCallbackHelper sch = new SurfaceCallbackHelper(() -> - mHandler.post(() -> surfaceSyncGroup.markSyncReady())); - mActiveSurfaceSyncGroup = null; + usingAsyncReport = true; + SurfaceCallbackHelper sch = new SurfaceCallbackHelper(() -> { + if (surfaceSyncGroup != null) { + surfaceSyncGroup.markSyncReady(); + } + }); SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks(); @@ -4696,8 +4692,9 @@ public final class ViewRootImpl implements ViewParent, } } } - if (mActiveSurfaceSyncGroup != null && !usingAsyncReport) { - mActiveSurfaceSyncGroup.markSyncReady(); + + if (surfaceSyncGroup != null && !usingAsyncReport) { + surfaceSyncGroup.markSyncReady(); } if (mPerformContentCapture) { performContentCaptureInitialReport(); @@ -4790,7 +4787,8 @@ public final class ViewRootImpl implements ViewParent, } } - private boolean draw(boolean fullRedrawNeeded, boolean forceDraw) { + private boolean draw(boolean fullRedrawNeeded, + @Nullable SurfaceSyncGroup activeSyncGroup, boolean syncBuffer) { Surface surface = mSurface; if (!surface.isValid()) { return false; @@ -4934,9 +4932,19 @@ public final class ViewRootImpl implements ViewParent, mAttachInfo.mThreadedRenderer.setTargetHdrSdrRatio(mRenderHdrSdrRatio); } - if (forceDraw) { - mAttachInfo.mThreadedRenderer.forceDrawNextFrame(); + if (activeSyncGroup != null) { + registerCallbacksForSync(syncBuffer, activeSyncGroup); + if (syncBuffer) { + mAttachInfo.mThreadedRenderer.forceDrawNextFrame(); + } + } else if (mHasPendingTransactions) { + // Register a calback if there's no sync involved but there were calls to + // applyTransactionOnDraw. If there is a sync involved, the sync callback will + // handle merging the pending transaction. + registerCallbackForPendingTransactions(); } + mHasPendingTransactions = false; + mAttachInfo.mThreadedRenderer.draw(mView, mAttachInfo, this); } else { // If we get here with a disabled & requested hardware renderer, something went diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java index d37c37a392a5..3da9e96618f3 100644 --- a/core/java/android/widget/Editor.java +++ b/core/java/android/widget/Editor.java @@ -8105,6 +8105,16 @@ public class Editor { private final Paint mHighlightPaint; private final Path mHighlightPath; + /** + * Whether it is in the progress of updating transformation method. It's needed because + * {@link TextView#setTransformationMethod(TransformationMethod)} will eventually call + * {@link TextView#setText(CharSequence)}. + * Because it normally should exit insert mode when {@link TextView#setText(CharSequence)} + * is called externally, we need this boolean to distinguish whether setText is triggered + * by setTransformation or not. + */ + private boolean mUpdatingTransformationMethod; + InsertModeController(@NonNull TextView textView) { mTextView = Objects.requireNonNull(textView); mIsInsertModeActive = false; @@ -8137,7 +8147,7 @@ public class Editor { final boolean isSingleLine = mTextView.isSingleLine(); mInsertModeTransformationMethod = new InsertModeTransformationMethod(offset, isSingleLine, oldTransformationMethod); - mTextView.setTransformationMethodInternal(mInsertModeTransformationMethod); + setTransformationMethod(mInsertModeTransformationMethod, true); Selection.setSelection((Spannable) mTextView.getText(), offset); mIsInsertModeActive = true; @@ -8145,6 +8155,10 @@ public class Editor { } void exitInsertMode() { + exitInsertMode(true); + } + + void exitInsertMode(boolean updateText) { if (!mIsInsertModeActive) return; if (mInsertModeTransformationMethod == null || mInsertModeTransformationMethod != mTextView.getTransformationMethod()) { @@ -8157,7 +8171,7 @@ public class Editor { final int selectionEnd = mTextView.getSelectionEnd(); final TransformationMethod oldTransformationMethod = mInsertModeTransformationMethod.getOldTransformationMethod(); - mTextView.setTransformationMethodInternal(oldTransformationMethod); + setTransformationMethod(oldTransformationMethod, updateText); Selection.setSelection((Spannable) mTextView.getText(), selectionStart, selectionEnd); mIsInsertModeActive = false; } @@ -8178,6 +8192,32 @@ public class Editor { } /** + * Update the TransformationMethod on the {@link TextView}. + * @param method the new method to be set on the {@link TextView}/ + * @param updateText whether to update the text during setTransformationMethod call. + */ + private void setTransformationMethod(TransformationMethod method, boolean updateText) { + mUpdatingTransformationMethod = true; + mTextView.setTransformationMethodInternal(method, updateText); + mUpdatingTransformationMethod = false; + } + + /** + * Notify the InsertMode controller that the {@link TextView} is about to set its text. + */ + void beforeSetText() { + // TextView#setText is called because our call to + // TextView#setTransformationMethodInternal in enterInsertMode() or exitInsertMode(). + // Do nothing in this case. + if (mUpdatingTransformationMethod) { + return; + } + // TextView#setText is called externally. Exit InsertMode but don't update text again + // when calling setTransformationMethod. + exitInsertMode(/* updateText */ false); + } + + /** * Notify the {@link InsertModeController} before the TextView's * {@link TransformationMethod} is updated. If it's not in the insert mode, * the given method is directly returned. Otherwise, it will wrap the given transformation @@ -8205,6 +8245,9 @@ public class Editor { return mInsertModeController.enterInsertMode(offset); } + /** + * Exit insert mode if this editor is in insert mode. + */ void exitInsertMode() { if (mInsertModeController == null) return; mInsertModeController.exitInsertMode(); @@ -8217,7 +8260,7 @@ public class Editor { */ void setTransformationMethod(TransformationMethod method) { if (mInsertModeController == null || !mInsertModeController.mIsInsertModeActive) { - mTextView.setTransformationMethodInternal(method); + mTextView.setTransformationMethodInternal(method, /* updateText */ true); return; } @@ -8226,11 +8269,19 @@ public class Editor { final int selectionStart = mTextView.getSelectionStart(); final int selectionEnd = mTextView.getSelectionEnd(); method = mInsertModeController.updateTransformationMethod(method); - mTextView.setTransformationMethodInternal(method); + mTextView.setTransformationMethodInternal(method, /* updateText */ true); Selection.setSelection((Spannable) mTextView.getText(), selectionStart, selectionEnd); } /** + * Notify that the Editor that the associated {@link TextView} is about to set its text. + */ + void beforeSetText() { + if (mInsertModeController == null) return; + mInsertModeController.beforeSetText(); + } + + /** * Initializes the nodeInfo with smart actions. */ void onInitializeSmartActionsAccessibilityNodeInfo(AccessibilityNodeInfo nodeInfo) { diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java index 3be8c3d6b502..bd7f5a0924cc 100644 --- a/core/java/android/widget/RemoteViews.java +++ b/core/java/android/widget/RemoteViews.java @@ -413,6 +413,13 @@ public class RemoteViews implements Parcelable, Filter { /** Class cookies of the Parcel this instance was read from. */ private Map<Class, Object> mClassCookies; + /** + * {@link LayoutInflater.Factory2} which will be passed into a {@link LayoutInflater} instance + * used by this class. + */ + @Nullable + private LayoutInflater.Factory2 mLayoutInflaterFactory2; + private static final InteractionHandler DEFAULT_INTERACTION_HANDLER = (view, pendingIntent, response) -> startPendingIntent(view, pendingIntent, response.getLaunchOptions(view)); @@ -432,6 +439,29 @@ public class RemoteViews implements Parcelable, Filter { } /** + * Sets {@link LayoutInflater.Factory2} to be passed into {@link LayoutInflater} used + * by this class instance. It has to be set before the views are inflated to have any effect. + * + * The factory callbacks will be called on the background thread so the implementation needs + * to be thread safe. + * + * @hide + */ + public void setLayoutInflaterFactory(@Nullable LayoutInflater.Factory2 factory) { + mLayoutInflaterFactory2 = factory; + } + + /** + * Returns currently set {@link LayoutInflater.Factory2}. + * + * @hide + */ + @Nullable + public LayoutInflater.Factory2 getLayoutInflaterFactory() { + return mLayoutInflaterFactory2; + } + + /** * Reduces all images and ensures that they are all below the given sizes. * * @param maxWidth the maximum width allowed @@ -5659,6 +5689,9 @@ public class RemoteViews implements Parcelable, Filter { // we don't add a filter to the static version returned by getSystemService. inflater = inflater.cloneInContext(inflationContext); inflater.setFilter(shouldUseStaticFilter() ? INFLATER_FILTER : this); + if (mLayoutInflaterFactory2 != null) { + inflater.setFactory2(mLayoutInflaterFactory2); + } View v = inflater.inflate(rv.getLayoutId(), parent, false); if (mViewId != View.NO_ID) { v.setId(mViewId); diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 7e1e52dd0707..438b9742f0af 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -2795,11 +2795,22 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener if (mEditor != null) { mEditor.setTransformationMethod(method); } else { - setTransformationMethodInternal(method); + setTransformationMethodInternal(method, /* updateText */ true); } } - void setTransformationMethodInternal(@Nullable TransformationMethod method) { + /** + * Set the transformation that is applied to the text that this TextView is displaying, + * optionally call the setText. + * @param method the new transformation method to be set. + * @param updateText whether the call {@link #setText} which will update the TextView to display + * the new content. This method is helpful when updating + * {@link TransformationMethod} inside {@link #setText}. It should only be + * false if text will be updated immediately after this call, otherwise the + * TextView will enter an inconsistent state. + */ + void setTransformationMethodInternal(@Nullable TransformationMethod method, + boolean updateText) { if (method == mTransformation) { // Avoid the setText() below if the transformation is // the same. @@ -2821,7 +2832,9 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener mAllowTransformationLengthChange = false; } - setText(mText); + if (updateText) { + setText(mText); + } if (hasPasswordTransformationMethod()) { notifyViewAccessibilityStateChangedIfNeeded( @@ -7000,6 +7013,9 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener @UnsupportedAppUsage private void setText(CharSequence text, BufferType type, boolean notifyBefore, int oldlen) { + if (mEditor != null) { + mEditor.beforeSetText(); + } mTextSetFromXmlOrResourceId = false; if (text == null) { text = ""; @@ -13811,13 +13827,14 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } /** - * Helper method to set {@code rect} to the text content's non-clipped area in the view's - * coordinates. + * Helper method to set {@code rect} to this TextView's non-clipped area in its own coordinates. + * This method obtains the view's visible rectangle whereas the method + * {@link #getContentVisibleRect} returns the text layout's visible rectangle. * * @return true if at least part of the text content is visible; false if the text content is * completely clipped or translated out of the visible area. */ - private boolean getContentVisibleRect(Rect rect) { + private boolean getViewVisibleRect(Rect rect) { if (!getLocalVisibleRect(rect)) { return false; } @@ -13826,6 +13843,20 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener // view's coordinates. So we need to offset it with the negative scrolled amount to convert // it to view's coordinate. rect.offset(-getScrollX(), -getScrollY()); + return true; + } + + /** + * Helper method to set {@code rect} to the text content's non-clipped area in the view's + * coordinates. + * + * @return true if at least part of the text content is visible; false if the text content is + * completely clipped or translated out of the visible area. + */ + private boolean getContentVisibleRect(Rect rect) { + if (!getViewVisibleRect(rect)) { + return false; + } // Clip the view's visible rect with the text layout's visible rect. return rect.intersect(getCompoundPaddingLeft(), getCompoundPaddingTop(), getWidth() - getCompoundPaddingRight(), getHeight() - getCompoundPaddingBottom()); @@ -13955,14 +13986,25 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener builder.setMatrix(viewToScreenMatrix); if (includeEditorBounds) { - final RectF editorBounds = new RectF(); - editorBounds.set(0 /* left */, 0 /* top */, - getWidth(), getHeight()); - final RectF handwritingBounds = new RectF( - -getHandwritingBoundsOffsetLeft(), - -getHandwritingBoundsOffsetTop(), - getWidth() + getHandwritingBoundsOffsetRight(), - getHeight() + getHandwritingBoundsOffsetBottom()); + if (mTempRect == null) { + mTempRect = new Rect(); + } + final Rect bounds = mTempRect; + final RectF editorBounds; + final RectF handwritingBounds; + if (getViewVisibleRect(bounds)) { + editorBounds = new RectF(bounds); + handwritingBounds = new RectF(editorBounds); + handwritingBounds.top -= getHandwritingBoundsOffsetTop(); + handwritingBounds.left -= getHandwritingBoundsOffsetLeft(); + handwritingBounds.bottom += getHandwritingBoundsOffsetBottom(); + handwritingBounds.right += getHandwritingBoundsOffsetRight(); + } else { + // The editor is not visible at all, return empty rectangles. We still need to + // return an EditorBoundsInfo because IME has subscribed the EditorBoundsInfo. + editorBounds = new RectF(); + handwritingBounds = new RectF(); + } EditorBoundsInfo.Builder boundsBuilder = new EditorBoundsInfo.Builder(); EditorBoundsInfo editorBoundsInfo = boundsBuilder.setEditorBounds(editorBounds) .setHandwritingBounds(handwritingBounds).build(); diff --git a/core/java/com/android/internal/widget/NotificationExpandButton.java b/core/java/com/android/internal/widget/NotificationExpandButton.java index 07ee9b5d2ff1..d4dd1e705653 100644 --- a/core/java/com/android/internal/widget/NotificationExpandButton.java +++ b/core/java/com/android/internal/widget/NotificationExpandButton.java @@ -21,6 +21,8 @@ import android.annotation.Nullable; import android.content.Context; import android.content.res.ColorStateList; import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.LayerDrawable; import android.util.AttributeSet; import android.view.RemotableViewMethod; import android.view.View; @@ -42,7 +44,7 @@ import java.util.Locale; @RemoteViews.RemoteView public class NotificationExpandButton extends FrameLayout { - private View mPillView; + private Drawable mPillDrawable; private TextView mNumberView; private ImageView mIconView; private boolean mExpanded; @@ -73,7 +75,10 @@ public class NotificationExpandButton extends FrameLayout { @Override protected void onFinishInflate() { super.onFinishInflate(); - mPillView = findViewById(R.id.expand_button_pill); + + final View pillView = findViewById(R.id.expand_button_pill); + final LayerDrawable layeredPill = (LayerDrawable) pillView.getBackground(); + mPillDrawable = layeredPill.findDrawableByLayerId(R.id.expand_button_pill_colorized_layer); mNumberView = findViewById(R.id.expand_button_number); mIconView = findViewById(R.id.expand_button_icon); } @@ -156,7 +161,7 @@ public class NotificationExpandButton extends FrameLayout { private void updateColors() { if (shouldShowNumber()) { if (mHighlightPillColor != 0) { - mPillView.setBackgroundTintList(ColorStateList.valueOf(mHighlightPillColor)); + mPillDrawable.setTintList(ColorStateList.valueOf(mHighlightPillColor)); } mIconView.setColorFilter(mHighlightTextColor); if (mHighlightTextColor != 0) { @@ -164,7 +169,7 @@ public class NotificationExpandButton extends FrameLayout { } } else { if (mDefaultPillColor != 0) { - mPillView.setBackgroundTintList(ColorStateList.valueOf(mDefaultPillColor)); + mPillDrawable.setTintList(ColorStateList.valueOf(mDefaultPillColor)); } mIconView.setColorFilter(mDefaultTextColor); if (mDefaultTextColor != 0) { diff --git a/core/res/res/color-night/notification_expand_button_state_tint.xml b/core/res/res/color-night/notification_expand_button_state_tint.xml new file mode 100644 index 000000000000..a794d53c7e71 --- /dev/null +++ b/core/res/res/color-night/notification_expand_button_state_tint.xml @@ -0,0 +1,21 @@ +<!-- + ~ Copyright (C) 2023 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> + +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_pressed="true" android:color="@android:color/system_on_surface_dark" android:alpha="0.06"/> + <item android:state_hovered="true" android:color="@android:color/system_on_surface_dark" android:alpha="0.03"/> + <item android:color="@android:color/system_on_surface_dark" android:alpha="0.00"/> +</selector>
\ No newline at end of file diff --git a/core/res/res/color/notification_expand_button_state_tint.xml b/core/res/res/color/notification_expand_button_state_tint.xml new file mode 100644 index 000000000000..67b2c2568bb1 --- /dev/null +++ b/core/res/res/color/notification_expand_button_state_tint.xml @@ -0,0 +1,21 @@ +<!-- + ~ Copyright (C) 2023 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> + +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_pressed="true" android:color="@android:color/system_on_surface_light" android:alpha="0.12"/> + <item android:state_hovered="true" android:color="@android:color/system_on_surface_light" android:alpha="0.08"/> + <item android:color="@android:color/system_on_surface_light" android:alpha="0.00"/> +</selector>
\ No newline at end of file diff --git a/core/res/res/drawable/expand_button_pill_bg.xml b/core/res/res/drawable/expand_button_pill_bg.xml index f95044a7fe76..a14d33c9527b 100644 --- a/core/res/res/drawable/expand_button_pill_bg.xml +++ b/core/res/res/drawable/expand_button_pill_bg.xml @@ -13,7 +13,17 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> -<shape xmlns:android="http://schemas.android.com/apk/res/android"> - <corners android:radius="@dimen/notification_expand_button_pill_height" /> - <solid android:color="@android:color/white" /> -</shape>
\ No newline at end of file +<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:id="@+id/expand_button_pill_colorized_layer"> + <shape xmlns:android="http://schemas.android.com/apk/res/android"> + <corners android:radius="@dimen/notification_expand_button_pill_height" /> + <solid android:color="@android:color/white" /> + </shape> + </item> + <item> + <shape xmlns:android="http://schemas.android.com/apk/res/android"> + <corners android:radius="@dimen/notification_expand_button_pill_height" /> + <solid android:color="@color/notification_expand_button_state_tint" /> + </shape> + </item> +</layer-list>
\ No newline at end of file diff --git a/core/res/res/layout/notification_expand_button.xml b/core/res/res/layout/notification_expand_button.xml index 8eae064cba1f..63fe47110c8b 100644 --- a/core/res/res/layout/notification_expand_button.xml +++ b/core/res/res/layout/notification_expand_button.xml @@ -34,6 +34,7 @@ android:background="@drawable/expand_button_pill_bg" android:gravity="center_vertical" android:layout_gravity="center_vertical" + android:duplicateParentState="true" > <TextView diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index f3ee40ec3057..a812ac0932da 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -1221,7 +1221,7 @@ <string name="aerr_application_repeated" msgid="7804378743218496566">"يستمر التطبيق <xliff:g id="APPLICATION">%1$s</xliff:g> في التوقف."</string> <string name="aerr_process_repeated" msgid="1153152413537954974">"تستمر عملية <xliff:g id="PROCESS">%1$s</xliff:g> في التوقف."</string> <string name="aerr_restart" msgid="2789618625210505419">"فتح التطبيق مرة أخرى"</string> - <string name="aerr_report" msgid="3095644466849299308">"إرسال تعليقات"</string> + <string name="aerr_report" msgid="3095644466849299308">"إرسال ملاحظات"</string> <string name="aerr_close" msgid="3398336821267021852">"إغلاق"</string> <string name="aerr_mute" msgid="2304972923480211376">"كتم الصوت حتى إعادة تشغيل الجهاز"</string> <string name="aerr_wait" msgid="3198677780474548217">"انتظار"</string> diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml index 840c720f8898..626c3d6e930a 100644 --- a/core/res/res/values-as/strings.xml +++ b/core/res/res/values-as/strings.xml @@ -703,7 +703,7 @@ <skip /> <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"মুখাৱয়বৰ মডেল সৃষ্টি কৰিব নোৱাৰি। পুনৰ চেষ্টা কৰক।"</string> <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"ডাঠ ৰঙৰ চশমা চিনাক্ত কৰা হৈছে। আপোনাৰ মুখাৱয়ব সম্পূৰ্ণৰূপে দেখা পোৱা হৈ থাকিবই লাগিব।"</string> - <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"মুখাৱয়বত আৱৰণ চিনাক্ত কৰা হৈছে। আপোনাৰ মুখাৱয়ব সম্পূৰ্ণৰূপে দেখা পোৱা হৈ থাকিবই লাগিব।"</string> + <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"মুখাৱয়ব ঢাক খাই আছে। সম্পূৰ্ণ মুখাৱয়ব দেখা পাব লাগিব।"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"মুখমণ্ডল সত্যাপন কৰিব পৰা নগ’ল। হাৰ্ডৱেৰ নাই।"</string> diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index 32836e44cbdf..1baf387eeab9 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -1365,7 +1365,7 @@ <string name="usb_ptp_notification_title" msgid="5043437571863443281">"Režim PTP preko USB-a je uključen"</string> <string name="usb_tether_notification_title" msgid="8828527870612663771">"USB privezivanje je uključeno"</string> <string name="usb_midi_notification_title" msgid="7404506788950595557">"Režim MIDI preko USB-a je uključen"</string> - <string name="usb_uvc_notification_title" msgid="2030032862673400008">"Uređaj povezan sa veb-kamerom"</string> + <string name="usb_uvc_notification_title" msgid="2030032862673400008">"Uređaj povezan kao veb-kamera"</string> <string name="usb_accessory_notification_title" msgid="1385394660861956980">"USB dodatak je povezan"</string> <string name="usb_notification_message" msgid="4715163067192110676">"Dodirnite za još opcija."</string> <string name="usb_power_notification_message" msgid="7284765627437897702">"Povezani uređaj se puni. Dodirnite za još opcija."</string> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index f9c5bfd6e065..b4ba000938ce 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -703,7 +703,7 @@ <skip /> <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Моделът на лицето ви не бе създаден. Опитайте отново."</string> <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Изглежда, че носите тъмни очила. То трябва да е напълно видимо."</string> - <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Изглежда, че лицето ви е покрито. То трябва да е напълно видимо."</string> + <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Лицето ви е покрито. То трябва да е напълно видимо."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Лицето не може да се потвърди. Хардуерът не е налице."</string> @@ -1257,7 +1257,7 @@ <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Приложенията се стартират."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Зареждането завършва."</string> <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Натиснахте бутона за включване/изключване – това обикновено изключва екрана.\n\nОпитайте да докоснете леко, докато настройвате отпечатъка си."</string> - <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"Изключете екрана за изход от настройката"</string> + <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"За изход изключете екрана"</string> <string name="fp_power_button_enrollment_button_text" msgid="3199783266386029200">"Изключване"</string> <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Напред с потвърждаването на отпечатъка?"</string> <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Натиснахте бутона за включване/изключване – това обикновено изключва екрана.\n\nОпитайте да докоснете леко, за да потвърдите отпечатъка си."</string> diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml index c339a1058d9c..25c0d42853e8 100644 --- a/core/res/res/values-bn/strings.xml +++ b/core/res/res/values-bn/strings.xml @@ -626,11 +626,11 @@ <string name="biometric_error_generic" msgid="6784371929985434439">"যাচাইকরণে সমস্যা হয়েছে"</string> <string name="screen_lock_app_setting_name" msgid="6054944352976789228">"স্ক্রিন লক ব্যবহার করুন"</string> <string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"চালিয়ে যেতে আপনার স্ক্রিন লক ব্যবহার করুন"</string> - <string name="fingerprint_acquired_partial" msgid="4323789264604479684">"সেন্সর জোরে প্রেস করুন"</string> + <string name="fingerprint_acquired_partial" msgid="4323789264604479684">"সেন্সরে জোরে প্রেস করুন"</string> <string name="fingerprint_acquired_insufficient" msgid="623888149088216458">"ফিঙ্গারপ্রিন্ট শনাক্ত করা যায়নি। আবার চেষ্টা করুন।"</string> <string name="fingerprint_acquired_imager_dirty" msgid="1770676120848224250">"আঙ্গুলের ছাপের সেন্সর পরিষ্কার করে আবার চেষ্টা করুন"</string> <string name="fingerprint_acquired_imager_dirty_alt" msgid="9169582140486372897">"সেন্সর পরিষ্কার করে আবার চেষ্টা করুন"</string> - <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"সেন্সর জোরে প্রেস করুন"</string> + <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"সেন্সরে জোরে প্রেস করুন"</string> <string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"আঙ্গুল খুব ধীরে সরানো হয়েছে৷ অনুগ্রহ করে আবার চেষ্টা করুন৷"</string> <string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"অন্য আঙ্গুলের ছাপ দিয়ে চেষ্টা করুন"</string> <string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"অত্যন্ত উজ্জ্বল"</string> @@ -639,7 +639,7 @@ <string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"প্রতিবার আপনার আঙুলের অবস্থান সামান্য পরিবর্তন করুন"</string> <string-array name="fingerprint_acquired_vendor"> </string-array> - <string name="fingerprint_error_not_match" msgid="4599441812893438961">"আঙ্গুলের ছাপ শনাক্ত করা যায়নি"</string> + <string name="fingerprint_error_not_match" msgid="4599441812893438961">"ফিঙ্গারপ্রিন্ট শনাক্ত করা যায়নি"</string> <string name="fingerprint_udfps_error_not_match" msgid="8236930793223158856">"ফিঙ্গারপ্রিন্ট শনাক্ত করা যায়নি"</string> <string name="fingerprint_authenticated" msgid="2024862866860283100">"আঙ্গুলের ছাপ যাচাই করা হয়েছে"</string> <string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"ফেস যাচাই করা হয়েছে"</string> @@ -1366,7 +1366,7 @@ <string name="usb_midi_notification_title" msgid="7404506788950595557">"USB এর মাধ্যমে MIDI চালু করা হয়েছে"</string> <string name="usb_uvc_notification_title" msgid="2030032862673400008">"ওয়েবক্যাম হিসেবে কানেক্ট করা আছে"</string> <string name="usb_accessory_notification_title" msgid="1385394660861956980">"ইউএসবি অ্যাক্সেসরি কানেক্ট করা হয়েছে"</string> - <string name="usb_notification_message" msgid="4715163067192110676">"আরও বিকল্পের জন্য আলতো চাপুন৷"</string> + <string name="usb_notification_message" msgid="4715163067192110676">"আরও বিকল্পের জন্য ট্যাপ করুন।"</string> <string name="usb_power_notification_message" msgid="7284765627437897702">"সংযুক্ত ডিভাইস চার্জ করা হচ্ছে। আরও বিকল্প দেখতে ট্যাপ করুন।"</string> <string name="usb_unsupported_audio_accessory_title" msgid="2335775548086533065">"অ্যানালগ অডিও অ্যাক্সেসরি শনাক্ত করা হয়েছে"</string> <string name="usb_unsupported_audio_accessory_message" msgid="1300168007129796621">"সংযুক্ত ডিভাইসটি এই ফোনের সাথে ব্যবহার করা যাবে না। আরও জানতে ট্যাপ করুন।"</string> diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index 85d0ed162a6a..e824ecc213ca 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -683,8 +683,8 @@ <string name="face_acquired_too_dark" msgid="8539853432479385326">"Nema dovoljno svjetlosti"</string> <string name="face_acquired_too_close" msgid="4453646176196302462">"Odmaknite telefon"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Primaknite telefon"</string> - <string name="face_acquired_too_high" msgid="8278815780046368576">"Pomjerite telefon naviše"</string> - <string name="face_acquired_too_low" msgid="4075391872960840081">"Pomjerite telefon naniže"</string> + <string name="face_acquired_too_high" msgid="8278815780046368576">"Pomjerite telefon nagore"</string> + <string name="face_acquired_too_low" msgid="4075391872960840081">"Pomjerite telefon nadolje"</string> <string name="face_acquired_too_right" msgid="6245286514593540859">"Pomjerite telefon ulijevo"</string> <string name="face_acquired_too_left" msgid="9201762240918405486">"Pomjerite telefon udesno"</string> <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Gledajte direktno u uređaj."</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index d448ebf733c0..46fc3a3a1114 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -704,7 +704,7 @@ <skip /> <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"No es pot crear el model facial. Torna-ho a provar."</string> <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"S\'han detectat ulleres fosques. La cara ha de veure\'s sencera."</string> - <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"S\'ha detectat una mascareta. La cara ha de veure\'s sencera."</string> + <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Tens la cara tapada. La cara ha de veure\'s sencera."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"No es pot verificar la cara. Maquinari no disponible."</string> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 6aabea5e15ee..196fa5618db3 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -632,7 +632,7 @@ <string name="fingerprint_acquired_insufficient" msgid="623888149088216458">"Otisk prstu se nepodařilo rozpoznat. Zkuste to znovu."</string> <string name="fingerprint_acquired_imager_dirty" msgid="1770676120848224250">"Vyčistěte snímač otisků prstů a zkuste to znovu"</string> <string name="fingerprint_acquired_imager_dirty_alt" msgid="9169582140486372897">"Vyčistěte senzor a zkuste to znovu"</string> - <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"Pevně přitiskněte na snímač"</string> + <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"Pevně přitiskněte prst na snímač"</string> <string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Pohyb prstem byl příliš pomalý. Zkuste to znovu."</string> <string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Zkuste jiný otisk prstu"</string> <string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Je příliš světlo"</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 2eecd2739a64..c1f0e711c1d3 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -695,7 +695,7 @@ <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Kig mere direkte på din telefon"</string> <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Kig mere direkte på din telefon"</string> <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Kig mere direkte på din telefon"</string> - <string name="face_acquired_obscured" msgid="4917643294953326639">"Hvis noget skjuler dit ansigt, skal du fjerne det."</string> + <string name="face_acquired_obscured" msgid="4917643294953326639">"Hvis noget skjuler dit ansigt, skal du fjerne det"</string> <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Rengør toppen af din skærm, inkl. den sorte bjælke"</string> <!-- no translation found for face_acquired_dark_glasses_detected (5643703296620631986) --> <skip /> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 9b0bc2891ce7..4ea1eab5cd74 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -703,7 +703,7 @@ <skip /> <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Αδύνατη η δημιουργία του μοντέλου προσώπου. Δοκιμάστε ξανά."</string> <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Ανιχνεύτηκαν σκούρα γυαλιά. Το πρόσωπό σας πρέπει να φαίνεται πλήρως."</string> - <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Ανιχνεύτηκε κάλυμμα προσώπου. Το πρόσωπό σας πρέπει να φαίνεται πλήρως."</string> + <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Ανιχνεύτηκε κάλυμμα προσώπου. Δεν φαίνεται όλο το πρόσωπο."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Αδύν. επαλήθ. προσώπου. Μη διαθέσιμος εξοπλισμός."</string> @@ -1370,8 +1370,8 @@ <string name="usb_power_notification_message" msgid="7284765627437897702">"Φόρτιση συνδεδεμένης συσκευής. Πατήστε για περισσότερες επιλογές."</string> <string name="usb_unsupported_audio_accessory_title" msgid="2335775548086533065">"Εντοπίστηκε αναλογικό αξεσουάρ ήχου"</string> <string name="usb_unsupported_audio_accessory_message" msgid="1300168007129796621">"Η συνδεδεμένη συσκευή δεν είναι συμβατή με αυτό το τηλέφωνο. Πατήστε για να μάθετε περισσότερα."</string> - <string name="adb_active_notification_title" msgid="408390247354560331">"Συνδέθηκε ο εντοπισμός σφαλμάτων USB"</string> - <string name="adb_active_notification_message" msgid="5617264033476778211">"Πατήστε για απενεργοποίηση εντοπισμού/διόρθ. σφαλμάτων USB"</string> + <string name="adb_active_notification_title" msgid="408390247354560331">"Συνδέθηκε ο εντοπ. σφαλμ. USB"</string> + <string name="adb_active_notification_message" msgid="5617264033476778211">"Πατήστε για απενεργ. εντοπ./διόρθ. σφαλμ. USB"</string> <string name="adb_active_notification_message" product="tv" msgid="6624498401272780855">"Επιλογή για απενεργοποίηση του εντοπισμού σφαλμάτων USB."</string> <string name="adbwifi_active_notification_title" msgid="6147343659168302473">"Συνδέθηκε ο ασύρματος εντοπισμός σφαλμάτων"</string> <string name="adbwifi_active_notification_message" msgid="930987922852867972">"Πατήστε, για να απενεργοποιήσετε τον ασύρματο εντοπισμό σφαλμάτων"</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 99ab4509fabc..93430602870d 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -627,11 +627,11 @@ <string name="biometric_error_generic" msgid="6784371929985434439">"Error de autenticación"</string> <string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Usar bloqueo de pantalla"</string> <string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Ingresa tu bloqueo de pantalla para continuar"</string> - <string name="fingerprint_acquired_partial" msgid="4323789264604479684">"Presiona con firmeza el sensor"</string> + <string name="fingerprint_acquired_partial" msgid="4323789264604479684">"Presiona el sensor con firmeza"</string> <string name="fingerprint_acquired_insufficient" msgid="623888149088216458">"No se reconoce la huella dactilar. Vuelve a intentarlo."</string> <string name="fingerprint_acquired_imager_dirty" msgid="1770676120848224250">"Limpia el sensor de huellas dactilares y vuelve a intentarlo"</string> <string name="fingerprint_acquired_imager_dirty_alt" msgid="9169582140486372897">"Limpia el sensor y vuelve a intentarlo"</string> - <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"Presiona con firmeza el sensor"</string> + <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"Presiona el sensor con firmeza"</string> <string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Moviste el dedo muy lento. Vuelve a intentarlo."</string> <string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Prueba con otra huella dactilar"</string> <string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Demasiada luz"</string> @@ -688,7 +688,7 @@ <string name="face_acquired_too_right" msgid="6245286514593540859">"Mueve el teléfono hacia la izquierda"</string> <string name="face_acquired_too_left" msgid="9201762240918405486">"Mueve el teléfono hacia la derecha"</string> <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Mira directamente al dispositivo."</string> - <string name="face_acquired_not_detected" msgid="1057966913397548150">"No se ve tu cara. Sostén el teléfono a la altura de los ojos."</string> + <string name="face_acquired_not_detected" msgid="1057966913397548150">"No se te ve el rostro. Sostén el teléfono a la altura de los ojos."</string> <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Te estás moviendo demasiado. No muevas el teléfono"</string> <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Vuelve a registrar tu rostro."</string> <string name="face_acquired_too_different" msgid="2520389515612972889">"No se reconoce el rostro. Vuelve a intentarlo."</string> @@ -703,8 +703,8 @@ <!-- no translation found for face_acquired_mouth_covering_detected (8219428572168642593) --> <skip /> <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"No se puede crear modelo de rostro. Vuelve a intentarlo."</string> - <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Se detectaron lentes oscuros. Tu rostro debe verse completamente."</string> - <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Llevas mascarilla. Se debe ver todo tu rostro."</string> + <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Se detectaron lentes oscuros. Se te debe ver todo el rostro."</string> + <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Llevas mascarilla. Se te debe ver todo el rostro."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"No se verificó el rostro. Hardware no disponible."</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 6fcf445cce6c..c0e705cd6750 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -704,7 +704,7 @@ <skip /> <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"No se puede crear tu modelo. Inténtalo de nuevo."</string> <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Gafas oscuras detectadas. Tu cara se debe poder ver entera."</string> - <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Cara parcialmente cubierta. Tu cara se debe poder ver entera."</string> + <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Cara parcialmente cubierta. Debe verse toda."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"No se puede verificar. Hardware no disponible."</string> diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index 384280ea6916..c50f3ba19831 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -1370,7 +1370,7 @@ <string name="usb_power_notification_message" msgid="7284765627437897702">"Ühendatud seadet laetakse. Puudutage lisavalikute nägemiseks."</string> <string name="usb_unsupported_audio_accessory_title" msgid="2335775548086533065">"Tuvastati analoogne helitarvik"</string> <string name="usb_unsupported_audio_accessory_message" msgid="1300168007129796621">"Ühendatud seade ei ühildu selle telefoniga. Puudutage lisateabe saamiseks."</string> - <string name="adb_active_notification_title" msgid="408390247354560331">"USB-silumine ühendatud"</string> + <string name="adb_active_notification_title" msgid="408390247354560331">"USB-silumine on ühendatud"</string> <string name="adb_active_notification_message" msgid="5617264033476778211">"Puudutage USB-silumise väljalülitamiseks"</string> <string name="adb_active_notification_message" product="tv" msgid="6624498401272780855">"Valige USB silumise keelamiseks"</string> <string name="adbwifi_active_notification_title" msgid="6147343659168302473">"Juhtmevaba silumine on ühendatud"</string> @@ -2158,7 +2158,7 @@ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Blokeeris teie IT-administraator"</string> <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Seda sisu ei saa töörakendustega jagada"</string> <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Seda sisu ei saa töörakendustega avada"</string> - <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Seda sisu ei saa isiklike rakendustega jagada"</string> + <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Seda sisu ei saa isiklike rakendustega jagada."</string> <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Seda sisu ei saa isiklike rakendustega avada"</string> <string name="resolver_turn_on_work_apps" msgid="1535946298236678122">"Töörakendused on peatatud"</string> <string name="resolver_switch_on_work" msgid="4527096360772311894">"Jätka"</string> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 4661f60c9c79..b5942580e99f 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -1264,7 +1264,7 @@ <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"خاموش کردن صفحه"</string> <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"ادامه"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> در حال اجرا"</string> - <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"برای برگشت به بازی، ضربه بزنید"</string> + <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"برای برگشتن به بازی، ضربه بزنید"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"انتخاب بازی"</string> <string name="heavy_weight_switcher_text" msgid="6814316627367160126">"برای عملکرد بهتر، هربار فقط یکی از این بازیها را میتوان باز کرد."</string> <string name="old_app_action" msgid="725331621042848590">"به <xliff:g id="OLD_APP">%1$s</xliff:g> برگردید"</string> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index 6741605c19aa..edfae7648bb9 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -1257,7 +1257,7 @@ <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Käynnistetään sovelluksia."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Viimeistellään päivitystä."</string> <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Painoit virtapainiketta, mikä yleensä sammuttaa näytön.\n\nKosketa painiketta kevyesti tallentaessasi sormenjälkeä."</string> - <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"Lopeta käyttöönotto sammuttamalla näyttö"</string> + <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"Lopeta sammuttamalla näyttö"</string> <string name="fp_power_button_enrollment_button_text" msgid="3199783266386029200">"Laita pois päältä"</string> <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Jatketaanko sormenjäljen vahvistamista?"</string> <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Painoit virtapainiketta, mikä yleensä sammuttaa näytön.\n\nVahvista sormenjälki koskettamalla painiketta kevyesti."</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index 7a3bf7657195..bca6087c94a4 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -693,9 +693,9 @@ <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Veuillez inscrire votre visage à nouveau."</string> <string name="face_acquired_too_different" msgid="2520389515612972889">"Visage non reconnu. Réessayez."</string> <string name="face_acquired_too_similar" msgid="8882920552674125694">"Modifiez légèrement la position de votre tête"</string> - <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Regardez plus directement votre téléphone"</string> - <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Regardez plus directement votre téléphone"</string> - <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Regardez plus directement votre téléphone"</string> + <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Regardez droit dans le téléphone"</string> + <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Regardez droit dans le téléphone"</string> + <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Regardez droit dans le téléphone"</string> <string name="face_acquired_obscured" msgid="4917643294953326639">"Retirez tout ce qui pourrait couvrir votre visage."</string> <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Nettoyez le haut de l\'écran, y compris la barre noire"</string> <!-- no translation found for face_acquired_dark_glasses_detected (5643703296620631986) --> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index d5d52e449c56..221c526732ee 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -687,16 +687,16 @@ <string name="face_acquired_too_low" msgid="4075391872960840081">"Déplacez le téléphone vers le bas"</string> <string name="face_acquired_too_right" msgid="6245286514593540859">"Déplacez le téléphone vers la gauche"</string> <string name="face_acquired_too_left" msgid="9201762240918405486">"Déplacez le téléphone vers la droite"</string> - <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Veuillez regarder plus directement l\'appareil."</string> + <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Mettez-vous bien de face et regardez l\'appareil."</string> <string name="face_acquired_not_detected" msgid="1057966913397548150">"Visage non détecté. Tenez votre téléphone à hauteur des yeux."</string> <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Trop de mouvement. Ne bougez pas le téléphone."</string> <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Veuillez enregistrer à nouveau votre visage."</string> <string name="face_acquired_too_different" msgid="2520389515612972889">"Visage non reconnu. Réessayez."</string> <string name="face_acquired_too_similar" msgid="8882920552674125694">"Déplacez légèrement votre tête."</string> - <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Regardez plus directement votre téléphone"</string> - <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Centrez bien votre visage devant votre téléphone"</string> - <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Regardez plus directement votre téléphone"</string> - <string name="face_acquired_obscured" msgid="4917643294953326639">"Retirez tout ce qui cache votre visage."</string> + <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Mettez-vous bien de face et regardez le téléphone"</string> + <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Mettez-vous bien de face et regardez le téléphone"</string> + <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Mettez-vous bien de face et regardez le téléphone"</string> + <string name="face_acquired_obscured" msgid="4917643294953326639">"Retirez tout ce qui cache votre visage"</string> <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Nettoyez la partie supérieure de l\'écran, y compris la barre noire"</string> <!-- no translation found for face_acquired_dark_glasses_detected (5643703296620631986) --> <skip /> @@ -704,7 +704,7 @@ <skip /> <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Impossible de créer votre empreinte faciale. Réessayez."</string> <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Lunettes sombres détectées. Votre visage doit être entièrement visible."</string> - <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Masque détecté. Votre visage doit être entièrement visible."</string> + <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Visage partiellement couvert. Votre visage doit être entièrement visible."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Imposs. valider visage. Matériel non disponible."</string> @@ -1258,7 +1258,7 @@ <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Lancement des applications…"</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Finalisation de la mise à jour."</string> <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Vous avez appuyé sur le bouton Marche/Arrêt, ce qui éteint généralement l\'écran.\n\nEssayez d\'appuyer doucement pendant la configuration de votre empreinte digitale."</string> - <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"Éteignez l\'écran pour achever la configuration."</string> + <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"Éteignez l\'écran pour finir la config."</string> <string name="fp_power_button_enrollment_button_text" msgid="3199783266386029200">"Éteindre"</string> <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Continuer de valider votre empreinte ?"</string> <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Vous avez appuyé sur le bouton Marche/Arrêt, ce qui éteint généralement l\'écran.\n\nPour valider votre empreinte digitale, appuyez plus doucement."</string> diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index 16b1e002c258..39ae24323c41 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -646,7 +646,7 @@ <string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Autenticouse a cara, preme Confirmar"</string> <string name="fingerprint_error_hw_not_available" msgid="4571700896929561202">"Hardware de impresión dixital non dispoñible."</string> <string name="fingerprint_error_no_space" msgid="7285481581905967580">"Non se puido configurar a impresión dixital"</string> - <string name="fingerprint_error_timeout" msgid="7361192266621252164">"Esgotouse o tempo para configurar a impresión dixital Téntao de novo."</string> + <string name="fingerprint_error_timeout" msgid="7361192266621252164">"Esgotouse o tempo para configurar a impresión dixital. Téntao de novo."</string> <string name="fingerprint_error_canceled" msgid="540026881380070750">"Cancelouse a operación da impresión dixital."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"O usuario cancelou a operación da impresión dixital."</string> <string name="fingerprint_error_lockout" msgid="6626753679019351368">"Houbo demasiados intentos. Mellor usa o bloqueo de pantalla."</string> @@ -703,7 +703,7 @@ <skip /> <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Non se puido crear o modelo facial. Téntao de novo."</string> <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Levas lentes escuras, pero débeseche ver toda a cara"</string> - <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Tes a cara tapada, pero débeseche ver enteira"</string> + <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Tes a cara tapada; tense que ver enteira"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Sen verificar a cara. Hardware non dispoñible."</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 2caba460a8f5..bfa4f3943953 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -1257,7 +1257,7 @@ <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"ऐप्स प्रारंभ होने वाले हैं"</string> <string name="android_upgrading_complete" msgid="409800058018374746">"बूट खत्म हो रहा है."</string> <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"आपने पावर बटन दबाया - आम तौर पर, इससे स्क्रीन बंद हो जाती है.\n\nअपना फ़िंगरप्रिंट सेट अप करते समय, बटन को हल्के से टैप करके देखें."</string> - <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"सेटअप पूरा होने पर, स्क्रीन बंद करें"</string> + <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"सेटअप रोकने के लिए, स्क्रीन बंद करें"</string> <string name="fp_power_button_enrollment_button_text" msgid="3199783266386029200">"बंद करें"</string> <string name="fp_power_button_bp_title" msgid="5585506104526820067">"फ़िंगरप्रिंट की पुष्टि करना जारी रखना है?"</string> <string name="fp_power_button_bp_message" msgid="2983163038168903393">"आपने पावर बटन दबाया - आम तौर पर, इससे स्क्रीन बंद हो जाती है.\n\nअपने फ़िंगरप्रिंट की पुष्टि करने के लिए, बटन पर हल्के से टैप करके देखें."</string> @@ -2158,7 +2158,7 @@ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"आपके आईटी एडमिन ने इस कॉन्टेंट को शेयर करने की सुविधा ब्लॉक कर रखी है"</string> <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"इस कॉन्टेंट को ऑफ़िस के काम से जुड़े ऐप्लिकेशन का इस्तेमाल करके, शेयर नहीं किया जा सकता"</string> <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"इस कॉन्टेंट को ऑफ़िस के काम से जुड़े ऐप्लिकेशन पर खोला नहीं जा सकता"</string> - <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"इस कॉन्टेंट को निजी ऐप्लिकेशन का इस्तेमाल करके, शेयर नहीं किया जा सकता"</string> + <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"इस कॉन्टेंट को निजी ऐप्लिकेशन के ज़रिए शेयर नहीं किया जा सकता"</string> <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"इस कॉन्टेंट को निजी ऐप्लिकेशन पर खोला नहीं जा सकता"</string> <string name="resolver_turn_on_work_apps" msgid="1535946298236678122">"वर्क ऐप्लिकेशन बंद किए गए हैं"</string> <string name="resolver_switch_on_work" msgid="4527096360772311894">"चालू करें"</string> diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index 569c54f271b9..f831700c5721 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -1257,7 +1257,7 @@ <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Հավելվածները մեկնարկում են:"</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Բեռնումն ավարտվում է:"</string> <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Դուք սեղմել եք սնուցման կոճակը։ Սովորաբար դրա արդյունքում էկրանն անջատվում է։\n\nՄատնահետքը ավելացնելու համար թեթևակի հպեք կոճակին։"</string> - <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"Ավարտեք կարգավորումը՝ անջատելով էկրանը"</string> + <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"Անջատեք էկրանը և ավարտեք"</string> <string name="fp_power_button_enrollment_button_text" msgid="3199783266386029200">"Անջատել"</string> <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Շարունակե՞լ մատնահետքի սկանավորումը"</string> <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Դուք սեղմել եք սնուցման կոճակը։ Սովորաբար դրա արդյունքում էկրանն անջատվում է։\n\nՄատնահետքը սկանավորելու համար թեթևակի հպեք կոճակին։"</string> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index f382b120b617..92d85c7a8ad3 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -223,7 +223,7 @@ <string name="silent_mode_silent" msgid="5079789070221150912">"Pendering mati"</string> <string name="silent_mode_vibrate" msgid="8821830448369552678">"Pendering bergetar"</string> <string name="silent_mode_ring" msgid="6039011004781526678">"Pendering nyala"</string> - <string name="reboot_to_update_title" msgid="2125818841916373708">"Pemutakhiran sistem Android"</string> + <string name="reboot_to_update_title" msgid="2125818841916373708">"Update sistem Android"</string> <string name="reboot_to_update_prepare" msgid="6978842143587422365">"Bersiap untuk memperbarui..."</string> <string name="reboot_to_update_package" msgid="4644104795527534811">"Memproses pembaruan paket…"</string> <string name="reboot_to_update_reboot" msgid="4474726009984452312">"Memulai ulang…"</string> @@ -703,7 +703,7 @@ <skip /> <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Tidak dapat membuat model wajah Anda. Coba lagi."</string> <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Kacamata hitam terdeteksi. Wajah harus terlihat sepenuhnya."</string> - <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Penutup wajah terdeteksi. Wajah harus terlihat sepenuhnya."</string> + <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Penutup wajah terdeteksi. Wajah harus terlihat jelas."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Tidak dapat memverifikasi wajah. Hardware tidak tersedia."</string> @@ -1371,7 +1371,7 @@ <string name="usb_unsupported_audio_accessory_title" msgid="2335775548086533065">"Aksesori audio analog terdeteksi"</string> <string name="usb_unsupported_audio_accessory_message" msgid="1300168007129796621">"Perangkat yang terpasang tidak kompatibel dengan ponsel ini. Ketuk untuk mempelajari lebih lanjut."</string> <string name="adb_active_notification_title" msgid="408390247354560331">"Proses debug USB terhubung"</string> - <string name="adb_active_notification_message" msgid="5617264033476778211">"Ketuk untuk menonaktifkan proses debug USB"</string> + <string name="adb_active_notification_message" msgid="5617264033476778211">"Ketuk untuk nonaktifkan proses debug USB"</string> <string name="adb_active_notification_message" product="tv" msgid="6624498401272780855">"Pilih untuk menonaktifkan debugging USB."</string> <string name="adbwifi_active_notification_title" msgid="6147343659168302473">"Proses debug nirkabel terhubung"</string> <string name="adbwifi_active_notification_message" msgid="930987922852867972">"Ketuk untuk menonaktifkan proses debug nirkabel."</string> @@ -2158,7 +2158,7 @@ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Diblokir oleh admin IT Anda"</string> <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Konten ini tidak dapat dibagikan dengan aplikasi kerja"</string> <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Konten ini tidak dapat dibuka dengan aplikasi kerja"</string> - <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Konten ini tidak dapat dibagikan dengan aplikasi pribadi"</string> + <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Konten ini tidak dapat dibagikan ke aplikasi pribadi"</string> <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Konten ini tidak dapat dibuka dengan aplikasi pribadi"</string> <string name="resolver_turn_on_work_apps" msgid="1535946298236678122">"Aplikasi kerja dijeda"</string> <string name="resolver_switch_on_work" msgid="4527096360772311894">"Batalkan jeda"</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 705613ad6fad..fe663ddebe71 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -693,8 +693,8 @@ <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Ripeti l\'acquisizione del volto."</string> <string name="face_acquired_too_different" msgid="2520389515612972889">"Impossibile riconoscere il volto. Riprova."</string> <string name="face_acquired_too_similar" msgid="8882920552674125694">"Cambia leggermente la posizione della testa"</string> - <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Guarda dritto nel telefono"</string> - <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Guarda dritto nel telefono"</string> + <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Guarda dritto nello smartphone"</string> + <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Guarda dritto nello smartphone"</string> <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Guarda dritto nel telefono"</string> <string name="face_acquired_obscured" msgid="4917643294953326639">"Rimuovi tutto ciò che ti nasconde il viso"</string> <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Pulisci la parte superiore dello schermo, inclusa la barra nera"</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index e4b50f9f4b86..1bba6e51580c 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -684,11 +684,11 @@ <string name="face_acquired_too_close" msgid="4453646176196302462">"צריך להרחיק את הטלפון"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"צריך לקרב את הטלפון"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"צריך להגביה את הטלפון"</string> - <string name="face_acquired_too_low" msgid="4075391872960840081">"צריך להוריד את הטלפון"</string> + <string name="face_acquired_too_low" msgid="4075391872960840081">"צריך להנמיך את הטלפון."</string> <string name="face_acquired_too_right" msgid="6245286514593540859">"צריך להזיז את הטלפון שמאלה"</string> <string name="face_acquired_too_left" msgid="9201762240918405486">"צריך להזיז את הטלפון ימינה"</string> <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"יש להביט ישירות אל המכשיר."</string> - <string name="face_acquired_not_detected" msgid="1057966913397548150">"כדי לראות את הפנים שלך יש להחזיק את הטלפון בגובה העיניים."</string> + <string name="face_acquired_not_detected" msgid="1057966913397548150">"לא רואים את הפנים שלך. יש להחזיק את הטלפון בגובה העיניים."</string> <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"יותר מדי תנועה. יש להחזיק את הטלפון בצורה יציבה."</string> <string name="face_acquired_recalibrate" msgid="8724013080976469746">"יש לסרוק שוב את הפנים."</string> <string name="face_acquired_too_different" msgid="2520389515612972889">"לא ניתן לזהות את הפנים. יש לנסות שוב."</string> @@ -704,7 +704,7 @@ <skip /> <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"לא ניתן ליצור את התבנית לזיהוי הפנים. יש לנסות שוב."</string> <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"זוהו משקפיים כהים. הפנים שלך חייבות להיות גלויות לגמרי."</string> - <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"זוהה כיסוי על הפנים. הפנים שלך חייבות להיות גלויות לגמרי."</string> + <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"זוהה שהפנים מכוסות. הפנים שלך חייבות להיות גלויות לגמרי."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"לא ניתן לאמת את הפנים. החומרה לא זמינה."</string> @@ -1259,7 +1259,7 @@ <string name="android_upgrading_complete" msgid="409800058018374746">"תהליך האתחול בשלבי סיום."</string> <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"לחצת על לחצן ההפעלה – בדרך כלל הפעולה הזו מכבה את המסך.\n\nעליך לנסות להקיש בעדינות במהלך ההגדרה של טביעת האצבע שלך."</string> <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"לסיום ההגדרה, יש לכבות את המסך"</string> - <string name="fp_power_button_enrollment_button_text" msgid="3199783266386029200">"השבתה"</string> + <string name="fp_power_button_enrollment_button_text" msgid="3199783266386029200">"כיבוי"</string> <string name="fp_power_button_bp_title" msgid="5585506104526820067">"להמשיך לאמת את טביעת האצבע שלך?"</string> <string name="fp_power_button_bp_message" msgid="2983163038168903393">"לחצת על לחצן ההפעלה – בדרך כלל הפעולה הזו מכבה את המסך.\n\nעליך לנסות להקיש בעדינות כדי לאמת את טביעת האצבע שלך."</string> <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"כיבוי המסך"</string> @@ -1367,7 +1367,7 @@ <string name="usb_midi_notification_title" msgid="7404506788950595557">"MIDI באמצעות USB מופעל"</string> <string name="usb_uvc_notification_title" msgid="2030032862673400008">"המכשיר מחובר כמצלמת אינטרנט"</string> <string name="usb_accessory_notification_title" msgid="1385394660861956980">"אביזר USB מחובר"</string> - <string name="usb_notification_message" msgid="4715163067192110676">"יש להקיש להצגת אפשרויות נוספות."</string> + <string name="usb_notification_message" msgid="4715163067192110676">"לאפשרויות נוספות, יש להקיש כאן."</string> <string name="usb_power_notification_message" msgid="7284765627437897702">"המכשיר המחובר בטעינה. יש להקיש לאפשרויות נוספות."</string> <string name="usb_unsupported_audio_accessory_title" msgid="2335775548086533065">"המכשיר זיהה התקן אודיו אנלוגי"</string> <string name="usb_unsupported_audio_accessory_message" msgid="1300168007129796621">"ההתקן שחיברת לא תואם לטלפון הזה. יש להקיש לקבלת מידע נוסף."</string> diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml index 65bdb2553bab..e09aa157a328 100644 --- a/core/res/res/values-ka/strings.xml +++ b/core/res/res/values-ka/strings.xml @@ -1371,7 +1371,7 @@ <string name="usb_unsupported_audio_accessory_title" msgid="2335775548086533065">"აღმოჩენილია ანალოგური აუდიო აქსესუარი"</string> <string name="usb_unsupported_audio_accessory_message" msgid="1300168007129796621">"მიერთებული მოწყობილობა არაა თავსებადი ამ ტელეფონთან. მეტის გასაგებად, შეეხეთ."</string> <string name="adb_active_notification_title" msgid="408390247354560331">"USB გამართვა შეერთებულია"</string> - <string name="adb_active_notification_message" msgid="5617264033476778211">"შეეხეთ და გამორთეთ USB შეცდ. გამართვა"</string> + <string name="adb_active_notification_message" msgid="5617264033476778211">"შეეხეთ და გამორთეთ USB გამართვა"</string> <string name="adb_active_notification_message" product="tv" msgid="6624498401272780855">"მონიშნეთ რათა შეწყვიტოთ USB-ის გამართვა"</string> <string name="adbwifi_active_notification_title" msgid="6147343659168302473">"შეცდომების უსადენო გამართვა დაკავშირებულია"</string> <string name="adbwifi_active_notification_message" msgid="930987922852867972">"შეეხეთ შეცდომების უსადენო გამართვის გამოსართავად"</string> diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml index d2bc2ca53bdb..70f5828a2b6f 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -630,7 +630,7 @@ <string name="fingerprint_acquired_insufficient" msgid="623888149088216458">"Саусақ ізін тану мүмкін емес. Қайталап көріңіз."</string> <string name="fingerprint_acquired_imager_dirty" msgid="1770676120848224250">"Саусақ ізін оқу сканерін тазалап, әрекетті қайталаңыз."</string> <string name="fingerprint_acquired_imager_dirty_alt" msgid="9169582140486372897">"Сканерді тазалап, әрекетті қайталаңыз."</string> - <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"Сканерді қатты басыңыз."</string> + <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"Сканерді қатты басыңыз"</string> <string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Саусағыңызды тым баяу қозғалттыңыз. Әрекетті қайталап көріңіз."</string> <string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Басқа саусақ ізін байқап көріңіз."</string> <string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Тым жарық."</string> @@ -682,20 +682,20 @@ <string name="face_acquired_too_dark" msgid="8539853432479385326">"Жарық жеткіліксіз"</string> <string name="face_acquired_too_close" msgid="4453646176196302462">"Телефонды алшақ ұстаңыз."</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Телефонды жақынырақ ұстаңыз."</string> - <string name="face_acquired_too_high" msgid="8278815780046368576">"Телефонды жоғарырақ ұстаңыз."</string> - <string name="face_acquired_too_low" msgid="4075391872960840081">"Телефонды төменірек ұстаңыз."</string> - <string name="face_acquired_too_right" msgid="6245286514593540859">"Телефонды солға қарай жылжытыңыз."</string> - <string name="face_acquired_too_left" msgid="9201762240918405486">"Телефонды оңға қарай жылжытыңыз."</string> + <string name="face_acquired_too_high" msgid="8278815780046368576">"Телефонды жоғарырақ ұстаңыз"</string> + <string name="face_acquired_too_low" msgid="4075391872960840081">"Телефонды төменірек ұстаңыз"</string> + <string name="face_acquired_too_right" msgid="6245286514593540859">"Телефонды солға қарай жылжытыңыз"</string> + <string name="face_acquired_too_left" msgid="9201762240918405486">"Телефонды оңға қарай жылжытыңыз"</string> <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Құрылғының камерасына тура қараңыз."</string> <string name="face_acquired_not_detected" msgid="1057966913397548150">"Бетіңіз көрінбей тұр. Телефонды көз деңгейінде ұстаңыз."</string> <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Қозғалыс тым көп. Телефонды қозғалтпаңыз."</string> <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_obscured" msgid="4917643294953326639">"Бетіңізді жауып тұрған нәрсені алып тастаңыз."</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) --> <skip /> diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml index 7bc1a200883a..864778597ca5 100644 --- a/core/res/res/values-km/strings.xml +++ b/core/res/res/values-km/strings.xml @@ -1371,7 +1371,7 @@ <string name="usb_unsupported_audio_accessory_title" msgid="2335775548086533065">"បានរកឃើញគ្រឿងបរិក្ខារសំឡេងអាណាឡូក"</string> <string name="usb_unsupported_audio_accessory_message" msgid="1300168007129796621">"ឧបករណ៍ដែលភ្ជាប់មកជាមួយមិនត្រូវគ្នាជាមួយទូរសព្ទនេះទេ។ ចុចដើម្បីស្វែងយល់បន្ថែម។"</string> <string name="adb_active_notification_title" msgid="408390247354560331">"បានភ្ជាប់ការជួសជុលតាម USB"</string> - <string name="adb_active_notification_message" msgid="5617264033476778211">"ចុចដើម្បីបិទការជួសជុលតាម USB"</string> + <string name="adb_active_notification_message" msgid="5617264033476778211">"ប៉ះដើម្បីបិទការជួសជុលតាម USB"</string> <string name="adb_active_notification_message" product="tv" msgid="6624498401272780855">"ជ្រើសរើស ដើម្បីបិទការកែកំហុសតាម USB ។"</string> <string name="adbwifi_active_notification_title" msgid="6147343659168302473">"បានភ្ជាប់ការជួសជុលដោយឥតខ្សែ"</string> <string name="adbwifi_active_notification_message" msgid="930987922852867972">"ចុច ដើម្បីបិទការជួសជុលដោយឥតខ្សែ"</string> @@ -2158,7 +2158,7 @@ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"បានទប់ស្កាត់ដោយអ្នកគ្រប់គ្រងផ្នែកព័ត៌មានវិទ្យារបស់អ្នក"</string> <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"ខ្លឹមសារនេះមិនអាចចែករំលែកតាមរយៈកម្មវិធីការងារបានទេ"</string> <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"ខ្លឹមសារនេះមិនអាចបើកតាមរយៈកម្មវិធីការងារបានទេ"</string> - <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"ខ្លឹមសារនេះមិនអាចចែករំលែកតាមរយៈកម្មវិធីផ្ទាល់ខ្លួនបានទេ"</string> + <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"មិនអាចចែករំលែកខ្លឹមសារនេះជាមួយកម្មវិធីផ្ទាល់ខ្លួនបានទេ"</string> <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"ខ្លឹមសារនេះមិនអាចបើកតាមរយៈកម្មវិធីផ្ទាល់ខ្លួនបានទេ"</string> <string name="resolver_turn_on_work_apps" msgid="1535946298236678122">"កម្មវិធីការងារត្រូវបានផ្អាក"</string> <string name="resolver_switch_on_work" msgid="4527096360772311894">"ឈប់ផ្អាក"</string> diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml index 1587918ed51a..26aa63d0396b 100644 --- a/core/res/res/values-kn/strings.xml +++ b/core/res/res/values-kn/strings.xml @@ -646,7 +646,7 @@ <string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"ಮುಖವನ್ನು ದೃಢೀಕರಿಸಲಾಗಿದೆ, ದೃಢೀಕರಣವನ್ನು ಒತ್ತಿ"</string> <string name="fingerprint_error_hw_not_available" msgid="4571700896929561202">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಹಾರ್ಡ್ವೇರ್ ಲಭ್ಯವಿಲ್ಲ."</string> <string name="fingerprint_error_no_space" msgid="7285481581905967580">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಅನ್ನು ಸೆಟಪ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ"</string> - <string name="fingerprint_error_timeout" msgid="7361192266621252164">"ಫಿಂಗರ್ ಪ್ರಿಂಟ್ ಸೆಟಪ್ ಮಾಡುವ ಅವಧಿ ಮುಗಿದಿದೆ. ಪುನಃ ಪ್ರಯತ್ನಿಸಿ."</string> + <string name="fingerprint_error_timeout" msgid="7361192266621252164">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಸೆಟಪ್ ಮಾಡುವ ಅವಧಿ ಮುಗಿದಿದೆ. ಪುನಃ ಪ್ರಯತ್ನಿಸಿ."</string> <string name="fingerprint_error_canceled" msgid="540026881380070750">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಕಾರ್ಯಾಚರಣೆಯನ್ನು ರದ್ದುಮಾಡಲಾಗಿದೆ."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"ಬಳಕೆದಾರರು ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಕಾರ್ಯಾಚರಣೆಯನ್ನು ರದ್ದುಪಡಿಸಿದ್ದಾರೆ."</string> <string name="fingerprint_error_lockout" msgid="6626753679019351368">"ಹಲವು ಬಾರಿ ಪ್ರಯತ್ನಿಸಿದ್ದೀರಿ. ಬದಲಾಗಿ ಸ್ಕ್ರೀನ್ಲಾಕ್ ಬಳಸಿ."</string> @@ -703,7 +703,7 @@ <skip /> <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"ಫೇಸ್ ಮಾಡೆಲ್ ರಚಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಪುನಃ ಪ್ರಯತ್ನಿಸಿ."</string> <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"ಕಪ್ಪು ಕನ್ನಡಕ ಪತ್ತೆಯಾಗಿದೆ. ನಿಮ್ಮ ಮುಖವು ಸಂಪೂರ್ಣವಾಗಿ ಗೋಚರಿಸಬೇಕು."</string> - <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"ಮುಖವಾಡ ಪತ್ತೆಯಾಗಿದೆ. ಮುಖವು ಸಂಪೂರ್ಣವಾಗಿ ಗೋಚರಿಸಬೇಕು."</string> + <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"ಮುಖವು ಕವರ್ ಆಗಿದೆ. ಮುಖವು ಸಂಪೂರ್ಣವಾಗಿ ಗೋಚರಿಸಬೇಕು."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"ಮುಖ ದೃಢೀಕರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಹಾರ್ಡ್ವೇರ್ ಲಭ್ಯವಿಲ್ಲ."</string> @@ -1371,7 +1371,7 @@ <string name="usb_unsupported_audio_accessory_title" msgid="2335775548086533065">"ಅನ್ಲಾಗ್ ಆಡಿಯೋ ಪರಿಕರ ಪತ್ತೆಯಾಗಿದೆ"</string> <string name="usb_unsupported_audio_accessory_message" msgid="1300168007129796621">"ಲಗತ್ತಿಸಲಾದ ಸಾಧನವು ಈ ಫೋನಿನೊಂದಿಗೆ ಹೊಂದಿಕೆಯಾಗುವುದಿಲ್ಲ. ಇನ್ನಷ್ಟು ತಿಳಿಯಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string> <string name="adb_active_notification_title" msgid="408390247354560331">"USB ಡೀಬಗ್ ಮಾಡುವಿಕೆ ಕನೆಕ್ಟ್ ಆಗಿದೆ"</string> - <string name="adb_active_notification_message" msgid="5617264033476778211">"USB ಡೀಬಗಿಂಗ್ ಆಫ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string> + <string name="adb_active_notification_message" msgid="5617264033476778211">"USB ಡೀಬಗ್ ಮಾಡುವಿಕೆ ಆಫ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string> <string name="adb_active_notification_message" product="tv" msgid="6624498401272780855">"USB ಡೀಬಗ್ ಮಾಡುವಿಕೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು ಆಯ್ಕೆ ಮಾಡಿ."</string> <string name="adbwifi_active_notification_title" msgid="6147343659168302473">"ವೈರ್ಲೆಸ್ ಡೀಬಗ್ ಮಾಡುವಿಕೆಯನ್ನು ಕನೆಕ್ಟ್ ಮಾಡಲಾಗಿದೆ"</string> <string name="adbwifi_active_notification_message" msgid="930987922852867972">"ವೈರ್ಲೆಸ್ ಡೀಬಗ್ ಮಾಡುವಿಕೆಯನ್ನು ಆಫ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string> @@ -1933,7 +1933,7 @@ <string name="default_notification_channel_label" msgid="3697928973567217330">"ವರ್ಗೀಕರಿಸದಿರುವುದು"</string> <string name="importance_from_user" msgid="2782756722448800447">"ನೀವು ಈ ಅಧಿಸೂಚನೆಗಳ ಪ್ರಾಮುಖ್ಯತೆಯನ್ನು ಹೊಂದಿಸಿರುವಿರಿ."</string> <string name="importance_from_person" msgid="4235804979664465383">"ಜನರು ತೊಡಗಿಕೊಂಡಿರುವ ಕಾರಣ ಇದು ಅತ್ಯಂತ ಪ್ರಮುಖವಾಗಿದೆ."</string> - <string name="notification_history_title_placeholder" msgid="7748630986182249599">"ಕಸ್ಟಮ್ ಆ್ಯಪ್ ಅಧಿಸೂಚನೆ"</string> + <string name="notification_history_title_placeholder" msgid="7748630986182249599">"ಕಸ್ಟಮ್ ಆ್ಯಪ್ ನೋಟಿಫಿಕೇಶನ್"</string> <string name="user_creation_account_exists" msgid="2239146360099708035">"<xliff:g id="ACCOUNT">%2$s</xliff:g> (ಈ ಖಾತೆಯ ಬಳಕೆದಾರರು ಈಗಾಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿದ್ದಾರೆ) ಮೂಲಕ ಹೊಸ ಬಳಕೆದಾರರನ್ನು ರಚಿಸಲು <xliff:g id="APP">%1$s</xliff:g> ಗೆ ಅನುಮತಿಸಬೇಕೆ ?"</string> <string name="user_creation_adding" msgid="7305185499667958364">"<xliff:g id="ACCOUNT">%2$s</xliff:g> ಮೂಲಕ ಹೊಸ ಬಳಕೆದಾರರನ್ನು ರಚಿಸಲು <xliff:g id="APP">%1$s</xliff:g> ಗೆ ಅನುಮತಿಸುವುದೇ ?"</string> <string name="supervised_user_creation_label" msgid="6884904353827427515">"ಮೇಲ್ವಿಚಾರಣೆಯ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿ"</string> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 2dabbf7377b1..18fe689d4466 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -626,11 +626,11 @@ <string name="biometric_error_generic" msgid="6784371929985434439">"인증 오류"</string> <string name="screen_lock_app_setting_name" msgid="6054944352976789228">"화면 잠금 사용"</string> <string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"계속하려면 화면 잠금용 사용자 인증 정보를 입력하세요"</string> - <string name="fingerprint_acquired_partial" msgid="4323789264604479684">"센서 위에 손가락을 좀 더 오래 올려놓으세요"</string> + <string name="fingerprint_acquired_partial" msgid="4323789264604479684">"센서를 세게 누르세요"</string> <string name="fingerprint_acquired_insufficient" msgid="623888149088216458">"지문을 인식할 수 없습니다. 다시 시도해 주세요."</string> <string name="fingerprint_acquired_imager_dirty" msgid="1770676120848224250">"지문 센서를 닦은 후 다시 시도해 보세요."</string> <string name="fingerprint_acquired_imager_dirty_alt" msgid="9169582140486372897">"센서를 닦은 후 다시 시도해 보세요."</string> - <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"센서 위에 손가락을 좀 더 오래 올려놓으세요"</string> + <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"센서를 세게 누르세요"</string> <string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"손가락을 너무 느리게 움직였습니다. 다시 시도해 주세요."</string> <string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"다른 지문으로 시도"</string> <string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"너무 밝음"</string> @@ -687,14 +687,14 @@ <string name="face_acquired_too_right" msgid="6245286514593540859">"휴대전화를 왼쪽으로 움직이세요"</string> <string name="face_acquired_too_left" msgid="9201762240918405486">"휴대전화를 오른쪽으로 움직이세요"</string> <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"기기에서 더 똑바로 바라보세요."</string> - <string name="face_acquired_not_detected" msgid="1057966913397548150">"얼굴이 보이지 않습니다. 눈높이에 맞춰 휴대전화를 들어 주세요."</string> + <string name="face_acquired_not_detected" msgid="1057966913397548150">"얼굴이 보이지 않습니다. 눈높이에 맞춰 휴대전화를 들어 주세요"</string> <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"너무 많이 움직였습니다. 휴대전화를 흔들리지 않게 잡으세요."</string> <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-ky/strings.xml b/core/res/res/values-ky/strings.xml index f4c887a6e101..ede68e4978fd 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -2156,10 +2156,10 @@ <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Жеке көрүнүш"</string> <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Жумуш көрүнүшү"</string> <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"IT администраторуңуз бөгөттөп койгон"</string> - <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Бул мазмунду жумуш колдонмолору менен бөлүшүү мүмкүн эмес"</string> - <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Бул мазмунду жумуш колдонмолору менен ачуу мүмкүн эмес"</string> - <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Бул мазмунду жеке колдонмолор менен бөлүшүү мүмкүн эмес"</string> - <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Бул мазмунду жеке колдонмолор менен ачуу мүмкүн эмес"</string> + <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Бул нерсени жумуш колдонмолору менен бөлүшө албайсыз"</string> + <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Бул нерсени жумуш колдонмолору менен ача албайсыз"</string> + <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Бул нерсени жеке колдонмолор менен бөлүшө албайсыз"</string> + <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Бул нерсени жеке колдонмолор менен ача албайсыз"</string> <string name="resolver_turn_on_work_apps" msgid="1535946298236678122">"Жумуш колдонмолору тындырылды"</string> <string name="resolver_switch_on_work" msgid="4527096360772311894">"Иштетүү"</string> <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Жумуш колдонмолору жок"</string> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index e1188b570c10..e3f1952f3ec2 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -641,8 +641,8 @@ <string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Kaskart šiek tiek pakeiskite piršto poziciją"</string> <string-array name="fingerprint_acquired_vendor"> </string-array> - <string name="fingerprint_error_not_match" msgid="4599441812893438961">"Kontrolinis kodas neatpažintas"</string> - <string name="fingerprint_udfps_error_not_match" msgid="8236930793223158856">"Kontrolinis kodas neatpažintas"</string> + <string name="fingerprint_error_not_match" msgid="4599441812893438961">"Piršto atspaudas neatpažintas"</string> + <string name="fingerprint_udfps_error_not_match" msgid="8236930793223158856">"Piršto atspaudas neatpažintas"</string> <string name="fingerprint_authenticated" msgid="2024862866860283100">"Piršto antspaudas autentifikuotas"</string> <string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Veidas autentifikuotas"</string> <string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Veidas autentifikuotas, paspauskite patvirtinimo mygtuką"</string> @@ -676,7 +676,7 @@ <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Jei norite naudoti atrakinimą pagal veidą, įjunkite parinktį "<b>"Prieiga prie fotoaparato"</b>" skiltyje „Nustatymai“ > „Privatumas“"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Daugiau atrakinimo metodų nustatymas"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Palieskite, kad pridėtumėte kontrolinį kodą"</string> - <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Atrakinimas kontroliniu kodu"</string> + <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Atrakinimas piršto atspaudu"</string> <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Negalima naudoti kontrolinio kodo jutiklio"</string> <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Apsilankykite pas taisymo paslaugos teikėją."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Nepavyko sukurti veido modelio. Band. dar kartą."</string> diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml index b0df176c3a0a..06a35302ffbd 100644 --- a/core/res/res/values-mk/strings.xml +++ b/core/res/res/values-mk/strings.xml @@ -695,7 +695,7 @@ <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_obscured" msgid="4917643294953326639">"Отстранете ги работите што ви го покриваат ликот"</string> <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Исчистете го врвот на екранот, вклучувајќи ја црната лента"</string> <!-- no translation found for face_acquired_dark_glasses_detected (5643703296620631986) --> <skip /> @@ -1257,7 +1257,7 @@ <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Се стартуваат апликациите."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Подигањето завршува."</string> <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Го притиснавте копчето за вклучување — така обично се исклучува екранот.\n\nДопрете лесно додека го поставувате отпечатокот."</string> - <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"За да завршите со поставувањето, исклучете го екранот."</string> + <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"За да завршите со поставувањето, исклучете го екранот"</string> <string name="fp_power_button_enrollment_button_text" msgid="3199783266386029200">"Исклучи"</string> <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Да продолжи потврдувањето на отпечаток?"</string> <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Го притиснавте копчето за вклучување — така обично се исклучува екранот.\n\nДопрете лесно за да го потврдите отпечатокот."</string> diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml index efbb0e13e890..0ca9b379cbb1 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -1010,7 +1010,7 @@ <string name="lockscreen_forgot_pattern_button_text" msgid="8362442730606839031">"പാറ്റേൺ മറന്നോ?"</string> <string name="lockscreen_glogin_forgot_pattern" msgid="9218940117797602518">"അക്കൗണ്ട് അൺലോക്ക്"</string> <string name="lockscreen_glogin_too_many_attempts" msgid="3775904917743034195">"വളരെയധികം പാറ്റേൺ ശ്രമങ്ങൾ"</string> - <string name="lockscreen_glogin_instructions" msgid="4695162942525531700">"അൺലോക്കുചെയ്യുന്നതിന്, നിങ്ങളുടെ Google അക്കൗണ്ട് ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്യുക."</string> + <string name="lockscreen_glogin_instructions" msgid="4695162942525531700">"അൺലോക്കുചെയ്യുന്നതിന്, നിങ്ങളുടെ Google Account ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്യുക."</string> <string name="lockscreen_glogin_username_hint" msgid="6916101478673157045">"ഉപയോക്താവിന്റെ പേര് (ഇമെയിൽ)"</string> <string name="lockscreen_glogin_password_hint" msgid="3031027901286812848">"പാസ്വേഡ്"</string> <string name="lockscreen_glogin_submit_button" msgid="3590556636347843733">"സൈൻ ഇൻ ചെയ്യുക"</string> @@ -1661,7 +1661,7 @@ <string name="kg_invalid_puk" msgid="4809502818518963344">"ശരിയായ PUK കോഡ് വീണ്ടും നൽകുക. ആവർത്തിച്ചുള്ള ശ്രമങ്ങൾ സിം ശാശ്വതമായി പ്രവർത്തനരഹിതമാക്കും."</string> <string name="kg_invalid_confirm_pin_hint" product="default" msgid="4705368340409816254">"പിൻ കോഡുകൾ പൊരുത്തപ്പെടുന്നില്ല"</string> <string name="kg_login_too_many_attempts" msgid="699292728290654121">"വളരെയധികം പാറ്റേൺ ശ്രമങ്ങൾ"</string> - <string name="kg_login_instructions" msgid="3619844310339066827">"അൺലോക്കുചെയ്യുന്നതിന്, നിങ്ങളുടെ Google അക്കൗണ്ട് ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്യുക."</string> + <string name="kg_login_instructions" msgid="3619844310339066827">"അൺലോക്കുചെയ്യുന്നതിന്, നിങ്ങളുടെ Google Account ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്യുക."</string> <string name="kg_login_username_hint" msgid="1765453775467133251">"ഉപയോക്താവിന്റെ പേര് (ഇമെയിൽ)"</string> <string name="kg_login_password_hint" msgid="3330530727273164402">"പാസ്വേഡ്"</string> <string name="kg_login_submit_button" msgid="893611277617096870">"സൈൻ ഇൻ ചെയ്യുക"</string> diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index dd0db08ffa6e..bbb19925b661 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -2126,7 +2126,7 @@ <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"कुनै पनि व्यक्तिसँग सेयर गर्ने सिफारिस गरिएको छैन"</string> <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"अनुप्रयोगहरूको सूची"</string> <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"यो एपलाई रेकर्ड गर्ने अनुमति प्रदान गरिएको छैन तर यसले यो USB यन्त्रमार्फत अडियो क्याप्चर गर्न सक्छ।"</string> - <string name="accessibility_system_action_home_label" msgid="3234748160850301870">"गृहपृष्ठ"</string> + <string name="accessibility_system_action_home_label" msgid="3234748160850301870">"होम"</string> <string name="accessibility_system_action_back_label" msgid="4205361367345537608">"पछाडि फर्कनुहोस्"</string> <string name="accessibility_system_action_recents_label" msgid="4782875610281649728">"हालसालैका एपहरू"</string> <string name="accessibility_system_action_notifications_label" msgid="6083767351772162010">"सूचनाहरू"</string> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 30b487b8d29a..5457872a29f6 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -695,15 +695,15 @@ <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Kijk goed recht naar je telefoon"</string> <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Kijk goed recht naar je telefoon"</string> <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Kijk goed recht naar je telefoon"</string> - <string name="face_acquired_obscured" msgid="4917643294953326639">"Zorg dat er niets voor je gezicht zit"</string> + <string name="face_acquired_obscured" msgid="4917643294953326639">"Zorg dat niets je gezicht bedekt"</string> <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Reinig de bovenkant van je scherm, inclusief de zwarte balk"</string> <!-- no translation found for face_acquired_dark_glasses_detected (5643703296620631986) --> <skip /> <!-- no translation found for face_acquired_mouth_covering_detected (8219428572168642593) --> <skip /> <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Kan gezichtsmodel niet maken. Probeer het opnieuw."</string> - <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Donkere bril waargenomen. Je gezicht moet geheel zichtbaar zijn."</string> - <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Gezichtsbedekking waargenomen. Je gezicht moet geheel zichtbaar zijn."</string> + <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Donkere bril waargenomen. Je gezicht moet helemaal zichtbaar zijn."</string> + <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Gezichtsbedekking waargenomen. Je hele gezicht moet zichtbaar zijn."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Kan gezicht niet verifiëren. Hardware niet beschikbaar."</string> @@ -1257,7 +1257,7 @@ <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Apps starten."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Opstarten afronden."</string> <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Je hebt op de aan/uit-knop gedrukt. Zo zet je meestal het scherm uit.\n\nRaak de knop voorzichtig aan terwijl je je vingerafdruk instelt."</string> - <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"Zet het scherm uit om het instellen te beëindigen"</string> + <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"Zet scherm uit om instellen te beëindigen"</string> <string name="fp_power_button_enrollment_button_text" msgid="3199783266386029200">"Uitzetten"</string> <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Doorgaan met verificatie van je vingerafdruk?"</string> <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Je hebt op de aan/uit-knop gedrukt. Zo zet je meestal het scherm uit.\n\nRaak de knop voorzichtig aan om je vingerafdruk te verifiëren."</string> diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml index 095830a48593..6932b441b5ef 100644 --- a/core/res/res/values-or/strings.xml +++ b/core/res/res/values-or/strings.xml @@ -1366,7 +1366,7 @@ <string name="usb_midi_notification_title" msgid="7404506788950595557">"USB ମାଧ୍ୟମରେ MIDIକୁ ଚାଲୁ କରାଗଲା"</string> <string name="usb_uvc_notification_title" msgid="2030032862673400008">"ୱେବକେମ ଭାବେ ଡିଭାଇସ କନେକ୍ଟ କରାଯାଇଛି"</string> <string name="usb_accessory_notification_title" msgid="1385394660861956980">"USB ଆକ୍ସେସୋରୀ ଯୋଡ଼ାଗଲା"</string> - <string name="usb_notification_message" msgid="4715163067192110676">"ଅଧିକ ବିକଳ୍ପ ପାଇଁ ଟାପ୍ କରନ୍ତୁ।"</string> + <string name="usb_notification_message" msgid="4715163067192110676">"ଅଧିକ ବିକଳ୍ପ ପାଇଁ ଟାପ କରନ୍ତୁ।"</string> <string name="usb_power_notification_message" msgid="7284765627437897702">"ଯୋଡ଼ାଯାଇଥିବା ଡିଭାଇସ୍ ଚାର୍ଜ ହେଉଛି। ଅଧିକ ବିକଳ୍ପ ପାଇଁ ଟାପ୍ କରନ୍ତୁ।"</string> <string name="usb_unsupported_audio_accessory_title" msgid="2335775548086533065">"ଆନାଲଗ୍ ଅଡିଓ ଆକ୍ସେସରୀ ଚିହ୍ନଟ ହେଲା"</string> <string name="usb_unsupported_audio_accessory_message" msgid="1300168007129796621">"ଏହି ଫୋନ୍ରେ କନେକ୍ଟ ଥିବା ଡିଭାଇସ୍ କମ୍ପାଟିବଲ୍ ନୁହେଁ। ଅଧିକ ଜାଣିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ।"</string> @@ -1431,7 +1431,7 @@ <string name="ext_media_nomedia_notification_message" msgid="2832724384636625852">"କିଛି କାର୍ଯ୍ୟକ୍ଷମତା ଠିକ୍ ଭାବେ କାମ ନକରିପାରେ। ନୂଆ ଷ୍ଟୋରେଜ୍ ଭର୍ତ୍ତି କରନ୍ତୁ।"</string> <string name="ext_media_unmounting_notification_title" msgid="4147986383917892162">"<xliff:g id="NAME">%s</xliff:g>କୁ ଇଜେକ୍ଟ କରାଯାଉଛି"</string> <string name="ext_media_unmounting_notification_message" msgid="5717036261538754203">"କାଢ଼ନ୍ତୁ ନାହିଁ"</string> - <string name="ext_media_init_action" msgid="2312974060585056709">"ସେଟ୍ ଅପ୍ କରନ୍ତୁ"</string> + <string name="ext_media_init_action" msgid="2312974060585056709">"ସେଟ ଅପ କରନ୍ତୁ"</string> <string name="ext_media_unmount_action" msgid="966992232088442745">"କାଢ଼ି ଦିଅନ୍ତୁ"</string> <string name="ext_media_browse_action" msgid="344865351947079139">"ଖୋଜନ୍ତୁ"</string> <string name="ext_media_seamless_action" msgid="8837030226009268080">"ଆଉଟ୍ପୁଟ୍ ସ୍ୱିଚ୍ କରନ୍ତୁ"</string> diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml index 92bb4916f494..0d0e0c899f6d 100644 --- a/core/res/res/values-pa/strings.xml +++ b/core/res/res/values-pa/strings.xml @@ -636,7 +636,7 @@ <string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"ਬਹੁਤ ਜ਼ਿਆਦਾ ਚਮਕ"</string> <string name="fingerprint_acquired_power_press" msgid="3107864151278434961">"ਪਾਵਰ ਬਟਨ ਦਬਾਏ ਜਾਣ ਦਾ ਪਤਾ ਲੱਗਿਆ ਹੈ"</string> <string name="fingerprint_acquired_try_adjusting" msgid="3667006071003809364">"ਵਿਵਸਥਿਤ ਕਰਕੇ ਦੇਖੋ"</string> - <string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"ਹਰ ਵਾਰ ਆਪਣੀ ਉਂਗਲੀ ਦੀ ਸਥਿਤੀ ਨੂੰ ਥੋੜਾ ਜਿਹਾ ਬਦਲੋ"</string> + <string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"ਹਰ ਵਾਰ ਆਪਣੀ ਉਂਗਲ ਦੀ ਸਥਿਤੀ ਨੂੰ ਥੋੜਾ ਜਿਹਾ ਬਦਲੋ"</string> <string-array name="fingerprint_acquired_vendor"> </string-array> <string name="fingerprint_error_not_match" msgid="4599441812893438961">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਦੀ ਪਛਾਣ ਨਹੀਂ ਹੋਈ"</string> @@ -703,7 +703,7 @@ <skip /> <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"ਤੁਹਾਡੇ ਚਿਹਰੇ ਦਾ ਮਾਡਲ ਨਹੀਂ ਬਣਿਆ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string> <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"ਧੁੱਪ ਦੀਆਂ ਐਨਕਾਂ ਦਾ ਪਤਾ ਲੱਗਾ। ਤੁਹਾਡਾ ਪੂਰਾ ਚਿਹਰਾ ਦਿਸਣਾ ਲਾਜ਼ਮੀ ਹੈ।"</string> - <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"ਚਿਹਰਾ ਢੱਕਿਆ ਹੋਣ ਦਾ ਪਤਾ ਲੱਗਾ। ਤੁਹਾਡਾ ਪੂਰਾ ਚਿਹਰਾ ਦਿਸਣਾ ਲਾਜ਼ਮੀ ਹੈ।"</string> + <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"ਚਿਹਰਾ ਢੱਕਿਆ ਹੋਇਆ ਹੈ। ਤੁਹਾਡਾ ਪੂਰਾ ਚਿਹਰਾ ਦਿਸਣਾ ਚਾਹੀਦਾ ਹੈ।"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"ਚਿਹਰੇ ਦੀ ਪੁਸ਼ਟੀ ਨਹੀਂ ਹੋ ਸਕੀ। ਹਾਰਡਵੇਅਰ ਉਪਲਬਧ ਨਹੀਂ।"</string> diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index 8160544d0922..72cb00e15929 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -647,7 +647,7 @@ <string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Rosto autenticado, pressione \"Confirmar\""</string> <string name="fingerprint_error_hw_not_available" msgid="4571700896929561202">"Hardware de impressão digital não disponível."</string> <string name="fingerprint_error_no_space" msgid="7285481581905967580">"Não foi possível configurar a impressão digital"</string> - <string name="fingerprint_error_timeout" msgid="7361192266621252164">"A configuração da impressão digital expirou. Tente de novo."</string> + <string name="fingerprint_error_timeout" msgid="7361192266621252164">"Tempo de configuração esgotado. Tente de novo."</string> <string name="fingerprint_error_canceled" msgid="540026881380070750">"Operação de impressão digital cancelada."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Operação de impressão digital cancelada pelo usuário."</string> <string name="fingerprint_error_lockout" msgid="6626753679019351368">"Excesso de tentativas. Use o bloqueio de tela."</string> @@ -1367,7 +1367,7 @@ <string name="usb_midi_notification_title" msgid="7404506788950595557">"MIDI via USB ativado"</string> <string name="usb_uvc_notification_title" msgid="2030032862673400008">"Dispositivo conectado como Webcam"</string> <string name="usb_accessory_notification_title" msgid="1385394660861956980">"Acessório USB conectado"</string> - <string name="usb_notification_message" msgid="4715163067192110676">"Toque para ver mais opções."</string> + <string name="usb_notification_message" msgid="4715163067192110676">"Toque para conferir mais opções."</string> <string name="usb_power_notification_message" msgid="7284765627437897702">"Carregando dispositivo conectado. Toque para ver mais opções."</string> <string name="usb_unsupported_audio_accessory_title" msgid="2335775548086533065">"Acessório de áudio analógico detectado"</string> <string name="usb_unsupported_audio_accessory_message" msgid="1300168007129796621">"O dispositivo anexo não é compatível com esse smartphone. Toque para saber mais."</string> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 50531dbc51a9..2158dfdc20e5 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -696,7 +696,7 @@ <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Olhe mais diretamente para o telemóvel"</string> <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Olhe mais diretamente para o telemóvel"</string> <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Olhe mais diretamente para o telemóvel"</string> - <string name="face_acquired_obscured" msgid="4917643294953326639">"Remova tudo o que esteja a ocultar o seu rosto."</string> + <string name="face_acquired_obscured" msgid="4917643294953326639">"Remova tudo o que esteja a ocultar o seu rosto"</string> <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Limpe a parte superior do ecrã, incluindo a barra preta."</string> <!-- no translation found for face_acquired_dark_glasses_detected (5643703296620631986) --> <skip /> @@ -704,7 +704,7 @@ <skip /> <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Não é possível criar o seu modelo de rosto. Tente novamente."</string> <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Óculos escuros detetados. O seu rosto tem de estar completamente visível."</string> - <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Máscara detetada. Todo o rosto tem de estar visível."</string> + <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Máscara detetada. Todo o rosto tem de estar visível"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Não pode validar o rosto. Hardware não disponível."</string> @@ -1258,8 +1258,8 @@ <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"A iniciar aplicações"</string> <string name="android_upgrading_complete" msgid="409800058018374746">"A concluir o arranque."</string> <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Premiu o botão ligar/desligar. Geralmente, esta ação desliga o ecrã.\n\nExperimente tocar levemente ao configurar a sua impressão digital."</string> - <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"Termine a configuração ao desligar ecrã"</string> - <string name="fp_power_button_enrollment_button_text" msgid="3199783266386029200">"Desativar"</string> + <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"Para terminar, desligue o ecrã"</string> + <string name="fp_power_button_enrollment_button_text" msgid="3199783266386029200">"Desligar"</string> <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Continuar a validar a impressão digital?"</string> <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Premiu o botão ligar/desligar. Geralmente, esta ação desliga o ecrã.\n\nExperimente tocar levemente para validar a sua impressão digital."</string> <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Desligar ecrã"</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 8160544d0922..72cb00e15929 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -647,7 +647,7 @@ <string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Rosto autenticado, pressione \"Confirmar\""</string> <string name="fingerprint_error_hw_not_available" msgid="4571700896929561202">"Hardware de impressão digital não disponível."</string> <string name="fingerprint_error_no_space" msgid="7285481581905967580">"Não foi possível configurar a impressão digital"</string> - <string name="fingerprint_error_timeout" msgid="7361192266621252164">"A configuração da impressão digital expirou. Tente de novo."</string> + <string name="fingerprint_error_timeout" msgid="7361192266621252164">"Tempo de configuração esgotado. Tente de novo."</string> <string name="fingerprint_error_canceled" msgid="540026881380070750">"Operação de impressão digital cancelada."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Operação de impressão digital cancelada pelo usuário."</string> <string name="fingerprint_error_lockout" msgid="6626753679019351368">"Excesso de tentativas. Use o bloqueio de tela."</string> @@ -1367,7 +1367,7 @@ <string name="usb_midi_notification_title" msgid="7404506788950595557">"MIDI via USB ativado"</string> <string name="usb_uvc_notification_title" msgid="2030032862673400008">"Dispositivo conectado como Webcam"</string> <string name="usb_accessory_notification_title" msgid="1385394660861956980">"Acessório USB conectado"</string> - <string name="usb_notification_message" msgid="4715163067192110676">"Toque para ver mais opções."</string> + <string name="usb_notification_message" msgid="4715163067192110676">"Toque para conferir mais opções."</string> <string name="usb_power_notification_message" msgid="7284765627437897702">"Carregando dispositivo conectado. Toque para ver mais opções."</string> <string name="usb_unsupported_audio_accessory_title" msgid="2335775548086533065">"Acessório de áudio analógico detectado"</string> <string name="usb_unsupported_audio_accessory_message" msgid="1300168007129796621">"O dispositivo anexo não é compatível com esse smartphone. Toque para saber mais."</string> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index be339765f85f..b52c0eb6d33c 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -1258,7 +1258,7 @@ <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Se pornesc aplicațiile."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Se finalizează pornirea."</string> <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Ai apăsat butonul de pornire. De obicei, astfel se dezactivează ecranul.\n\nAtinge ușor când îți configurezi amprenta."</string> - <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"Ca să termini configurarea, dezactivează ecranul"</string> + <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"Termină configurarea dezactivând ecranul"</string> <string name="fp_power_button_enrollment_button_text" msgid="3199783266386029200">"Dezactivează"</string> <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Continui cu verificarea amprentei?"</string> <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Ai apăsat butonul de pornire. De obicei, astfel se dezactivează ecranul.\n\nAtinge ușor pentru verificarea amprentei."</string> @@ -1371,7 +1371,7 @@ <string name="usb_power_notification_message" msgid="7284765627437897702">"Se încarcă dispozitivul conectat. Atinge pentru mai multe opțiuni."</string> <string name="usb_unsupported_audio_accessory_title" msgid="2335775548086533065">"S-a detectat un accesoriu audio analogic"</string> <string name="usb_unsupported_audio_accessory_message" msgid="1300168007129796621">"Dispozitivul atașat nu este compatibil cu acest telefon. Atinge pentru a afla mai multe."</string> - <string name="adb_active_notification_title" msgid="408390247354560331">"Remedierea erorilor prin USB conectată"</string> + <string name="adb_active_notification_title" msgid="408390247354560331">"Remedierea prin USB conectată"</string> <string name="adb_active_notification_message" msgid="5617264033476778211">"Atinge pentru a dezactiva."</string> <string name="adb_active_notification_message" product="tv" msgid="6624498401272780855">"Selectează pentru a dezactiva remedierea erorilor prin USB."</string> <string name="adbwifi_active_notification_title" msgid="6147343659168302473">"Remedierea erorilor wireless este activă"</string> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 58b994d13d4a..f8f323ffc805 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -1373,7 +1373,7 @@ <string name="usb_unsupported_audio_accessory_title" msgid="2335775548086533065">"Обнаружено аналоговое аудиоустройство"</string> <string name="usb_unsupported_audio_accessory_message" msgid="1300168007129796621">"Подсоединенное устройство несовместимо с этим телефоном. Нажмите, чтобы узнать подробности."</string> <string name="adb_active_notification_title" msgid="408390247354560331">"Отладка по USB активна"</string> - <string name="adb_active_notification_message" msgid="5617264033476778211">"Нажмите, чтобы отключить"</string> + <string name="adb_active_notification_message" msgid="5617264033476778211">"Нажмите, чтобы отключить."</string> <string name="adb_active_notification_message" product="tv" msgid="6624498401272780855">"Нажмите, чтобы запретить"</string> <string name="adbwifi_active_notification_title" msgid="6147343659168302473">"Отладка по Wi-Fi включена"</string> <string name="adbwifi_active_notification_message" msgid="930987922852867972">"Нажмите, чтобы отключить отладку по Wi-Fi."</string> @@ -2160,7 +2160,7 @@ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Заблокировано вашим администратором"</string> <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Этот контент нельзя открывать через рабочие приложения."</string> <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Этот контент нельзя открыть в рабочем приложении."</string> - <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Этот контент нельзя открывать через личные приложения."</string> + <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Этим контентом нельзя делиться с личными приложениями."</string> <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Этот контент нельзя открыть в личном приложении."</string> <string name="resolver_turn_on_work_apps" msgid="1535946298236678122">"Рабочие приложения приостановлены."</string> <string name="resolver_switch_on_work" msgid="4527096360772311894">"Включить"</string> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 187e182be329..f92a5bd233e4 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -705,7 +705,7 @@ <skip /> <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Modela obraza ni mogoče ustvariti. Poskusite znova."</string> <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Zaznana so temna očala. Videti se mora cel obraz."</string> - <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Zaznano je, da je obraz prekrit. Videti se mora cel obraz."</string> + <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Zaznano je obrazno pokrivalo. Videti se mora ves obraz."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Obraza ni mogoče preveriti. Str. opr. ni na voljo."</string> diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml index f1de0626403a..512dbc7b37b6 100644 --- a/core/res/res/values-sq/strings.xml +++ b/core/res/res/values-sq/strings.xml @@ -636,7 +636,7 @@ <string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Me shumë ndriçim"</string> <string name="fingerprint_acquired_power_press" msgid="3107864151278434961">"U zbulua shtypja e \"Energjisë\""</string> <string name="fingerprint_acquired_try_adjusting" msgid="3667006071003809364">"Provo ta rregullosh"</string> - <string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Ndrysho pak pozicionin e gishtit çdo herë"</string> + <string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Ndrysho paksa pozicionin e gishtit çdo herë"</string> <string-array name="fingerprint_acquired_vendor"> </string-array> <string name="fingerprint_error_not_match" msgid="4599441812893438961">"Gjurma e gishtit nuk u njoh"</string> @@ -695,7 +695,7 @@ <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Shiko më drejtpërdrejt telefonin"</string> <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Shiko më drejtpërdrejt telefonin"</string> <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Shiko më drejtpërdrejt telefonin"</string> - <string name="face_acquired_obscured" msgid="4917643294953326639">"Hiq gjithçka që fsheh fytyrën tënde."</string> + <string name="face_acquired_obscured" msgid="4917643294953326639">"Hiq gjithçka që ta mbulon fytyrën."</string> <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Pastro kreun e ekranit, duke përfshirë shiritin e zi"</string> <!-- no translation found for face_acquired_dark_glasses_detected (5643703296620631986) --> <skip /> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 7c95c9428207..ccd638e058de 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -1365,7 +1365,7 @@ <string name="usb_ptp_notification_title" msgid="5043437571863443281">"Режим PTP преко USB-а је укључен"</string> <string name="usb_tether_notification_title" msgid="8828527870612663771">"USB привезивање је укључено"</string> <string name="usb_midi_notification_title" msgid="7404506788950595557">"Режим MIDI преко USB-а је укључен"</string> - <string name="usb_uvc_notification_title" msgid="2030032862673400008">"Уређај повезан са веб-камером"</string> + <string name="usb_uvc_notification_title" msgid="2030032862673400008">"Уређај повезан као веб-камера"</string> <string name="usb_accessory_notification_title" msgid="1385394660861956980">"USB додатак је повезан"</string> <string name="usb_notification_message" msgid="4715163067192110676">"Додирните за још опција."</string> <string name="usb_power_notification_message" msgid="7284765627437897702">"Повезани уређај се пуни. Додирните за још опција."</string> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index 8d95142c463d..4b5d45e79d75 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -626,7 +626,7 @@ <string name="biometric_error_generic" msgid="6784371929985434439">"Ett fel uppstod vid autentiseringen"</string> <string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Använd skärmlåset"</string> <string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Fortsätt med hjälp av ditt skärmlås"</string> - <string name="fingerprint_acquired_partial" msgid="4323789264604479684">"Tryck på sensorn med ett stadigt tryck"</string> + <string name="fingerprint_acquired_partial" msgid="4323789264604479684">"Tryck hårt på sensorn"</string> <string name="fingerprint_acquired_insufficient" msgid="623888149088216458">"Fingeravtrycket kändes inte igen. Försök igen."</string> <string name="fingerprint_acquired_imager_dirty" msgid="1770676120848224250">"Rengör fingeravtryckssensorn och försök igen"</string> <string name="fingerprint_acquired_imager_dirty_alt" msgid="9169582140486372897">"Rengör sensorn och försök igen"</string> @@ -646,7 +646,7 @@ <string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Ansiktet har autentiserats. Tryck på Bekräfta"</string> <string name="fingerprint_error_hw_not_available" msgid="4571700896929561202">"Det finns ingen maskinvara för fingeravtryck."</string> <string name="fingerprint_error_no_space" msgid="7285481581905967580">"Det gick inte att konfigurera fingeravtryck"</string> - <string name="fingerprint_error_timeout" msgid="7361192266621252164">"Fingeravtryckskonfigurering nådde tidsgränsen. Försök igen."</string> + <string name="fingerprint_error_timeout" msgid="7361192266621252164">"Tiden för fingeravtrycksinställning gick ut. Försök igen."</string> <string name="fingerprint_error_canceled" msgid="540026881380070750">"Fingeravtrycksåtgärden avbröts."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Fingeravtrycksåtgärden avbröts av användaren."</string> <string name="fingerprint_error_lockout" msgid="6626753679019351368">"För många försök. Använd låsskärmen i stället."</string> diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index e546accd8bd9..73aab5823671 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -703,7 +703,7 @@ <skip /> <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"మీ ఫేస్మోడల్ క్రియేషన్ కుదరదు. మళ్లీ ట్రై చేయండి."</string> <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"డార్క్ గ్లాసెస్ గుర్తించబడ్డాయి. మీ ముఖం పూర్తిగా కనిపించాలి."</string> - <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"ముఖం కవర్ చేయబడింది. మీ ముఖం పూర్తిగా కనిపించాలి."</string> + <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"ముఖం మీద ఏదో కవరింగ్ ఉన్నట్టు గుర్తించబడింది."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"ముఖం ధృవీకరించలేరు. హార్డ్వేర్ అందుబాటులో లేదు."</string> @@ -1257,7 +1257,7 @@ <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"యాప్లను ప్రారంభిస్తోంది."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"బూట్ను ముగిస్తోంది."</string> <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"మీరు పవర్ బటన్ను నొక్కారు — ఇది సాధారణంగా స్క్రీన్ను ఆఫ్ చేస్తుంది.\n\nమీ వేలిముద్రను సెటప్ చేస్తున్నప్పుడు తేలికగా ట్యాప్ చేయడానికి ట్రై చేయండి."</string> - <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"సెటప్ ముగించడానికి, స్క్రీన్ను ఆఫ్ చేయండి"</string> + <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"సెటప్ ముగించడానికి, స్క్రీన్ ఆఫ్ చేయండి"</string> <string name="fp_power_button_enrollment_button_text" msgid="3199783266386029200">"ఆఫ్ చేయండి"</string> <string name="fp_power_button_bp_title" msgid="5585506104526820067">"మీ వేలిముద్ర వెరిఫైను కొనసాగించాలా?"</string> <string name="fp_power_button_bp_message" msgid="2983163038168903393">"మీరు పవర్ బటన్ను నొక్కారు — ఇది సాధారణంగా స్క్రీన్ను ఆఫ్ చేస్తుంది.\n\nమీ వేలిముద్రను వెరిఫై చేయడానికి తేలికగా ట్యాప్ చేయడం ట్రై చేయండి."</string> @@ -1366,7 +1366,7 @@ <string name="usb_midi_notification_title" msgid="7404506788950595557">"USB ద్వారా MIDI ఆన్ చేయబడింది"</string> <string name="usb_uvc_notification_title" msgid="2030032862673400008">"పరికరం వెబ్క్యామ్గా కనెక్ట్ చేయబడింది"</string> <string name="usb_accessory_notification_title" msgid="1385394660861956980">"USB ఉపకరణం కనెక్ట్ చేయబడింది"</string> - <string name="usb_notification_message" msgid="4715163067192110676">"మరిన్ని ఆప్షన్ల కోసం నొక్కండి."</string> + <string name="usb_notification_message" msgid="4715163067192110676">"మరిన్ని ఆప్షన్ల కోసం ట్యాప్ చేయండి."</string> <string name="usb_power_notification_message" msgid="7284765627437897702">"కనెక్ట్ చేయబడిన పరికరాన్ని ఛార్జ్ చేస్తోంది. మరిన్ని ఎంపికల కోసం నొక్కండి."</string> <string name="usb_unsupported_audio_accessory_title" msgid="2335775548086533065">"అనలాగ్ ఆడియో ఉపకరణం కనుగొనబడింది"</string> <string name="usb_unsupported_audio_accessory_message" msgid="1300168007129796621">"జోడించిన పరికరం ఈ ఫోన్కు అనుకూలంగా లేదు. మరింత తెలుసుకోవడానికి నొక్కండి."</string> @@ -1697,7 +1697,7 @@ <string name="accessibility_shortcut_menu_item_status_on" msgid="6608392117189732543">"ఆన్"</string> <string name="accessibility_shortcut_menu_item_status_off" msgid="5531598275559472393">"ఆఫ్"</string> <string name="accessibility_enable_service_title" msgid="3931558336268541484">"<xliff:g id="SERVICE">%1$s</xliff:g>కి మీ పరికరంపై పూర్తి కంట్రోల్ను ఇవ్వాలనుకుంటున్నారా?"</string> - <string name="accessibility_service_warning_description" msgid="291674995220940133">"అవసరమైన యాక్సెసిబిలిటీ కోసం యాప్లకు పూర్తి కంట్రోల్ ఇవ్వడం తగిన పనే అయినా, అన్ని యాప్లకు అలా ఇవ్వడం సరికాదు."</string> + <string name="accessibility_service_warning_description" msgid="291674995220940133">"యాక్సెసిబిలిటీ అవసరాలు ఉన్నప్పుడు మీకు సహాయం చేయడానికి యాప్లకు ఫుల్ కంట్రోల్ ఇవ్వడం సమంజసమే. అయితే అన్ని యాప్లకు అలా కంట్రోల్ ఇవ్వడం సరికాదు."</string> <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"స్క్రీన్ను చూసి, కంట్రోల్ చేయగలగడం"</string> <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"స్క్రీన్పై ఉండే కంటెంట్ మొత్తాన్ని చదవగలుగుతుంది. అంతే కాక, ఇతర యాప్లపై కంటెంట్ను డిస్ప్లే చేస్తుంది."</string> <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"చర్యలను చూసి, అమలు చేయగలగడం"</string> @@ -2152,7 +2152,7 @@ <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"గ్రూప్ సంభాషణ"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> <string name="resolver_personal_tab" msgid="2051260504014442073">"వ్యక్తిగతం"</string> - <string name="resolver_work_tab" msgid="2690019516263167035">"ఆఫీస్"</string> + <string name="resolver_work_tab" msgid="2690019516263167035">"వర్క్ ప్లేస్"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"వ్యక్తిగత వీక్షణ"</string> <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"పని వీక్షణ"</string> <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"మీ IT అడ్మిన్ ద్వారా బ్లాక్ చేయబడింది"</string> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index 292e911fe507..916e857acc77 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -703,7 +703,7 @@ <skip /> <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"สร้างรูปแบบใบหน้าไม่ได้ โปรดลองอีกครั้ง"</string> <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"ตรวจพบแว่นตาดำ ต้องมองเห็นใบหน้าของคุณทั้งหมด"</string> - <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"ตรวจพบหน้ากากอนามัย ต้องมองเห็นใบหน้าของคุณทั้งหมด"</string> + <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"ตรวจพบหน้ากาก ต้องมองเห็นใบหน้าของคุณทั้งหมด"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"ยืนยันใบหน้าไม่ได้ ฮาร์ดแวร์ไม่พร้อมใช้งาน"</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index ac714ed6e891..a0c71b5698b9 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -1951,7 +1951,7 @@ <string name="app_suspended_default_message" msgid="6451215678552004172">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> uygulaması şu anda kullanılamıyor. Uygulamanın kullanım durumu <xliff:g id="APP_NAME_1">%2$s</xliff:g> tarafından yönetiliyor."</string> <string name="app_suspended_more_details" msgid="211260942831587014">"Daha fazla bilgi"</string> <string name="app_suspended_unsuspend_message" msgid="1665438589450555459">"Uygulamanın duraklatmasını kaldır"</string> - <string name="work_mode_off_title" msgid="6367463960165135829">"İş uygulamaları devam ettirilsin mi?"</string> + <string name="work_mode_off_title" msgid="6367463960165135829">"İş uygulamaları açılsın mı?"</string> <string name="work_mode_turn_on" msgid="5316648862401307800">"Devam ettir"</string> <string name="work_mode_emergency_call_button" msgid="6818855962881612322">"Acil durum"</string> <string name="app_blocked_title" msgid="7353262160455028160">"Uygulama kullanılamıyor"</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 76292bf55a13..0c9f99a664f1 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -697,7 +697,7 @@ <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_obscured" msgid="4917643294953326639">"Приберіть об’єкти, які затуляють ваше обличчя"</string> <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Очистьте верхню частину екрана, зокрема чорну панель"</string> <!-- no translation found for face_acquired_dark_glasses_detected (5643703296620631986) --> <skip /> @@ -705,7 +705,7 @@ <skip /> <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Не вдається створити модель обличчя. Повторіть спробу."</string> <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Виявлено темні окуляри. Обличчя має бути видно повністю."</string> - <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Обличчя не видно повністю, бо його закриває аксесуар."</string> + <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Обличчя не видно повністю, бо його закриває аксесуар"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Не вдається перевірити обличчя. Апаратне забезпечення недоступне."</string> diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml index 41e8fef380e1..93ad0ceec86b 100644 --- a/core/res/res/values-uz/strings.xml +++ b/core/res/res/values-uz/strings.xml @@ -695,7 +695,7 @@ <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Telefonga tik qarab turing"</string> <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Telefonga tik qarab turing"</string> <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Telefonga tik qarab turing"</string> - <string name="face_acquired_obscured" msgid="4917643294953326639">"Yuzingizni berkitayotgan narsalarni olib tashlang."</string> + <string name="face_acquired_obscured" msgid="4917643294953326639">"Yuzingiz yaxshi koʻrinmayapti."</string> <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Ekranning yuqori qismini, shuningdek, qora panelni ham tozalang"</string> <!-- no translation found for face_acquired_dark_glasses_detected (5643703296620631986) --> <skip /> @@ -1257,7 +1257,7 @@ <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Ilovalar ishga tushirilmoqda."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Tizimni yuklashni tugatish."</string> <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Quvvat tugmasini bosdingiz — bu odatda ekranni oʻchiradi.\n\nBarmoq izini qoʻshish vaqtida tugmaga yengilgina tegining."</string> - <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"Sozlashni yakunlash uchun ekranni oʻchiring"</string> + <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"Yakunlash uchun ekranni oʻchiring"</string> <string name="fp_power_button_enrollment_button_text" msgid="3199783266386029200">"Faolsizlantirish"</string> <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Barmoq izi tasdiqlashda davom etilsinmi?"</string> <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Quvvat tugmasini bosdingiz. Bu odatda ekranni oʻchiradi.\n\nBarmoq izingizni tasdiqlash uchun tugmaga yengilgina tegining."</string> @@ -2332,7 +2332,7 @@ <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Ikki ekranli rejim ishlamaydi"</string> <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Quvvatni tejash yoniqligi uchun hozir ikki ekranli rejim ishlamaydi. Buni Sozlamalarda faolsizlantirishingiz mumkin."</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"Sozlamalarni ochish"</string> - <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Faolsizlantirish"</string> + <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Oʻchirish"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> sozlandi"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Klaviatura terilmasi bunga sozlandi: <xliff:g id="LAYOUT_1">%s</xliff:g>. Oʻzgartirish uchun ustiga bosing."</string> <string name="keyboard_layout_notification_two_selected_message" msgid="1876349944065922950">"Klaviatura terilmasi bunga sozlandi: <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>. Oʻzgartirish uchun ustiga bosing."</string> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 205eaf950522..bfe15619d87f 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -646,7 +646,7 @@ <string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Đã xác thực khuôn mặt, vui lòng nhấn để xác nhận"</string> <string name="fingerprint_error_hw_not_available" msgid="4571700896929561202">"Phần cứng vân tay không khả dụng."</string> <string name="fingerprint_error_no_space" msgid="7285481581905967580">"Không thể thiết lập vân tay"</string> - <string name="fingerprint_error_timeout" msgid="7361192266621252164">"Hết thời gian thiết lập vân tay. Hãy thử lại."</string> + <string name="fingerprint_error_timeout" msgid="7361192266621252164">"Hết thời gian chờ thiết lập vân tay. Hãy thử lại."</string> <string name="fingerprint_error_canceled" msgid="540026881380070750">"Thao tác dùng dấu vân tay bị hủy."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Người dùng đã hủy thao tác dùng dấu vân tay."</string> <string name="fingerprint_error_lockout" msgid="6626753679019351368">"Bạn đã thử quá nhiều lần. Hãy dùng phương thức khoá màn hình."</string> @@ -687,7 +687,7 @@ <string name="face_acquired_too_right" msgid="6245286514593540859">"Đưa điện thoại sang bên trái"</string> <string name="face_acquired_too_left" msgid="9201762240918405486">"Đưa điện thoại sang bên phải"</string> <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Vui lòng nhìn thẳng vào thiết bị."</string> - <string name="face_acquired_not_detected" msgid="1057966913397548150">"Không thấy khuôn mặt. Hãy cầm điện thoại ngang tầm mắt"</string> + <string name="face_acquired_not_detected" msgid="1057966913397548150">"Không thấy khuôn mặt. Hãy cầm điện thoại ngang tầm mắt."</string> <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Thiết bị di chuyển quá nhiều. Giữ yên thiết bị."</string> <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Vui lòng đăng ký lại khuôn mặt của bạn."</string> <string name="face_acquired_too_different" msgid="2520389515612972889">"Không thể nhận dạng khuôn mặt. Hãy thử lại."</string> @@ -702,7 +702,7 @@ <!-- no translation found for face_acquired_mouth_covering_detected (8219428572168642593) --> <skip /> <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Không thể tạo mẫu khuôn mặt của bạn. Hãy thử lại."</string> - <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Đã phát hiện thấy kính râm. Toàn bộ khuôn mặt của bạn phải được trông thấy rõ ràng."</string> + <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Đã phát hiện thấy kính râm. Bạn phải cho thấy toàn bộ khuôn mặt."</string> <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Khuôn mặt bị che. Bạn phải cho thấy toàn bộ khuôn mặt."</string> <string-array name="face_acquired_vendor"> </string-array> @@ -2126,7 +2126,7 @@ <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Không có gợi ý nào về người mà bạn có thể chia sẻ"</string> <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Danh sách ứng dụng"</string> <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Ứng dụng này chưa được cấp quyền ghi âm nhưng vẫn có thể ghi âm thông qua thiết bị USB này."</string> - <string name="accessibility_system_action_home_label" msgid="3234748160850301870">"Màn hình chính"</string> + <string name="accessibility_system_action_home_label" msgid="3234748160850301870">"Nhà"</string> <string name="accessibility_system_action_back_label" msgid="4205361367345537608">"Quay lại"</string> <string name="accessibility_system_action_recents_label" msgid="4782875610281649728">"Ứng dụng gần đây"</string> <string name="accessibility_system_action_notifications_label" msgid="6083767351772162010">"Thông báo"</string> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 35d9d9ed90f7..d7101f417c9f 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -703,7 +703,7 @@ <skip /> <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"无法创建您的脸部模型,请重试。"</string> <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"检测到墨镜,您的脸部必须完全可见。"</string> - <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"检测到脸部存在遮挡,请露出整张脸。"</string> + <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"检测到面部被遮挡,请露出整个面部。"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"无法验证人脸。硬件无法使用。"</string> @@ -1364,7 +1364,7 @@ <string name="usb_ptp_notification_title" msgid="5043437571863443281">"已开启 USB PTP 模式"</string> <string name="usb_tether_notification_title" msgid="8828527870612663771">"已开启 USB 网络共享模式"</string> <string name="usb_midi_notification_title" msgid="7404506788950595557">"已开启 USB MIDI 模式"</string> - <string name="usb_uvc_notification_title" msgid="2030032862673400008">"设备已连接为摄像头"</string> + <string name="usb_uvc_notification_title" msgid="2030032862673400008">"设备已连接并作为摄像头使用"</string> <string name="usb_accessory_notification_title" msgid="1385394660861956980">"USB 配件已连接"</string> <string name="usb_notification_message" msgid="4715163067192110676">"点按即可查看更多选项。"</string> <string name="usb_power_notification_message" msgid="7284765627437897702">"正在为连接的设备充电。点按即可查看更多选项。"</string> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 4c83d6fb8770..1449ab6eb5b3 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -687,7 +687,7 @@ <string name="face_acquired_too_right" msgid="6245286514593540859">"請將手機向左移"</string> <string name="face_acquired_too_left" msgid="9201762240918405486">"請將手機向右移"</string> <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"請儘可能直視裝置正面。"</string> - <string name="face_acquired_not_detected" msgid="1057966913397548150">"未偵測到你的臉,請將手機舉到與視線同高。"</string> + <string name="face_acquired_not_detected" msgid="1057966913397548150">"未偵測到你的臉,請將手機舉到與眼睛同高的位置。"</string> <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"鏡頭過度晃動,請拿穩手機。"</string> <string name="face_acquired_recalibrate" msgid="8724013080976469746">"請重新註冊你的臉孔。"</string> <string name="face_acquired_too_different" msgid="2520389515612972889">"無法辨識這張臉,請再試一次。"</string> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index f27535c65fe4..3be0d7ff06af 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -46,6 +46,7 @@ <item><xliff:g id="id">@string/status_bar_secure</xliff:g></item> <item><xliff:g id="id">@string/status_bar_managed_profile</xliff:g></item> <item><xliff:g id="id">@string/status_bar_cast</xliff:g></item> + <item><xliff:g id="id">@string/status_bar_connected_display</xliff:g></item> <item><xliff:g id="id">@string/status_bar_screen_record</xliff:g></item> <item><xliff:g id="id">@string/status_bar_vpn</xliff:g></item> <item><xliff:g id="id">@string/status_bar_bluetooth</xliff:g></item> @@ -72,6 +73,7 @@ <string translatable="false" name="status_bar_sync_failing">sync_failing</string> <string translatable="false" name="status_bar_sync_active">sync_active</string> <string translatable="false" name="status_bar_cast">cast</string> + <string translatable="false" name="status_bar_connected_display">connected_display</string> <string translatable="false" name="status_bar_hotspot">hotspot</string> <string translatable="false" name="status_bar_location">location</string> <string translatable="false" name="status_bar_bluetooth">bluetooth</string> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 2e5da3353752..85e9792fc99b 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -3050,6 +3050,7 @@ <java-symbol type="id" name="header_text_secondary" /> <java-symbol type="id" name="expand_button" /> <java-symbol type="id" name="expand_button_pill" /> + <java-symbol type="id" name="expand_button_pill_colorized_layer" /> <java-symbol type="id" name="expand_button_number" /> <java-symbol type="id" name="expand_button_icon" /> <java-symbol type="id" name="alternate_expand_target" /> @@ -3099,6 +3100,7 @@ <java-symbol type="string" name="status_bar_sync_failing" /> <java-symbol type="string" name="status_bar_sync_active" /> <java-symbol type="string" name="status_bar_cast" /> + <java-symbol type="string" name="status_bar_connected_display" /> <java-symbol type="string" name="status_bar_hotspot" /> <java-symbol type="string" name="status_bar_location" /> <java-symbol type="string" name="status_bar_bluetooth" /> diff --git a/core/tests/coretests/src/android/widget/EditTextCursorAnchorInfoTest.java b/core/tests/coretests/src/android/widget/EditTextCursorAnchorInfoTest.java index 1a019878f67f..62adc2001548 100644 --- a/core/tests/coretests/src/android/widget/EditTextCursorAnchorInfoTest.java +++ b/core/tests/coretests/src/android/widget/EditTextCursorAnchorInfoTest.java @@ -30,6 +30,7 @@ import android.util.TypedValue; import android.view.Gravity; import android.view.View; import android.view.inputmethod.CursorAnchorInfo; +import android.view.inputmethod.EditorBoundsInfo; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.platform.app.InstrumentationRegistry; @@ -54,8 +55,15 @@ public class EditTextCursorAnchorInfoTest { private static final int[] sLocationOnScreen = new int[2]; private static Typeface sTypeface; private static final float TEXT_SIZE = 1f; - // The line height of the test font font is 1.2 * textSize. + // The line height of the test font is 1.2 * textSize. private static final int LINE_HEIGHT = 12; + private static final int HW_BOUNDS_OFFSET_LEFT = 10; + private static final int HW_BOUNDS_OFFSET_TOP = 20; + private static final int HW_BOUNDS_OFFSET_RIGHT = 30; + private static final int HW_BOUNDS_OFFSET_BOTTOM = 40; + + + // Default text has 5 lines of text. The needed width is 50px and the needed height is 60px. private static final CharSequence DEFAULT_TEXT = "X\nXX\nXXX\nXXXX\nXXXXX"; private static final ImmutableList<RectF> DEFAULT_LINE_BOUNDS = ImmutableList.of( new RectF(0f, 0f, 10f, LINE_HEIGHT), @@ -131,6 +139,55 @@ public class EditTextCursorAnchorInfoTest { } @Test + public void testEditorBoundsInfo_allVisible() { + // The needed width and height of the DEFAULT_TEXT are 50 px and 60 px respectfully. + int width = 100; + int height = 200; + setupEditText(DEFAULT_TEXT, width, height); + CursorAnchorInfo cursorAnchorInfo = + mEditText.getCursorAnchorInfo(0, sCursorAnchorInfoBuilder, sMatrix); + EditorBoundsInfo editorBoundsInfo = cursorAnchorInfo.getEditorBoundsInfo(); + assertThat(editorBoundsInfo).isNotNull(); + assertThat(editorBoundsInfo.getEditorBounds()).isEqualTo(new RectF(0, 0, width, height)); + assertThat(editorBoundsInfo.getHandwritingBounds()) + .isEqualTo(new RectF(-HW_BOUNDS_OFFSET_LEFT, -HW_BOUNDS_OFFSET_TOP, + width + HW_BOUNDS_OFFSET_RIGHT, height + HW_BOUNDS_OFFSET_BOTTOM)); + } + + @Test + public void testEditorBoundsInfo_scrolled() { + // The height of the editor will be 60 px. + int width = 100; + int visibleTop = 10; + int visibleBottom = 30; + setupVerticalClippedEditText(width, visibleTop, visibleBottom); + CursorAnchorInfo cursorAnchorInfo = + mEditText.getCursorAnchorInfo(0, sCursorAnchorInfoBuilder, sMatrix); + EditorBoundsInfo editorBoundsInfo = cursorAnchorInfo.getEditorBoundsInfo(); + assertThat(editorBoundsInfo).isNotNull(); + assertThat(editorBoundsInfo.getEditorBounds()) + .isEqualTo(new RectF(0, visibleTop, width, visibleBottom)); + assertThat(editorBoundsInfo.getHandwritingBounds()) + .isEqualTo(new RectF(-HW_BOUNDS_OFFSET_LEFT, visibleTop - HW_BOUNDS_OFFSET_TOP, + width + HW_BOUNDS_OFFSET_RIGHT, visibleBottom + HW_BOUNDS_OFFSET_BOTTOM)); + } + + @Test + public void testEditorBoundsInfo_invisible() { + // The height of the editor will be 60px. Scroll it to 70px will make it invisible. + int width = 100; + int visibleTop = 70; + int visibleBottom = 70; + setupVerticalClippedEditText(width, visibleTop, visibleBottom); + CursorAnchorInfo cursorAnchorInfo = + mEditText.getCursorAnchorInfo(0, sCursorAnchorInfoBuilder, sMatrix); + EditorBoundsInfo editorBoundsInfo = cursorAnchorInfo.getEditorBoundsInfo(); + assertThat(editorBoundsInfo).isNotNull(); + assertThat(editorBoundsInfo.getEditorBounds()).isEqualTo(new RectF(0, 0, 0, 0)); + assertThat(editorBoundsInfo.getHandwritingBounds()).isEqualTo(new RectF(0, 0, 0, 0)); + } + + @Test public void testVisibleLineBounds_allVisible() { setupEditText(DEFAULT_TEXT, /* height= */ 100); CursorAnchorInfo cursorAnchorInfo = @@ -465,32 +522,26 @@ public class EditTextCursorAnchorInfoTest { } private void setupVerticalClippedEditText(int visibleTop, int visibleBottom) { - ScrollView scrollView = new ScrollView(mActivity); - mEditText = new EditText(mActivity); - mEditText.setTypeface(sTypeface); - mEditText.setText(DEFAULT_TEXT); - mEditText.setTextSize(TypedValue.COMPLEX_UNIT_PX, TEXT_SIZE); - - mEditText.setPadding(0, 0, 0, 0); - mEditText.setCompoundDrawables(null, null, null, null); - mEditText.setCompoundDrawablePadding(0); - - mEditText.scrollTo(0, 0); - mEditText.setLineSpacing(0f, 1f); + setupVerticalClippedEditText(1000, visibleTop, visibleBottom); + } - // Place the text layout top to the view's top. - mEditText.setGravity(Gravity.TOP); - int width = 1000; - int height = visibleBottom - visibleTop; + /** + * Helper method to create an EditText in a vertical ScrollView so that its visible bounds + * is Rect(0, visibleTop, width, visibleBottom) in the EditText's coordinates. Both ScrollView + * and EditText's width is set to the given width. + */ + private void setupVerticalClippedEditText(int width, int visibleTop, int visibleBottom) { + ScrollView scrollView = new ScrollView(mActivity); + createEditText(); + int scrollViewHeight = visibleBottom - visibleTop; scrollView.addView(mEditText, new FrameLayout.LayoutParams( View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY), View.MeasureSpec.makeMeasureSpec(5 * LINE_HEIGHT, View.MeasureSpec.EXACTLY))); scrollView.measure( View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY), - View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.EXACTLY)); - scrollView.layout(0, 0, width, height); - + View.MeasureSpec.makeMeasureSpec(scrollViewHeight, View.MeasureSpec.EXACTLY)); + scrollView.layout(0, 0, width, scrollViewHeight); scrollView.scrollTo(0, visibleTop); } @@ -499,6 +550,11 @@ public class EditTextCursorAnchorInfoTest { measureEditText(height); } + private void setupEditText(CharSequence text, int width, int height) { + createEditText(text); + measureEditText(width, height); + } + private void setupEditText(CharSequence text, int height, float lineSpacing, float lineMultiplier) { createEditText(text); @@ -537,6 +593,8 @@ public class EditTextCursorAnchorInfoTest { mEditText.setTypeface(sTypeface); mEditText.setText(text); mEditText.setTextSize(TypedValue.COMPLEX_UNIT_PX, TEXT_SIZE); + mEditText.setHandwritingBoundsOffsets(HW_BOUNDS_OFFSET_LEFT, HW_BOUNDS_OFFSET_TOP, + HW_BOUNDS_OFFSET_RIGHT, HW_BOUNDS_OFFSET_BOTTOM); mEditText.setPadding(0, 0, 0, 0); mEditText.setCompoundDrawables(null, null, null, null); diff --git a/core/tests/coretests/src/android/widget/RemoteViewsTest.java b/core/tests/coretests/src/android/widget/RemoteViewsTest.java index 73aa93603e56..c4427555078f 100644 --- a/core/tests/coretests/src/android/widget/RemoteViewsTest.java +++ b/core/tests/coretests/src/android/widget/RemoteViewsTest.java @@ -22,6 +22,7 @@ import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.spy; @@ -39,11 +40,15 @@ import android.os.AsyncTask; import android.os.Binder; import android.os.Looper; import android.os.Parcel; +import android.util.AttributeSet; import android.util.SizeF; import android.view.ContextThemeWrapper; +import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.test.InstrumentationRegistry; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; @@ -827,4 +832,71 @@ public class RemoteViewsTest { verify(visitor, times(1)).accept(eq(icon3S.getUri())); verify(visitor, times(1)).accept(eq(icon4S.getUri())); } + + @Test + public void layoutInflaterFactory_nothingSet_returnsNull() { + final RemoteViews rv = new RemoteViews(mPackage, R.layout.remote_views_test); + assertNull(rv.getLayoutInflaterFactory()); + } + + @Test + public void layoutInflaterFactory_replacesImageView_viewReplaced() { + final RemoteViews rv = new RemoteViews(mPackage, R.layout.remote_views_test); + final View replacement = new FrameLayout(mContext); + replacement.setId(1337); + + LayoutInflater.Factory2 factory = createLayoutInflaterFactory("ImageView", replacement); + rv.setLayoutInflaterFactory(factory); + + // Now inflate the views. + View inflated = rv.apply(mContext, mContainer); + + assertEquals(factory, rv.getLayoutInflaterFactory()); + View replacedFrameLayout = inflated.findViewById(1337); + assertNotNull(replacedFrameLayout); + assertEquals(replacement, replacedFrameLayout); + // ImageView should be fully replaced. + assertNull(inflated.findViewById(R.id.image)); + } + + @Test + public void layoutInflaterFactory_replacesImageView_settersStillFunctional() { + final RemoteViews rv = new RemoteViews(mPackage, R.layout.remote_views_test); + final TextView replacement = new TextView(mContext); + replacement.setId(R.id.text); + final String testText = "testText"; + rv.setLayoutInflaterFactory(createLayoutInflaterFactory("TextView", replacement)); + rv.setTextViewText(R.id.text, testText); + + + // Now inflate the views. + View inflated = rv.apply(mContext, mContainer); + + TextView replacedTextView = inflated.findViewById(R.id.text); + assertSame(replacement, replacedTextView); + assertEquals(testText, replacedTextView.getText()); + } + + private static LayoutInflater.Factory2 createLayoutInflaterFactory(String viewTypeToReplace, + View replacementView) { + return new LayoutInflater.Factory2() { + @Nullable + @Override + public View onCreateView(@Nullable View parent, @NonNull String name, + @NonNull Context context, @NonNull AttributeSet attrs) { + if (viewTypeToReplace.equals(name)) { + return replacementView; + } + + return null; + } + + @Nullable + @Override + public View onCreateView(@NonNull String name, @NonNull Context context, + @NonNull AttributeSet attrs) { + return null; + } + }; + } } diff --git a/libs/WindowManager/Shell/res/values-fa/strings.xml b/libs/WindowManager/Shell/res/values-fa/strings.xml index 13a2ea2db140..edff47a0be1a 100644 --- a/libs/WindowManager/Shell/res/values-fa/strings.xml +++ b/libs/WindowManager/Shell/res/values-fa/strings.xml @@ -59,7 +59,7 @@ <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"خروج از «حالت یکدستی»"</string> <string name="bubbles_settings_button_description" msgid="1301286017420516912">"تنظیمات برای حبابکهای <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"سرریز"</string> - <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"افزودن برگشت به پشته"</string> + <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"افزودن برگشتن به پشته"</string> <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> از <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> از <xliff:g id="APP_NAME">%2$s</xliff:g> و <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> مورد بیشتر"</string> <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"انتقال به بالا سمت راست"</string> diff --git a/libs/WindowManager/Shell/res/values/dimen.xml b/libs/WindowManager/Shell/res/values/dimen.xml index 2e3f60441b3a..14e82539a6a5 100644 --- a/libs/WindowManager/Shell/res/values/dimen.xml +++ b/libs/WindowManager/Shell/res/values/dimen.xml @@ -419,4 +419,8 @@ <dimen name="freeform_resize_handle">15dp</dimen> <dimen name="freeform_resize_corner">44dp</dimen> + + <!-- The height of the area at the top of the screen where a freeform task will transition to + fullscreen if dragged until the top bound of the task is within the area. --> + <dimen name="desktop_mode_transition_area_height">16dp</dimen> </resources> diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java index cb03c096f7f1..688023737074 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java @@ -1282,7 +1282,9 @@ public class BubbleController implements ConfigurationChangeListener, return; } mOverflowDataLoadNeeded = false; - mDataRepository.loadBubbles(mCurrentUserId, (bubbles) -> { + List<UserInfo> users = mUserManager.getAliveUsers(); + List<Integer> userIds = users.stream().map(userInfo -> userInfo.id).toList(); + mDataRepository.loadBubbles(mCurrentUserId, userIds, (bubbles) -> { bubbles.forEach(bubble -> { if (mBubbleData.hasAnyBubbleWithKey(bubble.getKey())) { // if the bubble is already active, there's no need to push it to overflow diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleDataRepository.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleDataRepository.kt index 942dcd9db54c..896a33449185 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleDataRepository.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleDataRepository.kt @@ -17,7 +17,6 @@ package com.android.wm.shell.bubbles import android.annotation.SuppressLint import android.annotation.UserIdInt -import android.content.Context import android.content.pm.LauncherApps import android.content.pm.LauncherApps.ShortcutQuery.FLAG_MATCH_CACHED import android.content.pm.LauncherApps.ShortcutQuery.FLAG_MATCH_DYNAMIC @@ -25,6 +24,8 @@ import android.content.pm.LauncherApps.ShortcutQuery.FLAG_MATCH_PINNED_BY_ANY_LA import android.content.pm.UserInfo import android.os.UserHandle import android.util.Log +import android.util.SparseArray +import com.android.internal.annotations.VisibleForTesting import com.android.wm.shell.bubbles.Bubbles.BubbleMetadataFlagListener import com.android.wm.shell.bubbles.storage.BubbleEntity import com.android.wm.shell.bubbles.storage.BubblePersistentRepository @@ -38,13 +39,12 @@ import kotlinx.coroutines.cancelAndJoin import kotlinx.coroutines.launch import kotlinx.coroutines.yield -internal class BubbleDataRepository( - context: Context, +class BubbleDataRepository( private val launcherApps: LauncherApps, - private val mainExecutor: ShellExecutor + private val mainExecutor: ShellExecutor, + private val persistentRepository: BubblePersistentRepository, ) { private val volatileRepository = BubbleVolatileRepository(launcherApps) - private val persistentRepository = BubblePersistentRepository(context) private val coroutineScope = CoroutineScope(Dispatchers.IO + SupervisorJob()) private var job: Job? = null @@ -99,6 +99,43 @@ internal class BubbleDataRepository( if (volatileRepository.sanitizeBubbles(userIds)) persistToDisk() } + /** + * Removes all entities that don't have a user in the activeUsers list, if any entities were + * removed it persists the new list to disk. + */ + private fun filterForActiveUsersAndPersist( + activeUsers: List<Int>, + entitiesByUser: SparseArray<List<BubbleEntity>> + ): SparseArray<List<BubbleEntity>> { + val validEntitiesByUser = SparseArray<List<BubbleEntity>>() + var entitiesChanged = false + for (i in 0 until entitiesByUser.size()) { + val parentUserId = entitiesByUser.keyAt(i) + if (activeUsers.contains(parentUserId)) { + val validEntities = mutableListOf<BubbleEntity>() + // Check if each of the bubbles in the top-level user still has a valid user + // as it could belong to a profile and have a different id from the parent. + for (entity in entitiesByUser.get(parentUserId)) { + if (activeUsers.contains(entity.userId)) { + validEntities.add(entity) + } else { + entitiesChanged = true + } + } + if (validEntities.isNotEmpty()) { + validEntitiesByUser.put(parentUserId, validEntities) + } + } else { + entitiesChanged = true + } + } + if (entitiesChanged) { + persistToDisk(validEntitiesByUser) + return validEntitiesByUser + } + return entitiesByUser + } + private fun transform(bubbles: List<Bubble>): List<BubbleEntity> { return bubbles.mapNotNull { b -> BubbleEntity( @@ -130,7 +167,9 @@ internal class BubbleDataRepository( * Job C resumes and reaches yield() and is then cancelled * Job D resumes and performs another blocking I/O */ - private fun persistToDisk() { + private fun persistToDisk( + entitiesByUser: SparseArray<List<BubbleEntity>> = volatileRepository.bubbles + ) { val prev = job job = coroutineScope.launch { // if there was an ongoing disk I/O operation, they can be cancelled @@ -138,7 +177,7 @@ internal class BubbleDataRepository( // check for cancellation before disk I/O yield() // save to disk - persistentRepository.persistsToDisk(volatileRepository.bubbles) + persistentRepository.persistsToDisk(entitiesByUser) } } @@ -149,7 +188,12 @@ internal class BubbleDataRepository( * bubbles. */ @SuppressLint("WrongConstant") - fun loadBubbles(userId: Int, cb: (List<Bubble>) -> Unit) = coroutineScope.launch { + @VisibleForTesting + fun loadBubbles( + userId: Int, + currentUsers: List<Int>, + cb: (List<Bubble>) -> Unit + ) = coroutineScope.launch { /** * Load BubbleEntity from disk. * e.g. @@ -160,7 +204,12 @@ internal class BubbleDataRepository( * ] */ val entitiesByUser = persistentRepository.readFromDisk() - val entities = entitiesByUser.get(userId) ?: return@launch + + // Before doing anything, validate that the entities we loaded are valid & have an existing + // user. + val validEntitiesByUser = filterForActiveUsersAndPersist(currentUsers, entitiesByUser) + + val entities = validEntitiesByUser.get(userId) ?: return@launch volatileRepository.addBubbles(userId, entities) /** * Extract userId/packageName from these entities. diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/OWNERS b/libs/WindowManager/Shell/src/com/android/wm/shell/common/OWNERS new file mode 100644 index 000000000000..7af038999797 --- /dev/null +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/OWNERS @@ -0,0 +1 @@ +madym@google.com diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java index 03f92aaf9ce9..20c3bd2dccc4 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java @@ -37,6 +37,7 @@ import com.android.wm.shell.bubbles.BubbleDataRepository; import com.android.wm.shell.bubbles.BubbleLogger; import com.android.wm.shell.bubbles.BubblePositioner; import com.android.wm.shell.bubbles.properties.ProdBubbleProperties; +import com.android.wm.shell.bubbles.storage.BubblePersistentRepository; import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.DisplayImeController; import com.android.wm.shell.common.DisplayInsetsController; @@ -184,7 +185,8 @@ public abstract class WMShellModule { IWindowManager wmService) { return new BubbleController(context, shellInit, shellCommandHandler, shellController, data, null /* synchronizer */, floatingContentCoordinator, - new BubbleDataRepository(context, launcherApps, mainExecutor), + new BubbleDataRepository(launcherApps, mainExecutor, + new BubblePersistentRepository(context)), statusBarService, windowManager, windowManagerShellWrapper, userManager, launcherApps, logger, taskStackListener, organizer, positioner, displayController, oneHandedOptional, dragAndDropController, mainExecutor, mainHandler, bgExecutor, diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt index 65a35b2ffcb3..4fda4b7896c2 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt @@ -100,6 +100,10 @@ class DesktopTasksController( } } + private val transitionAreaHeight + get() = context.resources.getDimensionPixelSize( + com.android.wm.shell.R.dimen.desktop_mode_transition_area_height) + init { desktopMode = DesktopModeImpl() if (DesktopModeStatus.isProto2Enabled()) { @@ -700,13 +704,12 @@ class DesktopTasksController( y: Float ) { if (taskInfo.windowingMode == WINDOWING_MODE_FREEFORM) { - val statusBarHeight = getStatusBarHeight(taskInfo) - if (y <= statusBarHeight && visualIndicator == null) { + if (y <= transitionAreaHeight && visualIndicator == null) { visualIndicator = DesktopModeVisualIndicator(syncQueue, taskInfo, displayController, context, taskSurface, shellTaskOrganizer, rootTaskDisplayAreaOrganizer) visualIndicator?.createFullscreenIndicatorWithAnimatedBounds() - } else if (y > statusBarHeight && visualIndicator != null) { + } else if (y > transitionAreaHeight && visualIndicator != null) { releaseVisualIndicator() } } @@ -726,8 +729,7 @@ class DesktopTasksController( y: Float, windowDecor: DesktopModeWindowDecoration ) { - val statusBarHeight = getStatusBarHeight(taskInfo) - if (y <= statusBarHeight && taskInfo.windowingMode == WINDOWING_MODE_FREEFORM) { + if (y <= transitionAreaHeight && taskInfo.windowingMode == WINDOWING_MODE_FREEFORM) { windowDecor.incrementRelayoutBlock() moveToFullscreenWithAnimation(taskInfo, position) } @@ -746,9 +748,9 @@ class DesktopTasksController( taskSurface: SurfaceControl, y: Float ) { - // If the motion event is above the status bar, return since we do not need to show the - // visual indicator at this point. - if (y < getStatusBarHeight(taskInfo)) { + // If the motion event is above the status bar and the visual indicator is not yet visible, + // return since we do not need to show the visual indicator at this point. + if (y < getStatusBarHeight(taskInfo) && visualIndicator == null) { return } if (visualIndicator == null) { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java index b8407c465741..24aaa9b75ebe 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java @@ -856,6 +856,9 @@ public class PipTransition extends PipTransitionController { final int enterAnimationType = mEnterAnimationType; if (enterAnimationType == ANIM_TYPE_ALPHA) { startTransaction.setAlpha(leash, 0f); + } else { + // set alpha to 1, because for multi-activity PiP it will create a new task with alpha 0 + startTransaction.setAlpha(leash, 1f); } startTransaction.apply(); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecorViewModel.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecorViewModel.java index 92c2a7c03ee4..cf1692018518 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecorViewModel.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecorViewModel.java @@ -193,7 +193,7 @@ public class CaptionWindowDecorViewModel implements WindowDecorViewModel { final DragPositioningCallback dragPositioningCallback = new FluidResizeTaskPositioner(mTaskOrganizer, windowDecoration, mDisplayController, - null /* disallowedAreaForEndBounds */); + 0 /* disallowedAreaForEndBoundsHeight */); final CaptionTouchEventListener touchEventListener = new CaptionTouchEventListener(taskInfo, dragPositioningCallback); windowDecoration.setCaptionListeners(touchEventListener, touchEventListener); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java index 331835cca142..7245bc91cfca 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java @@ -845,7 +845,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { windowDecoration.createResizeVeil(); final DragPositioningCallback dragPositioningCallback = createDragPositioningCallback( - windowDecoration, taskInfo); + windowDecoration); final DesktopModeTouchEventListener touchEventListener = new DesktopModeTouchEventListener(taskInfo, dragPositioningCallback); @@ -858,24 +858,17 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { incrementEventReceiverTasks(taskInfo.displayId); } private DragPositioningCallback createDragPositioningCallback( - @NonNull DesktopModeWindowDecoration windowDecoration, - @NonNull RunningTaskInfo taskInfo) { - final int screenWidth = mDisplayController.getDisplayLayout(taskInfo.displayId).width(); - final Rect disallowedAreaForEndBounds; - if (DesktopModeStatus.isProto2Enabled()) { - disallowedAreaForEndBounds = new Rect(0, 0, screenWidth, - getStatusBarHeight(taskInfo.displayId)); - } else { - disallowedAreaForEndBounds = null; - } + @NonNull DesktopModeWindowDecoration windowDecoration) { + final int transitionAreaHeight = mContext.getResources().getDimensionPixelSize( + R.dimen.desktop_mode_transition_area_height); if (!DesktopModeStatus.isVeiledResizeEnabled()) { return new FluidResizeTaskPositioner(mTaskOrganizer, windowDecoration, - mDisplayController, disallowedAreaForEndBounds, mDragStartListener, - mTransactionFactory); + mDisplayController, mDragStartListener, mTransactionFactory, + transitionAreaHeight); } else { return new VeiledResizeTaskPositioner(mTaskOrganizer, windowDecoration, - mDisplayController, disallowedAreaForEndBounds, mDragStartListener, - mTransitions); + mDisplayController, mDragStartListener, mTransitions, + transitionAreaHeight); } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragPositioningCallbackUtility.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragPositioningCallbackUtility.java index 09e29bcbcf9f..e32bd42acf74 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragPositioningCallbackUtility.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragPositioningCallbackUtility.java @@ -83,8 +83,6 @@ public class DragPositioningCallbackUtility { // Make sure the new resizing destination in any direction falls within the stable bounds. // If not, set the bounds back to the old location that was valid to avoid conflicts with // some regions such as the gesture area. - displayController.getDisplayLayout(windowDecoration.mDisplay.getDisplayId()) - .getStableBounds(stableBounds); if ((ctrlType & CTRL_TYPE_LEFT) != 0) { final int candidateLeft = repositionTaskBounds.left + (int) delta.x; repositionTaskBounds.left = (candidateLeft > stableBounds.left) @@ -136,7 +134,7 @@ public class DragPositioningCallbackUtility { repositionTaskBounds.top); } - static void updateTaskBounds(Rect repositionTaskBounds, Rect taskBoundsAtDragStart, + private static void updateTaskBounds(Rect repositionTaskBounds, Rect taskBoundsAtDragStart, PointF repositionStartPoint, float x, float y) { final float deltaX = x - repositionStartPoint.x; final float deltaY = y - repositionStartPoint.y; @@ -145,6 +143,23 @@ public class DragPositioningCallbackUtility { } /** + * Updates repositionTaskBounds to the final bounds of the task after the drag is finished. If + * the bounds are outside of the stable bounds, they are shifted to place task at the top of the + * stable bounds. + */ + static void onDragEnd(Rect repositionTaskBounds, Rect taskBoundsAtDragStart, Rect stableBounds, + PointF repositionStartPoint, float x, float y) { + updateTaskBounds(repositionTaskBounds, taskBoundsAtDragStart, repositionStartPoint, + x, y); + + // If task is outside of stable bounds (in the status bar area), shift the task down. + if (stableBounds.top > repositionTaskBounds.top) { + final int yShift = stableBounds.top - repositionTaskBounds.top; + repositionTaskBounds.offset(0, yShift); + } + } + + /** * Apply a bounds change to a task. * @param windowDecoration decor of task we are changing bounds for * @param taskBounds new bounds of this task diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/FluidResizeTaskPositioner.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/FluidResizeTaskPositioner.java index 9082323452c9..917abf5524a4 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/FluidResizeTaskPositioner.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/FluidResizeTaskPositioner.java @@ -21,8 +21,6 @@ import android.graphics.Rect; import android.view.SurfaceControl; import android.window.WindowContainerTransaction; -import androidx.annotation.Nullable; - import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.common.DisplayController; @@ -42,28 +40,31 @@ class FluidResizeTaskPositioner implements DragPositioningCallback { private final Rect mTaskBoundsAtDragStart = new Rect(); private final PointF mRepositionStartPoint = new PointF(); private final Rect mRepositionTaskBounds = new Rect(); - // If a task move (not resize) finishes in this region, the positioner will not attempt to + // If a task move (not resize) finishes with the positions y less than this value, do not // finalize the bounds there using WCT#setBounds - private final Rect mDisallowedAreaForEndBounds; + private final int mDisallowedAreaForEndBoundsHeight; private boolean mHasDragResized; private int mCtrlType; FluidResizeTaskPositioner(ShellTaskOrganizer taskOrganizer, WindowDecoration windowDecoration, - DisplayController displayController, @Nullable Rect disallowedAreaForEndBounds) { - this(taskOrganizer, windowDecoration, displayController, disallowedAreaForEndBounds, - dragStartListener -> {}, SurfaceControl.Transaction::new); + DisplayController displayController, int disallowedAreaForEndBoundsHeight) { + this(taskOrganizer, windowDecoration, displayController, dragStartListener -> {}, + SurfaceControl.Transaction::new, disallowedAreaForEndBoundsHeight); } FluidResizeTaskPositioner(ShellTaskOrganizer taskOrganizer, WindowDecoration windowDecoration, - DisplayController displayController, @Nullable Rect disallowedAreaForEndBounds, + DisplayController displayController, DragPositioningCallbackUtility.DragStartListener dragStartListener, - Supplier<SurfaceControl.Transaction> supplier) { + Supplier<SurfaceControl.Transaction> supplier, + int disallowedAreaForEndBoundsHeight) { mTaskOrganizer = taskOrganizer; mWindowDecoration = windowDecoration; mDisplayController = displayController; - mDisallowedAreaForEndBounds = new Rect(disallowedAreaForEndBounds); mDragStartListener = dragStartListener; mTransactionSupplier = supplier; + mDisallowedAreaForEndBoundsHeight = disallowedAreaForEndBoundsHeight; + mDisplayController.getDisplayLayout(windowDecoration.mDisplay.getDisplayId()) + .getStableBounds(mStableBounds); } @Override @@ -121,10 +122,10 @@ class FluidResizeTaskPositioner implements DragPositioningCallback { } mTaskOrganizer.applyTransaction(wct); } else if (mCtrlType == CTRL_TYPE_UNDEFINED - && !mDisallowedAreaForEndBounds.contains((int) x, (int) y)) { + && y > mDisallowedAreaForEndBoundsHeight) { final WindowContainerTransaction wct = new WindowContainerTransaction(); - DragPositioningCallbackUtility.updateTaskBounds(mRepositionTaskBounds, - mTaskBoundsAtDragStart, mRepositionStartPoint, x, y); + DragPositioningCallbackUtility.onDragEnd(mRepositionTaskBounds, + mTaskBoundsAtDragStart, mStableBounds, mRepositionStartPoint, x, y); wct.setBounds(mWindowDecoration.mTaskInfo.token, mRepositionTaskBounds); mTaskOrganizer.applyTransaction(wct); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/VeiledResizeTaskPositioner.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/VeiledResizeTaskPositioner.java index 39b90218dce1..bf3ff3fa83ef 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/VeiledResizeTaskPositioner.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/VeiledResizeTaskPositioner.java @@ -53,33 +53,35 @@ public class VeiledResizeTaskPositioner implements DragPositioningCallback, private final Rect mTaskBoundsAtDragStart = new Rect(); private final PointF mRepositionStartPoint = new PointF(); private final Rect mRepositionTaskBounds = new Rect(); - // If a task move (not resize) finishes in this region, the positioner will not attempt to + // If a task move (not resize) finishes with the positions y less than this value, do not // finalize the bounds there using WCT#setBounds - private final Rect mDisallowedAreaForEndBounds; + private final int mDisallowedAreaForEndBoundsHeight; private final Supplier<SurfaceControl.Transaction> mTransactionSupplier; private int mCtrlType; public VeiledResizeTaskPositioner(ShellTaskOrganizer taskOrganizer, DesktopModeWindowDecoration windowDecoration, DisplayController displayController, - Rect disallowedAreaForEndBounds, DragPositioningCallbackUtility.DragStartListener dragStartListener, - Transitions transitions) { - this(taskOrganizer, windowDecoration, displayController, disallowedAreaForEndBounds, - dragStartListener, SurfaceControl.Transaction::new, transitions); + Transitions transitions, + int disallowedAreaForEndBoundsHeight) { + this(taskOrganizer, windowDecoration, displayController, dragStartListener, + SurfaceControl.Transaction::new, transitions, disallowedAreaForEndBoundsHeight); } public VeiledResizeTaskPositioner(ShellTaskOrganizer taskOrganizer, DesktopModeWindowDecoration windowDecoration, DisplayController displayController, - Rect disallowedAreaForEndBounds, DragPositioningCallbackUtility.DragStartListener dragStartListener, - Supplier<SurfaceControl.Transaction> supplier, Transitions transitions) { + Supplier<SurfaceControl.Transaction> supplier, Transitions transitions, + int disallowedAreaForEndBoundsHeight) { mTaskOrganizer = taskOrganizer; mDesktopWindowDecoration = windowDecoration; mDisplayController = displayController; mDragStartListener = dragStartListener; - mDisallowedAreaForEndBounds = new Rect(disallowedAreaForEndBounds); mTransactionSupplier = supplier; mTransitions = transitions; + mDisallowedAreaForEndBoundsHeight = disallowedAreaForEndBoundsHeight; + mDisplayController.getDisplayLayout(windowDecoration.mDisplay.getDisplayId()) + .getStableBounds(mStableBounds); } @Override @@ -110,8 +112,7 @@ public class VeiledResizeTaskPositioner implements DragPositioningCallback, } else if (mCtrlType == CTRL_TYPE_UNDEFINED) { final SurfaceControl.Transaction t = mTransactionSupplier.get(); DragPositioningCallbackUtility.setPositionOnDrag(mDesktopWindowDecoration, - mRepositionTaskBounds, mTaskBoundsAtDragStart, mRepositionStartPoint, t, - x, y); + mRepositionTaskBounds, mTaskBoundsAtDragStart, mRepositionStartPoint, t, x, y); t.apply(); } } @@ -138,9 +139,9 @@ public class VeiledResizeTaskPositioner implements DragPositioningCallback, // won't be called. mDesktopWindowDecoration.hideResizeVeil(); } - } else if (!mDisallowedAreaForEndBounds.contains((int) x, (int) y)) { - DragPositioningCallbackUtility.updateTaskBounds(mRepositionTaskBounds, - mTaskBoundsAtDragStart, mRepositionStartPoint, x, y); + } else if (y > mDisallowedAreaForEndBoundsHeight) { + DragPositioningCallbackUtility.onDragEnd(mRepositionTaskBounds, + mTaskBoundsAtDragStart, mStableBounds, mRepositionStartPoint, x, y); DragPositioningCallbackUtility.applyTaskBoundsChange(new WindowContainerTransaction(), mDesktopWindowDecoration, mRepositionTaskBounds, mTaskOrganizer); } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleDataRepositoryTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleDataRepositoryTest.kt new file mode 100644 index 000000000000..6d9d62d3ad92 --- /dev/null +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleDataRepositoryTest.kt @@ -0,0 +1,190 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.wm.shell.bubbles + +import android.app.ActivityTaskManager +import android.content.pm.LauncherApps +import android.content.pm.ShortcutInfo +import android.util.SparseArray +import com.android.wm.shell.ShellTestCase +import com.android.wm.shell.bubbles.storage.BubbleEntity +import com.android.wm.shell.bubbles.storage.BubblePersistentRepository +import com.android.wm.shell.common.ShellExecutor +import com.google.common.truth.Truth.assertThat +import org.junit.After +import org.junit.Before +import org.junit.Test +import org.mockito.Mockito.mock +import org.mockito.Mockito.spy + +class BubbleDataRepositoryTest : ShellTestCase() { + + private val user0BubbleEntities = listOf( + BubbleEntity( + userId = 0, + packageName = "com.example.messenger", + shortcutId = "shortcut-1", + key = "0k1", + desiredHeight = 120, + desiredHeightResId = 0, + title = null, + taskId = 1, + locus = null, + isDismissable = true + ), + BubbleEntity( + userId = 10, + packageName = "com.example.chat", + shortcutId = "alice and bob", + key = "0k2", + desiredHeight = 0, + desiredHeightResId = 16537428, + title = "title", + taskId = 2, + locus = null + ), + BubbleEntity( + userId = 0, + packageName = "com.example.messenger", + shortcutId = "shortcut-2", + key = "0k3", + desiredHeight = 120, + desiredHeightResId = 0, + title = null, + taskId = ActivityTaskManager.INVALID_TASK_ID, + locus = null + ) + ) + + private val user1BubbleEntities = listOf( + BubbleEntity( + userId = 1, + packageName = "com.example.messenger", + shortcutId = "shortcut-1", + key = "1k1", + desiredHeight = 120, + desiredHeightResId = 0, + title = null, + taskId = 3, + locus = null, + isDismissable = true + ), + BubbleEntity( + userId = 12, + packageName = "com.example.chat", + shortcutId = "alice and bob", + key = "1k2", + desiredHeight = 0, + desiredHeightResId = 16537428, + title = "title", + taskId = 4, + locus = null + ), + BubbleEntity( + userId = 1, + packageName = "com.example.messenger", + shortcutId = "shortcut-2", + key = "1k3", + desiredHeight = 120, + desiredHeightResId = 0, + title = null, + taskId = ActivityTaskManager.INVALID_TASK_ID, + locus = null + ), + BubbleEntity( + userId = 12, + packageName = "com.example.chat", + shortcutId = "alice", + key = "1k4", + desiredHeight = 0, + desiredHeightResId = 16537428, + title = "title", + taskId = 5, + locus = null + ) + ) + + private val mainExecutor = mock(ShellExecutor::class.java) + private val launcherApps = mock(LauncherApps::class.java) + + private val persistedBubbles = SparseArray<List<BubbleEntity>>() + + private lateinit var dataRepository: BubbleDataRepository + private lateinit var persistentRepository: BubblePersistentRepository + + @Before + fun setup() { + persistentRepository = spy(BubblePersistentRepository(mContext)) + dataRepository = BubbleDataRepository(launcherApps, mainExecutor, persistentRepository) + + // Add the bubbles to the persistent repository + persistedBubbles.put(0, user0BubbleEntities) + persistedBubbles.put(1, user1BubbleEntities) + persistentRepository.persistsToDisk(persistedBubbles) + } + + @After + fun teardown() { + // Clean up any persisted bubbles for the next run + persistentRepository.persistsToDisk(SparseArray()) + } + + @Test + fun testLoadBubbles_invalidParent() { + val activeUserIds = listOf(10, 1, 12) // Missing user 0 in persistedBubbles + dataRepository.loadBubbles(1, activeUserIds) { + // Verify that user 0 has been removed from the persisted list + val entitiesByUser = persistentRepository.readFromDisk() + assertThat(entitiesByUser.get(0)).isNull() + } + } + + @Test + fun testLoadBubbles_invalidChild() { + val activeUserIds = listOf(0, 10, 1) // Missing user 1's child user 12 + dataRepository.loadBubbles(1, activeUserIds) { + // Build a list to compare against + val user1BubblesWithoutUser12 = mutableListOf<Bubble>() + val user1EntitiesWithoutUser12 = mutableListOf<BubbleEntity>() + for (entity in user1BubbleEntities) { + if (entity.userId != 12) { + user1BubblesWithoutUser12.add(entity.toBubble()) + user1EntitiesWithoutUser12.add(entity) + } + } + + // Verify that user 12 has been removed from the persisted list + val entitiesByUser = persistentRepository.readFromDisk() + assertThat(entitiesByUser.get(1)).isEqualTo(user1EntitiesWithoutUser12) + } + } + + private fun BubbleEntity.toBubble(): Bubble { + return Bubble( + key, + mock(ShortcutInfo::class.java), + desiredHeight, + desiredHeightResId, + title, + taskId, + locus, + isDismissable, + mainExecutor, + mock(Bubbles.BubbleMetadataFlagListener::class.java) + ) + } +}
\ No newline at end of file diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.java index 23158eac94de..adc2a6fbff23 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.java @@ -90,6 +90,7 @@ public class DesktopModeWindowDecorViewModelTests extends ShellTestCase { @Mock private DesktopModeWindowDecorViewModel.InputMonitorFactory mMockInputMonitorFactory; @Mock private Supplier<SurfaceControl.Transaction> mTransactionFactory; @Mock private SurfaceControl.Transaction mTransaction; + @Mock private Display mDisplay; private final List<InputManager> mMockInputManagers = new ArrayList<>(); private DesktopModeWindowDecorViewModel mDesktopModeWindowDecorViewModel; @@ -126,6 +127,9 @@ public class DesktopModeWindowDecorViewModelTests extends ShellTestCase { final InputChannel[] inputChannels = InputChannel.openInputChannelPair(TAG); inputChannels[0].dispose(); when(mInputMonitor.getInputChannel()).thenReturn(inputChannels[1]); + + mDesktopModeWindowDecoration.mDisplay = mDisplay; + doReturn(Display.DEFAULT_DISPLAY).when(mDisplay).getDisplayId(); } @Test diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/FluidResizeTaskPositionerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/FluidResizeTaskPositionerTest.kt index 69604ddf0af1..6f0599aa8243 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/FluidResizeTaskPositionerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/FluidResizeTaskPositionerTest.kt @@ -22,6 +22,7 @@ import com.android.wm.shell.windowdecor.DragPositioningCallback.CTRL_TYPE_UNDEFI import org.junit.Before import org.junit.Test import org.junit.runner.RunWith +import org.mockito.ArgumentMatchers.eq import org.mockito.Mock import org.mockito.Mockito.any import org.mockito.Mockito.argThat @@ -71,16 +72,6 @@ class FluidResizeTaskPositionerTest : ShellTestCase() { fun setUp() { MockitoAnnotations.initMocks(this) - taskPositioner = - FluidResizeTaskPositioner( - mockShellTaskOrganizer, - mockWindowDecoration, - mockDisplayController, - DISALLOWED_AREA_FOR_END_BOUNDS, - mockDragStartListener, - mockTransactionFactory - ) - whenever(taskToken.asBinder()).thenReturn(taskBinder) whenever(mockDisplayController.getDisplayLayout(DISPLAY_ID)).thenReturn(mockDisplayLayout) whenever(mockDisplayLayout.densityDpi()).thenReturn(DENSITY_DPI) @@ -101,6 +92,15 @@ class FluidResizeTaskPositionerTest : ShellTestCase() { } mockWindowDecoration.mDisplay = mockDisplay whenever(mockDisplay.displayId).thenAnswer { DISPLAY_ID } + + taskPositioner = FluidResizeTaskPositioner( + mockShellTaskOrganizer, + mockWindowDecoration, + mockDisplayController, + mockDragStartListener, + mockTransactionFactory, + DISALLOWED_AREA_FOR_END_BOUNDS_HEIGHT + ) } @Test @@ -544,7 +544,7 @@ class FluidResizeTaskPositionerTest : ShellTestCase() { ) val newX = STARTING_BOUNDS.right.toFloat() + 5 - val newY = STARTING_BOUNDS.top.toFloat() + 5 + val newY = DISALLOWED_AREA_FOR_END_BOUNDS_HEIGHT.toFloat() - 1 taskPositioner.onDragPositioningMove( newX, newY @@ -614,6 +614,38 @@ class FluidResizeTaskPositionerTest : ShellTestCase() { }) } + @Test + fun testDragResize_drag_taskPositionedInStableBounds() { + taskPositioner.onDragPositioningStart( + CTRL_TYPE_UNDEFINED, // drag + STARTING_BOUNDS.left.toFloat(), + STARTING_BOUNDS.top.toFloat() + ) + + val newX = STARTING_BOUNDS.left.toFloat() + val newY = STABLE_BOUNDS.top.toFloat() - 5 + taskPositioner.onDragPositioningMove( + newX, + newY + ) + verify(mockTransaction).setPosition(any(), eq(newX), eq(newY)) + + taskPositioner.onDragPositioningEnd( + newX, + newY + ) + // Verify task's top bound is set to stable bounds top since dragged outside stable bounds + // but not in disallowed end bounds area. + verify(mockShellTaskOrganizer).applyTransaction(argThat { wct -> + return@argThat wct.changes.any { (token, change) -> + token == taskBinder && + (change.windowSetMask and WindowConfiguration.WINDOW_CONFIG_BOUNDS) != 0 && + change.configuration.windowConfiguration.bounds.top == + STABLE_BOUNDS.top + } + }) + } + companion object { private const val TASK_ID = 5 private const val MIN_WIDTH = 10 @@ -622,10 +654,11 @@ class FluidResizeTaskPositionerTest : ShellTestCase() { private const val DEFAULT_MIN = 40 private const val DISPLAY_ID = 1 private const val NAVBAR_HEIGHT = 50 + private const val CAPTION_HEIGHT = 50 + private const val DISALLOWED_AREA_FOR_END_BOUNDS_HEIGHT = 10 private val DISPLAY_BOUNDS = Rect(0, 0, 2400, 1600) - private val STARTING_BOUNDS = Rect(0, 0, 100, 100) + private val STARTING_BOUNDS = Rect(100, 100, 200, 200) private val STABLE_INSETS = Rect(0, 50, 0, 0) - private val DISALLOWED_AREA_FOR_END_BOUNDS = Rect(0, 0, 300, 300) private val DISALLOWED_RESIZE_AREA = Rect( DISPLAY_BOUNDS.left, DISPLAY_BOUNDS.bottom - NAVBAR_HEIGHT, @@ -633,7 +666,7 @@ class FluidResizeTaskPositionerTest : ShellTestCase() { DISPLAY_BOUNDS.bottom) private val STABLE_BOUNDS = Rect( DISPLAY_BOUNDS.left, - DISPLAY_BOUNDS.top, + DISPLAY_BOUNDS.top + CAPTION_HEIGHT, DISPLAY_BOUNDS.right, DISPLAY_BOUNDS.bottom - NAVBAR_HEIGHT ) diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/VeiledResizeTaskPositionerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/VeiledResizeTaskPositionerTest.kt index 4147dd8e6152..3465ddd9d101 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/VeiledResizeTaskPositionerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/VeiledResizeTaskPositionerTest.kt @@ -89,17 +89,6 @@ class VeiledResizeTaskPositionerTest : ShellTestCase() { fun setUp() { MockitoAnnotations.initMocks(this) - taskPositioner = - VeiledResizeTaskPositioner( - mockShellTaskOrganizer, - mockDesktopWindowDecoration, - mockDisplayController, - DISALLOWED_AREA_FOR_END_BOUNDS, - mockDragStartListener, - mockTransactionFactory, - mockTransitions - ) - whenever(taskToken.asBinder()).thenReturn(taskBinder) whenever(mockDisplayController.getDisplayLayout(DISPLAY_ID)).thenReturn(mockDisplayLayout) whenever(mockDisplayLayout.densityDpi()).thenReturn(DENSITY_DPI) @@ -119,6 +108,17 @@ class VeiledResizeTaskPositionerTest : ShellTestCase() { } mockDesktopWindowDecoration.mDisplay = mockDisplay whenever(mockDisplay.displayId).thenAnswer { DISPLAY_ID } + + taskPositioner = + VeiledResizeTaskPositioner( + mockShellTaskOrganizer, + mockDesktopWindowDecoration, + mockDisplayController, + mockDragStartListener, + mockTransactionFactory, + mockTransitions, + DISALLOWED_AREA_FOR_END_BOUNDS_HEIGHT + ) } @Test @@ -269,7 +269,7 @@ class VeiledResizeTaskPositionerTest : ShellTestCase() { ) val newX = STARTING_BOUNDS.left.toFloat() + 5 - val newY = STARTING_BOUNDS.top.toFloat() + 5 + val newY = DISALLOWED_AREA_FOR_END_BOUNDS_HEIGHT.toFloat() - 1 taskPositioner.onDragPositioningMove( newX, newY @@ -334,6 +334,38 @@ class VeiledResizeTaskPositionerTest : ShellTestCase() { }) } + @Test + fun testDragResize_drag_taskPositionedInStableBounds() { + taskPositioner.onDragPositioningStart( + CTRL_TYPE_UNDEFINED, // drag + STARTING_BOUNDS.left.toFloat(), + STARTING_BOUNDS.top.toFloat() + ) + + val newX = STARTING_BOUNDS.left.toFloat() + val newY = STABLE_BOUNDS.top.toFloat() - 5 + taskPositioner.onDragPositioningMove( + newX, + newY + ) + verify(mockTransaction).setPosition(any(), eq(newX), eq(newY)) + + taskPositioner.onDragPositioningEnd( + newX, + newY + ) + // Verify task's top bound is set to stable bounds top since dragged outside stable bounds + // but not in disallowed end bounds area. + verify(mockShellTaskOrganizer).applyTransaction(argThat { wct -> + return@argThat wct.changes.any { (token, change) -> + token == taskBinder && + (change.windowSetMask and WindowConfiguration.WINDOW_CONFIG_BOUNDS) != 0 && + change.configuration.windowConfiguration.bounds.top == + STABLE_BOUNDS.top + } + }) + } + companion object { private const val TASK_ID = 5 private const val MIN_WIDTH = 10 @@ -342,12 +374,13 @@ class VeiledResizeTaskPositionerTest : ShellTestCase() { private const val DEFAULT_MIN = 40 private const val DISPLAY_ID = 1 private const val NAVBAR_HEIGHT = 50 + private const val CAPTION_HEIGHT = 50 + private const val DISALLOWED_AREA_FOR_END_BOUNDS_HEIGHT = 10 private val DISPLAY_BOUNDS = Rect(0, 0, 2400, 1600) - private val STARTING_BOUNDS = Rect(0, 0, 100, 100) - private val DISALLOWED_AREA_FOR_END_BOUNDS = Rect(0, 0, 50, 50) + private val STARTING_BOUNDS = Rect(100, 100, 200, 200) private val STABLE_BOUNDS = Rect( DISPLAY_BOUNDS.left, - DISPLAY_BOUNDS.top, + DISPLAY_BOUNDS.top + CAPTION_HEIGHT, DISPLAY_BOUNDS.right, DISPLAY_BOUNDS.bottom - NAVBAR_HEIGHT ) diff --git a/media/java/android/media/MediaRoute2Info.java b/media/java/android/media/MediaRoute2Info.java index 0e9c162e4929..651c732abdb8 100644 --- a/media/java/android/media/MediaRoute2Info.java +++ b/media/java/android/media/MediaRoute2Info.java @@ -156,6 +156,7 @@ public final class MediaRoute2Info implements Parcelable { TYPE_REMOTE_GAME_CONSOLE, TYPE_REMOTE_CAR, TYPE_REMOTE_SMARTWATCH, + TYPE_REMOTE_SMARTPHONE, TYPE_GROUP }) @Retention(RetentionPolicy.SOURCE) @@ -343,6 +344,17 @@ public final class MediaRoute2Info implements Parcelable { public static final int TYPE_REMOTE_SMARTWATCH = 1009; /** + * Indicates the route is a remote smartphone. + * + * <p>A remote device uses a routing protocol managed by the application, as opposed to the + * routing being done by the system. + * + * @see #getType + * @hide + */ + public static final int TYPE_REMOTE_SMARTPHONE = 1010; + + /** * Indicates the route is a group of devices. * * @see #getType @@ -546,32 +558,8 @@ public final class MediaRoute2Info implements Parcelable { return mFeatures; } - // TODO (b/278728942): Add the following once the symbols are published in the SDK. Until then, - // adding them would cause the generated link to be broken. - // @see #TYPE_REMOTE_TABLET - // @see #TYPE_REMOTE_TABLET_DOCKED - // @see #TYPE_REMOTE_COMPUTER - // @see #TYPE_REMOTE_GAME_CONSOLE - // @see #TYPE_REMOTE_CAR - // @see #TYPE_REMOTE_SMARTWATCH /** * Returns the type of this route. - * - * @see #TYPE_UNKNOWN - * @see #TYPE_BUILTIN_SPEAKER - * @see #TYPE_WIRED_HEADSET - * @see #TYPE_WIRED_HEADPHONES - * @see #TYPE_BLUETOOTH_A2DP - * @see #TYPE_HDMI - * @see #TYPE_DOCK - * @see #TYPE_USB_DEVICE - * @see #TYPE_USB_ACCESSORY - * @see #TYPE_USB_HEADSET - * @see #TYPE_HEARING_AID - * @see #TYPE_REMOTE_TV - * @see #TYPE_REMOTE_SPEAKER - * @see #TYPE_REMOTE_AUDIO_VIDEO_RECEIVER - * @see #TYPE_GROUP */ @Type public int getType() { @@ -954,6 +942,8 @@ public final class MediaRoute2Info implements Parcelable { return "REMOTE_CAR"; case TYPE_REMOTE_SMARTWATCH: return "REMOTE_SMARTWATCH"; + case TYPE_REMOTE_SMARTPHONE: + return "REMOTE_SMARTPHONE"; case TYPE_GROUP: return "GROUP"; case TYPE_UNKNOWN: diff --git a/packages/CarrierDefaultApp/res/values-ur/strings.xml b/packages/CarrierDefaultApp/res/values-ur/strings.xml index 0c7cdc5b912b..d6225c2dd16e 100644 --- a/packages/CarrierDefaultApp/res/values-ur/strings.xml +++ b/packages/CarrierDefaultApp/res/values-ur/strings.xml @@ -16,9 +16,7 @@ <string name="ssl_error_continue" msgid="1138548463994095584">"براؤزر کے ذریعے بہرحال جاری رکھیں"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"پرفارمینس بوسٹ"</string> <string name="performance_boost_notification_title" msgid="3126203390685781861">"آپ کے کیریئر سے 5G کے اختیارات"</string> - <!-- String.format failed for translation --> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"اپنی ایپ کے تجربے کے اختیارات دیکھنے کے لیے %s کی ویب سائٹ ملاحظہ کریں"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"ابھی نہیں"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"نظم کریں"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"پرفارمینس بوسٹ خریدیں۔"</string> diff --git a/packages/PackageInstaller/res/values-af/strings.xml b/packages/PackageInstaller/res/values-af/strings.xml index 3545179a3ab7..14ed179bb385 100644 --- a/packages/PackageInstaller/res/values-af/strings.xml +++ b/packages/PackageInstaller/res/values-af/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Program geïnstalleer."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Wil jy hierdie program installeer?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Wil jy hierdie program opdateer?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Dateer hierdie app vanaf <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> op?\n\nHierdie app kry gewoonlik opdaterings vanaf <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. As jy vanaf ’n ander bron opdateer, kan jy in die toekoms dalk opdaterings vanaf enige bron op jou foon kry. Appfunksie kan verander."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Dateer hierdie app vanaf <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> op?\n\nHierdie app kry gewoonlik opdaterings vanaf <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. As jy vanaf ’n ander bron opdateer, kan jy in die toekoms dalk opdaterings vanaf enige bron op jou tablet kry. Appfunksies kan verander."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Dateer hierdie app vanaf <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> op?\n\nHierdie app kry gewoonlik opdaterings vanaf <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. As jy vanaf ’n ander bron opdateer, kan jy in die toekoms dalk opdaterings vanaf enige bron op jou TV kry. Appfunksies kan verander."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Dateer hierdie app vanaf <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> op?\n\nHierdie app kry gewoonlik opdaterings vanaf <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. As jy vanaf ’n ander bron opdateer, kan jy in die toekoms dalk opdaterings vanaf enige bron op jou foon kry. Appfunksie kan verander."</string> <string name="install_failed" msgid="5777824004474125469">"Program nie geïnstalleer nie."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Die installering van die pakket is geblokkeer."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Program is nie geïnstalleer nie omdat pakket met \'n bestaande pakket bots."</string> diff --git a/packages/PackageInstaller/res/values-am/strings.xml b/packages/PackageInstaller/res/values-am/strings.xml index 3dab467c4cf7..1fb5c12d6ad0 100644 --- a/packages/PackageInstaller/res/values-am/strings.xml +++ b/packages/PackageInstaller/res/values-am/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"መተግበሪያ ተጭኗል።"</string> <string name="install_confirm_question" msgid="7663733664476363311">"ይህን መተግበሪያ መጫን ይፈልጋሉ?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"ይህን መተግበሪያ ማዘመን ይፈልጋሉ?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"ይህ መተግበሪያ ከ<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> ይዘምን?\n\nይህ መተግበሪያ በመደበኛነት ዝማኔዎችን ከ<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> ይቀበላል። ከተለየ ምንጭ በማዘመን በስልክዎ ላይ ካለ ማንኛውም ምንጭ የወደፊት ዝማኔዎችን ሊቀበሉ ይችላሉ። የመተግበሪያ ተግባራዊነት ሊለወጥ ይችላል።"</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"ይህ መተግበሪያ ከ<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> ይዘምን?\n\nይህ መተግበሪያ በመደበኛነት ዝማኔዎችን ከ<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> ይቀበላል። ከተለየ ምንጭ በማዘመን በጡባዊዎ ላይ ካለ ማንኛውም ምንጭ የወደፊት ዝማኔዎችን ሊቀበሉ ይችላሉ። የመተግበሪያ ተግባራዊነት ሊለወጥ ይችላል።"</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"ይህ መተግበሪያ ከ<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> ይዘምን?\n\nይህ መተግበሪያ በመደበኛነት ዝማኔዎችን ከ<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> ይቀበላል። ከተለየ ምንጭ በማዘመን በቲቪዎ ላይ ካለ ማንኛውም ምንጭ የወደፊት ዝማኔዎችን ሊቀበሉ ይችላሉ። የመተግበሪያ ተግባራዊነት ሊለወጥ ይችላል።"</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"ይህ መተግበሪያ ከ<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> ይዘምን?\n\nይህ መተግበሪያ በመደበኛነት ዝማኔዎችን ከ<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> ይቀበላል። ከተለየ ምንጭ በማዘመን በስልክዎ ላይ ካለ ማንኛውም ምንጭ የወደፊት ዝማኔዎችን ሊቀበሉ ይችላሉ። የመተግበሪያ ተግባራዊነት ሊለወጥ ይችላል።"</string> <string name="install_failed" msgid="5777824004474125469">"መተግበሪያ አልተጫነም።"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"ጥቅሉ እንዳይጫን ታግዷል።"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"እንደ ጥቅል ያልተጫነ መተግበሪያ ከነባር ጥቅል ጋር ይጋጫል።"</string> diff --git a/packages/PackageInstaller/res/values-ar/strings.xml b/packages/PackageInstaller/res/values-ar/strings.xml index 170c1fcb05ac..a92b0166dd83 100644 --- a/packages/PackageInstaller/res/values-ar/strings.xml +++ b/packages/PackageInstaller/res/values-ar/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"تم تثبيت التطبيق."</string> <string name="install_confirm_question" msgid="7663733664476363311">"هل تريد تثبيت هذا التطبيق؟"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"هل تريد تحديث هذا التطبيق؟"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"هل تريد تحديث هذا التطبيق من خلال \"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>\"؟\n\nيتلقّى هذا التطبيق التحديثات عادةً من \"<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>\". من خلال إجراء التحديث من مصدر مختلف، قد تتلقّى تحديثات في المستقبل من أي مصدر على هاتفك. قد تتغير وظائف التطبيق."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"هل تريد تحديث هذا التطبيق من خلال \"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>\"؟\n\nيتلقّى هذا التطبيق التحديثات عادةً من \"<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>\". من خلال تحديثه من مصدر مختلف، قد يتلقّى تحديثات في المستقبل من أي مصدر على جهازك اللوحي. قد تتغير وظائف التطبيق."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"هل تريد تحديث هذا التطبيق من خلال \"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>\"؟\n\nيتلقّى هذا التطبيق التحديثات عادةً من \"<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>\". من خلال تحديثه من مصدر مختلف، قد يتلقّى تحديثات في المستقبل من أي مصدر على التلفزيون. قد تتغير وظائف التطبيق."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"هل تريد تحديث هذا التطبيق من خلال \"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>\"؟\n\nيتلقّى هذا التطبيق التحديثات عادةً من \"<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>\". من خلال إجراء التحديث من مصدر مختلف، قد تتلقّى تحديثات في المستقبل من أي مصدر على هاتفك. قد تتغير وظائف التطبيق."</string> <string name="install_failed" msgid="5777824004474125469">"التطبيق ليس مثبتًا."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"تم حظر تثبيت الحزمة."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"لم يتم تثبيت التطبيق لأن حزمة التثبيت تتعارض مع حزمة حالية."</string> diff --git a/packages/PackageInstaller/res/values-as/strings.xml b/packages/PackageInstaller/res/values-as/strings.xml index 37f6c13d1f31..e6b46aed5d53 100644 --- a/packages/PackageInstaller/res/values-as/strings.xml +++ b/packages/PackageInstaller/res/values-as/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"এপ্ ইনষ্টল কৰা হ’ল।"</string> <string name="install_confirm_question" msgid="7663733664476363311">"আপুনি এই এপ্টো ইনষ্টল কৰিবলৈ বিচাৰেনে?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"আপুনি এই এপ্টো আপডে’ট কৰিবলৈ বিচাৰেনে?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"এই এপ্টো <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>ৰ পৰা আপডে’ট কৰিবনে?\n\nএই এপ্টোৱে সাধাৰণতে <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>ৰ পৰা আপডে’ট লাভ কৰে। অন্য এটা উৎসৰ পৰা আপডে’ট কৰি আপুনি যিকোনো উৎসৰ পৰা আপোনাৰ ফ’নত অনাগত আপডে’টসমূহ পাব পাৰে। এপৰ কাৰ্যক্ষমতা সলনি হ’ব পাৰে।"</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"এই এপ্টো <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>ৰ পৰা আপডে’ট কৰিবনে?\n\nএই এপ্টোৱে সাধাৰণতে <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>ৰ পৰা আপডে’ট লাভ কৰে। অন্য এটা উৎসৰ পৰা আপডে’ট কৰি আপুনি যিকোনো উৎসৰ পৰা আপোনাৰ টেবলেটত অনাগত আপডে’টসমূহ পাব পাৰে। এপৰ কাৰ্যক্ষমতা সলনি হ’ব পাৰে।"</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"এই এপ্টো <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>ৰ পৰা আপডে’ট কৰিবনে?\n\nএই এপ্টোৱে সাধাৰণতে <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>ৰ পৰা আপডে’ট লাভ কৰে। অন্য এটা উৎসৰ পৰা আপডে’ট কৰি আপুনি যিকোনো উৎসৰ পৰা আপোনাৰ টিভিত অনাগত আপডে’টসমূহ পাব পাৰে। এপৰ কাৰ্যক্ষমতা সলনি হ’ব পাৰে।"</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"এই এপ্টো <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>ৰ পৰা আপডে’ট কৰিবনে?\n\nএই এপ্টোৱে সাধাৰণতে <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>ৰ পৰা আপডে’ট লাভ কৰে। অন্য এটা উৎসৰ পৰা আপডে’ট কৰি আপুনি যিকোনো উৎসৰ পৰা আপোনাৰ ফ’নত অনাগত আপডে’টসমূহ পাব পাৰে। এপৰ কাৰ্যক্ষমতা সলনি হ’ব পাৰে।"</string> <string name="install_failed" msgid="5777824004474125469">"এপ্ ইনষ্টল কৰা হোৱা নাই।"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"পেকেজটোৰ ইনষ্টল অৱৰোধ কৰা হৈছে।"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"এপ্টো ইনষ্টল কৰিব পৰা নগ\'ল কাৰণ ইয়াৰ সৈতে আগৰে পৰা থকা এটা পেকেজৰ সংঘাত হৈছে।"</string> diff --git a/packages/PackageInstaller/res/values-az/strings.xml b/packages/PackageInstaller/res/values-az/strings.xml index ae7b2fcd6411..a1b4fcad5374 100644 --- a/packages/PackageInstaller/res/values-az/strings.xml +++ b/packages/PackageInstaller/res/values-az/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Tətbiq quraşdırılıb."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Bu tətbiqi quraşdırmaq istəyirsiniz?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Bu tətbiqi güncəlləmək istəyirsiniz?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Bu tətbiq <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> mənbəyindən güncəllənsin?\n\nBu tətbiq adətən <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> mənbəyindən güncəllənmələr qəbul edir. Fərqli mənbədən güncəllədikdə telefonda istənilən mənbədən gələcəkdə güncəllənmələr qəbul edə bilərsiniz. Tətbiq funksionallığı dəyişə bilər."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Bu tətbiq <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> mənbəyindən güncəllənsin?\n\nBu tətbiq adətən <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> mənbəyindən güncəllənir. Fərqli mənbədən güncəllədikdə gələcəkdə planşetdə istənilən mənbədən güncəlləyə bilərsiniz. Tətbiq funksionallığı dəyişə bilər."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Bu tətbiq <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> mənbəyindən güncəllənsin?\n\nBu tətbiq adətən <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> mənbəyindən güncəllənir. Fərqli mənbədən güncəllədikdə gələcəkdə TV-də istənilən mənbədən güncəlləyə bilərsiniz. Tətbiq funksionallığı dəyişə bilər."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Bu tətbiq <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> mənbəyindən güncəllənsin?\n\nBu tətbiq adətən <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> mənbəyindən güncəllənmələr qəbul edir. Fərqli mənbədən güncəllədikdə telefonda istənilən mənbədən gələcəkdə güncəllənmələr qəbul edə bilərsiniz. Tətbiq funksionallığı dəyişə bilər."</string> <string name="install_failed" msgid="5777824004474125469">"Tətbiq quraşdırılmayıb."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Paketin quraşdırılması blok edildi."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Bu paketin mövcud paket ilə ziddiyətinə görə tətbiq quraşdırılmadı."</string> diff --git a/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml b/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml index 2b0fa823afef..953b227a1055 100644 --- a/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml +++ b/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Aplikacija je instalirana."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Želite da instalirate ovu aplikaciju?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Želite da ažurirate ovu aplikaciju?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Želite da ažurirate ovu aplikaciju iz izvora <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nOva aplikacija se obično ažurira iz izvora <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ako ažurirate iz drugog izvora, možete da primate buduća ažuriranja iz bilo kog izvora na telefonu. Funkcije aplikacije mogu da se promene."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Želite da ažurirate ovu aplikaciju iz izvora <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nOva aplikacija se obično ažurira iz izvora <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ako ažurirate iz drugog izvora, možete da primate buduća ažuriranja iz bilo kog izvora na tabletu. Funkcije aplikacije mogu da se promene."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Želite da ažurirate ovu aplikaciju iz izvora <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nOva aplikacija se obično ažurira iz izvora <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ako ažurirate iz drugog izvora, možete da primate buduća ažuriranja iz bilo kog izvora na TV-u. Funkcije aplikacije mogu da se promene."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Želite da ažurirate ovu aplikaciju iz izvora <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nOva aplikacija se obično ažurira iz izvora <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ako ažurirate iz drugog izvora, možete da primate buduća ažuriranja iz bilo kog izvora na telefonu. Funkcije aplikacije mogu da se promene."</string> <string name="install_failed" msgid="5777824004474125469">"Aplikacija nije instalirana."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Instaliranje paketa je blokirano."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikacija nije instalirana jer je paket neusaglašen sa postojećim paketom."</string> diff --git a/packages/PackageInstaller/res/values-be/strings.xml b/packages/PackageInstaller/res/values-be/strings.xml index d18e009c88a4..0e47d726e2f7 100644 --- a/packages/PackageInstaller/res/values-be/strings.xml +++ b/packages/PackageInstaller/res/values-be/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Праграма ўсталявана."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Усталяваць гэту праграму?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Абнавіць гэту праграму?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Абнавіць праграму ад <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nЗвычайна гэтая праграма атрымлівае абнаўленні ад <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Пры абнаўленні з іншай крыніцы вы, магчыма, будзеце атрымліваць будучыя абнаўленні з любой крыніцы на тэлефоне. Функцыі праграмы могуць змяніцца."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Абнавіць праграму з <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nЗвычайна гэтая праграма атрымлівае абнаўленні з <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Калі абнавіць праграму з іншай крыніцы, то ў будучыні вы, магчыма, будзеце атрымліваць абнаўленні з любых крыніц на планшэце. Функцыі праграмы могуць змяніцца."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Абнавіць праграму з <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nЗвычайна гэтая праграма атрымлівае абнаўленні з <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Калі абнавіць праграму з іншай крыніцы, то ў будучыні вы, магчыма, будзеце атрымліваць абнаўленні з любых крыніц на тэлевізары. Функцыі праграмы могуць змяніцца."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Абнавіць праграму ад <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nЗвычайна гэтая праграма атрымлівае абнаўленні ад <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Пры абнаўленні з іншай крыніцы вы, магчыма, будзеце атрымліваць будучыя абнаўленні з любой крыніцы на тэлефоне. Функцыі праграмы могуць змяніцца."</string> <string name="install_failed" msgid="5777824004474125469">"Праграма не ўсталявана."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Усталяванне пакета заблакіравана."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Праграма не ўсталявана, таму што пакет канфліктуе з існуючым пакетам."</string> diff --git a/packages/PackageInstaller/res/values-bg/strings.xml b/packages/PackageInstaller/res/values-bg/strings.xml index 6dc927f7cd5c..6a3812946d82 100644 --- a/packages/PackageInstaller/res/values-bg/strings.xml +++ b/packages/PackageInstaller/res/values-bg/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Приложението бе инсталирано."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Искате ли да инсталирате това приложение?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Искате ли да актуализирате това приложение?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Да се актуализира ли това приложение от <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nТо обикновено получава актуализации от <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ако инсталирате актуализация от друг източник, може да получавате бъдещи актуализации от който и да е източник на телефона си. Функционалността на приложението може да се промени."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Да се актуализира ли това приложение от <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nТо обикновено получава актуализации от <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ако инсталирате актуализация от друг източник, може да получавате бъдещи актуализации от който и да е източник на таблета си. Функционалността на приложението може да се промени."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Да се актуализира ли това приложение от <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nТо обикновено получава актуализации от <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ако инсталирате актуализация от друг източник, може да получавате бъдещи актуализации от който и да е източник на телевизора си. Функционалността на приложението може да се промени."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Да се актуализира ли това приложение от <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nТо обикновено получава актуализации от <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ако инсталирате актуализация от друг източник, може да получавате бъдещи актуализации от който и да е източник на телефона си. Функционалността на приложението може да се промени."</string> <string name="install_failed" msgid="5777824004474125469">"Приложението не бе инсталирано."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Инсталирането на пакета бе блокирано."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Приложението не бе инсталирано, тъй като пакетът е в конфликт със съществуващ пакет."</string> diff --git a/packages/PackageInstaller/res/values-bn/strings.xml b/packages/PackageInstaller/res/values-bn/strings.xml index 5b5c6dc7c8e9..95cec049432b 100644 --- a/packages/PackageInstaller/res/values-bn/strings.xml +++ b/packages/PackageInstaller/res/values-bn/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"অ্যাপটি ইনস্টল করা হয়ে গেছে।"</string> <string name="install_confirm_question" msgid="7663733664476363311">"আপনি কি এই অ্যাপটি ইনস্টল করতে চান?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"আপনি কি এই অ্যাপটি আপডেট করতে চান?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> থেকে এই অ্যাপ আপডেট করবেন?\n\nএই অ্যাপ সাধারণত <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> থেকে আপডেট পায়। অন্য কোনও সোর্স থেকে আপডেট করলে, আপনার ফোনে ভবিষ্যতে যেকোনও সোর্স থেকে আপডেট পেতে পারেন। অ্যাপের কার্যকারিতা পরিবর্তন হতে পারে।"</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>-এর থেকে এই অ্যাপ আপডেট করতে চান?\n\nসাধারণত <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>-এর থেকেই এই অ্যাপ আপডেট পায়। অন্য কোনও সোর্স থেকে আপডেট করলে, আপনার ট্যাবলেটে ভবিষ্যতে যেকোনও সোর্স থেকে আপডেট পাঠানো হতে পারে। তার ফলে অ্যাপের কার্যকারিতার ক্ষেত্রে পরিবর্তন হতে পারে।"</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>-এর থেকে এই অ্যাপ আপডেট করতে চান?\n\nসাধারণত <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>-এর থেকেই এই অ্যাপ আপডেট পায়। অন্য কোনও সোর্স থেকে আপডেট করলে, আপনার টিভিতে ভবিষ্যতে যেকোনও সোর্স থেকে আপডেট পাঠানো হতে পারে। তার ফলে অ্যাপের কার্যকারিতার ক্ষেত্রে পরিবর্তন হতে পারে।"</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> থেকে এই অ্যাপ আপডেট করবেন?\n\nএই অ্যাপ সাধারণত <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> থেকে আপডেট পায়। অন্য কোনও সোর্স থেকে আপডেট করলে, আপনার ফোনে ভবিষ্যতে যেকোনও সোর্স থেকে আপডেট পেতে পারেন। অ্যাপের কার্যকারিতা পরিবর্তন হতে পারে।"</string> <string name="install_failed" msgid="5777824004474125469">"অ্যাপটি ইনস্টল করা হয়নি।"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"ইনস্টল হওয়া থেকে প্যাকেজটিকে ব্লক করা হয়েছে।"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"আগে থেকেই থাকা একটি প্যাকেজের সাথে প্যাকেজটির সমস্যা সৃষ্টি হওয়ায় অ্যাপটি ইনস্টল করা যায়নি।"</string> diff --git a/packages/PackageInstaller/res/values-bs/strings.xml b/packages/PackageInstaller/res/values-bs/strings.xml index e728937b348f..56de9f29ef34 100644 --- a/packages/PackageInstaller/res/values-bs/strings.xml +++ b/packages/PackageInstaller/res/values-bs/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Aplikacija je instalirana."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Želite li instalirati ovu aplikaciju?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Želite li ažurirati ovu aplikaciju?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Ažurirati aplikaciju iz izvora <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nOva aplikacija obično prima ažuriranja iz izvora <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ako je ažurirate iz drugog izvora, možda ćete primati buduća ažuriranja iz bilo kojeg izvora na telefonu. Funkcionalnost aplikacije se može promijeniti."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Ažurirati aplikaciju iz izvora <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nOva aplikacija obično prima ažuriranja iz izvora <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ako je ažurirate iz drugog izvora, možda ćete primati buduća ažuriranja iz bilo kojeg izvora na tabletu. Funkcionalnost aplikacije se može promijeniti."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Ažurirati aplikaciju iz izvora <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nOva aplikacija obično prima ažuriranja iz izvora <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ako je ažurirate iz drugog izvora, možda ćete primati buduća ažuriranja iz bilo kojeg izvora na TV-u. Funkcionalnost aplikacije se može promijeniti."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Ažurirati aplikaciju iz izvora <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nOva aplikacija obično prima ažuriranja iz izvora <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ako je ažurirate iz drugog izvora, možda ćete primati buduća ažuriranja iz bilo kojeg izvora na telefonu. Funkcionalnost aplikacije se može promijeniti."</string> <string name="install_failed" msgid="5777824004474125469">"Aplikacija nije instalirana."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Instaliranje ovog paketa je blokirano."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikacija nije instalirana jer paket nije usaglašen s postojećim paketom."</string> diff --git a/packages/PackageInstaller/res/values-ca/strings.xml b/packages/PackageInstaller/res/values-ca/strings.xml index 8b0d1a8c9e61..00d6f244c900 100644 --- a/packages/PackageInstaller/res/values-ca/strings.xml +++ b/packages/PackageInstaller/res/values-ca/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"S\'ha instal·lat l\'aplicació."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Vols instal·lar aquesta aplicació?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Vols actualitzar aquesta aplicació?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Vols actualitzar l\'aplicació des de <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nAquesta aplicació sol rebre actualitzacions a través de <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Si l\'actualitzes des d\'una font diferent, pot ser que en el futur rebis actualitzacions des de qualsevol font del teu telèfon. És possible que la funcionalitat de l\'aplicació canviï."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Vols actualitzar l\'aplicació de <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nAquesta aplicació sol rebre actualitzacions de <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Si l\'actualitzes des d\'una font diferent, pot ser que en el futur rebis actualitzacions des de qualsevol font de la teva tauleta. És possible que la funcionalitat de l\'aplicació canviï."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Vols actualitzar l\'aplicació de <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nAquesta aplicació sol rebre actualitzacions de <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Si l\'actualitzes des d\'una font diferent, pot ser que en el futur rebis actualitzacions des de qualsevol font del teu televisor. És possible que la funcionalitat de l\'aplicació canviï."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Vols actualitzar l\'aplicació des de <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nAquesta aplicació sol rebre actualitzacions a través de <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Si l\'actualitzes des d\'una font diferent, pot ser que en el futur rebis actualitzacions des de qualsevol font del teu telèfon. És possible que la funcionalitat de l\'aplicació canviï."</string> <string name="install_failed" msgid="5777824004474125469">"No s\'ha instal·lat l\'aplicació."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"El paquet s\'ha bloquejat perquè no es pugui instal·lar."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"L\'aplicació no s\'ha instal·lat perquè el paquet entra en conflicte amb un d\'existent."</string> diff --git a/packages/PackageInstaller/res/values-cs/strings.xml b/packages/PackageInstaller/res/values-cs/strings.xml index c96d27e05125..117c6f61fcf6 100644 --- a/packages/PackageInstaller/res/values-cs/strings.xml +++ b/packages/PackageInstaller/res/values-cs/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Aplikace je nainstalována."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Chcete tuto aplikaci nainstalovat?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Chcete tuto aplikaci aktualizovat?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Aktualizovat tuto aplikaci ze zdroje <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nTato aplikace obvykle dostává aktualizace ze zdroje <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Pokud ji aktualizujete z jiného zdroje, budete v budoucnu do telefonu moci dostávat aktualizace z libovolného zdroje. Funkčnost aplikace se může změnit."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Aktualizovat tuto aplikaci ze zdroje <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nTato aplikace obvykle dostává aktualizace ze zdroje <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Pokud ji aktualizujete z jiného zdroje, budete v budoucnu do tabletu moci dostávat aktualizace z libovolného zdroje. Funkčnost aplikace se může změnit."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Aktualizovat tuto aplikaci ze zdroje <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nTato aplikace obvykle dostává aktualizace ze zdroje <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Pokud ji aktualizujete z jiného zdroje, budete v budoucnu do televize moci dostávat aktualizace z libovolného zdroje. Funkčnost aplikace se může změnit."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Aktualizovat tuto aplikaci ze zdroje <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nTato aplikace obvykle dostává aktualizace ze zdroje <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Pokud ji aktualizujete z jiného zdroje, budete v budoucnu do telefonu moci dostávat aktualizace z libovolného zdroje. Funkčnost aplikace se může změnit."</string> <string name="install_failed" msgid="5777824004474125469">"Aplikaci nelze nainstalovat."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Instalace balíčku byla zablokována."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikaci nelze nainstalovat, protože balíček je v konfliktu se stávajícím balíčkem."</string> diff --git a/packages/PackageInstaller/res/values-da/strings.xml b/packages/PackageInstaller/res/values-da/strings.xml index d8759d4b61f0..e34d8cf31376 100644 --- a/packages/PackageInstaller/res/values-da/strings.xml +++ b/packages/PackageInstaller/res/values-da/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Appen er installeret."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Vil du installere denne app?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Vil du opdatere denne app?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Vil du opdatere denne app fra <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nDenne app plejer at modtage opdateringer fra <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Hvis du opdaterer fra en anden kilde, vil du kunne modtage opdateringer fra en hvilken som helst kilde på din telefon fremover. Appfunktionaliteten kan ændre sig."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Vil du opdatere denne app fra <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nDenne app plejer at modtage opdateringer fra <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Hvis du opdaterer fra en anden kilde, vil du kunne modtage opdateringer fra en hvilken som helst kilde på din tablet fremover. Appfunktionaliteten kan ændre sig."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Vil du opdatere denne app fra <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nDenne app plejer at modtage opdateringer fra <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Hvis du opdaterer fra en anden kilde, vil du kunne modtage opdateringer fra en hvilken som helst kilde på dit fjernsyn fremover. Appfunktionaliteten kan ændre sig."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Vil du opdatere denne app fra <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nDenne app plejer at modtage opdateringer fra <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Hvis du opdaterer fra en anden kilde, vil du kunne modtage opdateringer fra en hvilken som helst kilde på din telefon fremover. Appfunktionaliteten kan ændre sig."</string> <string name="install_failed" msgid="5777824004474125469">"Appen blev ikke installeret."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Pakken blev forhindret i at blive installeret."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Appen blev ikke installeret, da pakken er i strid med en eksisterende pakke."</string> diff --git a/packages/PackageInstaller/res/values-de/strings.xml b/packages/PackageInstaller/res/values-de/strings.xml index bb557087b6b3..dc9c6e6e0acb 100644 --- a/packages/PackageInstaller/res/values-de/strings.xml +++ b/packages/PackageInstaller/res/values-de/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"App wurde installiert."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Möchtest du diese App installieren?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Möchtest du diese App aktualisieren?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Diese App mit einem Update von <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> aktualisieren?\n\nSie erhält normalerweise Updates von <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Wenn du ein Update von einer anderen Quelle verwendest, erhältst du möglicherweise zukünftige Updates von beliebigen Quellen auf deinem Smartphone. Die Funktionalität der App kann sich ändern."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Diese App mit einem Update von <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> aktualisieren?\n\nSie erhält normalerweise Updates von <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Wenn du ein Update von einer anderen Quelle verwendest, erhältst du möglicherweise zukünftige Updates von beliebigen Quellen auf deinem Tablet. Die Funktionalität der App kann sich ändern."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Diese App mit einem Update von <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> aktualisieren?\n\nSie erhält normalerweise Updates von <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Wenn du ein Update von einer anderen Quelle verwendest, erhältst du möglicherweise zukünftige Updates von beliebigen Quellen auf deinem Fernseher. Die Funktionalität der App kann sich ändern."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Diese App mit einem Update von <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> aktualisieren?\n\nSie erhält normalerweise Updates von <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Wenn du ein Update von einer anderen Quelle verwendest, erhältst du möglicherweise zukünftige Updates von beliebigen Quellen auf deinem Smartphone. Die Funktionalität der App kann sich ändern."</string> <string name="install_failed" msgid="5777824004474125469">"App wurde nicht installiert."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Die Installation des Pakets wurde blockiert."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Die App wurde nicht installiert, da das Paket in Konflikt mit einem bestehenden Paket steht."</string> diff --git a/packages/PackageInstaller/res/values-el/strings.xml b/packages/PackageInstaller/res/values-el/strings.xml index 9721a193b994..092f34c66290 100644 --- a/packages/PackageInstaller/res/values-el/strings.xml +++ b/packages/PackageInstaller/res/values-el/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Η εφαρμογή εγκαταστάθηκε."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Θέλετε να εγκαταστήσετε αυτήν την εφαρμογή;"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Θέλετε να ενημερώσετε αυτήν την εφαρμογή;"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Να ενημερωθεί αυτή η εφαρμογή από <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>;\n\nΗ συγκεκριμένη εφαρμογή λαμβάνει συνήθως ενημερώσεις από <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Αν κάνετε την ενημέρωση από διαφορετική πηγή, μπορεί να λαμβάνετε μελλοντικές ενημερώσεις από οποιαδήποτε πηγή στο τηλέφωνό σας. Η λειτουργικότητα της εφαρμογής μπορεί να αλλάξει."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Να ενημερωθεί αυτή η εφαρμογή από <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>;\n\nΗ συγκεκριμένη εφαρμογή λαμβάνει συνήθως ενημερώσεις από <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Αν κάνετε την ενημέρωση από διαφορετική πηγή, μπορεί να λαμβάνετε μελλοντικές ενημερώσεις από οποιαδήποτε πηγή στο tablet σας. Η λειτουργικότητα της εφαρμογής μπορεί να αλλάξει."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Να ενημερωθεί αυτή η εφαρμογή από <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>;\n\nΗ συγκεκριμένη εφαρμογή λαμβάνει συνήθως ενημερώσεις από <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Αν κάνετε την ενημέρωση από διαφορετική πηγή, μπορεί να λαμβάνετε μελλοντικές ενημερώσεις από οποιαδήποτε πηγή στην τηλεόρασή σας. Η λειτουργικότητα της εφαρμογής μπορεί να αλλάξει."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Να ενημερωθεί αυτή η εφαρμογή από <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>;\n\nΗ συγκεκριμένη εφαρμογή λαμβάνει συνήθως ενημερώσεις από <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Αν κάνετε την ενημέρωση από διαφορετική πηγή, μπορεί να λαμβάνετε μελλοντικές ενημερώσεις από οποιαδήποτε πηγή στο τηλέφωνό σας. Η λειτουργικότητα της εφαρμογής μπορεί να αλλάξει."</string> <string name="install_failed" msgid="5777824004474125469">"Η εφαρμογή δεν εγκαταστάθηκε."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Η εγκατάσταση του πακέτου αποκλείστηκε."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Η εφαρμογή δεν εγκαταστάθηκε, επειδή το πακέτο είναι σε διένεξη με κάποιο υπάρχον πακέτο."</string> diff --git a/packages/PackageInstaller/res/values-en-rAU/strings.xml b/packages/PackageInstaller/res/values-en-rAU/strings.xml index 543dbf6547b9..16e87a25b8a0 100644 --- a/packages/PackageInstaller/res/values-en-rAU/strings.xml +++ b/packages/PackageInstaller/res/values-en-rAU/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"App installed."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Do you want to install this app?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Do you want to update this app?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Update this app from <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nThis app normally receives updates from <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. By updating from a different source, you may receive future updates from any source on your phone. App functionality may change."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Update this app from <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nThis app normally receives updates from <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. By updating from a different source, you may receive future updates from any source on your tablet. App functionality may change."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Update this app from <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nThis app normally receives updates from <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. By updating from a different source, you may receive future updates from any source on your TV. App functionality may change."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Update this app from <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nThis app normally receives updates from <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. By updating from a different source, you may receive future updates from any source on your phone. App functionality may change."</string> <string name="install_failed" msgid="5777824004474125469">"App not installed."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"The package was blocked from being installed."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"App not installed as package conflicts with an existing package."</string> diff --git a/packages/PackageInstaller/res/values-en-rCA/strings.xml b/packages/PackageInstaller/res/values-en-rCA/strings.xml index f2457f26f870..03c0c27c5052 100644 --- a/packages/PackageInstaller/res/values-en-rCA/strings.xml +++ b/packages/PackageInstaller/res/values-en-rCA/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"App installed."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Do you want to install this app?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Do you want to update this app?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Update this app from <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nThis app normally receives updates from <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. By updating from a different source, you may receive future updates from any source on your phone. App functionality may change."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Update this app from <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nThis app normally receives updates from <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. By updating from a different source, you may receive future updates from any source on your tablet. App functionality may change."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Update this app from <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nThis app normally receives updates from <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. By updating from a different source, you may receive future updates from any source on your TV. App functionality may change."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Update this app from <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nThis app normally receives updates from <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. By updating from a different source, you may receive future updates from any source on your phone. App functionality may change."</string> <string name="install_failed" msgid="5777824004474125469">"App not installed."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"The package was blocked from being installed."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"App not installed as package conflicts with an existing package."</string> diff --git a/packages/PackageInstaller/res/values-en-rGB/strings.xml b/packages/PackageInstaller/res/values-en-rGB/strings.xml index 543dbf6547b9..16e87a25b8a0 100644 --- a/packages/PackageInstaller/res/values-en-rGB/strings.xml +++ b/packages/PackageInstaller/res/values-en-rGB/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"App installed."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Do you want to install this app?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Do you want to update this app?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Update this app from <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nThis app normally receives updates from <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. By updating from a different source, you may receive future updates from any source on your phone. App functionality may change."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Update this app from <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nThis app normally receives updates from <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. By updating from a different source, you may receive future updates from any source on your tablet. App functionality may change."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Update this app from <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nThis app normally receives updates from <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. By updating from a different source, you may receive future updates from any source on your TV. App functionality may change."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Update this app from <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nThis app normally receives updates from <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. By updating from a different source, you may receive future updates from any source on your phone. App functionality may change."</string> <string name="install_failed" msgid="5777824004474125469">"App not installed."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"The package was blocked from being installed."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"App not installed as package conflicts with an existing package."</string> diff --git a/packages/PackageInstaller/res/values-en-rIN/strings.xml b/packages/PackageInstaller/res/values-en-rIN/strings.xml index 543dbf6547b9..16e87a25b8a0 100644 --- a/packages/PackageInstaller/res/values-en-rIN/strings.xml +++ b/packages/PackageInstaller/res/values-en-rIN/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"App installed."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Do you want to install this app?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Do you want to update this app?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Update this app from <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nThis app normally receives updates from <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. By updating from a different source, you may receive future updates from any source on your phone. App functionality may change."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Update this app from <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nThis app normally receives updates from <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. By updating from a different source, you may receive future updates from any source on your tablet. App functionality may change."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Update this app from <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nThis app normally receives updates from <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. By updating from a different source, you may receive future updates from any source on your TV. App functionality may change."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Update this app from <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nThis app normally receives updates from <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. By updating from a different source, you may receive future updates from any source on your phone. App functionality may change."</string> <string name="install_failed" msgid="5777824004474125469">"App not installed."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"The package was blocked from being installed."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"App not installed as package conflicts with an existing package."</string> diff --git a/packages/PackageInstaller/res/values-en-rXC/strings.xml b/packages/PackageInstaller/res/values-en-rXC/strings.xml index a674c20fa078..c36b3e9b2868 100644 --- a/packages/PackageInstaller/res/values-en-rXC/strings.xml +++ b/packages/PackageInstaller/res/values-en-rXC/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"App installed."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Do you want to install this app?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Do you want to update this app?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Update this app from <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nThis app normally receives updates from <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. By updating from a different source, you may receive future updates from any source on your phone. App functionality may change."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Update this app from <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nThis app normally receives updates from <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. By updating from a different source, you may receive future updates from any source on your tablet. App functionality may change."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Update this app from <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nThis app normally receives updates from <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. By updating from a different source, you may receive future updates from any source on your TV. App functionality may change."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Update this app from <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nThis app normally receives updates from <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. By updating from a different source, you may receive future updates from any source on your phone. App functionality may change."</string> <string name="install_failed" msgid="5777824004474125469">"App not installed."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"The package was blocked from being installed."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"App not installed as package conflicts with an existing package."</string> diff --git a/packages/PackageInstaller/res/values-es-rUS/strings.xml b/packages/PackageInstaller/res/values-es-rUS/strings.xml index eb3abe9698e3..23d1291d017d 100644 --- a/packages/PackageInstaller/res/values-es-rUS/strings.xml +++ b/packages/PackageInstaller/res/values-es-rUS/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Se instaló la app."</string> <string name="install_confirm_question" msgid="7663733664476363311">"¿Deseas instalar esta app?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"¿Deseas actualizar esta app?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"¿Quieres actualizar esta app a través de <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nEn general, esta suele recibir actualizaciones de <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Si actualizas a través de otra fuente, es posible que recibas las próximas actualizaciones de cualquier fuente en el teléfono. Por ende, podría verse afectada la funcionalidad de la app."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"¿Quieres actualizar esta app a través <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nPor lo general, suele recibir actualizaciones de <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Si actualizas a través de otra fuente, es posible que recibas las próximas actualizaciones de cualquier fuente en la tablet. Por ende, podría verse afectada la funcionalidad de la app."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"¿Quieres actualizar esta app a través <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nPor lo general, suele recibir actualizaciones de <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Si actualizas a través de otra fuente, es posible que recibas las próximas actualizaciones de cualquier fuente en la TV. Por ende, podría verse afectada la funcionalidad de la app."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"¿Quieres actualizar esta app a través de <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nEn general, esta suele recibir actualizaciones de <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Si actualizas a través de otra fuente, es posible que recibas las próximas actualizaciones de cualquier fuente en el teléfono. Por ende, podría verse afectada la funcionalidad de la app."</string> <string name="install_failed" msgid="5777824004474125469">"No se instaló la app."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Se bloqueó el paquete para impedir la instalación."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"No se instaló la app debido a un conflicto con un paquete."</string> diff --git a/packages/PackageInstaller/res/values-es/strings.xml b/packages/PackageInstaller/res/values-es/strings.xml index 9005718be734..62e4776446c8 100644 --- a/packages/PackageInstaller/res/values-es/strings.xml +++ b/packages/PackageInstaller/res/values-es/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Aplicación instalada."</string> <string name="install_confirm_question" msgid="7663733664476363311">"¿Quieres instalar esta aplicación?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"¿Quieres actualizar esta aplicación?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"¿Actualizar esta aplicación a través de <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nEsta aplicación normalmente recibe actualizaciones a través de <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Si la actualizas usando otra fuente, puede que recibas futuras actualizaciones a través de cualquier fuente en tu teléfono. La funcionalidad de la aplicación puede cambiar."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"¿Actualizar esta aplicación con <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nEsta aplicación suele recibir actualizaciones de <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Si actualizas a través de otra fuente, puede que recibas futuras actualizaciones de cualquier fuente de tu tablet. La funcionalidad de la aplicación puede cambiar."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"¿Actualizar esta aplicación con <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nEsta aplicación suele recibir actualizaciones de <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Si actualizas a través de otra fuente, puede que recibas futuras actualizaciones de cualquier fuente de tu TV. La funcionalidad de la aplicación puede cambiar."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"¿Actualizar esta aplicación a través de <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nEsta aplicación normalmente recibe actualizaciones a través de <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Si la actualizas usando otra fuente, puede que recibas futuras actualizaciones a través de cualquier fuente en tu teléfono. La funcionalidad de la aplicación puede cambiar."</string> <string name="install_failed" msgid="5777824004474125469">"No se ha instalado la aplicación."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Se ha bloqueado la instalación del paquete."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"La aplicación no se ha instalado debido a un conflicto con un paquete."</string> diff --git a/packages/PackageInstaller/res/values-et/strings.xml b/packages/PackageInstaller/res/values-et/strings.xml index cf488a935cce..f518b50e61ea 100644 --- a/packages/PackageInstaller/res/values-et/strings.xml +++ b/packages/PackageInstaller/res/values-et/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Rakendus on installitud."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Kas soovite selle rakenduse installida?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Kas soovite seda rakendust värskendada?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Kas värskendada seda rakendust allikast <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nSee rakendus saab tavaliselt värskendusi allikast <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Muust allikast värskendamise korral võite edaspidi saada telefonis värskendusi mis tahes allikast. Rakenduse funktsioonid võivad muutuda."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Kas värskendada seda rakendust allikast <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nSee rakendus saab tavaliselt värskendusi allikast <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Muust allikast värskendamise korral võite edaspidi saada tahvelarvutis värskendusi mis tahes allikast. Rakenduse funktsioonid võivad muutuda."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Kas värskendada seda rakendust allikast <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nSee rakendus saab tavaliselt värskendusi allikast <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Muust allikast värskendamise korral võite edaspidi saada teleris värskendusi mis tahes allikast. Rakenduse funktsioonid võivad muutuda."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Kas värskendada seda rakendust allikast <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nSee rakendus saab tavaliselt värskendusi allikast <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Muust allikast värskendamise korral võite edaspidi saada telefonis värskendusi mis tahes allikast. Rakenduse funktsioonid võivad muutuda."</string> <string name="install_failed" msgid="5777824004474125469">"Rakendus pole installitud."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Paketi installimine blokeeriti."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Rakendust ei installitud, kuna pakett on olemasoleva paketiga vastuolus."</string> diff --git a/packages/PackageInstaller/res/values-eu/strings.xml b/packages/PackageInstaller/res/values-eu/strings.xml index 9dadbed74177..580791c89bcc 100644 --- a/packages/PackageInstaller/res/values-eu/strings.xml +++ b/packages/PackageInstaller/res/values-eu/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Instalatu da aplikazioa."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Aplikazioa instalatu nahi duzu?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Aplikazioa eguneratu nahi duzu?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Aplikazioa <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> zerbitzutik eguneratu nahi duzu?\n\nAplikazioak <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> zerbitzutik jaso ohi ditu eguneratzeak. Beste iturburu batetik eguneratuz gero, baliteke aurrerantzeko eguneratzeak telefonoko edozein iturburutatik jasotzea. Baliteke aplikazioaren funtzioak aldatzea."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Aplikazioa <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> zerbitzutik eguneratu nahi duzu?\n\nAplikazioak <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> zerbitzutik jaso ohi ditu eguneratzeak. Beste iturburu batetik eguneratuz gero, baliteke aurrerantzeko eguneratzeak tabletako edozein iturburutatik jasotzea. Baliteke aplikazioaren funtzioak aldatzea."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Aplikazioa <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> zerbitzutik eguneratu nahi duzu?\n\nAplikazioak <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> zerbitzutik jaso ohi ditu eguneratzeak. Beste iturburu batetik eguneratuz gero, baliteke aurrerantzeko eguneratzeak telebistako edozein iturburutatik jasotzea. Baliteke aplikazioaren funtzioak aldatzea."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Aplikazioa <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> zerbitzutik eguneratu nahi duzu?\n\nAplikazioak <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> zerbitzutik jaso ohi ditu eguneratzeak. Beste iturburu batetik eguneratuz gero, baliteke aurrerantzeko eguneratzeak telefonoko edozein iturburutatik jasotzea. Baliteke aplikazioaren funtzioak aldatzea."</string> <string name="install_failed" msgid="5777824004474125469">"Ez da instalatu aplikazioa."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Paketea instalatzeko aukera blokeatu egin da."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Ez da instalatu aplikazioa, gatazka bat sortu delako lehendik dagoen pakete batekin."</string> diff --git a/packages/PackageInstaller/res/values-fa/strings.xml b/packages/PackageInstaller/res/values-fa/strings.xml index 73b070d1dad0..4bde113044f6 100644 --- a/packages/PackageInstaller/res/values-fa/strings.xml +++ b/packages/PackageInstaller/res/values-fa/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"برنامه نصب شد."</string> <string name="install_confirm_question" msgid="7663733664476363311">"میخواهید این برنامه را نصب کنید؟"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"میخواهید این برنامه را بهروزرسانی کنید؟"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"این برنامه ازطریق <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> بهروز شود؟\n\nاین برنامه معمولاً بهروزرسانیها را از <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> دریافت میکند. با بهروزرسانی از منبعی متفاوت، ممکن است بهروزرسانیهای بعدی را از هر منبعی در تلفنتان دریافت کنید. قابلیتهای برنامه ممکن است تغییر کند."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"این برنامه ازطریق <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> بهروز شود؟\n\nاین برنامه معمولاً بهروزرسانیها را از <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> دریافت میکند. با بهروزرسانی از منبعی متفاوت، ممکن است بهروزرسانیهای آتی را از هر منبعی در رایانه لوحیتان دریافت کنید. قابلیتهای برنامه ممکن است تغییر کند."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"این برنامه ازطریق <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> بهروز شود؟\n\nاین برنامه معمولاً بهروزرسانیها را از <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> دریافت میکند. با بهروزرسانی از منبعی متفاوت، ممکن است بهروزرسانیهای آتی را از هر منبعی در تلویزیون دریافت کنید. قابلیتهای برنامه ممکن است تغییر کند."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"این برنامه ازطریق <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> بهروز شود؟\n\nاین برنامه معمولاً بهروزرسانیها را از <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> دریافت میکند. با بهروزرسانی از منبعی متفاوت، ممکن است بهروزرسانیهای بعدی را از هر منبعی در تلفنتان دریافت کنید. قابلیتهای برنامه ممکن است تغییر کند."</string> <string name="install_failed" msgid="5777824004474125469">"برنامه نصب نشد."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"از نصب شدن بسته جلوگیری شد."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"برنامه نصب نشد چون بسته با بسته موجود تداخل دارد."</string> diff --git a/packages/PackageInstaller/res/values-fi/strings.xml b/packages/PackageInstaller/res/values-fi/strings.xml index ee8910b46966..e71ebaf303b5 100644 --- a/packages/PackageInstaller/res/values-fi/strings.xml +++ b/packages/PackageInstaller/res/values-fi/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Sovellus on asennettu."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Haluatko asentaa tämän sovelluksen?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Haluatko päivittää tämän sovelluksen?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Voiko <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> päivittää sovelluksen?\n\nTämän sovelluksen päivitykset tarjoaa yleensä <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Kun päivität uudesta lähteestä, tulevat päivitykset voivat tulla mistä tahansa puhelimella olevasta lähteestä. Sovelluksen toiminnot voivat muuttua."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Voiko <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> päivittää sovelluksen?\n\nTämän sovelluksen päivitykset tarjoaa yleensä <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Kun päivität uudesta lähteestä, tulevat päivitykset voivat tulla mistä tahansa tabletilla olevasta lähteestä. Sovelluksen toiminnot voivat muuttua."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Voiko <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> päivittää sovelluksen?\n\nTämän sovelluksen päivitykset tarjoaa yleensä <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Kun päivität uudesta lähteestä, tulevat päivitykset voivat tulla mistä tahansa televisiolla olevasta lähteestä. Sovelluksen toiminnot voivat muuttua."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Voiko <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> päivittää sovelluksen?\n\nTämän sovelluksen päivitykset tarjoaa yleensä <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Kun päivität uudesta lähteestä, tulevat päivitykset voivat tulla mistä tahansa puhelimella olevasta lähteestä. Sovelluksen toiminnot voivat muuttua."</string> <string name="install_failed" msgid="5777824004474125469">"Sovellusta ei asennettu."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Paketin asennus estettiin."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Sovellusta ei asennettu, koska paketti on ristiriidassa nykyisen paketin kanssa."</string> diff --git a/packages/PackageInstaller/res/values-fr-rCA/strings.xml b/packages/PackageInstaller/res/values-fr-rCA/strings.xml index b971c3534e27..6e4803034931 100644 --- a/packages/PackageInstaller/res/values-fr-rCA/strings.xml +++ b/packages/PackageInstaller/res/values-fr-rCA/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Application installée."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Voulez-vous installer cette application?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Voulez-vous mettre à jour cette application?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Mettre à jour cette application à partir de <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nCette application reçoit normalement des mises à jour de <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. En effectuant une mise à jour à partir d\'une source différente, vous pourriez recevoir des mises à jour futures à partir de n\'importe quelle source sur votre téléphone. Le fonctionnement de l\'application peut en être modifié."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Mettre à jour cette application à partir de <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nCette application reçoit normalement des mises à jour de <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. En effectuant une mise à jour à partir d\'une source différente, vous pourriez recevoir des mises à jour futures à partir de n\'importe quelle source sur votre tablette. Le fonctionnement de l\'application peut en être modifié."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Mettre à jour cette application à partir de <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nCette application reçoit normalement des mises à jour de <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. En effectuant une mise à jour à partir d\'une source différente, vous pourriez recevoir des mises à jour futures à partir de n\'importe quelle source sur votre téléviseur. Le fonctionnement de l\'application peut en être modifié."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Mettre à jour cette application à partir de <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nCette application reçoit normalement des mises à jour de <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. En effectuant une mise à jour à partir d\'une source différente, vous pourriez recevoir des mises à jour futures à partir de n\'importe quelle source sur votre téléphone. Le fonctionnement de l\'application peut en être modifié."</string> <string name="install_failed" msgid="5777824004474125469">"Application non installée."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"L\'installation du paquet a été bloquée."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"L\'application n\'a pas été installée, car le paquet entre en conflit avec un paquet existant."</string> diff --git a/packages/PackageInstaller/res/values-fr/strings.xml b/packages/PackageInstaller/res/values-fr/strings.xml index 08d37d182d14..4b52724c70fe 100644 --- a/packages/PackageInstaller/res/values-fr/strings.xml +++ b/packages/PackageInstaller/res/values-fr/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Application installée."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Voulez-vous installer cette appli ?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Voulez-vous mettre à jour cette appli ?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Mettre à jour cette appli à partir de <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> ?\n\nCette appli reçoit normalement des mises à jour de <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Si vous effectuez la mise à jour à partir d\'une autre source, vous recevrez peut-être les prochaines mises à jour depuis n\'importe quelle source sur votre téléphone. Le fonctionnement de l\'application est susceptible de changer."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Mettre à jour cette appli à partir de <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> ?\n\nCette appli reçoit normalement des mises à jour de <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Si vous effectuez la mise à jour à partir d\'une autre source, vous recevrez peut-être les prochaines mises à jour depuis n\'importe quelle source sur votre tablette. Le fonctionnement de l\'application est susceptible d\'évoluer."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Mettre à jour cette appli à partir de <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> ?\n\nCette appli reçoit normalement des mises à jour de <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Si vous effectuez la mise à jour à partir d\'une autre source, vous recevrez peut-être les prochaines mises à jour depuis n\'importe quelle source sur votre téléviseur. Le fonctionnement de l\'application est susceptible d\'évoluer."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Mettre à jour cette appli à partir de <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> ?\n\nCette appli reçoit normalement des mises à jour de <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Si vous effectuez la mise à jour à partir d\'une autre source, vous recevrez peut-être les prochaines mises à jour depuis n\'importe quelle source sur votre téléphone. Le fonctionnement de l\'application est susceptible de changer."</string> <string name="install_failed" msgid="5777824004474125469">"Application non installée."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"L\'installation du package a été bloquée."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"L\'application n\'a pas été installée, car le package est en conflit avec un package déjà présent."</string> diff --git a/packages/PackageInstaller/res/values-gl/strings.xml b/packages/PackageInstaller/res/values-gl/strings.xml index d6cbf60c80c6..5427cc608b72 100644 --- a/packages/PackageInstaller/res/values-gl/strings.xml +++ b/packages/PackageInstaller/res/values-gl/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Instalouse a aplicación."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Queres instalar esta aplicación?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Queres actualizar esta aplicación?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Queres actualizar esta aplicación desde <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nAs actualizacións desta aplicación adoitan provir de <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Se actualizas a aplicación desde unha fonte diferente, pode que, a partir de agora, recibas actualizacións de calquera fonte no teléfono. Poderían cambiar as funcións da aplicación."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Queres actualizar esta aplicación desde <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nAs actualizacións desta aplicación adoitan provir de <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Se actualizas a aplicación desde unha fonte diferente, pode que, a partir de agora, recibas actualizacións de calquera fonte na tableta. Poderían cambiar as funcións da aplicación."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Queres actualizar esta aplicación desde <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nAs actualizacións desta aplicación adoitan provir de <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Se actualizas a aplicación desde unha fonte diferente, pode que, a partir de agora, recibas actualizacións de calquera fonte na televisión. Poderían cambiar as funcións da aplicación."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Queres actualizar esta aplicación desde <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nAs actualizacións desta aplicación adoitan provir de <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Se actualizas a aplicación desde unha fonte diferente, pode que, a partir de agora, recibas actualizacións de calquera fonte no teléfono. Poderían cambiar as funcións da aplicación."</string> <string name="install_failed" msgid="5777824004474125469">"Non se instalou a aplicación"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Bloqueouse a instalación do paquete."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"A aplicación non se instalou porque o paquete presenta un conflito cun paquete que xa hai."</string> diff --git a/packages/PackageInstaller/res/values-gu/strings.xml b/packages/PackageInstaller/res/values-gu/strings.xml index dcaa48f68c15..155a31b53f26 100644 --- a/packages/PackageInstaller/res/values-gu/strings.xml +++ b/packages/PackageInstaller/res/values-gu/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"ઍપ્લિકેશન ઇન્સ્ટૉલ કરી."</string> <string name="install_confirm_question" msgid="7663733664476363311">"શું તમે આ ઍપ ઇન્સ્ટૉલ કરવા માગો છો?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"શું તમે આ ઍપ અપડેટ કરવા માગો છો?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"આ ઍપને <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>થી અપડેટ કરવી છે?\n\nઆ ઍપ સામાન્ય રીતે <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>થી અપડેટ મેળવે છે. અલગ સૉર્સથી અપડેટ કરીને, તમે તમારા ફોન પર કોઈપણ સૉર્સથી ભાવિ અપડેટ મેળવી શકો છો. ઍપની કાર્યક્ષમતા બદલાઈ શકે છે."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"આ ઍપને <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>થી અપડેટ કરવી છે?\n\nઆ ઍપ સામાન્ય રીતે <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>થી અપડેટ મેળવે છે. અલગ સૉર્સથી અપડેટ કરીને, તમે તમારા ટૅબ્લેટ પર કોઈપણ સૉર્સથી ભાવિ અપડેટ મેળવી શકો છો. ઍપની કાર્યક્ષમતા બદલાઈ શકે છે."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"આ ઍપને <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>થી અપડેટ કરવી છે?\n\nઆ ઍપ સામાન્ય રીતે <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>થી અપડેટ મેળવે છે. અલગ સૉર્સથી અપડેટ કરીને, તમે તમારા ટીવી પર કોઈપણ સૉર્સથી ભાવિ અપડેટ મેળવી શકો છો. ઍપની કાર્યક્ષમતા બદલાઈ શકે છે."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"આ ઍપને <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>થી અપડેટ કરવી છે?\n\nઆ ઍપ સામાન્ય રીતે <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>થી અપડેટ મેળવે છે. અલગ સૉર્સથી અપડેટ કરીને, તમે તમારા ફોન પર કોઈપણ સૉર્સથી ભાવિ અપડેટ મેળવી શકો છો. ઍપની કાર્યક્ષમતા બદલાઈ શકે છે."</string> <string name="install_failed" msgid="5777824004474125469">"ઍપ્લિકેશન ઇન્સ્ટૉલ કરી નથી."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"પૅકેજને ઇન્સ્ટૉલ થવાથી બ્લૉક કરવામાં આવ્યું હતું."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"પૅકેજનો અસ્તિત્વમાંના પૅકેજ સાથે વિરોધાભાસ હોવાને કારણે ઍપ્લિકેશન ઇન્સ્ટૉલ થઈ નથી."</string> diff --git a/packages/PackageInstaller/res/values-hi/strings.xml b/packages/PackageInstaller/res/values-hi/strings.xml index df3353b45bda..131d9d5b1aef 100644 --- a/packages/PackageInstaller/res/values-hi/strings.xml +++ b/packages/PackageInstaller/res/values-hi/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"ऐप्लिकेशन इंस्टॉल हो गया."</string> <string name="install_confirm_question" msgid="7663733664476363311">"क्या आपको यह ऐप्लिकेशन इंस्टॉल करना है?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"क्या आप इस ऐप्लिकेशन को अपडेट करना चाहते हैं?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"क्या इस ऐप्लिकेशन को <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> से अपडेट करना है?\n\nआम तौर पर, इस ऐप्लिकेशन को <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> से अपडेट मिलते हैं. किसी दूसरे सोर्स से अपडेट करने पर, आपको नए अपडेट फ़ोन पर मौजूद किसी भी सोर्स से मिल सकते हैं. इसके साथ ही, ऐप्लिकेशन की मुख्य सुविधाओं और उनके काम करने के तरीके में बदलाव आ सकता है."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"क्या इस ऐप्लिकेशन को <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> से अपडेट करना है?\n\nआम तौर पर, इस ऐप्लिकेशन को <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> से अपडेट मिलते हैं. किसी दूसरे सोर्स से अपडेट करने पर, आपको आगे से अपने टैबलेट पर किसी भी सोर्स से अपडेट मिल सकते हैं. ऐप्लिकेशन की मुख्य सुविधाएं और उसके काम करने का तरीका बदल सकता है."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"क्या इस ऐप्लिकेशन को <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> से अपडेट करना है?\n\nआम तौर पर, इस ऐप्लिकेशन को <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> से अपडेट मिलते हैं. किसी दूसरे सोर्स से अपडेट करने पर, आपको आगे से अपने टीवी पर किसी भी सोर्स से अपडेट मिल सकते हैं. ऐप्लिकेशन की मुख्य सुविधाएं और उसके काम करने का तरीका बदल सकता है."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"क्या इस ऐप्लिकेशन को <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> से अपडेट करना है?\n\nआम तौर पर, इस ऐप्लिकेशन को <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> से अपडेट मिलते हैं. किसी दूसरे सोर्स से अपडेट करने पर, आपको नए अपडेट फ़ोन पर मौजूद किसी भी सोर्स से मिल सकते हैं. इसके साथ ही, ऐप्लिकेशन की मुख्य सुविधाओं और उनके काम करने के तरीके में बदलाव आ सकता है."</string> <string name="install_failed" msgid="5777824004474125469">"ऐप्लिकेशन इंस्टॉल नहीं हुआ."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"पैकेज को इंस्टॉल होने से ब्लॉक किया हुआ है."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"ऐप्लिकेशन इंस्टॉल नहीं हुआ क्योंकि पैकेज का किसी मौजूदा पैकेज से विरोध है."</string> diff --git a/packages/PackageInstaller/res/values-hr/strings.xml b/packages/PackageInstaller/res/values-hr/strings.xml index 74c1fa1698a3..7eb2e80e0cd3 100644 --- a/packages/PackageInstaller/res/values-hr/strings.xml +++ b/packages/PackageInstaller/res/values-hr/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Aplikacija je instalirana."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Želite li instalirati ovu aplikaciju?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Želite li ažurirati ovu aplikaciju?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Želite li ovu aplikaciju ažurirati s izvora <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nOva aplikacija obično prima ažuriranja s izvora <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ako je ažurirate s nekog drugog izvora, buduća ažuriranja možete primati s bilo kojeg izvora na svojem telefonu. Funkcije aplikacije mogu se promijeniti."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Želite li ažurirati ovu aplikaciju s izvora <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nOva aplikacija obično prima ažuriranja s izvora <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ako je ažurirate s nekog drugog izvora, buduća ažuriranja možete primati s bilo kojeg izvora na svojem tabletu. Funkcije aplikacije mogu se promijeniti."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Želite li ažurirati ovu aplikaciju s izvora <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nOva aplikacija obično prima ažuriranja s izvora <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ako je ažurirate s nekog drugog izvora, buduća ažuriranja možete primati s bilo kojeg izvora na svojem TV-u. Funkcije aplikacije mogu se promijeniti."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Želite li ovu aplikaciju ažurirati s izvora <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nOva aplikacija obično prima ažuriranja s izvora <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ako je ažurirate s nekog drugog izvora, buduća ažuriranja možete primati s bilo kojeg izvora na svojem telefonu. Funkcije aplikacije mogu se promijeniti."</string> <string name="install_failed" msgid="5777824004474125469">"Aplikacija nije instalirana."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Instaliranje paketa blokirano je."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikacija koja nije instalirana kao paket u sukobu je s postojećim paketom."</string> diff --git a/packages/PackageInstaller/res/values-hu/strings.xml b/packages/PackageInstaller/res/values-hu/strings.xml index 823c20cdfd4d..ac19a48fcc16 100644 --- a/packages/PackageInstaller/res/values-hu/strings.xml +++ b/packages/PackageInstaller/res/values-hu/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Alkalmazás telepítve."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Telepíti ezt az alkalmazást?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Frissíti ezt az alkalmazást?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Frissíti az appot ebből a forrásból: <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nEz az app általában a következő forrásból kap frissítéseket: <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ha másik forrásból frissíti, a későbbiekben bármelyik forrásból kaphat frissítéseket a telefonján. Emiatt megváltozhat az app működése."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"A(z) <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> forrásból frissíti ezt az alkalmazást?\n\nEz az alkalmazás általában a következő forrásból kap frissítéseket: <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ha másik forrásból frissíti, a későbbiekben bármelyik forrásból kaphat frissítéseket a táblagépén. Emiatt megváltozhat az alkalmazás működése."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"A(z) <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> forrásból frissíti ezt az alkalmazást?\n\nEz az alkalmazás általában a következő forrásból kap frissítéseket: <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ha másik forrásból frissíti, a későbbiekben bármelyik forrásból kaphat frissítéseket a tévéjén. Emiatt megváltozhat az alkalmazás működése."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Frissíti az appot ebből a forrásból: <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nEz az app általában a következő forrásból kap frissítéseket: <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ha másik forrásból frissíti, a későbbiekben bármelyik forrásból kaphat frissítéseket a telefonján. Emiatt megváltozhat az app működése."</string> <string name="install_failed" msgid="5777824004474125469">"Az alkalmazás nincs telepítve."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"A csomag telepítését letiltotta a rendszer."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"A nem csomagként telepített alkalmazás ütközik egy már létező csomaggal."</string> diff --git a/packages/PackageInstaller/res/values-hy/strings.xml b/packages/PackageInstaller/res/values-hy/strings.xml index 4f5656829b47..fe2f06b556dc 100644 --- a/packages/PackageInstaller/res/values-hy/strings.xml +++ b/packages/PackageInstaller/res/values-hy/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Հավելվածը տեղադրված է:"</string> <string name="install_confirm_question" msgid="7663733664476363311">"Տեղադրե՞լ այս հավելվածը:"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Թարմացնե՞լ այս հավելվածը։"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Թարմացնե՞լ այս հավելվածը <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>-ից։\n\nՍովորաբար այս հավելվածի թարմացումները ստացվում են <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>-ից։ Եթե թարմացնեք այլ աղբյուրից, հետագայում կարող եք ձեր հեռախոսում թարմացումներ ստանալ ցանկացած աղբյուրից։ Հավելվածի գործառույթները կարող են փոփոխվել։"</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Թարմացնե՞լ այս հավելվածը <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>-ից։\n\nՍովորաբար այս հավելվածի թարմացումները ստացվում են <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>-ից։ Եթե թարմացնեք այլ աղբյուրից, հետագայում կարող եք ձեր պլանշետում թարմացումներ ստանալ ցանկացած աղբյուրից։ Հավելվածի գործառույթները կարող են փոփոխվել։"</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Թարմացնե՞լ այս հավելվածը <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>-ից։\n\nՍովորաբար այս հավելվածի թարմացումները ստացվում են <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>-ից։ Եթե թարմացնեք այլ աղբյուրից, հետագայում կարող եք ձեր հեռուստացույցում թարմացումներ ստանալ ցանկացած աղբյուրից։ Հավելվածի գործառույթները կարող են փոփոխվել։"</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Թարմացնե՞լ այս հավելվածը <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>-ից։\n\nՍովորաբար այս հավելվածի թարմացումները ստացվում են <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>-ից։ Եթե թարմացնեք այլ աղբյուրից, հետագայում կարող եք ձեր հեռախոսում թարմացումներ ստանալ ցանկացած աղբյուրից։ Հավելվածի գործառույթները կարող են փոփոխվել։"</string> <string name="install_failed" msgid="5777824004474125469">"Հավելվածը տեղադրված չէ:"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Փաթեթի տեղադրումն արգելափակվել է:"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Հավելվածը չի տեղադրվել, քանի որ տեղադրման փաթեթն ունի հակասություն առկա փաթեթի հետ:"</string> diff --git a/packages/PackageInstaller/res/values-in/strings.xml b/packages/PackageInstaller/res/values-in/strings.xml index 0758a1d1b550..a0c76c6fd987 100644 --- a/packages/PackageInstaller/res/values-in/strings.xml +++ b/packages/PackageInstaller/res/values-in/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Aplikasi terinstal."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Ingin menginstal aplikasi ini?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Ingin mengupdate aplikasi ini?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Update aplikasi ini dari <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nAplikasi ini biasanya menerima update dari <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Dengan mengupdate dari sumber yang berbeda, Anda mungkin menerima update berikutnya dari sumber mana pun di ponsel. Fungsi aplikasi mungkin berubah."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Update aplikasi ini dari <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nAplikasi ini biasanya menerima update dari <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Dengan mengupdate dari sumber yang berbeda, Anda mungkin menerima update berikutnya dari sumber mana pun di tablet. Fungsi aplikasi mungkin berubah."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Update aplikasi ini dari <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nAplikasi ini biasanya menerima update dari <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Dengan mengupdate dari sumber yang berbeda, Anda mungkin menerima update berikutnya dari sumber mana pun di TV. Fungsi aplikasi mungkin berubah."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Update aplikasi ini dari <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nAplikasi ini biasanya menerima update dari <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Dengan mengupdate dari sumber yang berbeda, Anda mungkin menerima update berikutnya dari sumber mana pun di ponsel. Fungsi aplikasi mungkin berubah."</string> <string name="install_failed" msgid="5777824004474125469">"Aplikasi tidak terinstal."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Paket diblokir sehingga tidak dapat diinstal."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikasi tidak diinstal karena paket ini bentrok dengan paket yang sudah ada."</string> diff --git a/packages/PackageInstaller/res/values-is/strings.xml b/packages/PackageInstaller/res/values-is/strings.xml index 6cbb2ee7be84..f0dce1e4d773 100644 --- a/packages/PackageInstaller/res/values-is/strings.xml +++ b/packages/PackageInstaller/res/values-is/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Forritið er uppsett."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Viltu setja upp þetta forrit?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Viltu uppfæra þetta forrit?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Uppfæra þetta forrit frá <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nÞetta forrit fær venjulega uppfærslur frá <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Með því að uppfæra frá öðrum uppruna gætirðu fengið framtíðaruppfærslur frá hvaða uppruna sem er í símanum. Forritseiginleikar kunna að breytast."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Uppfæra þetta forrit frá <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nÞetta forrit fær venjulega uppfærslur frá <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Með því að uppfæra frá öðrum uppruna gætirðu fengið framtíðaruppfærslur frá hvaða uppruna sem er í spjaldtölvunni. Forritseiginleikar kunna að breytast."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Uppfæra þetta forrit frá <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nÞetta forrit fær venjulega uppfærslur frá <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Með því að uppfæra frá öðrum uppruna gætirðu fengið framtíðaruppfærslur frá hvaða uppruna sem er í sjónvarpinu. Forritseiginleikar kunna að breytast."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Uppfæra þetta forrit frá <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nÞetta forrit fær venjulega uppfærslur frá <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Með því að uppfæra frá öðrum uppruna gætirðu fengið framtíðaruppfærslur frá hvaða uppruna sem er í símanum. Forritseiginleikar kunna að breytast."</string> <string name="install_failed" msgid="5777824004474125469">"Forritið er ekki uppsett."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Lokað var á uppsetningu pakkans."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Forritið var ekki sett upp vegna árekstra á milli pakkans og annars pakka."</string> diff --git a/packages/PackageInstaller/res/values-it/strings.xml b/packages/PackageInstaller/res/values-it/strings.xml index 323db1da8845..b43570fe0c55 100644 --- a/packages/PackageInstaller/res/values-it/strings.xml +++ b/packages/PackageInstaller/res/values-it/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"App installata."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Vuoi installare questa app?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Vuoi aggiornare questa app?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Vuoi aggiornare questa app tramite <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nGeneralmente l\'app viene aggiornata tramite <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Se la aggiorni da un\'origine diversa, in futuro potresti ricevere aggiornamenti da qualsiasi origine sul telefono. La funzionalità dell\'app potrebbe cambiare."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Vuoi aggiornare questa app tramite <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nGeneralmente l\'app viene aggiornata tramite <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Se la aggiorni da un\'origine diversa, in futuro potresti ricevere aggiornamenti da qualsiasi origine sul tablet. La funzionalità dell\'app potrebbe cambiare."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Vuoi aggiornare questa app tramite <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nGeneralmente l\'app viene aggiornata tramite <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Se la aggiorni da un\'origine diversa, in futuro potresti ricevere aggiornamenti da qualsiasi origine sulla TV. La funzionalità dell\'app potrebbe cambiare."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Vuoi aggiornare questa app tramite <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nGeneralmente l\'app viene aggiornata tramite <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Se la aggiorni da un\'origine diversa, in futuro potresti ricevere aggiornamenti da qualsiasi origine sul telefono. La funzionalità dell\'app potrebbe cambiare."</string> <string name="install_failed" msgid="5777824004474125469">"App non installata."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"È stata bloccata l\'installazione del pacchetto."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"App non installata poiché il pacchetto è in conflitto con un pacchetto esistente."</string> diff --git a/packages/PackageInstaller/res/values-iw/strings.xml b/packages/PackageInstaller/res/values-iw/strings.xml index 24beba658e21..692ce2d07185 100644 --- a/packages/PackageInstaller/res/values-iw/strings.xml +++ b/packages/PackageInstaller/res/values-iw/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"האפליקציה הותקנה."</string> <string name="install_confirm_question" msgid="7663733664476363311">"האם ברצונך להתקין אפליקציה זו?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"האם ברצונך לעדכן אפליקציה זו?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"לקבל את העדכון לאפליקציה הזו מ-<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nהאפליקציה הזו בדרך כלל מקבלת עדכונים מ: <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. אם בחרת לעדכן ממקור אחר, יכול להיות שבעתיד יתקבלו עדכונים ממקורות אחרים בטלפון. תכונות האפליקציה יכולות להשתנות."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"לקבל את העדכון לאפליקציה הזו מ-<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nהאפליקציה הזו בדרך כלל מקבלת עדכונים מ-<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. אם בחרת לעדכן ממקור אחר, יכול להיות שבעתיד יתקבלו עדכונים ממקורות אחרים בטאבלט. תכונות האפליקציה עשויות להשתנות."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"לקבל את העדכון לאפליקציה הזו מ-<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nהאפליקציה הזו בדרך כלל מקבלת עדכונים מ-<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. אם בחרת לעדכן ממקור אחר, יכול להיות שבעתיד יתקבלו עדכונים ממקורות אחרים בטלוויזיה. תכונות האפליקציה עשויות להשתנות."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"לקבל את העדכון לאפליקציה הזו מ-<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nהאפליקציה הזו בדרך כלל מקבלת עדכונים מ: <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. אם בחרת לעדכן ממקור אחר, יכול להיות שבעתיד יתקבלו עדכונים ממקורות אחרים בטלפון. תכונות האפליקציה יכולות להשתנות."</string> <string name="install_failed" msgid="5777824004474125469">"האפליקציה לא הותקנה."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"החבילה נחסמה להתקנה."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"האפליקציה לא הותקנה כי החבילה מתנגשת עם חבילה קיימת."</string> diff --git a/packages/PackageInstaller/res/values-ja/strings.xml b/packages/PackageInstaller/res/values-ja/strings.xml index 95b789e4c730..b91312b3a057 100644 --- a/packages/PackageInstaller/res/values-ja/strings.xml +++ b/packages/PackageInstaller/res/values-ja/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"アプリをインストールしました。"</string> <string name="install_confirm_question" msgid="7663733664476363311">"このアプリをインストールしますか?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"このアプリを更新しますか?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"このアプリを <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> から更新しますか?\n\nこのアプリは通常、<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> からアップデートを受信しています。別の提供元から更新することにより、お使いのスマートフォンで今後のアップデートを任意の提供元から受け取ることになります。アプリの機能は変更される場合があります。"</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"このアプリを <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> から更新しますか?\n\nこのアプリは通常、<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> からアップデートを受信しています。別の提供元から更新することにより、お使いのタブレットで今後のアップデートを任意の提供元から受け取ることになります。アプリの機能は変更される場合があります。"</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"このアプリを <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> から更新しますか?\n\nこのアプリは通常、<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> からアップデートを受信しています。別の提供元から更新することにより、お使いのテレビで今後のアップデートを任意の提供元から受け取ることになります。アプリの機能は変更される場合があります。"</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"このアプリを <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> から更新しますか?\n\nこのアプリは通常、<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> からアップデートを受信しています。別の提供元から更新することにより、お使いのスマートフォンで今後のアップデートを任意の提供元から受け取ることになります。アプリの機能は変更される場合があります。"</string> <string name="install_failed" msgid="5777824004474125469">"アプリはインストールされていません。"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"パッケージのインストールはブロックされています。"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"パッケージが既存のパッケージと競合するため、アプリをインストールできませんでした。"</string> diff --git a/packages/PackageInstaller/res/values-ka/strings.xml b/packages/PackageInstaller/res/values-ka/strings.xml index 0699f0bd8973..497f3b0d741a 100644 --- a/packages/PackageInstaller/res/values-ka/strings.xml +++ b/packages/PackageInstaller/res/values-ka/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"აპი დაინსტალირებულია."</string> <string name="install_confirm_question" msgid="7663733664476363311">"გნებავთ ამ აპის დაყენება?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"გსურთ ამ აპის განახლება?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"გსურთ განაახლოთ ეს აპი <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>-ისგან?\n\nეს აპი, როგორც წესი, განახლებებს იღებს <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>-ისგან. აპის სხვა წყაროდან განახლებით შემდგომში განახლებების მიღებას შეძლებთ ნებისმიერი წყაროდან თქვენს ტელეფონზე. აპის ფუნქციები, შესაძლოა, შეიცვალოს."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"გსურთ განაახლოთ ეს აპი <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>-ისგან?\n\nეს აპი, როგორც წესი, განახლებებს იღებს <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>-ისგან. სხვა წყაროდან განახლებით, შეგიძლიათ მიიღოთ მომავალი განახლებები ტაბლეტზე არსებული ნებისმიერი წყაროდან. აპის ფუნქციები, შესაძლოა, შეიცვალოს."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"გსურთ განაახლოთ ეს აპი <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>-ისგან?\n\nეს აპი, როგორც წესი, განახლებებს იღებს <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>-ისგან. სხვა წყაროდან განახლებით, შეგიძლიათ მიიღოთ მომავალი განახლებები ტელევიზორზე არსებული ნებისმიერი წყაროდან. აპის ფუნქციები, შესაძლოა, შეიცვალოს."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"გსურთ განაახლოთ ეს აპი <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>-ისგან?\n\nეს აპი, როგორც წესი, განახლებებს იღებს <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>-ისგან. აპის სხვა წყაროდან განახლებით შემდგომში განახლებების მიღებას შეძლებთ ნებისმიერი წყაროდან თქვენს ტელეფონზე. აპის ფუნქციები, შესაძლოა, შეიცვალოს."</string> <string name="install_failed" msgid="5777824004474125469">"აპი დაუინსტალირებელია."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"ამ პაკეტის ინსტალაცია დაბლოკილია."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"აპი ვერ დაინსტალირდა, რადგან პაკეტი კონფლიქტშია არსებულ პაკეტთან."</string> diff --git a/packages/PackageInstaller/res/values-kk/strings.xml b/packages/PackageInstaller/res/values-kk/strings.xml index 129267fd5d13..a7ae943489d1 100644 --- a/packages/PackageInstaller/res/values-kk/strings.xml +++ b/packages/PackageInstaller/res/values-kk/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Қолданба орнатылды."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Бұл қолданбаны орнатқыңыз келе ме?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Бұл қолданбаны жаңартқыңыз келе ме?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Бұл қолданба <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> арқылы жаңартылсын ба?\n\nБұл қолданба әдетте <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> көмегімен жаңартылады. Басқа дереккөзден жаңартсаңыз, алдағы жаңартулар телефоныңыздағы кез келген дереккөзден келуі мүмкін. Қолданба функциялары өзгеруі мүмкін."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Бұл қолданба <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> арқылы жаңартылсын ба?\n\nБұл қолданба әдетте <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> көмегімен жаңартылады. Басқа дереккөзден жаңартсаңыз, планшетіңіздегі кез келген дереккөзден алдағы жаңартулар берілуі мүмкін. Қолданба функциялары өзгеруі мүмкін."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Бұл қолданба <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> арқылы жаңартылсын ба?\n\nБұл қолданба әдетте <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> көмегімен жаңартылады. Басқа дереккөзден жаңартсаңыз, теледидарыңыздағы кез келген дереккөзден алдағы жаңартулар берілуі мүмкін. Қолданба функциялары өзгеруі мүмкін."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Бұл қолданба <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> арқылы жаңартылсын ба?\n\nБұл қолданба әдетте <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> көмегімен жаңартылады. Басқа дереккөзден жаңартсаңыз, алдағы жаңартулар телефоныңыздағы кез келген дереккөзден келуі мүмкін. Қолданба функциялары өзгеруі мүмкін."</string> <string name="install_failed" msgid="5777824004474125469">"Қолданба орнатылмады."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Пакетті орнатуға тыйым салынды."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Жаңа пакет пен бұрыннан бар пакеттің арасында қайшылық туындағандықтан, қолданба орнатылмады."</string> diff --git a/packages/PackageInstaller/res/values-km/strings.xml b/packages/PackageInstaller/res/values-km/strings.xml index 04dc5749bab0..52bfce351529 100644 --- a/packages/PackageInstaller/res/values-km/strings.xml +++ b/packages/PackageInstaller/res/values-km/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"បានដំឡើងកម្មវិធី។"</string> <string name="install_confirm_question" msgid="7663733664476363311">"តើអ្នកចង់ដំឡើងកម្មវិធីនេះដែរទេ?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"តើអ្នកចង់ដំឡើងកំណែកម្មវិធីនេះដែរទេ?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"ដំឡើងកំណែកម្មវិធីនេះពី <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> ឬ?\n\nកម្មវិធីនេះជាធម្មតាទទួលបានកំណែថ្មីពី <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>។ តាមរយៈការដំឡើងកំណែពីប្រភពផ្សេង អ្នកអាចនឹងទទួលបានកំណែថ្មីនាពេលអនាគតពីប្រភពណាក៏បាននៅលើទូរសព្ទរបស់អ្នក។ មុខងារកម្មវិធីអាចមានការផ្លាស់ប្ដូរ។"</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"ដំឡើងកំណែកម្មវិធីនេះពី <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> ឬ?\n\nកម្មវិធីនេះជាធម្មតាទទួលបានកំណែថ្មីៗពី <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>។ តាមរយៈការដំឡើងកំណែពីប្រភពផ្សេង អ្នកអាចទទួលបានកំណែថ្មីៗនាពេលអនាគតពីប្រភពណាក៏បាននៅលើថេប្លេតរបស់អ្នក។ មុខងារកម្មវិធីអាចមានការផ្លាស់ប្ដូរ។"</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"ដំឡើងកំណែកម្មវិធីនេះពី <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> ឬ?\n\nកម្មវិធីនេះជាធម្មតាទទួលបានកំណែថ្មីៗពី <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>។ តាមរយៈការដំឡើងកំណែពីប្រភពផ្សេង អ្នកអាចទទួលបានកំណែថ្មីៗនាពេលអនាគតពីប្រភពណាក៏បាននៅលើទូរទស្សន៍របស់អ្នក។ មុខងារកម្មវិធីអាចមានការផ្លាស់ប្ដូរ។"</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"ដំឡើងកំណែកម្មវិធីនេះពី <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> ឬ?\n\nកម្មវិធីនេះជាធម្មតាទទួលបានកំណែថ្មីពី <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>។ តាមរយៈការដំឡើងកំណែពីប្រភពផ្សេង អ្នកអាចនឹងទទួលបានកំណែថ្មីនាពេលអនាគតពីប្រភពណាក៏បាននៅលើទូរសព្ទរបស់អ្នក។ មុខងារកម្មវិធីអាចមានការផ្លាស់ប្ដូរ។"</string> <string name="install_failed" msgid="5777824004474125469">"មិនបានដំឡើងកម្មវិធីទេ។"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"កញ្ចប់ត្រូវបានទប់ស្កាត់មិនឱ្យដំឡើង។"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"កម្មវិធីមិនបានដំឡើងទេ ដោយសារកញ្ចប់កម្មវិធីមិនត្រូវគ្នាជាមួយកញ្ចប់ដែលមានស្រាប់។"</string> diff --git a/packages/PackageInstaller/res/values-kn/strings.xml b/packages/PackageInstaller/res/values-kn/strings.xml index c9455aeb843b..1d3cfd332d5d 100644 --- a/packages/PackageInstaller/res/values-kn/strings.xml +++ b/packages/PackageInstaller/res/values-kn/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"ಆ್ಯಪ್ ಅನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲಾಗಿದೆ."</string> <string name="install_confirm_question" msgid="7663733664476363311">"ನೀವು ಈ ಆ್ಯಪ್ ಅನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲು ಬಯಸುವಿರಾ?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"ನೀವು ಈ ಆ್ಯಪ್ ಅನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಲು ಬಯಸುವಿರಾ?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> ನಿಂದ ಈ ಆ್ಯಪ್ ಅನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಬೇಕೇ?\n\nಈ ಆ್ಯಪ್ ಸಾಮಾನ್ಯವಾಗಿ <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> ನಿಂದ ಅಪ್ಡೇಟ್ಗಳನ್ನು ಸ್ವೀಕರಿಸುತ್ತದೆ. ಬೇರೆ ಮೂಲವೊಂದರಿಂದ ಅಪ್ಡೇಟ್ ಮಾಡುವ ಮೂಲಕ, ನಿಮ್ಮ ಫೋನ್ನಲ್ಲಿರುವ ಯಾವುದೇ ಮೂಲದಿಂದ ಭವಿಷ್ಯದ ಅಪ್ಡೇಟ್ಗಳನ್ನು ನೀವು ಸ್ವೀಕರಿಸಬಹುದು. ಆ್ಯಪ್ನ ಕಾರ್ಯಚಟುವಟಿಕೆಯು ಬದಲಾಗಬಹುದು."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> ನಿಂದ ಈ ಆ್ಯಪ್ ಅನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಬೇಕೇ?\n\nಈ ಆ್ಯಪ್ ಸಾಮಾನ್ಯವಾಗಿ <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> ನಿಂದ ಅಪ್ಡೇಟ್ಗಳನ್ನು ಸ್ವೀಕರಿಸುತ್ತದೆ. ಬೇರೆ ಮೂಲವೊಂದರಿಂದ ಅಪ್ಡೇಟ್ ಮಾಡುವ ಮೂಲಕ, ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್ನಲ್ಲಿರುವ ಯಾವುದೇ ಮೂಲದಿಂದ ಭವಿಷ್ಯದ ಅಪ್ಡೇಟ್ಗಳನ್ನು ನೀವು ಸ್ವೀಕರಿಸಬಹುದು. ಆ್ಯಪ್ನ ಕಾರ್ಯಚಟುವಟಿಕೆಯು ಬದಲಾಗಬಹುದು."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> ನಿಂದ ಈ ಆ್ಯಪ್ ಅನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಬೇಕೇ?\n\nಈ ಆ್ಯಪ್ ಸಾಮಾನ್ಯವಾಗಿ <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> ನಿಂದ ಅಪ್ಡೇಟ್ಗಳನ್ನು ಸ್ವೀಕರಿಸುತ್ತದೆ. ಬೇರೆ ಮೂಲವೊಂದರಿಂದ ಅಪ್ಡೇಟ್ ಮಾಡುವ ಮೂಲಕ, ನಿಮ್ಮ ಟಿವಿಯಲ್ಲಿರುವ ಯಾವುದೇ ಮೂಲದಿಂದ ಭವಿಷ್ಯದ ಅಪ್ಡೇಟ್ಗಳನ್ನು ನೀವು ಸ್ವೀಕರಿಸಬಹುದು. ಆ್ಯಪ್ನ ಕಾರ್ಯಚಟುವಟಿಕೆಯು ಬದಲಾಗಬಹುದು."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> ನಿಂದ ಈ ಆ್ಯಪ್ ಅನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಬೇಕೇ?\n\nಈ ಆ್ಯಪ್ ಸಾಮಾನ್ಯವಾಗಿ <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> ನಿಂದ ಅಪ್ಡೇಟ್ಗಳನ್ನು ಸ್ವೀಕರಿಸುತ್ತದೆ. ಬೇರೆ ಮೂಲವೊಂದರಿಂದ ಅಪ್ಡೇಟ್ ಮಾಡುವ ಮೂಲಕ, ನಿಮ್ಮ ಫೋನ್ನಲ್ಲಿರುವ ಯಾವುದೇ ಮೂಲದಿಂದ ಭವಿಷ್ಯದ ಅಪ್ಡೇಟ್ಗಳನ್ನು ನೀವು ಸ್ವೀಕರಿಸಬಹುದು. ಆ್ಯಪ್ನ ಕಾರ್ಯಚಟುವಟಿಕೆಯು ಬದಲಾಗಬಹುದು."</string> <string name="install_failed" msgid="5777824004474125469">"ಆ್ಯಪ್ ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲಾಗಿಲ್ಲ."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"ಇನ್ಸ್ಟಾಲ್ ಮಾಡುವ ಪ್ಯಾಕೇಜ್ ಅನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"ಪ್ಯಾಕೇಜ್ನಂತೆ ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲಾಗಿರುವ ಆ್ಯಪ್ ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಪ್ಯಾಕೇಜ್ ಜೊತೆಗೆ ಸಂಘರ್ಷವಾಗುತ್ತದೆ."</string> diff --git a/packages/PackageInstaller/res/values-ko/strings.xml b/packages/PackageInstaller/res/values-ko/strings.xml index 14f95138fa92..5c22453a8506 100644 --- a/packages/PackageInstaller/res/values-ko/strings.xml +++ b/packages/PackageInstaller/res/values-ko/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"앱이 설치되었습니다."</string> <string name="install_confirm_question" msgid="7663733664476363311">"이 앱을 설치하시겠습니까?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"이 앱을 업데이트하시겠습니까?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>에서 이 앱에 대한 업데이트를 받으시겠습니까?\n\n평소에는 <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>에서 앱을 업데이트했습니다. 다른 출처에서 앱을 업데이트하면 향후 휴대전화에 있는 어떤 출처에서든지 업데이트를 받을 수 있습니다. 앱 기능도 변경될 수 있습니다."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>에서 이 앱에 대한 업데이트를 받으시겠습니까?\n\n평소에는 <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>에서 앱을 업데이트했습니다. 다른 출처에서 업데이트를 받으면 향후 태블릿에 있는 어떤 출처에서든지 업데이트를 받을 수 있습니다. 앱 기능도 변경될 수 있습니다."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>에서 이 앱에 대한 업데이트를 받으시겠습니까?\n\n평소에는 <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>에서 앱을 업데이트했습니다. 다른 출처에서 앱을 업데이트하면 향후 TV에 있는 어떤 출처에서든지 업데이트를 받을 수 있습니다. 앱 기능도 변경될 수 있습니다."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>에서 이 앱에 대한 업데이트를 받으시겠습니까?\n\n평소에는 <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>에서 앱을 업데이트했습니다. 다른 출처에서 앱을 업데이트하면 향후 휴대전화에 있는 어떤 출처에서든지 업데이트를 받을 수 있습니다. 앱 기능도 변경될 수 있습니다."</string> <string name="install_failed" msgid="5777824004474125469">"앱이 설치되지 않았습니다."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"패키지 설치가 차단되었습니다."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"패키지가 기존 패키지와 충돌하여 앱이 설치되지 않았습니다."</string> @@ -70,7 +72,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> 제거 중…"</string> <string name="uninstall_done" msgid="439354138387969269">"제거를 완료했습니다."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>를 제거했습니다."</string> - <string name="uninstall_done_clone_app" msgid="5578308154544195413">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> 클론 삭제됨"</string> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> 복제 삭제됨"</string> <string name="uninstall_failed" msgid="1847750968168364332">"제거하지 못했습니다."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>을(를) 제거하지 못했습니다."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> 클론 삭제 중…"</string> @@ -94,7 +96,7 @@ <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"휴대전화와 개인 데이터는 알 수 없는 앱의 공격에 더욱 취약합니다. 이 앱을 설치하면 앱 사용으로 인해 발생할 수 있는 모든 휴대전화 손상이나 데이터 손실에 사용자가 책임을 진다는 것에 동의하게 됩니다."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"태블릿과 개인 데이터는 알 수 없는 앱의 공격에 더욱 취약합니다. 이 앱을 설치하면 앱 사용으로 인해 발생할 수 있는 모든 태블릿 손상이나 데이터 손실에 사용자가 책임을 진다는 것에 동의하게 됩니다."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"TV와 개인 데이터는 알 수 없는 앱의 공격에 더욱 취약합니다. 이 앱을 설치하면 앱 사용으로 인해 발생할 수 있는 모든 TV 손상이나 데이터 손실에 사용자가 책임을 진다는 것에 동의하게 됩니다."</string> - <string name="cloned_app_label" msgid="7503612829833756160">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> 클론"</string> + <string name="cloned_app_label" msgid="7503612829833756160">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> 복제"</string> <string name="anonymous_source_continue" msgid="4375745439457209366">"계속"</string> <string name="external_sources_settings" msgid="4046964413071713807">"설정"</string> <string name="wear_app_channel" msgid="1960809674709107850">"Wear 앱 설치/제거"</string> diff --git a/packages/PackageInstaller/res/values-ky/strings.xml b/packages/PackageInstaller/res/values-ky/strings.xml index 8b166c8fb84a..febc30c950f1 100644 --- a/packages/PackageInstaller/res/values-ky/strings.xml +++ b/packages/PackageInstaller/res/values-ky/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Колдонмо орнотулду."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Бул колдонмону орнотоюн деп жатасызбы?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Бул колдонмону жаңыртайын деп жатасызбы?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Колдонмону <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> аркылуу жаңыртасызбы?\n\nАдатта бул колдонмонун жаңыртууларын <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> жөнөтөт. Эгер колдонмону башка булактан жаңыртсаңыз, эртеңки күнү телефонуңуз ар кайсы булактан жаңырып, колдонмонун функциялары өзгөрүшү мүмкүн."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Колдонмо <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> аркылуу жаңыртылсынбы?\n\nАдатта бул колдонмо <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> жөнөткөн жаңыртууларды алат. Башка булактан жаңыртcаңыз, кийинки жаңыртуулар планшетиңиздеги ар кандай булактардан алынышы мүмкүн. Колдонмонун функциялары өзгөрүшү мүмкүн."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Колдонмо <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> аркылуу жаңыртылсынбы?\n\nАдатта бул колдонмо <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> жөнөткөн жаңыртууларды алат. Башка булактан жаңыртcаңыз, кийинки жаңыртуулар сыналгыңыздагы ар кандай булактардан алынышы мүмкүн. Колдонмонун функциялары өзгөрүшү мүмкүн."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Колдонмону <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> аркылуу жаңыртасызбы?\n\nАдатта бул колдонмонун жаңыртууларын <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> жөнөтөт. Эгер колдонмону башка булактан жаңыртсаңыз, эртеңки күнү телефонуңуз ар кайсы булактан жаңырып, колдонмонун функциялары өзгөрүшү мүмкүн."</string> <string name="install_failed" msgid="5777824004474125469">"Колдонмо орнотулган жок."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Топтомду орнотууга болбойт."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Башка топтом менен дал келбегендиктен колдонмо орнотулган жок."</string> diff --git a/packages/PackageInstaller/res/values-lo/strings.xml b/packages/PackageInstaller/res/values-lo/strings.xml index f3912cce919b..667e074b191b 100644 --- a/packages/PackageInstaller/res/values-lo/strings.xml +++ b/packages/PackageInstaller/res/values-lo/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"ຕິດຕັ້ງແອັບແລ້ວ."</string> <string name="install_confirm_question" msgid="7663733664476363311">"ທ່ານຕ້ອງການຕິດຕັ້ງແອັບນີ້ບໍ່?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"ທ່ານຕ້ອງການອັບເດດແອັບນີ້ບໍ່?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"ອັບເດດແອັບນີ້ຈາກ <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> ບໍ?\n\nໂດຍທົ່ວໄປແລ້ວແອັບນີ້ຈະໄດ້ຮັບການອັບເດດຈາກ <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. ການອັບເດດຈາກແຫຼ່ງທີ່ມາອື່ນອາດເຮັດໃຫ້ໂທລະສັບຂອງທ່ານໄດ້ຮັບການອັບເດດຈາກແຫຼ່ງທີ່ມານັ້ນໃນອະນາຄົດ. ຟັງຊັນການເຮັດວຽກຂອງແອັບອາດມີການປ່ຽນແປງ."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"ອັບເດດແອັບນີ້ຈາກ <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> ບໍ?\n\nໂດຍທົ່ວໄປແລ້ວແອັບນີ້ຈະໄດ້ຮັບການອັບເດດຈາກ <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. ໂດຍການອັບເດດຈາກແຫຼ່ງອື່ນ, ທ່ານອາດຈະໄດ້ຮັບການອັບເດດໃນອະນາຄົດຈາກແຫຼ່ງທີ່ມາໃດກໍໄດ້ຢູ່ແທັບເລັດຂອງທ່ານ. ຟັງຊັນການນຳໃຊ້ແອັບອາດມີການປ່ຽນແປງ."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"ອັບເດດແອັບນີ້ຈາກ <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> ບໍ?\n\nໂດຍທົ່ວໄປແລ້ວແອັບນີ້ຈະໄດ້ຮັບການອັບເດດຈາກ <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. ໂດຍການອັບເດດຈາກແຫຼ່ງອື່ນ, ທ່ານອາດຈະໄດ້ຮັບການອັບເດດໃນອະນາຄົດຈາກແຫຼ່ງທີ່ມາໃດກໍໄດ້ຢູ່ໂທລະທັດຂອງທ່ານ. ຟັງຊັນການນຳໃຊ້ແອັບອາດມີການປ່ຽນແປງ."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"ອັບເດດແອັບນີ້ຈາກ <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> ບໍ?\n\nໂດຍທົ່ວໄປແລ້ວແອັບນີ້ຈະໄດ້ຮັບການອັບເດດຈາກ <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. ການອັບເດດຈາກແຫຼ່ງທີ່ມາອື່ນອາດເຮັດໃຫ້ໂທລະສັບຂອງທ່ານໄດ້ຮັບການອັບເດດຈາກແຫຼ່ງທີ່ມານັ້ນໃນອະນາຄົດ. ຟັງຊັນການເຮັດວຽກຂອງແອັບອາດມີການປ່ຽນແປງ."</string> <string name="install_failed" msgid="5777824004474125469">"ບໍ່ໄດ້ຕິດຕັ້ງແອັບເທື່ອ."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"ແພັກເກດຖືກບລັອກບໍ່ໃຫ້ໄດ້ຮັບການຕິດຕັ້ງ."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"ບໍ່ໄດ້ຕິດຕັ້ງແອັບເນື່ອງຈາກແພັກເກດຂັດແຍ່ງກັບແພັກເກດທີ່ມີຢູ່ກ່ອນແລ້ວ."</string> diff --git a/packages/PackageInstaller/res/values-lt/strings.xml b/packages/PackageInstaller/res/values-lt/strings.xml index a7ec560e7023..1fe963d70f21 100644 --- a/packages/PackageInstaller/res/values-lt/strings.xml +++ b/packages/PackageInstaller/res/values-lt/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Programa įdiegta."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Ar norite įdiegti šią programą?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Ar norite atnaujinti šią programą?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Atnaujinti šią programą iš <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nŠi programa įprastai gauna naujinius iš <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Atnaujinę iš kito šaltinio, būsimus naujinius galite gauti iš bet kurio šaltinio telefone. Gali būti pakeistos programos funkcijos."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Atnaujinti šią programą iš <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nŠi programa įprastai gauna naujinius iš <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Atnaujinę iš kito šaltinio, būsimus naujinius galite gauti iš bet kurio šaltinio planšetiniame kompiuteryje. Gali būti pakeistos programos funkcijos."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Atnaujinti šią programą iš <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nŠi programa įprastai gauna naujinius iš <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Atnaujinę iš kito šaltinio, būsimus naujinius galite gauti iš bet kurio šaltinio televizoriuje. Gali būti pakeistos programos funkcijos."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Atnaujinti šią programą iš <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nŠi programa įprastai gauna naujinius iš <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Atnaujinę iš kito šaltinio, būsimus naujinius galite gauti iš bet kurio šaltinio telefone. Gali būti pakeistos programos funkcijos."</string> <string name="install_failed" msgid="5777824004474125469">"Programa neįdiegta."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Paketas užblokuotas ir negali būti įdiegtas."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Programa neįdiegta, nes paketas nesuderinamas su esamu paketu."</string> diff --git a/packages/PackageInstaller/res/values-lv/strings.xml b/packages/PackageInstaller/res/values-lv/strings.xml index 17dd542bd787..867657960afc 100644 --- a/packages/PackageInstaller/res/values-lv/strings.xml +++ b/packages/PackageInstaller/res/values-lv/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Lietotne ir instalēta."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Vai vēlaties instalēt šo lietotni?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Vai vēlaties atjaunināt šo lietotni?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Vai atjaunināt šo lietotni, izmantojot “<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>”?\n\nŠī lietotne parasti saņem atjauninājumus no “<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>”. Veicot atjaunināšanu no cita avota, iespējams, turpmāk tālrunī saņemsiet atjauninājumus no jebkāda avota. Lietotnes funkcionalitāte var mainīties."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Vai atjaunināt šo lietotni, izmantojot “<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>”?\n\nŠai lietotnei parasti saņemat atjauninājumus no “<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>”. Veicot atjaunināšanu no cita avota, iespējams, turpmāk planšetdatorā saņemsiet atjauninājumus no jebkāda avota. Lietotnes funkcionalitāte var mainīties."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Vai atjaunināt šo lietotni, izmantojot “<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>”?\n\nŠai lietotnei parasti saņemat atjauninājumus no “<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>”. Veicot atjaunināšanu no cita avota, iespējams, turpmāk televizorā saņemsiet atjauninājumus no jebkāda avota. Lietotnes funkcionalitāte var mainīties."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Vai atjaunināt šo lietotni, izmantojot “<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>”?\n\nŠī lietotne parasti saņem atjauninājumus no “<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>”. Veicot atjaunināšanu no cita avota, iespējams, turpmāk tālrunī saņemsiet atjauninājumus no jebkāda avota. Lietotnes funkcionalitāte var mainīties."</string> <string name="install_failed" msgid="5777824004474125469">"Lietotne nav instalēta."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Pakotnes instalēšana tika bloķēta."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Lietotne netika instalēta, jo pastāv pakotnes konflikts ar esošu pakotni."</string> diff --git a/packages/PackageInstaller/res/values-mk/strings.xml b/packages/PackageInstaller/res/values-mk/strings.xml index 5aaea17b5f6d..c8f439ec2774 100644 --- a/packages/PackageInstaller/res/values-mk/strings.xml +++ b/packages/PackageInstaller/res/values-mk/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Апликацијата е инсталирана."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Дали сакате да ја инсталирате апликацијава?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Дали сакате да ја ажурирате апликацијава?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Да се ажурира апликацијава од <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nАпликацијава вообичаено добива ажурирања од<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Со ажурирање од различен извор, може да добивате идни ажурирања од кој било извор на вашиот телефон. Функционалноста на апликацијата може да се промени."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Да се ажурира апликацијава од <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nАпликацијава вообичаено добива ажурирања од<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Со ажурирање од различен извор, може да добивате идни ажурирања од кој било извор на вашиот таблет. Функционалноста на апликацијата може да се промени."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Да се ажурира апликацијава од <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nАпликацијава вообичаено добива ажурирања од<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Со ажурирање од различен извор, може да добивате идни ажурирања од кој било извор на вашиот телевизор. Функционалноста на апликацијата може да се промени."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Да се ажурира апликацијава од <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nАпликацијава вообичаено добива ажурирања од<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Со ажурирање од различен извор, може да добивате идни ажурирања од кој било извор на вашиот телефон. Функционалноста на апликацијата може да се промени."</string> <string name="install_failed" msgid="5777824004474125469">"Апликацијата не е инсталирана."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Инсталирањето на пакетот е блокирано."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Апликација што не е инсталирана како пакет е во конфликт со постоечки пакет."</string> diff --git a/packages/PackageInstaller/res/values-ml/strings.xml b/packages/PackageInstaller/res/values-ml/strings.xml index 053584363af7..f051cc1069a2 100644 --- a/packages/PackageInstaller/res/values-ml/strings.xml +++ b/packages/PackageInstaller/res/values-ml/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"ആപ്പ് ഇൻസ്റ്റാൾ ചെയ്തു."</string> <string name="install_confirm_question" msgid="7663733664476363311">"ഈ ആപ്പ് ഇൻസ്റ്റാൾ ചെയ്യണോ?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"ഈ ആപ്പ് അപ്ഡേറ്റ് ചെയ്യണോ?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> എന്നതിൽ നിന്ന് ഈ ആപ്പ് അപ്ഡേറ്റ് ചെയ്യണോ?\n\nഈ ആപ്പിന് സാധാരണയായി <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> എന്നതിൽ നിന്ന് അപ്ഡേറ്റുകൾ ലഭിക്കാറുണ്ട്. മറ്റൊരു ഉറവിടത്തിൽ നിന്ന് അപ്ഡേറ്റ് ചെയ്യുന്നത് വഴി, നിങ്ങളുടെ ഫോണിലെ ഏത് ഉറവിടത്തിൽ നിന്നും ഭാവിയിൽ അപ്ഡേറ്റുകൾ ലഭിക്കാൻ ഇടയുണ്ട്. ആപ്പ് ഫംഗ്ഷണാലിറ്റിയിൽ വ്യത്യാസം വന്നേക്കാം."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> എന്നതിൽ നിന്ന് ഈ ആപ്പ് അപ്ഡേറ്റ് ചെയ്യണോ?\n\nഈ ആപ്പിന് സാധാരണയായി <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> എന്നതിൽ നിന്ന് അപ്ഡേറ്റുകൾ ലഭിക്കാറുണ്ട്. മറ്റൊരു ഉറവിടത്തിൽ നിന്ന് അപ്ഡേറ്റ് ചെയ്യുന്നതിലൂടെ, നിങ്ങളുടെ ടാബ്ലെറ്റിലെ ഏത് ഉറവിടത്തിൽ നിന്നും ഭാവിയിൽ അപ്ഡേറ്റുകൾ ലഭിച്ചേക്കാം. ആപ്പ് ഫംഗ്ഷണാലിറ്റിയിൽ വ്യത്യാസം വന്നേക്കാം."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> എന്നതിൽ നിന്ന് ഈ ആപ്പ് അപ്ഡേറ്റ് ചെയ്യണോ?\n\nഈ ആപ്പിന് സാധാരണയായി <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> എന്നതിൽ നിന്ന് അപ്ഡേറ്റുകൾ ലഭിക്കാറുണ്ട്. മറ്റൊരു ഉറവിടത്തിൽ നിന്ന് അപ്ഡേറ്റ് ചെയ്യുന്നതിലൂടെ, നിങ്ങളുടെ ടിവിയിലെ ഏത് ഉറവിടത്തിൽ നിന്നും ഭാവിയിൽ അപ്ഡേറ്റുകൾ ലഭിച്ചേക്കാം. ആപ്പ് ഫംഗ്ഷണാലിറ്റിയിൽ വ്യത്യാസം വന്നേക്കാം."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> എന്നതിൽ നിന്ന് ഈ ആപ്പ് അപ്ഡേറ്റ് ചെയ്യണോ?\n\nഈ ആപ്പിന് സാധാരണയായി <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> എന്നതിൽ നിന്ന് അപ്ഡേറ്റുകൾ ലഭിക്കാറുണ്ട്. മറ്റൊരു ഉറവിടത്തിൽ നിന്ന് അപ്ഡേറ്റ് ചെയ്യുന്നത് വഴി, നിങ്ങളുടെ ഫോണിലെ ഏത് ഉറവിടത്തിൽ നിന്നും ഭാവിയിൽ അപ്ഡേറ്റുകൾ ലഭിക്കാൻ ഇടയുണ്ട്. ആപ്പ് ഫംഗ്ഷണാലിറ്റിയിൽ വ്യത്യാസം വന്നേക്കാം."</string> <string name="install_failed" msgid="5777824004474125469">"ആപ്പ് ഇൻസ്റ്റാൾ ചെയ്തിട്ടില്ല."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"പാക്കേജ് ഇൻസ്റ്റാൾ ചെയ്യുന്നത് ബ്ലോക്ക് ചെയ്തു."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"പാക്കേജിന് നിലവിലുള്ള പാക്കേജുമായി പൊരുത്തക്കേടുള്ളതിനാൽ, ആപ്പ് ഇൻസ്റ്റാൾ ചെയ്തില്ല."</string> diff --git a/packages/PackageInstaller/res/values-mn/strings.xml b/packages/PackageInstaller/res/values-mn/strings.xml index 84a3909bb706..6098eb8ed37e 100644 --- a/packages/PackageInstaller/res/values-mn/strings.xml +++ b/packages/PackageInstaller/res/values-mn/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Аппыг суулгасан."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Та энэ аппыг суулгахыг хүсэж байна уу?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Та энэ аппыг шинэчлэхийг хүсэж байна уу?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Аппыг <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>-с шинэчлэх үү?\n\nЭнэ апп ихэвчлэн <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>-с шинэчлэлт хүлээн авдаг. Өөр эх сурвалжаас шинэчилснээр та ирээдүйн шинэчлэлтийг утсан дээрх аливаа эх сурвалжаас хүлээн авч магадгүй. Аппын ажиллагаа өөрчлөгдөж магадгүй."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Энэ аппыг <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>-с шинэчлэх үү?\n\nЭнэ апп ихэвчлэн <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>-с шинэчлэлт хүлээн авдаг. Өөр эх сурвалжаас шинэчилснээр та ирээдүйн шинэчлэлтийг таблет дээрх аливаа эх сурвалжаас хүлээн авч магадгүй. Аппын ажиллагаа өөрчлөгдөж магадгүй."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Энэ аппыг <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>-с шинэчлэх үү?\n\nЭнэ апп ихэвчлэн <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>-с шинэчлэлт хүлээн авдаг. Өөр эх сурвалжаас шинэчилснээр та ирээдүйн шинэчлэлтийг ТВ дээрх аливаа эх сурвалжаас хүлээн авч магадгүй. Аппын ажиллагаа өөрчлөгдөж магадгүй."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Аппыг <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>-с шинэчлэх үү?\n\nЭнэ апп ихэвчлэн <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>-с шинэчлэлт хүлээн авдаг. Өөр эх сурвалжаас шинэчилснээр та ирээдүйн шинэчлэлтийг утсан дээрх аливаа эх сурвалжаас хүлээн авч магадгүй. Аппын ажиллагаа өөрчлөгдөж магадгүй."</string> <string name="install_failed" msgid="5777824004474125469">"Аппыг суулгаагүй."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Багц суулгахыг блоклосон байна."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Багц одоо байгаа багцтай тохирохгүй байгаа тул аппыг суулгаж чадсангүй."</string> diff --git a/packages/PackageInstaller/res/values-mr/strings.xml b/packages/PackageInstaller/res/values-mr/strings.xml index 367dede86ebf..5364fa4f2d11 100644 --- a/packages/PackageInstaller/res/values-mr/strings.xml +++ b/packages/PackageInstaller/res/values-mr/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"अॅप इंस्टॉल झाले."</string> <string name="install_confirm_question" msgid="7663733664476363311">"तुम्हाला हे ॲप इंस्टॉल करायचे आहे का?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"तुम्हाला हे ॲप अपडेट करायचे आहे का?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> वरून हे अॅप अपडेट करायचे आहे का?\n\nया अॅपला सामान्यतः <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> कडून अपडेट मिळतात. वेगवेगळ्या स्रोताकडून अपडेट करून, तुम्हाला तुमच्या फोनवरील कोणत्याही स्रोताकडून भविष्यातील अपडेट मिळू शकतात. अॅपची कार्यक्षमता बदलू शकते."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> वरून हे अॅप अपडेट करायचे आहे का?\n\nया अॅपला सामान्यतः <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> कडून अपडेट मिळतात. वेगवेगळ्या स्रोताकडून अपडेट करून, तुम्हाला तुमच्या टॅबलेटवरील कोणत्याही स्रोताकडून भविष्यातील अपडेट मिळू शकतात. अॅपची कार्यक्षमता बदलू शकते."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> वरून हे अॅप अपडेट करायचे आहे का?\n\nया अॅपला सामान्यतः <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> कडून अपडेट मिळतात. वेगवेगळ्या स्रोताकडून अपडेट करून, तुम्हाला तुमच्या टीव्हीवरील कोणत्याही स्रोताकडून भविष्यातील अपडेट मिळू शकतात. अॅपची कार्यक्षमता बदलू शकते."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> वरून हे अॅप अपडेट करायचे आहे का?\n\nया अॅपला सामान्यतः <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> कडून अपडेट मिळतात. वेगवेगळ्या स्रोताकडून अपडेट करून, तुम्हाला तुमच्या फोनवरील कोणत्याही स्रोताकडून भविष्यातील अपडेट मिळू शकतात. अॅपची कार्यक्षमता बदलू शकते."</string> <string name="install_failed" msgid="5777824004474125469">"अॅप इंस्टॉल झाले नाही."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"पॅकेज इंस्टॉल होण्यापासून ब्लॉक केले होते."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"पॅकेजचा विद्यमान पॅकेजशी विरोध असल्याने अॅप इंस्टॉल झाले नाही."</string> diff --git a/packages/PackageInstaller/res/values-ms/strings.xml b/packages/PackageInstaller/res/values-ms/strings.xml index 6ab6622e75e2..7f62f5b06a50 100644 --- a/packages/PackageInstaller/res/values-ms/strings.xml +++ b/packages/PackageInstaller/res/values-ms/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Aplikasi dipasang."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Adakah anda ingin memasang aplikasi ini?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Adakah anda mahu mengemas kini apl ini?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Kemas kinikan apl ini daripada <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nApl ini biasanya menerima kemaskinian daripada <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Dengan membuat kemaskinian daripada sumber yang berbeza, anda mungkin menerima kemaskinian masa hadapan daripada sebarang sumber pada telefon anda. Fungsi apl mungkin berubah."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Kemas kinikan apl ini daripada <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nApl ini biasanya menerima kemaskinian daripada <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Dengan membuat kemaskinian daripada sumber yang berbeza, anda mungkin menerima kemaskinian masa hadapan daripada sebarang sumber pada tablet anda. Fungsi apl mungkin berubah."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Kemas kinikan apl ini daripada <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nApl ini biasanya menerima kemaskinian daripada <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Dengan membuat kemaskinian daripada sumber yang berbeza, anda mungkin menerima kemaskinian masa hadapan daripada sebarang sumber pada TV anda. Fungsi apl mungkin berubah."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Kemas kinikan apl ini daripada <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nApl ini biasanya menerima kemaskinian daripada <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Dengan membuat kemaskinian daripada sumber yang berbeza, anda mungkin menerima kemaskinian masa hadapan daripada sebarang sumber pada telefon anda. Fungsi apl mungkin berubah."</string> <string name="install_failed" msgid="5777824004474125469">"Aplikasi tidak dipasang."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Pakej ini telah disekat daripada dipasang."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Apl tidak dipasang kerana pakej bercanggah dengan pakej yang sedia ada."</string> diff --git a/packages/PackageInstaller/res/values-my/strings.xml b/packages/PackageInstaller/res/values-my/strings.xml index cb05b06cea64..4eafd7a8edeb 100644 --- a/packages/PackageInstaller/res/values-my/strings.xml +++ b/packages/PackageInstaller/res/values-my/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"အက်ပ်ထည့်သွင်းပြီးပါပြီ။"</string> <string name="install_confirm_question" msgid="7663733664476363311">"ဤအက်ပ်ကို ထည့်သွင်းလိုသလား။"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"ဤအက်ပ်ကို အပ်ဒိတ်လုပ်လိုသလား။"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"ဤအက်ပ်ကို <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> မှ အပ်ဒိတ်လုပ်မလား။\n\nဤအက်ပ်သည် ပုံမှန်အားဖြင့် <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> မှ အပ်ဒိတ်များ ရရှိသည်။ မတူညီသောရင်းမြစ်မှ အပ်ဒိတ်လုပ်ခြင်းဖြင့် ဖုန်းပေါ်တွင် နောင်လာမည့်အပ်ဒိတ်များကို မည်သည့်ရင်းမြစ်မှမဆို လက်ခံရယူနိုင်သည်။ အက်ပ်လုပ်ဆောင်ချက် ပြောင်းလဲနိုင်သည်။"</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"ဤအက်ပ်ကို <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> မှ အပ်ဒိတ်လုပ်မလား။\n\nဤအက်ပ်သည် ပုံမှန်အားဖြင့် <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> မှ အပ်ဒိတ်များ ရရှိသည်။ မတူညီသောရင်းမြစ်မှ အပ်ဒိတ်လုပ်ခြင်းဖြင့် တက်ဘလက်ပေါ်တွင် နောင်လာမည့်အပ်ဒိတ်များကို မည်သည့်ရင်းမြစ်မဆိုမှ လက်ခံရယူနိုင်သည်။ အက်ပ်လုပ်ဆောင်ချက် ပြောင်းလဲနိုင်သည်။"</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"ဤအက်ပ်ကို <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> မှ အပ်ဒိတ်လုပ်မလား။\n\nဤအက်ပ်သည် ပုံမှန်အားဖြင့် <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> မှ အပ်ဒိတ်များ ရရှိသည်။ မတူညီသောရင်းမြစ်မှ အပ်ဒိတ်လုပ်ခြင်းဖြင့် TV တွင် နောင်လာမည့်အပ်ဒိတ်များကို မည်သည့်ရင်းမြစ်မဆိုမှ လက်ခံရယူနိုင်သည်။ အက်ပ်လုပ်ဆောင်ချက် ပြောင်းလဲနိုင်သည်။"</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"ဤအက်ပ်ကို <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> မှ အပ်ဒိတ်လုပ်မလား။\n\nဤအက်ပ်သည် ပုံမှန်အားဖြင့် <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> မှ အပ်ဒိတ်များ ရရှိသည်။ မတူညီသောရင်းမြစ်မှ အပ်ဒိတ်လုပ်ခြင်းဖြင့် ဖုန်းပေါ်တွင် နောင်လာမည့်အပ်ဒိတ်များကို မည်သည့်ရင်းမြစ်မှမဆို လက်ခံရယူနိုင်သည်။ အက်ပ်လုပ်ဆောင်ချက် ပြောင်းလဲနိုင်သည်။"</string> <string name="install_failed" msgid="5777824004474125469">"အက်ပ်မထည့်သွင်းရသေးပါ"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"ပက်ကေ့ဂျ်ထည့်သွင်းခြင်းကို ပိတ်ထားသည်။"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"ပက်ကေ့ဂျ်အဖြစ် ထည့်သွင်းမထားသော အက်ပ်သည် လက်ရှိပက်ကေ့ဂျ်နှင့် တိုက်နေသည်။"</string> diff --git a/packages/PackageInstaller/res/values-nb/strings.xml b/packages/PackageInstaller/res/values-nb/strings.xml index 7532d7b3e96f..7d87473a9da8 100644 --- a/packages/PackageInstaller/res/values-nb/strings.xml +++ b/packages/PackageInstaller/res/values-nb/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Appen er installert."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Vil du installere denne appen?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Vil du oppdatere denne appen?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Vil du oppdatere denne appen fra <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nDenne appen mottar vanligvis oppdateringer fra <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Hvis du oppdaterer fra en annen kilde, kan du få fremtidige oppdateringer fra en hvilken som helst kilde på telefonen. Appfunksjonaliteten kan endres."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Vil du oppdatere denne appen fra <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nDenne appen får vanligvis oppdateringer fra <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Hvis du oppdaterer fra en annen kilde, kan du få fremtidige oppdateringer fra en hvilken som helst kilde på nettbrettet. Appfunksjonaliteten kan endres."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Vil du oppdatere denne appen fra <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nDenne appen får vanligvis oppdateringer fra <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Hvis du oppdaterer fra en annen kilde, kan du få fremtidige oppdateringer fra en hvilken som helst kilde på TV-en. Appfunksjonaliteten kan endres."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Vil du oppdatere denne appen fra <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nDenne appen mottar vanligvis oppdateringer fra <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Hvis du oppdaterer fra en annen kilde, kan du få fremtidige oppdateringer fra en hvilken som helst kilde på telefonen. Appfunksjonaliteten kan endres."</string> <string name="install_failed" msgid="5777824004474125469">"Appen ble ikke installert."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Pakken er blokkert fra å bli installert."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Appen ble ikke installert fordi pakken er i konflikt med en eksisterende pakke."</string> diff --git a/packages/PackageInstaller/res/values-ne/strings.xml b/packages/PackageInstaller/res/values-ne/strings.xml index 0d7068e01bc8..ee0782adaedc 100644 --- a/packages/PackageInstaller/res/values-ne/strings.xml +++ b/packages/PackageInstaller/res/values-ne/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"एप इन्स्टल गरियो।"</string> <string name="install_confirm_question" msgid="7663733664476363311">"तपाईं यो एप इन्स्टल गर्न चाहनुहुन्छ?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"तपाईं यो एप अपडेट गर्न चाहनुहुन्छ?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"यो एप <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> बाट अपडेट गर्ने हो?\n\nयो एपले सामान्यतया <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> बाट अपडेट प्राप्त गर्छ। तपाईंले कुनै फरक स्रोतबाट अपडेट गर्नुभयो भने तपाईं भविष्यमा आफ्नो फोनमा भएको जुनसुकै स्रोतबाट अपडेटहरू प्राप्त गर्न सक्नुहुन्छ। यसो गर्दा एपका मुख्य सुविधाहरूले काम गर्ने तरिका परिवर्तन हुन सक्छ।"</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"यो एप <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> बाट अपडेट गर्ने हो?\n\nयो एपले सामान्यतया <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> बाट अपडेट प्राप्त गर्छ। तपाईंले कुनै फरक स्रोतबाट अपडेट गर्नुभयो भने तपाईं भविष्यमा आफ्नो ट्याब्लेटमा भएको जुनसुकै स्रोतबाट अपडेटहरू प्राप्त गर्न सक्नुहुन्छ। यसो गर्दा एपको मुख्य सुविधा परिवर्तन हुन सक्छ।"</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"यो एप <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> बाट अपडेट गर्ने हो?\n\nयो एपले सामान्यतया <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> बाट अपडेट प्राप्त गर्छ। तपाईंले कुनै फरक स्रोतबाट अपडेट गर्नुभयो भने तपाईं भविष्यमा आफ्नो टिभीमा भएको जुनसुकै स्रोतबाट अपडेटहरू प्राप्त गर्न सक्नुहुन्छ। यसो गर्दा एपको मुख्य सुविधा परिवर्तन हुन सक्छ।"</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"यो एप <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> बाट अपडेट गर्ने हो?\n\nयो एपले सामान्यतया <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> बाट अपडेट प्राप्त गर्छ। तपाईंले कुनै फरक स्रोतबाट अपडेट गर्नुभयो भने तपाईं भविष्यमा आफ्नो फोनमा भएको जुनसुकै स्रोतबाट अपडेटहरू प्राप्त गर्न सक्नुहुन्छ। यसो गर्दा एपका मुख्य सुविधाहरूले काम गर्ने तरिका परिवर्तन हुन सक्छ।"</string> <string name="install_failed" msgid="5777824004474125469">"एप स्थापना गरिएन।"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"यो प्याकेज स्थापना गर्ने क्रममा अवरोध गरियो।"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"प्याकेजका रूपमा स्थापना नगरिएको एप विद्यमान प्याकेजसँग मेल खाँदैन।"</string> diff --git a/packages/PackageInstaller/res/values-nl/strings.xml b/packages/PackageInstaller/res/values-nl/strings.xml index fab6d5163627..47a5ec04f30d 100644 --- a/packages/PackageInstaller/res/values-nl/strings.xml +++ b/packages/PackageInstaller/res/values-nl/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"App geïnstalleerd."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Wil je deze app installeren?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Wil je deze app updaten?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Deze app updaten via <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nDeze app krijgt gewoonlijk updates via <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Als je updatet via een andere bron, kun je toekomstige updates via elke bron op je telefoon krijgen. De app-functionaliteit kan veranderen."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Deze app updaten via <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nDeze app krijgt gewoonlijk updates via <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Als je updatet via een andere bron, kun je toekomstige updates via elke bron op je tablet krijgen. De app-functionaliteit kan veranderen."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Deze app updaten via <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nDeze app krijgt gewoonlijk updates via <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Als je updatet via een andere bron, kun je toekomstige updates via elke bron op je tv krijgen. De app-functionaliteit kan veranderen."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Deze app updaten via <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nDeze app krijgt gewoonlijk updates via <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Als je updatet via een andere bron, kun je toekomstige updates via elke bron op je telefoon krijgen. De app-functionaliteit kan veranderen."</string> <string name="install_failed" msgid="5777824004474125469">"App niet geïnstalleerd."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"De installatie van het pakket is geblokkeerd."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"App die niet is geïnstalleerd als pakket conflicteert met een bestaand pakket."</string> diff --git a/packages/PackageInstaller/res/values-or/strings.xml b/packages/PackageInstaller/res/values-or/strings.xml index b6caebd19711..7c91ac4ef079 100644 --- a/packages/PackageInstaller/res/values-or/strings.xml +++ b/packages/PackageInstaller/res/values-or/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"ଆପ ଇନଷ୍ଟଲ ହୋଇଗଲା।"</string> <string name="install_confirm_question" msgid="7663733664476363311">"ଆପଣ ଏହି ଆପକୁ ଇନଷ୍ଟଲ୍ କରିବା ପାଇଁ ଚାହୁଁଛନ୍ତି କି?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"ଆପଣ ଏହି ଆପକୁ ଅପଡେଟ୍ କରିବା ପାଇଁ ଚାହୁଁଛନ୍ତି କି?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>ରୁ ଏହି ଆପକୁ ଅପଡେଟ କରିବେ?\n\nଏହି ଆପ ସାଧାରଣତଃ <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>ରୁ ଅପଡେଟଗୁଡ଼ିକ ପାଏ। ଏକ ଭିନ୍ନ ସୋର୍ସରୁ ଅପଡେଟ କରି ଆପଣଙ୍କ ଫୋନରେ ଯେ କୌଣସି ସୋର୍ସରୁ ଭବିଷ୍ୟତର ଅପଡେଟଗୁଡ଼ିକ ଆପଣ ପାଇପାରନ୍ତି। ଆପ କାର୍ଯ୍ୟକ୍ଷମତା ପରିବର୍ତ୍ତନ ହୋଇପାରେ।"</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>ରୁ ଏହି ଆପକୁ ଅପଡେଟ କରିବେ?\n\nଏହି ଆପ ସାଧାରଣତଃ <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>ରୁ ଅପଡେଟ ପାଇଥାଏ। ଏକ ଭିନ୍ନ ସୋର୍ସରୁ ଅପଡେଟ କରି ଆପଣ ଆପଣଙ୍କ ଫୋନରେ ଯେ କୌଣସି ସୋର୍ସରୁ ଭବିଷ୍ୟତର ଅପଡେଟଗୁଡ଼ିକ ପାଇପାରନ୍ତି। ଆପ କାର୍ଯ୍ୟକ୍ଷମତା ପରିବର୍ତ୍ତନ ହୋଇପାରେ।"</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>ରୁ ଏହି ଆପକୁ ଅପଡେଟ କରିବେ?\n\nଏହି ଆପ ସାଧାରଣତଃ <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>ରୁ ଅପଡେଟ ପାଇଥାଏ। ଏକ ଭିନ୍ନ ସୋର୍ସରୁ ଅପଡେଟ କରି ଆପଣ ଆପଣଙ୍କ ଫୋନରେ ଯେ କୌଣସି ସୋର୍ସରୁ ଭବିଷ୍ୟତର ଅପଡେଟଗୁଡ଼ିକ ପାଇପାରନ୍ତି। ଆପ କାର୍ଯ୍ୟକ୍ଷମତା ପରିବର୍ତ୍ତନ ହୋଇପାରେ।"</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>ରୁ ଏହି ଆପକୁ ଅପଡେଟ କରିବେ?\n\nଏହି ଆପ ସାଧାରଣତଃ <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>ରୁ ଅପଡେଟଗୁଡ଼ିକ ପାଏ। ଏକ ଭିନ୍ନ ସୋର୍ସରୁ ଅପଡେଟ କରି ଆପଣଙ୍କ ଫୋନରେ ଯେ କୌଣସି ସୋର୍ସରୁ ଭବିଷ୍ୟତର ଅପଡେଟଗୁଡ଼ିକ ଆପଣ ପାଇପାରନ୍ତି। ଆପ କାର୍ଯ୍ୟକ୍ଷମତା ପରିବର୍ତ୍ତନ ହୋଇପାରେ।"</string> <string name="install_failed" msgid="5777824004474125469">"ଆପ୍ ଇନଷ୍ଟଲ୍ ହୋଇନାହିଁ।"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"ଏହି ପ୍ୟାକେଜ୍କୁ ଇନଷ୍ଟଲ୍ କରାଯିବାରୁ ଅବରୋଧ କରାଯାଇଥିଲା।"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"ପୂର୍ବରୁ ଥିବା ପ୍ୟାକେଜ୍ ସହ ଏହି ପ୍ୟାକେଜ୍ର ସମସ୍ୟା ଉପୁଯିବାରୁ ଆପ୍ ଇନଷ୍ଟଲ୍ ହୋଇପାରିଲା ନାହିଁ।"</string> diff --git a/packages/PackageInstaller/res/values-pa/strings.xml b/packages/PackageInstaller/res/values-pa/strings.xml index 1ef49215b8e2..40ed47977c29 100644 --- a/packages/PackageInstaller/res/values-pa/strings.xml +++ b/packages/PackageInstaller/res/values-pa/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"ਐਪ ਸਥਾਪਤ ਕੀਤੀ ਗਈ।"</string> <string name="install_confirm_question" msgid="7663733664476363311">"ਕੀ ਤੁਸੀਂ ਇਸ ਐਪ ਨੂੰ ਸਥਾਪਤ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"ਕੀ ਤੁਸੀਂ ਇਸ ਐਪ ਨੂੰ ਅੱਪਡੇਟ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"ਕੀ ਇਸ ਐਪ ਨੂੰ <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> ਤੋਂ ਅੱਪਡੇਟ ਕਰਨਾ ਹੈ?\n\nਇਸ ਐਪ ਨੂੰ ਆਮ ਤੌਰ \'ਤੇ <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> ਤੋਂ ਅੱਪਡੇਟਾਂ ਪ੍ਰਾਪਤ ਹੁੰਦੀਆਂ ਹਨ। ਕਿਸੇ ਵੱਖਰੇ ਸਰੋਤ ਤੋਂ ਅੱਪਡੇਟ ਕਰ ਕੇ, ਤੁਸੀਂ ਆਪਣੇ ਫ਼ੋਨ \'ਤੇ ਕਿਸੇ ਵੀ ਸਰੋਤ ਤੋਂ ਭਵਿੱਖੀ ਅੱਪਡੇਟਾਂ ਪ੍ਰਾਪਤ ਕਰ ਸਕਦੇ ਹੋ। ਐਪ ਪ੍ਰਕਾਰਜਾਤਮਕਤਾ ਬਦਲ ਸਕਦੀ ਹੈ।"</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"ਕੀ ਇਸ ਐਪ ਨੂੰ <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> ਤੋਂ ਅੱਪਡੇਟ ਕਰਨਾ ਹੈ?\n\nਇਸ ਐਪ ਨੂੰ ਆਮ ਤੌਰ \'ਤੇ <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> ਤੋਂ ਅੱਪਡੇਟਾਂ ਪ੍ਰਾਪਤ ਹੁੰਦੀਆਂ ਹਨ। ਕਿਸੇ ਵੱਖਰੇ ਸਰੋਤ ਤੋਂ ਅੱਪਡੇਟ ਕਰ ਕੇ, ਤੁਸੀਂ ਆਪਣੇ ਟੈਬਲੈੱਟ \'ਤੇ ਕਿਸੇ ਵੀ ਸਰੋਤ ਤੋਂ ਭਵਿੱਖੀ ਅੱਪਡੇਟਾਂ ਨੂੰ ਪ੍ਰਾਪਤ ਕਰ ਸਕਦੇ ਹੋ। ਐਪ ਪ੍ਰਕਾਰਜਾਤਮਕਤਾ ਬਦਲ ਸਕਦੀ ਹੈ।"</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"ਕੀ ਇਸ ਐਪ ਨੂੰ <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> ਤੋਂ ਅੱਪਡੇਟ ਕਰਨਾ ਹੈ?\n\nਇਸ ਐਪ ਨੂੰ ਆਮ ਤੌਰ \'ਤੇ <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> ਤੋਂ ਅੱਪਡੇਟਾਂ ਪ੍ਰਾਪਤ ਹੁੰਦੀਆਂ ਹਨ। ਕਿਸੇ ਵੱਖਰੇ ਸਰੋਤ ਤੋਂ ਅੱਪਡੇਟ ਕਰ ਕੇ, ਤੁਸੀਂ ਆਪਣੇ ਟੀਵੀ \'ਤੇ ਕਿਸੇ ਵੀ ਸਰੋਤ ਤੋਂ ਭਵਿੱਖੀ ਅੱਪਡੇਟਾਂ ਨੂੰ ਪ੍ਰਾਪਤ ਕਰ ਸਕਦੇ ਹੋ। ਐਪ ਪ੍ਰਕਾਰਜਾਤਮਕਤਾ ਬਦਲ ਸਕਦੀ ਹੈ।"</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"ਕੀ ਇਸ ਐਪ ਨੂੰ <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> ਤੋਂ ਅੱਪਡੇਟ ਕਰਨਾ ਹੈ?\n\nਇਸ ਐਪ ਨੂੰ ਆਮ ਤੌਰ \'ਤੇ <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> ਤੋਂ ਅੱਪਡੇਟਾਂ ਪ੍ਰਾਪਤ ਹੁੰਦੀਆਂ ਹਨ। ਕਿਸੇ ਵੱਖਰੇ ਸਰੋਤ ਤੋਂ ਅੱਪਡੇਟ ਕਰ ਕੇ, ਤੁਸੀਂ ਆਪਣੇ ਫ਼ੋਨ \'ਤੇ ਕਿਸੇ ਵੀ ਸਰੋਤ ਤੋਂ ਭਵਿੱਖੀ ਅੱਪਡੇਟਾਂ ਪ੍ਰਾਪਤ ਕਰ ਸਕਦੇ ਹੋ। ਐਪ ਪ੍ਰਕਾਰਜਾਤਮਕਤਾ ਬਦਲ ਸਕਦੀ ਹੈ।"</string> <string name="install_failed" msgid="5777824004474125469">"ਐਪ ਸਥਾਪਤ ਨਹੀਂ ਕੀਤੀ ਗਈ।"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"ਪੈਕੇਜ ਨੂੰ ਸਥਾਪਤ ਹੋਣ ਤੋਂ ਬਲਾਕ ਕੀਤਾ ਗਿਆ ਸੀ।"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"ਪੈਕੇਜ ਦੇ ਇੱਕ ਮੌਜੂਦਾ ਪੈਕੇਜ ਨਾਲ ਵਿਵਾਦ ਹੋਣ ਕਰਕੇ ਐਪ ਸਥਾਪਤ ਨਹੀਂ ਕੀਤੀ ਗਈ।"</string> diff --git a/packages/PackageInstaller/res/values-pl/strings.xml b/packages/PackageInstaller/res/values-pl/strings.xml index e44a391c2ee6..264d24751eae 100644 --- a/packages/PackageInstaller/res/values-pl/strings.xml +++ b/packages/PackageInstaller/res/values-pl/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Aplikacja została zainstalowana."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Zainstalować tę aplikację?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Zaktualizować tę aplikację?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Zastosować do aplikacji aktualizację pochodzącą z tego źródła (<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>)?\n\nAktualizacje dla tej aplikacji zwykle dostarcza <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Jeśli zastosujesz aplikację pochodzącą z innego źródła, możesz w przyszłości otrzymywać na telefonie aktualizacje z dowolnych źródeł. Funkcje aplikacji mogą się zmienić."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Zastosować do aplikacji aktualizację pochodzącą z tego źródła (<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>)?\n\nAktualizacje dla tej aplikacji zwykle dostarcza <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Jeśli zastosujesz aplikację pochodzącą z innego źródła, możesz w przyszłości otrzymywać na tablecie aktualizacje z dowolnych źródeł. Funkcje aplikacji mogą się zmienić."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Zastosować do aplikacji aktualizację pochodzącą z tego źródła (<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>)?\n\nAktualizacje dla tej aplikacji zwykle dostarcza <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Jeśli zastosujesz aplikację pochodzącą z innego źródła, możesz w przyszłości otrzymywać na telewizorze aktualizacje z dowolnych źródeł. Funkcje aplikacji mogą się zmienić."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Zastosować do aplikacji aktualizację pochodzącą z tego źródła (<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>)?\n\nAktualizacje dla tej aplikacji zwykle dostarcza <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Jeśli zastosujesz aplikację pochodzącą z innego źródła, możesz w przyszłości otrzymywać na telefonie aktualizacje z dowolnych źródeł. Funkcje aplikacji mogą się zmienić."</string> <string name="install_failed" msgid="5777824004474125469">"Aplikacja nie została zainstalowana."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Instalacja pakietu została zablokowana."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikacja nie została zainstalowana, bo powoduje konflikt z istniejącym pakietem."</string> diff --git a/packages/PackageInstaller/res/values-pt-rBR/strings.xml b/packages/PackageInstaller/res/values-pt-rBR/strings.xml index 923c3bd0e273..38ea89ec4c11 100644 --- a/packages/PackageInstaller/res/values-pt-rBR/strings.xml +++ b/packages/PackageInstaller/res/values-pt-rBR/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"App instalado."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Quer instalar esse app?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Quer atualizar esse app?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Atualizar este app com <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nEste app normalmente recebe atualizações de <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Se você usa uma fonte diferente, o smartphone vai aceitar outras fontes para fazer as próximas atualizações. A funcionalidade do app pode mudar."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Atualizar este app com <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nAs atualizações dele normalmente são feitas com <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ao usar uma fonte diferente, as próximas atualizações poderão ser feitas com qualquer fonte no tablet. A funcionalidade do app pode mudar."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Atualizar este app com <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nAs atualizações dele normalmente são feitas com <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ao usar uma fonte diferente, as próximas atualizações poderão ser feitas com qualquer fonte na TV. A funcionalidade do app pode mudar."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Atualizar este app com <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nEste app normalmente recebe atualizações de <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Se você usa uma fonte diferente, o smartphone vai aceitar outras fontes para fazer as próximas atualizações. A funcionalidade do app pode mudar."</string> <string name="install_failed" msgid="5777824004474125469">"O app não foi instalado."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"A instalação do pacote foi bloqueada."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Como o pacote tem um conflito com um pacote já existente, o app não foi instalado."</string> diff --git a/packages/PackageInstaller/res/values-pt-rPT/strings.xml b/packages/PackageInstaller/res/values-pt-rPT/strings.xml index de85f662f0a9..4400615e9c92 100644 --- a/packages/PackageInstaller/res/values-pt-rPT/strings.xml +++ b/packages/PackageInstaller/res/values-pt-rPT/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"App instalada."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Instalar esta app?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Pretende atualizar esta app?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Atualizar esta app a partir de <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nNormalmente, esta app recebe atualizações de <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Se atualizar a partir de uma fonte diferente, poderá receber futuras atualizações de qualquer fonte no seu telemóvel. A funcionalidade da app pode sofrer alterações."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Atualizar esta app a partir de <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nNormalmente, esta app recebe atualizações de <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Se atualizar a partir de uma origem diferente, poderá receber futuras atualizações de qualquer origem no seu tablet. A funcionalidade da app pode sofrer alterações."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Atualizar esta app a partir de <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nNormalmente, esta app recebe atualizações de <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Se atualizar a partir de uma origem diferente, poderá receber futuras atualizações de qualquer origem na sua TV. A funcionalidade da app pode sofrer alterações."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Atualizar esta app a partir de <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nNormalmente, esta app recebe atualizações de <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Se atualizar a partir de uma fonte diferente, poderá receber futuras atualizações de qualquer fonte no seu telemóvel. A funcionalidade da app pode sofrer alterações."</string> <string name="install_failed" msgid="5777824004474125469">"Aplicação não instalada."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Foi bloqueada a instalação do pacote."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"A app não foi instalada porque o pacote entra em conflito com um pacote existente."</string> diff --git a/packages/PackageInstaller/res/values-pt/strings.xml b/packages/PackageInstaller/res/values-pt/strings.xml index 923c3bd0e273..38ea89ec4c11 100644 --- a/packages/PackageInstaller/res/values-pt/strings.xml +++ b/packages/PackageInstaller/res/values-pt/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"App instalado."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Quer instalar esse app?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Quer atualizar esse app?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Atualizar este app com <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nEste app normalmente recebe atualizações de <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Se você usa uma fonte diferente, o smartphone vai aceitar outras fontes para fazer as próximas atualizações. A funcionalidade do app pode mudar."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Atualizar este app com <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nAs atualizações dele normalmente são feitas com <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ao usar uma fonte diferente, as próximas atualizações poderão ser feitas com qualquer fonte no tablet. A funcionalidade do app pode mudar."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Atualizar este app com <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nAs atualizações dele normalmente são feitas com <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ao usar uma fonte diferente, as próximas atualizações poderão ser feitas com qualquer fonte na TV. A funcionalidade do app pode mudar."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Atualizar este app com <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nEste app normalmente recebe atualizações de <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Se você usa uma fonte diferente, o smartphone vai aceitar outras fontes para fazer as próximas atualizações. A funcionalidade do app pode mudar."</string> <string name="install_failed" msgid="5777824004474125469">"O app não foi instalado."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"A instalação do pacote foi bloqueada."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Como o pacote tem um conflito com um pacote já existente, o app não foi instalado."</string> diff --git a/packages/PackageInstaller/res/values-ro/strings.xml b/packages/PackageInstaller/res/values-ro/strings.xml index de4dd5548f8f..471ff096e4b5 100644 --- a/packages/PackageInstaller/res/values-ro/strings.xml +++ b/packages/PackageInstaller/res/values-ro/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Aplicație instalată."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Vrei să instalezi această aplicație?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Vrei să actualizezi această aplicație?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Actualizezi aplicația de la <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nDe obicei, aplicația primește actualizări de la <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Dacă actualizezi din altă sursă, este posibil să primești actualizări viitoare din orice sursă pe telefon. Funcționalitatea aplicației se poate modifica."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Actualizează aplicația de la <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nDe obicei, aplicația primește actualizări de la <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Dacă actualizezi din altă sursă, este posibil să primești actualizări viitoare din orice sursă pe tabletă. Funcționalitatea aplicației se poate modifica."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Actualizează aplicația de la <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nDe obicei, aplicația primește actualizări de la <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Dacă actualizezi din altă sursă, este posibil să primești actualizări viitoare din orice sursă pe televizor. Funcționalitatea aplicației se poate modifica."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Actualizezi aplicația de la <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nDe obicei, aplicația primește actualizări de la <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Dacă actualizezi din altă sursă, este posibil să primești actualizări viitoare din orice sursă pe telefon. Funcționalitatea aplicației se poate modifica."</string> <string name="install_failed" msgid="5777824004474125469">"Aplicația nu a fost instalată."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Instalarea pachetului a fost blocată."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Aplicația nu a fost instalată deoarece pachetul intră în conflict cu un pachet existent."</string> diff --git a/packages/PackageInstaller/res/values-ru/strings.xml b/packages/PackageInstaller/res/values-ru/strings.xml index d1f56fd60478..11e2ebf34220 100644 --- a/packages/PackageInstaller/res/values-ru/strings.xml +++ b/packages/PackageInstaller/res/values-ru/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Приложение установлено."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Установить приложение?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Обновить приложение?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Обновить приложение отсюда: <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nСтандартный источник обновлений этого приложения – <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Если обновить приложение из другого источника, для последующих обновлений будут использоваться любые источники на телефоне. Функции приложения могут измениться."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Обновить приложение из <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nОбычно это приложение получает обновления из <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Если обновить приложение из другого источника, в будущем для обновления могут использоваться любые источники на планшете. Функции приложения могут измениться."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Обновить приложение из <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nОбычно это приложение получает обновления из <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Если обновить приложение из другого источника, в будущем для обновления могут использоваться любые источники на телевизоре. Функции приложения могут измениться."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Обновить приложение отсюда: <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nСтандартный источник обновлений этого приложения – <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Если обновить приложение из другого источника, для последующих обновлений будут использоваться любые источники на телефоне. Функции приложения могут измениться."</string> <string name="install_failed" msgid="5777824004474125469">"Приложение не установлено."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Установка пакета заблокирована."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Приложение не установлено, так как оно конфликтует с другим пакетом."</string> diff --git a/packages/PackageInstaller/res/values-si/strings.xml b/packages/PackageInstaller/res/values-si/strings.xml index c300b68c17a1..b0392ed28964 100644 --- a/packages/PackageInstaller/res/values-si/strings.xml +++ b/packages/PackageInstaller/res/values-si/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"යෙදුම ස්ථාපනය කර ඇත."</string> <string name="install_confirm_question" msgid="7663733664476363311">"මෙම යෙදුම ස්ථාපනය කිරීමට ඔබට අවශ්යද?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"ඔබට මෙම යෙදුම යාවත්කාලීන කිරීමට අවශ්යද?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> වෙතින් මෙම යෙදුම යාවත්කාලීන කරන්න ද?\n\nමෙම යෙදුමට සාමාන්යයෙන් <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> සිට යාවත්කාලීන ලැබේ. වෙනස් මූලාශ්රයකින් යාවත්කාලීන කිරීමෙන්, ඔබට ඔබේ දුරකථනයෙහි ඕනෑම මූලාශ්රයකින් අනාගත යාවත්කාලීන ලැබීමට ඉඩ ඇත. යෙදුම් ක්රියාකාරිත්වය වෙනස් වීමට ඉඩ ඇත."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> වෙතින් මෙම යෙදුම යාවත්කාලීන කරන්න ද?\n\nමෙම යෙදුමට සාමාන්යයෙන් <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> සිට යාවත්කාලීන ලැබේ. වෙනස් මූලාශ්රයකින් යාවත්කාලීන කිරීමෙන්, ඔබට ඔබේ ටැබ්ලටයෙහි ඕනෑම මූලාශ්රයකින් අනාගත යාවත්කාලීන ලැබීමට ඉඩ ඇත. යෙදුම් ක්රියාකාරිත්වය වෙනස් වීමට ඉඩ ඇත."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> වෙතින් මෙම යෙදුම යාවත්කාලීන කරන්න ද?\n\nමෙම යෙදුමට සාමාන්යයෙන් <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> සිට යාවත්කාලීන ලැබේ. වෙනස් මූලාශ්රයකින් යාවත්කාලීන කිරීමෙන්, ඔබට ඔබේ TV මත ඕනෑම මූලාශ්රයකින් අනාගත යාවත්කාලීන ලැබීමට ඉඩ ඇත. යෙදුම් ක්රියාකාරිත්වය වෙනස් වීමට ඉඩ ඇත."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> වෙතින් මෙම යෙදුම යාවත්කාලීන කරන්න ද?\n\nමෙම යෙදුමට සාමාන්යයෙන් <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> සිට යාවත්කාලීන ලැබේ. වෙනස් මූලාශ්රයකින් යාවත්කාලීන කිරීමෙන්, ඔබට ඔබේ දුරකථනයෙහි ඕනෑම මූලාශ්රයකින් අනාගත යාවත්කාලීන ලැබීමට ඉඩ ඇත. යෙදුම් ක්රියාකාරිත්වය වෙනස් වීමට ඉඩ ඇත."</string> <string name="install_failed" msgid="5777824004474125469">"යෙදුම ස්ථාපනය කර නැත."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"මෙම පැකේජය ස්ථාපනය කිරීම අවහිර කරන ලදි."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"පැකේජය දැනට පවතින පැකේජයක් සමග ගැටෙන නිසා යෙදුම ස්ථාපනය නොකරන ලදී."</string> diff --git a/packages/PackageInstaller/res/values-sk/strings.xml b/packages/PackageInstaller/res/values-sk/strings.xml index 58a3a35a8089..8e846710d86f 100644 --- a/packages/PackageInstaller/res/values-sk/strings.xml +++ b/packages/PackageInstaller/res/values-sk/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Aplikácia bola nainštalovaná."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Chcete túto aplikáciu nainštalovať?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Chcete túto aplikáciu aktualizovať?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Chcete aktualizovať túto aplikáciu zo zdroja <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nTúto aplikáciu obvykle aktualizuje <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ak vykonáte aktualizáciu z iného zdroja, aplikácia sa v budúcnosti môže aktualizovať z ľubovoľného zdroja v telefóne. Funkcie aplikácie sa môžu zmeniť."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Chcete aktualizovať túto aplikáciu zo zdroja <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nTáto aplikácia obvykle dostáva aktualizácie zo zdroja <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ak aktualizujete z iného zdroja, môžete v budúcnosti dostávať aktualizácie z ľubovoľného zdroja v tablete. Funkcie aplikácie sa môžu zmeniť."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Chcete aktualizovať túto aplikáciu zo zdroja <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nTáto aplikácia obvykle dostáva aktualizácie zo zdroja <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ak aktualizujete z iného zdroja, môžete v budúcnosti dostávať aktualizácie z ľubovoľného zdroja v televízore. Funkcie aplikácie sa môžu zmeniť."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Chcete aktualizovať túto aplikáciu zo zdroja <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nTúto aplikáciu obvykle aktualizuje <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ak vykonáte aktualizáciu z iného zdroja, aplikácia sa v budúcnosti môže aktualizovať z ľubovoľného zdroja v telefóne. Funkcie aplikácie sa môžu zmeniť."</string> <string name="install_failed" msgid="5777824004474125469">"Aplikácia nebola nainštalovaná."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Inštalácia balíka bola zablokovaná."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikácia sa nenainštalovala, pretože balík je v konflikte s existujúcim balíkom."</string> diff --git a/packages/PackageInstaller/res/values-sl/strings.xml b/packages/PackageInstaller/res/values-sl/strings.xml index 00c3d152f75f..0c673736fe18 100644 --- a/packages/PackageInstaller/res/values-sl/strings.xml +++ b/packages/PackageInstaller/res/values-sl/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Aplikacija je nameščena."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Ali želite namestiti to aplikacijo?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Ali želite posodobiti to aplikacijo?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Želite to aplikacijo posodobiti iz vira <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nTa aplikacija običajno prejema posodobitve iz vira <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Če jo posodobite iz drugega vira, boste prihodnje posodobitve morda prejemali iz katerega koli vira v telefonu. Funkcija aplikacije se lahko spremeni."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Želite to aplikacijo posodobiti iz vira <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nTa aplikacija običajno prejema posodobitve iz vira <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Če jo posodobite iz drugega vira, boste prihodnje posodobitve morda prejemali iz katerega koli vira v tabličnem računalniku. Funkcija aplikacije se lahko spremeni."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Želite to aplikacijo posodobiti iz vira <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nTa aplikacija običajno prejema posodobitve iz vira <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Če jo posodobite iz drugega vira, boste prihodnje posodobitve morda prejemali iz katerega koli vira v televizorju. Funkcija aplikacije se lahko spremeni."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Želite to aplikacijo posodobiti iz vira <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nTa aplikacija običajno prejema posodobitve iz vira <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Če jo posodobite iz drugega vira, boste prihodnje posodobitve morda prejemali iz katerega koli vira v telefonu. Funkcija aplikacije se lahko spremeni."</string> <string name="install_failed" msgid="5777824004474125469">"Aplikacija ni nameščena."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Namestitev paketa je bila blokirana."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikacija ni bila nameščena, ker je paket v navzkrižju z obstoječim paketom."</string> diff --git a/packages/PackageInstaller/res/values-sq/strings.xml b/packages/PackageInstaller/res/values-sq/strings.xml index 9904bc04be50..f2cbf312c121 100644 --- a/packages/PackageInstaller/res/values-sq/strings.xml +++ b/packages/PackageInstaller/res/values-sq/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Aplikacioni u instalua."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Dëshiron ta instalosh këtë aplikacion?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Dëshiron ta përditësosh këtë aplikacion?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Të përditësohet ky aplikacion nga <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nKy aplikacion zakonisht merr përditësime nga <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Duke përditësuar nga një burim tjetër, mund të marrësh përditësime të ardhshme nga çdo burim në telefonin tënd. Funksionaliteti i aplikacionit mund të ndryshojë."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Të përditësohet ky aplikacion nga <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nKy aplikacion zakonisht merr përditësime nga <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Duke përditësuar nga një burim tjetër, mund të marrësh përditësime të ardhshme nga çdo burim në tabletin tënd. Funksionaliteti i aplikacionit mund të ndryshojë."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Të përditësohet ky aplikacion nga <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nKy aplikacion zakonisht merr përditësime nga <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Duke përditësuar nga një burim tjetër, mund të marrësh përditësime të ardhshme nga çdo burim në televizorin tënd. Funksionaliteti i aplikacionit mund të ndryshojë."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Të përditësohet ky aplikacion nga <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nKy aplikacion zakonisht merr përditësime nga <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Duke përditësuar nga një burim tjetër, mund të marrësh përditësime të ardhshme nga çdo burim në telefonin tënd. Funksionaliteti i aplikacionit mund të ndryshojë."</string> <string name="install_failed" msgid="5777824004474125469">"Aplikacioni nuk u instalua."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Instalimi paketës u bllokua."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikacioni nuk u instalua pasi paketa është në konflikt me një paketë ekzistuese."</string> diff --git a/packages/PackageInstaller/res/values-sr/strings.xml b/packages/PackageInstaller/res/values-sr/strings.xml index 5a0f52d02182..867bc8406f72 100644 --- a/packages/PackageInstaller/res/values-sr/strings.xml +++ b/packages/PackageInstaller/res/values-sr/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Апликација је инсталирана."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Желите да инсталирате ову апликацију?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Желите да ажурирате ову апликацију?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Желите да ажурирате ову апликацију из извора <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nОва апликација се обично ажурира из извора <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ако ажурирате из другог извора, можете да примате будућа ажурирања из било ког извора на телефону. Функције апликације могу да се промене."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Желите да ажурирате ову апликацију из извора <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nОва апликација се обично ажурира из извора <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ако ажурирате из другог извора, можете да примате будућа ажурирања из било ког извора на таблету. Функције апликације могу да се промене."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Желите да ажурирате ову апликацију из извора <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nОва апликација се обично ажурира из извора <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ако ажурирате из другог извора, можете да примате будућа ажурирања из било ког извора на ТВ-у. Функције апликације могу да се промене."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Желите да ажурирате ову апликацију из извора <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nОва апликација се обично ажурира из извора <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ако ажурирате из другог извора, можете да примате будућа ажурирања из било ког извора на телефону. Функције апликације могу да се промене."</string> <string name="install_failed" msgid="5777824004474125469">"Апликација није инсталирана."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Инсталирање пакета је блокирано."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Апликација није инсталирана јер је пакет неусаглашен са постојећим пакетом."</string> diff --git a/packages/PackageInstaller/res/values-sv/strings.xml b/packages/PackageInstaller/res/values-sv/strings.xml index ec6af2e59897..8c2b1dd47fa5 100644 --- a/packages/PackageInstaller/res/values-sv/strings.xml +++ b/packages/PackageInstaller/res/values-sv/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Appen har installerats."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Vill du installera den här appen?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Vill du uppdatera den här appen?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Vill du uppdatera den här appen från <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nAppen tar vanligtvis emot uppdateringar från <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Genom att uppdatera från en annan källa kan du komma att ta emot framtida uppdateringar från olika källor på telefonen. Appfunktioner kan förändras."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Vill du uppdatera den här appen från <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nAppen tar vanligtvis emot uppdateringar från <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Om du uppdaterar från en annan källa kanske du får framtida uppdateringar från olika källor på surfplattan. Appfunktioner kan förändras."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Vill du uppdatera den här appen från <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nAppen tar vanligtvis emot uppdateringar från <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Om du uppdaterar från en annan källa kanske du får framtida uppdateringar från olika källor på tv:n. Appfunktioner kan förändras."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Vill du uppdatera den här appen från <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nAppen tar vanligtvis emot uppdateringar från <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Genom att uppdatera från en annan källa kan du komma att ta emot framtida uppdateringar från olika källor på telefonen. Appfunktioner kan förändras."</string> <string name="install_failed" msgid="5777824004474125469">"Appen har inte installerats."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Paketet har blockerats för installation."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Appen har inte installerats på grund av en konflikt mellan detta paket och ett befintligt paket."</string> diff --git a/packages/PackageInstaller/res/values-sw/strings.xml b/packages/PackageInstaller/res/values-sw/strings.xml index 0eb224a7335d..d8cb12ab9c3f 100644 --- a/packages/PackageInstaller/res/values-sw/strings.xml +++ b/packages/PackageInstaller/res/values-sw/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Imesakinisha programu."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Ungependa kusakinisha programu hii?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Ungependa kusasisha programu hii?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Ungependa kusasisha programu hii kutoka kwenye <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nProgramu hii kwa kawaida hupokea masasisho kutoka <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Kwa kusasisha kutoka chanzo tofauti, huenda ukapokea masasisho ya siku zijazo kutoka chanzo chochote kwenye simu yako. Utendaji wa programu unaweza kubadilika."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Ungependa kusasisha programu hii kutoka kwa <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nProgramu hii kwa kawaida hupokea masasisho kutoka kwa <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Kwa kusasisha kutoka kwenye chanzo tofauti, unaweza kupokea masasisho ya baadaye kutoka kwenye chanzo chochote katika kishikwambi chako. Utendaji wa programu unaweza kubadilika."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Ungependa kusasisha programu hii kutoka kwa <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nProgramu hii kwa kawaida hupokea masasisho kutoka kwa <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Kwa kusasisha kutoka kwenye chanzo tofauti, unaweza kupokea masasisho ya baadaye kutoka kwenye chanzo chochote katika TV yako. Utendaji wa programu unaweza kubadilika."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Ungependa kusasisha programu hii kutoka kwenye <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nProgramu hii kwa kawaida hupokea masasisho kutoka <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Kwa kusasisha kutoka chanzo tofauti, huenda ukapokea masasisho ya siku zijazo kutoka chanzo chochote kwenye simu yako. Utendaji wa programu unaweza kubadilika."</string> <string name="install_failed" msgid="5777824004474125469">"Imeshindwa kusakinisha programu."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Kifurushi kimezuiwa kisisakinishwe."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Programu haikusakinishwa kwa sababu kifurushi kinakinzana na kifurushi kingine kilichopo."</string> diff --git a/packages/PackageInstaller/res/values-ta/strings.xml b/packages/PackageInstaller/res/values-ta/strings.xml index c60910c05714..06870aafe43f 100644 --- a/packages/PackageInstaller/res/values-ta/strings.xml +++ b/packages/PackageInstaller/res/values-ta/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"ஆப்ஸ் நிறுவப்பட்டது."</string> <string name="install_confirm_question" msgid="7663733664476363311">"இந்த ஆப்ஸை நிறுவ வேண்டுமா?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"இந்த ஆப்ஸைப் புதுப்பிக்க வேண்டுமா?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> இலிருந்து இந்த ஆப்ஸைப் புதுப்பிக்க வேண்டுமா?\n\nபொதுவாக இந்த ஆப்ஸ்<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> இலிருந்து புதுப்பிப்புகளைப் பெறும். வேறொன்றின் மூலம் புதுப்பித்தால் எதிர்காலத்தில் மொபைலில் வேறு இடத்திலிருந்து புதுப்பிப்புகளை நீங்கள் பெறக்கூடும். ஆப்ஸ் செயல்பாடுகள் மாறுபடக்கூடும்."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> இல் இருந்து இந்த ஆப்ஸைப் புதுப்பிக்க வேண்டுமா?\n\nபொதுவாக இந்த ஆப்ஸ் <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> இல் இருந்து புதுப்பிப்புகளைப் பெறும். வேறு உரிமையாளர் மூலம் புதுப்பித்தால் எதிர்காலத்தில் டேப்லெட்டில் இடம்பெற்றுள்ள எந்த உரிமையாளரிடம் இருந்தும் புதுப்பிப்புகளைப் பெறக்கூடும். ஆப்ஸ் செயல்பாடுகள் மாறுபடக்கூடும்."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> இல் இருந்து இந்த ஆப்ஸைப் புதுப்பிக்க வேண்டுமா?\n\nபொதுவாக இந்த ஆப்ஸ் <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> இல் இருந்து புதுப்பிப்புகளைப் பெறும். வேறு உரிமையாளர் மூலம் புதுப்பித்தால் எதிர்காலத்தில் டிவியில் இடம்பெற்றுள்ள எந்த உரிமையாளரிடம் இருந்தும் புதுப்பிப்புகளைப் பெறக்கூடும். ஆப்ஸ் செயல்பாடுகள் மாறுபடக்கூடும்."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> இலிருந்து இந்த ஆப்ஸைப் புதுப்பிக்க வேண்டுமா?\n\nபொதுவாக இந்த ஆப்ஸ்<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> இலிருந்து புதுப்பிப்புகளைப் பெறும். வேறொன்றின் மூலம் புதுப்பித்தால் எதிர்காலத்தில் மொபைலில் வேறு இடத்திலிருந்து புதுப்பிப்புகளை நீங்கள் பெறக்கூடும். ஆப்ஸ் செயல்பாடுகள் மாறுபடக்கூடும்."</string> <string name="install_failed" msgid="5777824004474125469">"ஆப்ஸ் நிறுவப்படவில்லை."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"இந்தத் தொகுப்பு நிறுவப்படுவதிலிருந்து தடுக்கப்பட்டது."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"இந்தத் தொகுப்பு ஏற்கனவே உள்ள தொகுப்புடன் முரண்படுவதால் ஆப்ஸ் நிறுவப்படவில்லை."</string> diff --git a/packages/PackageInstaller/res/values-te/strings.xml b/packages/PackageInstaller/res/values-te/strings.xml index 25673f33e27a..df871a60f10c 100644 --- a/packages/PackageInstaller/res/values-te/strings.xml +++ b/packages/PackageInstaller/res/values-te/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"యాప్ ఇన్స్టాల్ చేయబడింది."</string> <string name="install_confirm_question" msgid="7663733664476363311">"మీరు ఈ యాప్ను ఇన్స్టాల్ చేయాలనుకుంటున్నారా?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"మీరు ఈ యాప్ను అప్డేట్ చేయాలనుకుంటున్నారా?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> ద్వారా ఈ యాప్ను అప్డేట్ చేయాలా?\n\nఈ యాప్ సాధారణంగా <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> నుండి అప్డేట్లను అందుకుంటుంది. వేరే సోర్స్ ద్వారా అప్డేట్ చేయడం వల్ల, భవిష్యత్తులో మీ ఫోన్లోని ఏ సోర్స్ ద్వారా అయినా అప్డేట్లను పొందవచ్చు. యాప్ ఫంక్షనాలిటీ మారవచ్చు."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> నుండి ఈ యాప్ను అప్డేట్ చేయాలా?\n\nఈ యాప్ సాధారణంగా <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> నుండి అప్డేట్లను అందుకుంటుంది. విభిన్నమైన సోర్స్ నుండి అప్డేట్ చేయడం ద్వారా, మీరు మీ టాబ్లెట్లోని ఏదైనా సోర్స్ నుండి భవిష్యత్తు అప్డేట్లను పొందవచ్చు. యాప్ ఫంక్షనాలిటీ మారవచ్చు."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> నుండి ఈ యాప్ను అప్డేట్ చేయాలా?\n\nఈ యాప్ సాధారణంగా <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> నుండి అప్డేట్లను అందుకుంటుంది. విభిన్నమైన సోర్స్ నుండి అప్డేట్ చేయడం ద్వారా, మీరు మీ TVలోని ఏదైనా సోర్స్ నుండి భవిష్యత్తు అప్డేట్లను పొందవచ్చు. యాప్ ఫంక్షనాలిటీ మారవచ్చు."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> ద్వారా ఈ యాప్ను అప్డేట్ చేయాలా?\n\nఈ యాప్ సాధారణంగా <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> నుండి అప్డేట్లను అందుకుంటుంది. వేరే సోర్స్ ద్వారా అప్డేట్ చేయడం వల్ల, భవిష్యత్తులో మీ ఫోన్లోని ఏ సోర్స్ ద్వారా అయినా అప్డేట్లను పొందవచ్చు. యాప్ ఫంక్షనాలిటీ మారవచ్చు."</string> <string name="install_failed" msgid="5777824004474125469">"యాప్ ఇన్స్టాల్ చేయబడలేదు."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"ప్యాకేజీ ఇన్స్టాల్ కాకుండా బ్లాక్ చేయబడింది."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"ప్యాకేజీ, అలాగే ఇప్పటికే ఉన్న ప్యాకేజీ మధ్య వైరుధ్యం ఉన్నందున యాప్ ఇన్స్టాల్ చేయబడలేదు."</string> diff --git a/packages/PackageInstaller/res/values-th/strings.xml b/packages/PackageInstaller/res/values-th/strings.xml index c8f3275ec60d..5a837fc4bf4f 100644 --- a/packages/PackageInstaller/res/values-th/strings.xml +++ b/packages/PackageInstaller/res/values-th/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"ติดตั้งแอปแล้ว"</string> <string name="install_confirm_question" msgid="7663733664476363311">"คุณต้องการติดตั้งแอปนี้ไหม"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"คุณต้องการอัปเดตแอปนี้ไหม"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"อัปเดตแอปนี้จาก <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> ไหม\n\nโดยปกติแล้ว แอปนี้จะได้รับการอัปเดตจาก <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> การอัปเดตจากแหล่งที่มาอื่นอาจทำให้โทรศัพท์ของคุณได้รับการอัปเดตจากแหล่งที่มาใดก็ได้ในอนาคต ฟังก์ชันการทำงานของแอปอาจมีการเปลี่ยนแปลง"</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"อัปเดตแอปนี้จาก <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> ไหม\n\nโดยปกติแล้ว แอปนี้จะได้รับการอัปเดตจาก <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> การอัปเดตจากแหล่งที่มาอื่นอาจทำให้แท็บเล็ตของคุณได้รับการอัปเดตจากแหล่งที่มานั้นในอนาคต ฟังก์ชันการทำงานของแอปอาจมีการเปลี่ยนแปลง"</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"อัปเดตแอปนี้จาก <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> ไหม\n\nโดยปกติแล้ว แอปนี้จะได้รับการอัปเดตจาก <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> การอัปเดตจากแหล่งที่มาอื่นอาจทำให้ทีวีของคุณได้รับการอัปเดตจากแหล่งที่มานั้นในอนาคต ฟังก์ชันการทำงานของแอปอาจมีการเปลี่ยนแปลง"</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"อัปเดตแอปนี้จาก <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> ไหม\n\nโดยปกติแล้ว แอปนี้จะได้รับการอัปเดตจาก <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> การอัปเดตจากแหล่งที่มาอื่นอาจทำให้โทรศัพท์ของคุณได้รับการอัปเดตจากแหล่งที่มาใดก็ได้ในอนาคต ฟังก์ชันการทำงานของแอปอาจมีการเปลี่ยนแปลง"</string> <string name="install_failed" msgid="5777824004474125469">"ไม่ได้ติดตั้งแอป"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"มีการบล็อกแพ็กเกจไม่ให้ติดตั้ง"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"ไม่ได้ติดตั้งแอปเพราะแพ็กเกจขัดแย้งกับแพ็กเกจที่มีอยู่"</string> diff --git a/packages/PackageInstaller/res/values-tl/strings.xml b/packages/PackageInstaller/res/values-tl/strings.xml index 4d516b587008..af79ffeb34c9 100644 --- a/packages/PackageInstaller/res/values-tl/strings.xml +++ b/packages/PackageInstaller/res/values-tl/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Na-install na ang app."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Gusto mo bang i-install ang app na ito?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Gusto mo bang i-update ang app na ito?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"I-update itong app na mula sa <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nKaraniwang nakakatanggap ang app na ito ng mga update mula sa <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Sa pag-update mula sa ibang pinagmulan, puwede kang makatanggap ng mga update mula sa anumang pinagmulan sa iyong telepono sa hinaharap. Posibleng magbago ang functionality ng app."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"I-update itong app na mula sa <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nKaraniwang nakakatanggap ang app na ito ng mga update mula sa <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Sa pag-update mula sa ibang pinagmulan, puwede kang makatanggap ng mga update mula sa anumang pinagmulan sa iyong tablet sa hinaharap. Posibleng magbago ang functionality ng app."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"I-update itong app na mula sa <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nKaraniwang nakakatanggap ang app na ito ng mga update mula sa <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Sa pag-update mula sa ibang pinagmulan, puwede kang makatanggap ng mga update mula sa anumang pinagmulan sa iyong TV sa hinaharap. Posibleng magbago ang functionality ng app."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"I-update itong app na mula sa <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nKaraniwang nakakatanggap ang app na ito ng mga update mula sa <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Sa pag-update mula sa ibang pinagmulan, puwede kang makatanggap ng mga update mula sa anumang pinagmulan sa iyong telepono sa hinaharap. Posibleng magbago ang functionality ng app."</string> <string name="install_failed" msgid="5777824004474125469">"Hindi na-install ang app."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Na-block ang pag-install sa package."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Hindi na-install ang app dahil nagkakaproblema ang package sa isang dati nang package."</string> diff --git a/packages/PackageInstaller/res/values-tr/strings.xml b/packages/PackageInstaller/res/values-tr/strings.xml index 050d3986da20..4a0d8698388b 100644 --- a/packages/PackageInstaller/res/values-tr/strings.xml +++ b/packages/PackageInstaller/res/values-tr/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Uygulama yüklendi."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Bu uygulamayı yüklemek istiyor musunuz?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Bu uygulamayı güncellemek istiyor musunuz?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Bu uygulama <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> kaynağından güncellensin mi?\n\nBu uygulama genellikle <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> kaynağından güncelleme alır. Farklı bir kaynaktan güncellerseniz ileride telefonunuzda herhangi bir kaynaktan güncelleme alabilirsiniz. Uygulama işlevselliği değişebilir."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Bu uygulama <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> kaynağından güncellensin mi?\n\nBu uygulama genellikle <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> kaynağından güncelleme alır. Farklı bir kaynaktan güncellerseniz ileride tabletinizde herhangi bir kaynaktan güncelleme alabilirsiniz. Uygulama işlevselliği değişebilir."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Bu uygulama <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> kaynağından güncellensin mi?\n\nBu uygulama genellikle <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> kaynağından güncelleme alır. Farklı bir kaynaktan güncellerseniz ileride televizyonunuzda herhangi bir kaynaktan güncelleme alabilirsiniz. Uygulama işlevselliği değişebilir."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Bu uygulama <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> kaynağından güncellensin mi?\n\nBu uygulama genellikle <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> kaynağından güncelleme alır. Farklı bir kaynaktan güncellerseniz ileride telefonunuzda herhangi bir kaynaktan güncelleme alabilirsiniz. Uygulama işlevselliği değişebilir."</string> <string name="install_failed" msgid="5777824004474125469">"Uygulama yüklenmedi."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Paketin yüklemesi engellendi."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Paket, mevcut bir paketle çakıştığından uygulama yüklenemedi."</string> diff --git a/packages/PackageInstaller/res/values-uk/strings.xml b/packages/PackageInstaller/res/values-uk/strings.xml index ec10962641b7..a3b8e811e4a0 100644 --- a/packages/PackageInstaller/res/values-uk/strings.xml +++ b/packages/PackageInstaller/res/values-uk/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Програму встановлено."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Установити цей додаток?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Оновити цей додаток?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Оновити цей додаток через <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nЗазвичай цей додаток отримує оновлення в інший спосіб (<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>). Якщо встановити оновлення з іншого джерела, надалі на ваш телефон зможуть надходити оновлення з будь-яких джерел. Це може змінити функції додатка."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Оновити цей додаток від <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nЗазвичай цей додаток отримує оновлення від <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Якщо встановити оновлення з іншого джерела, надалі на ваш планшет зможуть надходити оновлення з будь-яких джерел. Це може змінити функції додатка."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Оновити цей додаток від <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nЗазвичай цей додаток отримує оновлення від <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Якщо встановити оновлення з іншого джерела, надалі на ваш телевізор зможуть надходити оновлення з будь-яких джерел. Це може змінити функції додатка."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Оновити цей додаток через <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nЗазвичай цей додаток отримує оновлення в інший спосіб (<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>). Якщо встановити оновлення з іншого джерела, надалі на ваш телефон зможуть надходити оновлення з будь-яких джерел. Це може змінити функції додатка."</string> <string name="install_failed" msgid="5777824004474125469">"Програму не встановлено."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Встановлення пакета заблоковано."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Додаток не встановлено, оскільки пакет конфліктує з наявним пакетом."</string> diff --git a/packages/PackageInstaller/res/values-ur/strings.xml b/packages/PackageInstaller/res/values-ur/strings.xml index b3b4c0d37ed1..c2a318b59608 100644 --- a/packages/PackageInstaller/res/values-ur/strings.xml +++ b/packages/PackageInstaller/res/values-ur/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"ایپ انسٹال ہو گئی۔"</string> <string name="install_confirm_question" msgid="7663733664476363311">"کیا آپ یہ ایپ انسٹال کرنا چاہتے ہیں؟"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"کیا آپ یہ ایپ اپ ڈیٹ کرنا چاہتے ہیں؟"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"اس ایپ کو <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> سے اپ ڈیٹ کریں؟\n\n اس ایپ کو عام طور پر <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> سے اپ ڈیٹس موصول ہوتی ہیں۔ کسی مختلف ذریعے سے اپ ڈیٹ کر کے، آپ اپنے فون پر کسی بھی ذریعے سے مستقبل کی اپ ڈیٹس حاصل کر سکتے ہیں۔ ایپ کی فعالیت تبدیل ہو سکتی ہے۔"</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"اس ایپ کو <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> سے اپ ڈیٹ کریں؟\n\nاس ایپ کو عام طور پر <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> سے اپ ڈیٹس موصول ہوتی ہیں۔ کسی مختلف وسیلے سے اپ ڈیٹ کر کے، آپ اپنے ٹیبلیٹ پر کسی بھی وسیلے سے مستقبل کی اپ ڈیٹس حاصل کر سکتے ہیں۔ ایپ کی فعالیت تبدیل ہو سکتی ہے۔"</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"اس ایپ کو <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> سے اپ ڈیٹ کریں؟\n\nاس ایپ کو عام طور پر <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> سے اپ ڈیٹس موصول ہوتی ہیں۔ کسی مختلف وسیلے سے اپ ڈیٹ کر کے، آپ اپنے TV پر کسی بھی وسیلے سے مستقبل کی اپ ڈیٹس حاصل کر سکتے ہیں۔ ایپ کی فعالیت تبدیل ہو سکتی ہے۔"</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"اس ایپ کو <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> سے اپ ڈیٹ کریں؟\n\n اس ایپ کو عام طور پر <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> سے اپ ڈیٹس موصول ہوتی ہیں۔ کسی مختلف ذریعے سے اپ ڈیٹ کر کے، آپ اپنے فون پر کسی بھی ذریعے سے مستقبل کی اپ ڈیٹس حاصل کر سکتے ہیں۔ ایپ کی فعالیت تبدیل ہو سکتی ہے۔"</string> <string name="install_failed" msgid="5777824004474125469">"ایپ انسٹال نہیں ہوئی۔"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"پیکج کو انسٹال ہونے سے مسدود کر دیا گیا تھا۔"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"ایپ انسٹال نہیں ہوئی کیونکہ پیکج ایک موجودہ پیکیج سے متصادم ہے۔"</string> diff --git a/packages/PackageInstaller/res/values-uz/strings.xml b/packages/PackageInstaller/res/values-uz/strings.xml index 2993663c6829..691633acbd17 100644 --- a/packages/PackageInstaller/res/values-uz/strings.xml +++ b/packages/PackageInstaller/res/values-uz/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Ilova o‘rnatildi."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Bu ilovani oʻrnatmoqchimisiz?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Bu ilova yangilansinmi?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Bu ilova <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> orqali yangilansinmi?\n\nBu ilova odatda <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> orqali yangilanishlar oladi. Boshqa manbadan yangilash orqali siz kelajakdagi yangilanishlarni telefoningizda istalgan manbadan olishingiz mumkin. Ilova funksiyalari oʻzgarishi mumkin."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Bu ilova <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> orqali yangilansinmi?\n\nBu ilova odatda <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> orqali yangilanishlar oladi. Boshqa manbadan yangilash orqali siz kelajakdagi yangilanishlarni planshetingizda istalgan manbadan olishingiz mumkin. Ilova funksiyalari oʻzgarishi mumkin."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Bu ilova <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> orqali yangilansinmi?\n\nBu ilova odatda <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> orqali yangilanishlar oladi. Boshqa manbadan yangilash orqali siz kelajakdagi yangilanishlarni televizoringizda istalgan manbadan olishingiz mumkin. Ilova funksiyalari oʻzgarishi mumkin."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Bu ilova <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> orqali yangilansinmi?\n\nBu ilova odatda <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> orqali yangilanishlar oladi. Boshqa manbadan yangilash orqali siz kelajakdagi yangilanishlarni telefoningizda istalgan manbadan olishingiz mumkin. Ilova funksiyalari oʻzgarishi mumkin."</string> <string name="install_failed" msgid="5777824004474125469">"Ilova o‘rnatilmadi."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Paket o‘rnatilishga qarshi bloklangan."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Paket mavjud paket bilan zid kelganligi uchun ilovani o‘rnatib bo‘lmadi."</string> diff --git a/packages/PackageInstaller/res/values-vi/strings.xml b/packages/PackageInstaller/res/values-vi/strings.xml index f6ffa3a2efb7..4976d661eb39 100644 --- a/packages/PackageInstaller/res/values-vi/strings.xml +++ b/packages/PackageInstaller/res/values-vi/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Ứng dụng đã được cài đặt."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Bạn có muốn cài đặt ứng dụng này không?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Bạn có muốn cập nhật ứng dụng này không?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Cập nhật ứng dụng này của <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nỨng dụng này thường nhận thông tin cập nhật từ <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Khi cập nhật từ một nguồn khác, trong tương lai, bạn có thể nhận thông tin cập nhật từ nguồn bất kỳ trên điện thoại của bạn. Chức năng ứng dụng có thể thay đổi."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Cập nhật ứng dụng này từ <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nỨng dụng này thường nhận các bản cập nhật từ <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Khi cập nhật từ một nguồn khác, bạn có thể nhận các bản cập nhật trong tương lai từ nguồn bất kỳ trên máy tính bảng của mình. Chức năng ứng dụng có thể thay đổi."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Cập nhật ứng dụng này từ <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nỨng dụng này thường nhận các bản cập nhật từ <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Khi cập nhật từ một nguồn khác, bạn có thể nhận các bản cập nhật trong tương lai từ nguồn bất kỳ trên TV của mình. Chức năng ứng dụng có thể thay đổi."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Cập nhật ứng dụng này của <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nỨng dụng này thường nhận thông tin cập nhật từ <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Khi cập nhật từ một nguồn khác, trong tương lai, bạn có thể nhận thông tin cập nhật từ nguồn bất kỳ trên điện thoại của bạn. Chức năng ứng dụng có thể thay đổi."</string> <string name="install_failed" msgid="5777824004474125469">"Ứng dụng chưa được cài đặt."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Đã chặn cài đặt gói."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Chưa cài đặt được ứng dụng do gói xung đột với một gói hiện có."</string> diff --git a/packages/PackageInstaller/res/values-zh-rCN/strings.xml b/packages/PackageInstaller/res/values-zh-rCN/strings.xml index 5c2d11f6375e..075467df003d 100644 --- a/packages/PackageInstaller/res/values-zh-rCN/strings.xml +++ b/packages/PackageInstaller/res/values-zh-rCN/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"已安装应用。"</string> <string name="install_confirm_question" msgid="7663733664476363311">"要安装此应用吗?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"要更新此应用吗?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"要通过<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>更新此应用吗?\n\n此应用通常通过<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>接收更新。如果通过其他来源更新,手机未来可能会收到任何来源的更新。应用功能可能会变化。"</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"要通过<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>更新此应用?\n\n此应用通常通过<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>接收更新。如果通过其他来源更新,平板电脑未来可能会收到任何来源的更新。应用功能可能会变化。"</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"要通过<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>更新此应用?\n\n此应用通常通过<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>接收更新。如果通过其他来源更新,电视未来可能会收到任何来源的更新。应用功能可能会变化。"</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"要通过<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>更新此应用吗?\n\n此应用通常通过<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>接收更新。如果通过其他来源更新,手机未来可能会收到任何来源的更新。应用功能可能会变化。"</string> <string name="install_failed" msgid="5777824004474125469">"未安装应用。"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"系统已禁止安装该软件包。"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"应用未安装:软件包与现有软件包存在冲突。"</string> diff --git a/packages/PackageInstaller/res/values-zh-rHK/strings.xml b/packages/PackageInstaller/res/values-zh-rHK/strings.xml index b36770d95757..c971682557a1 100644 --- a/packages/PackageInstaller/res/values-zh-rHK/strings.xml +++ b/packages/PackageInstaller/res/values-zh-rHK/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"已安裝應用程式。"</string> <string name="install_confirm_question" msgid="7663733664476363311">"要安裝此應用程式嗎?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"要更新此應用程式嗎?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"要從「<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>」更新此應用程式嗎?\n\n在正常情況下,系統會透過「<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>」更新此應用程式。如果透過其他來源更新,手機未來可能會收到任何來源的更新。應用程式功能可能會有變動。"</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"要從「<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>」更新此應用程式嗎?\n\n在正常情況下,系統會透過「<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>」更新此應用程式。如果透過其他來源更新,平板電腦未來可能會收到任何來源的更新。應用程式功能可能會有變動。"</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"要從「<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>」更新此應用程式嗎?\n\n在正常情況下,系統會透過「<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>」更新此應用程式。如果透過其他來源更新,電視未來可能會收到任何來源的更新。應用程式功能可能會有變動。"</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"要從「<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>」更新此應用程式嗎?\n\n在正常情況下,系統會透過「<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>」更新此應用程式。如果透過其他來源更新,手機未來可能會收到任何來源的更新。應用程式功能可能會有變動。"</string> <string name="install_failed" msgid="5777824004474125469">"未安裝應用程式。"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"套件已遭封鎖,無法安裝。"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"套件與現有的套件發生衝突,無法安裝應用程式。"</string> diff --git a/packages/PackageInstaller/res/values-zh-rTW/strings.xml b/packages/PackageInstaller/res/values-zh-rTW/strings.xml index 2a87eb880df2..d9027ccca95d 100644 --- a/packages/PackageInstaller/res/values-zh-rTW/strings.xml +++ b/packages/PackageInstaller/res/values-zh-rTW/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"已安裝應用程式。"</string> <string name="install_confirm_question" msgid="7663733664476363311">"要安裝這個應用程式嗎?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"要更新這個應用程式嗎?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"要透過「<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>」更新這個應用程式嗎?\n\n在正常情況下,系統會透過「<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>」更新這個應用程式。如果透過其他來源更新,手機未來可能會收到任何來源的更新。應用程式功能可能會有變動。"</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"要透過「<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>」更新這個應用程式嗎?\n\n在正常情況下,系統會透過「<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>」更新這個應用程式。如果透過其他來源更新,平板電腦未來可能會收到任何來源的更新。應用程式功能可能會有變動。"</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"要透過「<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>」更新這個應用程式嗎?\n\n在正常情況下,系統會透過「<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>」更新這個應用程式。如果透過其他來源更新,TV 裝置未來可能會收到任何來源的更新。應用程式功能可能會有變動。"</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"要透過「<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>」更新這個應用程式嗎?\n\n在正常情況下,系統會透過「<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>」更新這個應用程式。如果透過其他來源更新,手機未來可能會收到任何來源的更新。應用程式功能可能會有變動。"</string> <string name="install_failed" msgid="5777824004474125469">"未安裝應用程式。"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"系統已封鎖這個套件,因此無法安裝。"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"應用程式套件與現有套件衝突,因此未能完成安裝。"</string> diff --git a/packages/PackageInstaller/res/values-zu/strings.xml b/packages/PackageInstaller/res/values-zu/strings.xml index ca9c63b9e3a6..13419d9b9616 100644 --- a/packages/PackageInstaller/res/values-zu/strings.xml +++ b/packages/PackageInstaller/res/values-zu/strings.xml @@ -26,7 +26,9 @@ <string name="install_done" msgid="5987363587661783896">"Uhlelo lokusebenza olufakiwe."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Ingabe ufuna ukufaka le app?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Ingabe ufuna ukubuyekeza le app?"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Buyekeza le app kusuka ku-<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nNgokuvamile le app ithola izibuyekezo kusuka ku-<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ngokubuyekeza kusuka kumthombo ohlukile, ungase uthole izibuyekezo zesikhathi esizayo kusuka kunoma yimuphi umthombo efonini yakho. Okwenziwa yi-app kungase kushintshe."</string> + <string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="738046584021528374">"Buyekeza le app kusuka ku-<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nNgokuvamile le app ithola izibuyekezo kusuka ku-<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ngokubuyekeza kusuka kumthombo ohlukile, ungase uthole izibuyekezo zesikhathi esizayo kusuka kunoma yimuphi umthombo kuthebulethi yakho. Okwenziwa yi-app kungase kushintshe."</string> + <string name="install_confirm_question_update_owner_reminder" product="tv" msgid="3056133099508550163">"Buyekeza le app kusuka ku-<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nNgokuvamile le app ithola izibuyekezo kusuka ku-<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ngokubuyekeza kusuka kumthombo ohlukile, ungase uthole izibuyekezo zesikhathi esizayo kusuka kunoma yimuphi umthombo ku-TV yakho. Okwenziwa yi-app kungase kushintshe."</string> + <string name="install_confirm_question_update_owner_reminder" product="default" msgid="3750986542284587290">"Buyekeza le app kusuka ku-<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nNgokuvamile le app ithola izibuyekezo kusuka ku-<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ngokubuyekeza kusuka kumthombo ohlukile, ungase uthole izibuyekezo zesikhathi esizayo kusuka kunoma yimuphi umthombo efonini yakho. Okwenziwa yi-app kungase kushintshe."</string> <string name="install_failed" msgid="5777824004474125469">"Uhlelo lokusebenza alufakiwe."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Iphakheji livinjiwe kusukela ekufakweni."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Uhlelo lokusebenza alufakiwe njengoba ukuphakheja kushayisana nephakheji elikhona."</string> diff --git a/packages/SettingsLib/Spa/build.gradle.kts b/packages/SettingsLib/Spa/build.gradle.kts index 64b67d7fe4f1..e76139fbbc79 100644 --- a/packages/SettingsLib/Spa/build.gradle.kts +++ b/packages/SettingsLib/Spa/build.gradle.kts @@ -25,13 +25,13 @@ plugins { } allprojects { - extra["jetpackComposeVersion"] = "1.4.0-beta01" + extra["jetpackComposeVersion"] = "1.6.0-alpha01" } subprojects { plugins.withType<AndroidBasePlugin> { configure<BaseExtension> { - compileSdkVersion(33) + compileSdkVersion(34) defaultConfig { minSdk = 21 diff --git a/packages/SettingsLib/Spa/gallery/Android.bp b/packages/SettingsLib/Spa/gallery/Android.bp index bc083c9db6b0..e59e98202ced 100644 --- a/packages/SettingsLib/Spa/gallery/Android.bp +++ b/packages/SettingsLib/Spa/gallery/Android.bp @@ -28,6 +28,6 @@ android_app { "androidx.compose.runtime_runtime", ], kotlincflags: ["-Xjvm-default=all"], - platform_apis: true, + sdk_version: "current", min_sdk_version: "31", } diff --git a/packages/SettingsLib/Spa/gallery/build.gradle.kts b/packages/SettingsLib/Spa/gallery/build.gradle.kts index 7f689c16b7ed..a1151a5e827e 100644 --- a/packages/SettingsLib/Spa/gallery/build.gradle.kts +++ b/packages/SettingsLib/Spa/gallery/build.gradle.kts @@ -30,7 +30,7 @@ android { sourceSets { sourceSets.getByName("main") { - java.setSrcDirs(listOf("src")) + kotlin.setSrcDirs(listOf("src")) res.setSrcDirs(listOf("res")) manifest.srcFile("AndroidManifest.xml") } diff --git a/packages/SettingsLib/Spa/spa/Android.bp b/packages/SettingsLib/Spa/spa/Android.bp index 139f3e13d5bc..79f8c463b5ae 100644 --- a/packages/SettingsLib/Spa/spa/Android.bp +++ b/packages/SettingsLib/Spa/spa/Android.bp @@ -43,6 +43,7 @@ android_library { kotlincflags: [ "-Xjvm-default=all", ], + sdk_version: "current", min_sdk_version: "31", } diff --git a/packages/SettingsLib/Spa/spa/build.gradle.kts b/packages/SettingsLib/Spa/spa/build.gradle.kts index 329d80e05434..188e7f64f972 100644 --- a/packages/SettingsLib/Spa/spa/build.gradle.kts +++ b/packages/SettingsLib/Spa/spa/build.gradle.kts @@ -56,13 +56,13 @@ dependencies { api("androidx.slice:slice-builders:1.1.0-alpha02") api("androidx.slice:slice-core:1.1.0-alpha02") api("androidx.slice:slice-view:1.1.0-alpha02") - api("androidx.compose.material3:material3:1.1.0-alpha06") + api("androidx.compose.material3:material3:1.2.0-alpha03") api("androidx.compose.material:material-icons-extended:$jetpackComposeVersion") api("androidx.compose.runtime:runtime-livedata:$jetpackComposeVersion") api("androidx.compose.ui:ui-tooling-preview:$jetpackComposeVersion") api("androidx.lifecycle:lifecycle-livedata-ktx") api("androidx.lifecycle:lifecycle-runtime-compose") - api("androidx.navigation:navigation-compose:2.6.0-alpha08") + api("androidx.navigation:navigation-compose:2.7.0-beta01") api("com.github.PhilJay:MPAndroidChart:v3.1.0-alpha") api("com.google.android.material:material:1.7.0-alpha03") debugApi("androidx.compose.ui:ui-tooling:$jetpackComposeVersion") diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/BrowseActivity.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/BrowseActivity.kt index afce16c530c7..08e3a27da125 100644 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/BrowseActivity.kt +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/BrowseActivity.kt @@ -14,8 +14,6 @@ * limitations under the License. */ -@file:OptIn(ExperimentalAnimationApi::class) - package com.android.settingslib.spa.framework import android.content.Intent @@ -24,20 +22,17 @@ import android.util.Log import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.annotation.VisibleForTesting -import androidx.compose.animation.AnimatedContentTransitionScope -import androidx.compose.animation.ExperimentalAnimationApi -import androidx.compose.animation.core.tween -import androidx.compose.animation.fadeIn -import androidx.compose.animation.fadeOut import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.saveable.rememberSaveable -import androidx.compose.ui.unit.IntOffset import androidx.core.view.WindowCompat import androidx.navigation.NavGraph.Companion.findStartDestination +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import androidx.navigation.compose.rememberNavController import com.android.settingslib.spa.R import com.android.settingslib.spa.framework.common.LogCategory import com.android.settingslib.spa.framework.common.NullPageProvider @@ -46,12 +41,10 @@ import com.android.settingslib.spa.framework.common.SettingsPageProvider import com.android.settingslib.spa.framework.common.SettingsPageProviderRepository import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory import com.android.settingslib.spa.framework.common.createSettingsPage -import com.android.settingslib.spa.framework.compose.AnimatedNavHost import com.android.settingslib.spa.framework.compose.LocalNavController import com.android.settingslib.spa.framework.compose.NavControllerWrapperImpl -import com.android.settingslib.spa.framework.compose.composable +import com.android.settingslib.spa.framework.compose.animatedComposable import com.android.settingslib.spa.framework.compose.localNavController -import com.android.settingslib.spa.framework.compose.rememberAnimatedNavController import com.android.settingslib.spa.framework.theme.SettingsTheme import com.android.settingslib.spa.framework.util.PageLogger import com.android.settingslib.spa.framework.util.getDestination @@ -108,7 +101,7 @@ internal fun BrowseContent( isPageEnabled: (SettingsPage) -> Boolean, initialIntent: Intent?, ) { - val navController = rememberAnimatedNavController() + val navController = rememberNavController() CompositionLocalProvider(navController.localNavController()) { val controller = LocalNavController.current as NavControllerWrapperImpl controller.NavContent(sppRepository.getAllProviders()) { page -> @@ -133,41 +126,15 @@ private fun NavControllerWrapperImpl.NavContent( allProvider: Collection<SettingsPageProvider>, content: @Composable (SettingsPage) -> Unit, ) { - AnimatedNavHost( + NavHost( navController = navController, startDestination = NullPageProvider.name, ) { - val slideEffect = tween<IntOffset>(durationMillis = 300) - val fadeEffect = tween<Float>(durationMillis = 300) composable(NullPageProvider.name) {} for (spp in allProvider) { - composable( + animatedComposable( route = spp.name + spp.parameter.navRoute(), arguments = spp.parameter, - enterTransition = { - slideIntoContainer( - AnimatedContentTransitionScope.SlideDirection.Start, - animationSpec = slideEffect - ) + fadeIn(animationSpec = fadeEffect) - }, - exitTransition = { - slideOutOfContainer( - AnimatedContentTransitionScope.SlideDirection.Start, - animationSpec = slideEffect - ) + fadeOut(animationSpec = fadeEffect) - }, - popEnterTransition = { - slideIntoContainer( - AnimatedContentTransitionScope.SlideDirection.End, - animationSpec = slideEffect - ) + fadeIn(animationSpec = fadeEffect) - }, - popExitTransition = { - slideOutOfContainer( - AnimatedContentTransitionScope.SlideDirection.End, - animationSpec = slideEffect - ) + fadeOut(animationSpec = fadeEffect) - }, ) { navBackStackEntry -> val page = remember { spp.createSettingsPage(navBackStackEntry.arguments) } content(page) diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/compose/AnimatedComposeNavigator.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/compose/AnimatedComposeNavigator.kt deleted file mode 100644 index 930a83f76e3f..000000000000 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/compose/AnimatedComposeNavigator.kt +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (C) 2023 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.settingslib.spa.framework.compose - -import androidx.compose.animation.AnimatedVisibilityScope -import androidx.compose.animation.ExperimentalAnimationApi -import androidx.compose.runtime.Composable -import androidx.compose.runtime.mutableStateOf -import androidx.navigation.NavBackStackEntry -import androidx.navigation.NavDestination -import androidx.navigation.NavOptions -import androidx.navigation.Navigator - -/** - * Navigator that navigates through [Composable]s. Every destination using this Navigator must - * set a valid [Composable] by setting it directly on an instantiated [Destination] or calling - * [composable]. - */ -@ExperimentalAnimationApi -@Navigator.Name("animatedComposable") -public class AnimatedComposeNavigator : Navigator<AnimatedComposeNavigator.Destination>() { - internal val transitionsInProgress get() = state.transitionsInProgress - - internal val backStack get() = state.backStack - - internal val isPop = mutableStateOf(false) - - override fun navigate( - entries: List<NavBackStackEntry>, - navOptions: NavOptions?, - navigatorExtras: Extras? - ) { - entries.forEach { entry -> - state.pushWithTransition(entry) - } - isPop.value = false - } - - override fun createDestination(): Destination { - return Destination(this, content = { }) - } - - override fun popBackStack(popUpTo: NavBackStackEntry, savedState: Boolean) { - state.popWithTransition(popUpTo, savedState) - isPop.value = true - } - - internal fun markTransitionComplete(entry: NavBackStackEntry) { - state.markTransitionComplete(entry) - } - - /** - * NavDestination specific to [AnimatedComposeNavigator] - */ - @ExperimentalAnimationApi - @NavDestination.ClassType(Composable::class) - public class Destination( - navigator: AnimatedComposeNavigator, - internal val content: @Composable AnimatedVisibilityScope.(NavBackStackEntry) -> Unit - ) : NavDestination(navigator) - - internal companion object { - internal const val NAME = "animatedComposable" - } -} diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/compose/AnimatedNavGraphBuilder.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/compose/AnimatedNavGraphBuilder.kt new file mode 100644 index 000000000000..192b12500978 --- /dev/null +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/compose/AnimatedNavGraphBuilder.kt @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settingslib.spa.framework.compose + +import androidx.compose.animation.AnimatedContentScope +import androidx.compose.animation.AnimatedContentTransitionScope +import androidx.compose.animation.core.FastOutLinearInEasing +import androidx.compose.animation.core.LinearOutSlowInEasing +import androidx.compose.animation.core.tween +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.runtime.Composable +import androidx.compose.ui.unit.IntOffset +import androidx.navigation.NamedNavArgument +import androidx.navigation.NavBackStackEntry +import androidx.navigation.NavDeepLink +import androidx.navigation.NavGraphBuilder +import androidx.navigation.compose.composable + +/** + * Add the [Composable] to the [NavGraphBuilder] with animation + * + * @param route route for the destination + * @param arguments list of arguments to associate with destination + * @param deepLinks list of deep links to associate with the destinations + * @param content composable for the destination + */ +internal fun NavGraphBuilder.animatedComposable( + route: String, + arguments: List<NamedNavArgument> = emptyList(), + deepLinks: List<NavDeepLink> = emptyList(), + content: @Composable AnimatedContentScope.(NavBackStackEntry) -> Unit, +) = composable( + route = route, + arguments = arguments, + deepLinks = deepLinks, + enterTransition = { + slideIntoContainer( + towards = AnimatedContentTransitionScope.SlideDirection.Start, + animationSpec = slideInEffect, + initialOffset = offsetFunc, + ) + fadeIn(animationSpec = fadeInEffect) + }, + exitTransition = { + slideOutOfContainer( + towards = AnimatedContentTransitionScope.SlideDirection.Start, + animationSpec = slideOutEffect, + targetOffset = offsetFunc, + ) + fadeOut(animationSpec = fadeOutEffect) + }, + popEnterTransition = { + slideIntoContainer( + towards = AnimatedContentTransitionScope.SlideDirection.End, + animationSpec = slideInEffect, + initialOffset = offsetFunc, + ) + fadeIn(animationSpec = fadeInEffect) + }, + popExitTransition = { + slideOutOfContainer( + towards = AnimatedContentTransitionScope.SlideDirection.End, + animationSpec = slideOutEffect, + targetOffset = offsetFunc, + ) + fadeOut(animationSpec = fadeOutEffect) + }, + content = content, +) + +private const val FADE_OUT_MILLIS = 75 +private const val FADE_IN_MILLIS = 300 + +private val slideInEffect = tween<IntOffset>( + durationMillis = FADE_IN_MILLIS, + delayMillis = FADE_OUT_MILLIS, + easing = LinearOutSlowInEasing, +) +private val slideOutEffect = tween<IntOffset>(durationMillis = FADE_IN_MILLIS) +private val fadeOutEffect = tween<Float>( + durationMillis = FADE_OUT_MILLIS, + easing = FastOutLinearInEasing, +) +private val fadeInEffect = tween<Float>( + durationMillis = FADE_IN_MILLIS, + delayMillis = FADE_OUT_MILLIS, + easing = LinearOutSlowInEasing, +) +private val offsetFunc: (offsetForFullSlide: Int) -> Int = { it.div(5) } diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/compose/AnimatedNavHost.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/compose/AnimatedNavHost.kt deleted file mode 100644 index 81bbc2456577..000000000000 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/compose/AnimatedNavHost.kt +++ /dev/null @@ -1,252 +0,0 @@ -/* - * Copyright (C) 2023 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.settingslib.spa.framework.compose - -import androidx.activity.compose.LocalOnBackPressedDispatcherOwner -import androidx.compose.animation.AnimatedContent -import androidx.compose.animation.AnimatedContentTransitionScope -import androidx.compose.animation.ContentTransform -import androidx.compose.animation.EnterTransition -import androidx.compose.animation.ExitTransition -import androidx.compose.animation.ExperimentalAnimationApi -import androidx.compose.animation.core.tween -import androidx.compose.animation.core.updateTransition -import androidx.compose.animation.fadeIn -import androidx.compose.animation.fadeOut -import androidx.compose.animation.with -import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState -import androidx.compose.runtime.getValue -import androidx.compose.runtime.remember -import androidx.compose.runtime.saveable.rememberSaveableStateHolder -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalLifecycleOwner -import androidx.lifecycle.viewmodel.compose.LocalViewModelStoreOwner -import androidx.navigation.NavBackStackEntry -import androidx.navigation.NavDestination -import androidx.navigation.NavDestination.Companion.hierarchy -import androidx.navigation.NavGraph -import androidx.navigation.NavGraphBuilder -import androidx.navigation.NavHostController -import androidx.navigation.Navigator -import androidx.navigation.compose.DialogHost -import androidx.navigation.compose.DialogNavigator -import androidx.navigation.compose.LocalOwnersProvider -import androidx.navigation.createGraph -import androidx.navigation.get -import kotlinx.coroutines.flow.map - -/** - * Provides in place in the Compose hierarchy for self contained navigation to occur. - * - * Once this is called, any Composable within the given [NavGraphBuilder] can be navigated to from - * the provided [navController]. - * - * The builder passed into this method is [remember]ed. This means that for this NavHost, the - * contents of the builder cannot be changed. - * - * @param navController the navController for this host - * @param startDestination the route for the start destination - * @param modifier The modifier to be applied to the layout. - * @param route the route for the graph - * @param enterTransition callback to define enter transitions for destination in this host - * @param exitTransition callback to define exit transitions for destination in this host - * @param popEnterTransition callback to define popEnter transitions for destination in this host - * @param popExitTransition callback to define popExit transitions for destination in this host - * @param builder the builder used to construct the graph - */ -@Composable -@ExperimentalAnimationApi -public fun AnimatedNavHost( - navController: NavHostController, - startDestination: String, - modifier: Modifier = Modifier, - contentAlignment: Alignment = Alignment.Center, - route: String? = null, - enterTransition: (AnimatedScope.() -> EnterTransition) = { fadeIn(animationSpec = tween(700)) }, - exitTransition: (AnimatedScope.() -> ExitTransition) = { fadeOut(animationSpec = tween(700)) }, - popEnterTransition: (AnimatedScope.() -> EnterTransition) = enterTransition, - popExitTransition: (AnimatedScope.() -> ExitTransition) = exitTransition, - builder: NavGraphBuilder.() -> Unit -) { - AnimatedNavHost( - navController, - remember(route, startDestination, builder) { - navController.createGraph(startDestination, route, builder) - }, - modifier, - contentAlignment, - enterTransition, - exitTransition, - popEnterTransition, - popExitTransition - ) -} - -/** - * Provides in place in the Compose hierarchy for self contained navigation to occur. - * - * Once this is called, any Composable within the given [NavGraphBuilder] can be navigated to from - * the provided [navController]. - * - * @param navController the navController for this host - * @param graph the graph for this host - * @param modifier The modifier to be applied to the layout. - * @param enterTransition callback to define enter transitions for destination in this host - * @param exitTransition callback to define exit transitions for destination in this host - * @param popEnterTransition callback to define popEnter transitions for destination in this host - * @param popExitTransition callback to define popExit transitions for destination in this host - */ -@ExperimentalAnimationApi -@Composable -public fun AnimatedNavHost( - navController: NavHostController, - graph: NavGraph, - modifier: Modifier = Modifier, - contentAlignment: Alignment = Alignment.Center, - enterTransition: (AnimatedScope.() -> EnterTransition) = { fadeIn(animationSpec = tween(700)) }, - exitTransition: (AnimatedScope.() -> ExitTransition) = { fadeOut(animationSpec = tween(700)) }, - popEnterTransition: (AnimatedScope.() -> EnterTransition) = enterTransition, - popExitTransition: (AnimatedScope.() -> ExitTransition) = exitTransition, -) { - - val lifecycleOwner = LocalLifecycleOwner.current - val viewModelStoreOwner = checkNotNull(LocalViewModelStoreOwner.current) { - "NavHost requires a ViewModelStoreOwner to be provided via LocalViewModelStoreOwner" - } - val onBackPressedDispatcherOwner = LocalOnBackPressedDispatcherOwner.current - val onBackPressedDispatcher = onBackPressedDispatcherOwner?.onBackPressedDispatcher - - // on successful recompose we setup the navController with proper inputs - // after the first time, this will only happen again if one of the inputs changes - navController.setLifecycleOwner(lifecycleOwner) - navController.setViewModelStore(viewModelStoreOwner.viewModelStore) - if (onBackPressedDispatcher != null) { - navController.setOnBackPressedDispatcher(onBackPressedDispatcher) - } - - navController.graph = graph - - val saveableStateHolder = rememberSaveableStateHolder() - - // Find the ComposeNavigator, returning early if it isn't found - // (such as is the case when using TestNavHostController) - val composeNavigator = navController.navigatorProvider.get<Navigator<out NavDestination>>( - AnimatedComposeNavigator.NAME - ) as? AnimatedComposeNavigator ?: return - val visibleEntries by remember(navController.visibleEntries) { - navController.visibleEntries.map { - it.filter { entry -> - entry.destination.navigatorName == AnimatedComposeNavigator.NAME - } - } - }.collectAsState(emptyList()) - - val backStackEntry = visibleEntries.lastOrNull() - - if (backStackEntry != null) { - val finalEnter: AnimatedScope.() -> EnterTransition = { - val targetDestination = targetState.destination as AnimatedComposeNavigator.Destination - - if (composeNavigator.isPop.value) { - targetDestination.hierarchy.firstNotNullOfOrNull { destination -> - popEnterTransitions[destination.route]?.invoke(this) - } ?: popEnterTransition.invoke(this) - } else { - targetDestination.hierarchy.firstNotNullOfOrNull { destination -> - enterTransitions[destination.route]?.invoke(this) - } ?: enterTransition.invoke(this) - } - } - - val finalExit: AnimatedScope.() -> ExitTransition = { - val initialDestination = - initialState.destination as AnimatedComposeNavigator.Destination - - if (composeNavigator.isPop.value) { - initialDestination.hierarchy.firstNotNullOfOrNull { destination -> - popExitTransitions[destination.route]?.invoke(this) - } ?: popExitTransition.invoke(this) - } else { - initialDestination.hierarchy.firstNotNullOfOrNull { destination -> - exitTransitions[destination.route]?.invoke(this) - } ?: exitTransition.invoke(this) - } - } - - val transition = updateTransition(backStackEntry, label = "entry") - transition.AnimatedContent( - modifier, - transitionSpec = { - val zIndex = composeNavigator.backStack.value.size.toFloat() - // If the initialState of the AnimatedContent is not in visibleEntries, we are in - // a case where visible has cleared the old state for some reason, so instead of - // attempting to animate away from the initialState, we skip the animation. - if (initialState in visibleEntries) { - ContentTransform(finalEnter(this), finalExit(this), zIndex) - } else { - EnterTransition.None with ExitTransition.None - } - }, - contentAlignment, - contentKey = { it.id } - ) { - // In some specific cases, such as clearing your back stack by changing your - // start destination, AnimatedContent can contain an entry that is no longer - // part of visible entries since it was cleared from the back stack and is not - // animating. In these cases the currentEntry will be null, and in those cases, - // AnimatedContent will just skip attempting to transition the old entry. - // See https://issuetracker.google.com/238686802 - val currentEntry = visibleEntries.lastOrNull { entry -> - it == entry - } - // while in the scope of the composable, we provide the navBackStackEntry as the - // ViewModelStoreOwner and LifecycleOwner - currentEntry?.LocalOwnersProvider(saveableStateHolder) { - (currentEntry.destination as AnimatedComposeNavigator.Destination) - .content(this, currentEntry) - } - } - if (transition.currentState == transition.targetState) { - visibleEntries.forEach { entry -> - composeNavigator.markTransitionComplete(entry) - } - } - } - - val dialogNavigator = navController.navigatorProvider.get<Navigator<out NavDestination>>( - "dialog" - ) as? DialogNavigator ?: return - - // Show any dialog destinations - DialogHost(dialogNavigator) -} - -@OptIn(ExperimentalAnimationApi::class) -internal typealias AnimatedScope = AnimatedContentTransitionScope<NavBackStackEntry> - -@ExperimentalAnimationApi -internal val enterTransitions = mutableMapOf<String?, (AnimatedScope.() -> EnterTransition?)?>() - -@ExperimentalAnimationApi -internal val exitTransitions = mutableMapOf<String?, (AnimatedScope.() -> ExitTransition?)?>() -@ExperimentalAnimationApi -internal val popEnterTransitions = mutableMapOf<String?, (AnimatedScope.() -> EnterTransition?)?>() - -@ExperimentalAnimationApi -internal val popExitTransitions = mutableMapOf<String?, (AnimatedScope.() -> ExitTransition?)?>() diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/compose/NavGraphBuilder.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/compose/NavGraphBuilder.kt deleted file mode 100644 index bf92f5dda1a9..000000000000 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/compose/NavGraphBuilder.kt +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (C) 2023 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.settingslib.spa.framework.compose - -import androidx.compose.animation.AnimatedVisibilityScope -import androidx.compose.animation.EnterTransition -import androidx.compose.animation.ExitTransition -import androidx.compose.animation.ExperimentalAnimationApi -import androidx.compose.runtime.Composable -import androidx.navigation.NamedNavArgument -import androidx.navigation.NavBackStackEntry -import androidx.navigation.NavDeepLink -import androidx.navigation.NavGraphBuilder -import androidx.navigation.get - -/** - * Add the [Composable] to the [NavGraphBuilder] - * - * @param route route for the destination - * @param arguments list of arguments to associate with destination - * @param deepLinks list of deep links to associate with the destinations - * @param enterTransition callback to determine the destination's enter transition - * @param exitTransition callback to determine the destination's exit transition - * @param popEnterTransition callback to determine the destination's popEnter transition - * @param popExitTransition callback to determine the destination's popExit transition - * @param content composable for the destination - */ -@ExperimentalAnimationApi -public fun NavGraphBuilder.composable( - route: String, - arguments: List<NamedNavArgument> = emptyList(), - deepLinks: List<NavDeepLink> = emptyList(), - enterTransition: (AnimatedScope.() -> EnterTransition?)? = null, - exitTransition: (AnimatedScope.() -> ExitTransition?)? = null, - popEnterTransition: (AnimatedScope.() -> EnterTransition?)? = enterTransition, - popExitTransition: (AnimatedScope.() -> ExitTransition?)? = exitTransition, - content: @Composable AnimatedVisibilityScope.(NavBackStackEntry) -> Unit -) { - addDestination( - AnimatedComposeNavigator.Destination( - provider[AnimatedComposeNavigator::class], - content - ).apply { - this.route = route - arguments.forEach { (argumentName, argument) -> - addArgument(argumentName, argument) - } - deepLinks.forEach { deepLink -> - addDeepLink(deepLink) - } - enterTransition?.let { enterTransitions[route] = enterTransition } - exitTransition?.let { exitTransitions[route] = exitTransition } - popEnterTransition?.let { popEnterTransitions[route] = popEnterTransition } - popExitTransition?.let { popExitTransitions[route] = popExitTransition } - } - ) -} diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/compose/NavHostController.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/compose/NavHostController.kt deleted file mode 100644 index a8ac86c2fb15..000000000000 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/compose/NavHostController.kt +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2023 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.settingslib.spa.framework.compose - -import androidx.compose.animation.ExperimentalAnimationApi -import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember -import androidx.navigation.NavDestination -import androidx.navigation.NavHostController -import androidx.navigation.Navigator -import androidx.navigation.compose.rememberNavController - -/** - * Creates a NavHostController that handles the adding of the [ComposeNavigator], [DialogNavigator] - * and [AnimatedComposeNavigator]. Additional [androidx.navigation.Navigator] instances should be - * added in a [androidx.compose.runtime.SideEffect] block. - * - * @see AnimatedNavHost - */ -@ExperimentalAnimationApi -@Composable -fun rememberAnimatedNavController( - vararg navigators: Navigator<out NavDestination> -): NavHostController { - val animatedNavigator = remember { AnimatedComposeNavigator() } - return rememberNavController(animatedNavigator, *navigators) -} diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/CustomizedAppBar.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/CustomizedAppBar.kt index e07a6298a627..90a723f707da 100644 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/CustomizedAppBar.kt +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/CustomizedAppBar.kt @@ -50,7 +50,7 @@ import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.SideEffect import androidx.compose.runtime.Stable import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.mutableFloatStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberUpdatedState import androidx.compose.ui.Alignment @@ -286,21 +286,22 @@ private fun TwoRowsTopAppBar( ) } val pinnedHeightPx: Float - val density = LocalDensity.current - val maxHeightPx = density.run { - remember { mutableStateOf((MaxHeightWithoutTitle + DefaultTitleHeight).toPx()) } - } val titleBottomPaddingPx: Int + val defaultMaxHeightPx: Float + val density = LocalDensity.current density.run { pinnedHeightPx = pinnedHeight.toPx() titleBottomPaddingPx = titleBottomPadding.roundToPx() + defaultMaxHeightPx = (MaxHeightWithoutTitle + DefaultTitleHeight).toPx() } + val maxHeightPx = remember(density) { mutableFloatStateOf(defaultMaxHeightPx) } + // Sets the app bar's height offset limit to hide just the bottom title area and keep top title // visible when collapsed. SideEffect { - if (scrollBehavior?.state?.heightOffsetLimit != pinnedHeightPx - maxHeightPx.value) { - scrollBehavior?.state?.heightOffsetLimit = pinnedHeightPx - maxHeightPx.value + if (scrollBehavior?.state?.heightOffsetLimit != pinnedHeightPx - maxHeightPx.floatValue) { + scrollBehavior?.state?.heightOffsetLimit = pinnedHeightPx - maxHeightPx.floatValue } } @@ -370,16 +371,20 @@ private fun TwoRowsTopAppBar( ) TopAppBarLayout( modifier = Modifier.clipToBounds(), - heightPx = maxHeightPx.value - pinnedHeightPx + + heightPx = maxHeightPx.floatValue - pinnedHeightPx + (scrollBehavior?.state?.heightOffset ?: 0f), navigationIconContentColor = colors.navigationIconContentColor, titleContentColor = colors.titleContentColor, actionIconContentColor = colors.actionIconContentColor, title = { Box(modifier = Modifier.onGloballyPositioned { coordinates -> - density.run { - maxHeightPx.value = - MaxHeightWithoutTitle.toPx() + coordinates.size.height.toFloat() + val measuredMaxHeightPx = density.run { + MaxHeightWithoutTitle.toPx() + coordinates.size.height.toFloat() + } + // Allow larger max height for multi-line title, but do not reduce + // max height to prevent flaky. + if (measuredMaxHeightPx > defaultMaxHeightPx) { + maxHeightPx.floatValue = measuredMaxHeightPx } }) { title() } }, @@ -506,7 +511,7 @@ private fun TopAppBarLayout( 0 } - val layoutHeight = heightPx.roundToInt() + val layoutHeight = if (heightPx.isNaN()) 0 else heightPx.roundToInt() layout(constraints.maxWidth, layoutHeight) { // Navigation icon @@ -612,9 +617,9 @@ private suspend fun settleAppBar( // Medium or Large app bar. private val TopTitleAlphaEasing = CubicBezierEasing(.8f, 0f, .8f, .15f) -private val MaxHeightWithoutTitle = 124.dp -private val DefaultTitleHeight = 52.dp -private val ContainerHeight = 56.dp +internal val MaxHeightWithoutTitle = 124.dp +internal val DefaultTitleHeight = 52.dp +internal val ContainerHeight = 56.dp private val LargeTitleBottomPadding = 28.dp private val TopAppBarHorizontalPadding = 4.dp diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/SearchScaffold.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/SearchScaffold.kt index 67c4cdcc1290..67f4418b7e4c 100644 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/SearchScaffold.kt +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/SearchScaffold.kt @@ -163,7 +163,6 @@ private fun SearchTopAppBar( BackHandler { onClose() } } -@OptIn(ExperimentalMaterial3Api::class) @Composable private fun SearchBox(query: TextFieldValue, onQueryChange: (TextFieldValue) -> Unit) { val focusRequester = remember { FocusRequester() } @@ -186,8 +185,9 @@ private fun SearchBox(query: TextFieldValue, onQueryChange: (TextFieldValue) -> keyboardOptions = KeyboardOptions(imeAction = ImeAction.Search), keyboardActions = KeyboardActions(onSearch = { hideKeyboardAction() }), singleLine = true, - colors = TextFieldDefaults.textFieldColors( - containerColor = Color.Transparent, + colors = TextFieldDefaults.colors( + focusedContainerColor = Color.Transparent, + unfocusedContainerColor = Color.Transparent, focusedIndicatorColor = Color.Transparent, unfocusedIndicatorColor = Color.Transparent, ), diff --git a/packages/SettingsLib/Spa/tests/Android.bp b/packages/SettingsLib/Spa/tests/Android.bp index f9e64aee1513..0d9ba54f5630 100644 --- a/packages/SettingsLib/Spa/tests/Android.bp +++ b/packages/SettingsLib/Spa/tests/Android.bp @@ -36,5 +36,6 @@ android_test { "mockito-target-minus-junit4", ], kotlincflags: ["-Xjvm-default=all"], + sdk_version: "current", min_sdk_version: "31", } diff --git a/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/scaffold/CustomizedAppBarTest.kt b/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/scaffold/CustomizedAppBarTest.kt new file mode 100644 index 000000000000..a6a5ed229756 --- /dev/null +++ b/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/scaffold/CustomizedAppBarTest.kt @@ -0,0 +1,457 @@ +/* + * Copyright 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settingslib.spa.widget.scaffold + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.LazyListState +import androidx.compose.foundation.lazy.LazyRow +import androidx.compose.foundation.lazy.rememberLazyListState +import androidx.compose.material3.CenterAlignedTopAppBar +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.LocalContentColor +import androidx.compose.material3.LocalTextStyle +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.material3.TopAppBarScrollBehavior +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.painter.ColorPainter +import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.platform.testTag +import androidx.compose.ui.semantics.semantics +import androidx.compose.ui.test.assertHeightIsEqualTo +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.assertLeftPositionInRootIsEqualTo +import androidx.compose.ui.test.assertTopPositionInRootIsEqualTo +import androidx.compose.ui.test.assertWidthIsEqualTo +import androidx.compose.ui.test.getUnclippedBoundsInRoot +import androidx.compose.ui.test.junit4.createComposeRule +import androidx.compose.ui.test.onNodeWithTag +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.performTouchInput +import androidx.compose.ui.test.swipeLeft +import androidx.compose.ui.test.swipeRight +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.height +import androidx.compose.ui.unit.width +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.android.settingslib.spa.testutils.rootWidth +import com.android.settingslib.spa.testutils.setContentForSizeAssertions +import com.google.common.truth.Truth.assertThat +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith + +@OptIn(ExperimentalMaterial3Api::class) +@RunWith(AndroidJUnit4::class) +class CustomizedAppBarTest { + + @get:Rule + val rule = createComposeRule() + + @Test + fun smallTopAppBar_expandsToScreen() { + rule + .setContentForSizeAssertions { + CustomizedTopAppBar(title = { Text("Title") }) + } + .assertHeightIsEqualTo(ContainerHeight) + .assertWidthIsEqualTo(rule.rootWidth()) + } + + @Test + fun smallTopAppBar_withTitle() { + val title = "Title" + rule.setContent { + Box(Modifier.testTag(TopAppBarTestTag)) { + CustomizedTopAppBar(title = { Text(title) }) + } + } + rule.onNodeWithText(title).assertIsDisplayed() + } + + @Test + fun smallTopAppBar_default_positioning() { + rule.setContent { + Box(Modifier.testTag(TopAppBarTestTag)) { + CustomizedTopAppBar( + navigationIcon = { + FakeIcon(Modifier.testTag(NavigationIconTestTag)) + }, + title = { + Text("Title", Modifier.testTag(TitleTestTag)) + }, + actions = { + FakeIcon(Modifier.testTag(ActionsTestTag)) + } + ) + } + } + assertSmallDefaultPositioning() + } + + @Test + fun smallTopAppBar_noNavigationIcon_positioning() { + rule.setContent { + Box(Modifier.testTag(TopAppBarTestTag)) { + CustomizedTopAppBar( + title = { + Text("Title", Modifier.testTag(TitleTestTag)) + }, + actions = { + FakeIcon(Modifier.testTag(ActionsTestTag)) + } + ) + } + } + assertSmallPositioningWithoutNavigation() + } + + @Test + fun smallTopAppBar_titleDefaultStyle() { + var textStyle: TextStyle? = null + var expectedTextStyle: TextStyle? = null + rule.setContent { + CustomizedTopAppBar( + title = { + Text("Title") + textStyle = LocalTextStyle.current + expectedTextStyle = MaterialTheme.typography.titleMedium + }, + ) + } + assertThat(textStyle).isNotNull() + assertThat(textStyle).isEqualTo(expectedTextStyle) + } + + @Test + fun smallTopAppBar_contentColor() { + var titleColor: Color = Color.Unspecified + var navigationIconColor: Color = Color.Unspecified + var actionsColor: Color = Color.Unspecified + var expectedTitleColor: Color = Color.Unspecified + var expectedNavigationIconColor: Color = Color.Unspecified + var expectedActionsColor: Color = Color.Unspecified + + rule.setContent { + CustomizedTopAppBar( + navigationIcon = { + FakeIcon(Modifier.testTag(NavigationIconTestTag)) + navigationIconColor = LocalContentColor.current + expectedNavigationIconColor = + TopAppBarDefaults.topAppBarColors().navigationIconContentColor + // fraction = 0f to indicate no scroll. + }, + title = { + Text("Title", Modifier.testTag(TitleTestTag)) + titleColor = LocalContentColor.current + expectedTitleColor = TopAppBarDefaults.topAppBarColors().titleContentColor + }, + actions = { + FakeIcon(Modifier.testTag(ActionsTestTag)) + actionsColor = LocalContentColor.current + expectedActionsColor = + TopAppBarDefaults.topAppBarColors().actionIconContentColor + } + ) + } + assertThat(navigationIconColor).isNotNull() + assertThat(titleColor).isNotNull() + assertThat(actionsColor).isNotNull() + assertThat(navigationIconColor).isEqualTo(expectedNavigationIconColor) + assertThat(titleColor).isEqualTo(expectedTitleColor) + assertThat(actionsColor).isEqualTo(expectedActionsColor) + } + + @Test + fun largeTopAppBar_scrolled_positioning() { + val content = @Composable { scrollBehavior: TopAppBarScrollBehavior? -> + Box(Modifier.testTag(TopAppBarTestTag)) { + CustomizedLargeTopAppBar( + navigationIcon = { + FakeIcon(Modifier.testTag(NavigationIconTestTag)) + }, + title = "Title", + actions = { + FakeIcon(Modifier.testTag(ActionsTestTag)) + }, + scrollBehavior = scrollBehavior, + ) + } + } + assertLargeScrolledHeight( + MaxHeightWithoutTitle + DefaultTitleHeight, + MaxHeightWithoutTitle + DefaultTitleHeight, + content, + ) + } + + @OptIn(ExperimentalMaterial3Api::class) + @Test + fun topAppBar_enterAlways_allowHorizontalScroll() { + lateinit var state: LazyListState + rule.setContent { + state = rememberLazyListState() + MultiPageContent(TopAppBarDefaults.enterAlwaysScrollBehavior(), state) + } + + rule.onNodeWithTag(LazyListTag).performTouchInput { swipeLeft() } + rule.runOnIdle { + assertThat(state.firstVisibleItemIndex).isEqualTo(1) + } + + rule.onNodeWithTag(LazyListTag).performTouchInput { swipeRight() } + rule.runOnIdle { + assertThat(state.firstVisibleItemIndex).isEqualTo(0) + } + } + + @OptIn(ExperimentalMaterial3Api::class) + @Test + fun topAppBar_exitUntilCollapsed_allowHorizontalScroll() { + lateinit var state: LazyListState + rule.setContent { + state = rememberLazyListState() + MultiPageContent(TopAppBarDefaults.exitUntilCollapsedScrollBehavior(), state) + } + + rule.onNodeWithTag(LazyListTag).performTouchInput { swipeLeft() } + rule.runOnIdle { + assertThat(state.firstVisibleItemIndex).isEqualTo(1) + } + + rule.onNodeWithTag(LazyListTag).performTouchInput { swipeRight() } + rule.runOnIdle { + assertThat(state.firstVisibleItemIndex).isEqualTo(0) + } + } + + @OptIn(ExperimentalMaterial3Api::class) + @Test + fun topAppBar_pinned_allowHorizontalScroll() { + lateinit var state: LazyListState + rule.setContent { + state = rememberLazyListState() + MultiPageContent( + TopAppBarDefaults.pinnedScrollBehavior(), + state + ) + } + + rule.onNodeWithTag(LazyListTag).performTouchInput { swipeLeft() } + rule.runOnIdle { + assertThat(state.firstVisibleItemIndex).isEqualTo(1) + } + + rule.onNodeWithTag(LazyListTag).performTouchInput { swipeRight() } + rule.runOnIdle { + assertThat(state.firstVisibleItemIndex).isEqualTo(0) + } + } + + @OptIn(ExperimentalMaterial3Api::class) + @Composable + private fun MultiPageContent(scrollBehavior: TopAppBarScrollBehavior, state: LazyListState) { + Scaffold( + modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection), + topBar = { + CustomizedTopAppBar( + title = { Text(text = "Title") }, + ) + } + ) { contentPadding -> + LazyRow( + Modifier + .fillMaxSize() + .testTag(LazyListTag), state + ) { + items(2) { page -> + LazyColumn( + modifier = Modifier.fillParentMaxSize(), + contentPadding = contentPadding + ) { + items(50) { + Text( + modifier = Modifier.fillParentMaxWidth(), + text = "Item #$page x $it" + ) + } + } + } + } + } + } + + /** + * Checks the app bar's components positioning when it's a [CustomizedTopAppBar], a + * [CenterAlignedTopAppBar], or a larger app bar that is scrolled up and collapsed into a small + * configuration and there is no navigation icon. + */ + private fun assertSmallPositioningWithoutNavigation(isCenteredTitle: Boolean = false) { + val appBarBounds = rule.onNodeWithTag(TopAppBarTestTag).getUnclippedBoundsInRoot() + val titleBounds = rule.onNodeWithTag(TitleTestTag).getUnclippedBoundsInRoot() + + val titleNode = rule.onNodeWithTag(TitleTestTag) + // Title should be vertically centered + titleNode.assertTopPositionInRootIsEqualTo((appBarBounds.height - titleBounds.height) / 2) + if (isCenteredTitle) { + // Title should be horizontally centered + titleNode.assertLeftPositionInRootIsEqualTo( + (appBarBounds.width - titleBounds.width) / 2 + ) + } else { + // Title should now be placed 16.dp from the start, as there is no navigation icon + // 4.dp padding for the whole app bar + 12.dp inset + titleNode.assertLeftPositionInRootIsEqualTo(4.dp + 12.dp) + } + + rule.onNodeWithTag(ActionsTestTag) + // Action should still be placed at the end + .assertLeftPositionInRootIsEqualTo(expectedActionPosition(appBarBounds.width)) + } + + /** + * Checks the app bar's components positioning when it's a [CustomizedTopAppBar] or a + * [CenterAlignedTopAppBar]. + */ + private fun assertSmallDefaultPositioning(isCenteredTitle: Boolean = false) { + val appBarBounds = rule.onNodeWithTag(TopAppBarTestTag).getUnclippedBoundsInRoot() + val titleBounds = rule.onNodeWithTag(TitleTestTag).getUnclippedBoundsInRoot() + val appBarBottomEdgeY = appBarBounds.top + appBarBounds.height + + rule.onNodeWithTag(NavigationIconTestTag) + // Navigation icon should be 4.dp from the start + .assertLeftPositionInRootIsEqualTo(AppBarStartAndEndPadding) + // Navigation icon should be centered within the height of the app bar. + .assertTopPositionInRootIsEqualTo( + appBarBottomEdgeY - AppBarTopAndBottomPadding - FakeIconSize + ) + + val titleNode = rule.onNodeWithTag(TitleTestTag) + // Title should be vertically centered + titleNode.assertTopPositionInRootIsEqualTo((appBarBounds.height - titleBounds.height) / 2) + if (isCenteredTitle) { + // Title should be horizontally centered + titleNode.assertLeftPositionInRootIsEqualTo( + (appBarBounds.width - titleBounds.width) / 2 + ) + } else { + // Title should be 56.dp from the start + // 4.dp padding for the whole app bar + 48.dp icon size + 4.dp title padding. + titleNode.assertLeftPositionInRootIsEqualTo(4.dp + FakeIconSize + 4.dp) + } + + rule.onNodeWithTag(ActionsTestTag) + // Action should be placed at the end + .assertLeftPositionInRootIsEqualTo(expectedActionPosition(appBarBounds.width)) + // Action should be 8.dp from the top + .assertTopPositionInRootIsEqualTo( + appBarBottomEdgeY - AppBarTopAndBottomPadding - FakeIconSize + ) + } + + /** + * Checks that changing values at a [CustomizedLargeTopAppBar] scroll behavior + * affects the height of the app bar. + * + * This check partially and fully collapses the app bar to test its height. + * + * @param appBarMaxHeight the max height of the app bar [content] + * @param appBarMinHeight the min height of the app bar [content] + * @param content a Composable that adds a CustomizedLargeTopAppBar + */ + @OptIn(ExperimentalMaterial3Api::class) + private fun assertLargeScrolledHeight( + appBarMaxHeight: Dp, + appBarMinHeight: Dp, + content: @Composable (TopAppBarScrollBehavior?) -> Unit + ) { + val fullyCollapsedOffsetDp = appBarMaxHeight - appBarMinHeight + val partiallyCollapsedOffsetDp = fullyCollapsedOffsetDp / 3 + var partiallyCollapsedHeightOffsetPx = 0f + var fullyCollapsedHeightOffsetPx = 0f + lateinit var scrollBehavior: TopAppBarScrollBehavior + rule.setContent { + scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior() + with(LocalDensity.current) { + partiallyCollapsedHeightOffsetPx = partiallyCollapsedOffsetDp.toPx() + fullyCollapsedHeightOffsetPx = fullyCollapsedOffsetDp.toPx() + } + + content(scrollBehavior) + } + + // Simulate a partially collapsed app bar. + rule.runOnIdle { + scrollBehavior.state.heightOffset = -partiallyCollapsedHeightOffsetPx + scrollBehavior.state.contentOffset = -partiallyCollapsedHeightOffsetPx + } + rule.waitForIdle() + rule.onNodeWithTag(TopAppBarTestTag) + .assertHeightIsEqualTo( + appBarMaxHeight - partiallyCollapsedOffsetDp + ) + + // Simulate a fully collapsed app bar. + rule.runOnIdle { + scrollBehavior.state.heightOffset = -fullyCollapsedHeightOffsetPx + // Simulate additional content scroll beyond the max offset scroll. + scrollBehavior.state.contentOffset = + -fullyCollapsedHeightOffsetPx - partiallyCollapsedHeightOffsetPx + } + rule.waitForIdle() + // Check that the app bar collapsed to its min height. + rule.onNodeWithTag(TopAppBarTestTag).assertHeightIsEqualTo(appBarMinHeight) + } + + /** + * An [IconButton] with an [Icon] inside for testing positions. + * + * An [IconButton] is defaulted to be 48X48dp, while its child [Icon] is defaulted to 24x24dp. + */ + private val FakeIcon = @Composable { modifier: Modifier -> + IconButton( + onClick = { /* doSomething() */ }, + modifier = modifier.semantics(mergeDescendants = true) {} + ) { + Icon(ColorPainter(Color.Red), null) + } + } + + private fun expectedActionPosition(appBarWidth: Dp): Dp = + appBarWidth - AppBarStartAndEndPadding - FakeIconSize + + private val FakeIconSize = 48.dp + private val AppBarStartAndEndPadding = 4.dp + private val AppBarTopAndBottomPadding = (ContainerHeight - FakeIconSize) / 2 + + private val LazyListTag = "lazyList" + private val TopAppBarTestTag = "bar" + private val NavigationIconTestTag = "navigationIcon" + private val TitleTestTag = "title" + private val ActionsTestTag = "actions" +} diff --git a/packages/SettingsLib/Spa/testutils/src/com/android/settingslib/spa/testutils/ComposeContentTestRuleExt.kt b/packages/SettingsLib/Spa/testutils/src/com/android/settingslib/spa/testutils/ComposeContentTestRuleExt.kt index a5d1f402e022..0436fc275b60 100644 --- a/packages/SettingsLib/Spa/testutils/src/com/android/settingslib/spa/testutils/ComposeContentTestRuleExt.kt +++ b/packages/SettingsLib/Spa/testutils/src/com/android/settingslib/spa/testutils/ComposeContentTestRuleExt.kt @@ -16,13 +16,28 @@ package com.android.settingslib.spa.testutils +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.sizeIn +import androidx.compose.material3.Surface +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.testTag import androidx.compose.ui.test.ComposeTimeoutException import androidx.compose.ui.test.SemanticsMatcher import androidx.compose.ui.test.SemanticsNodeInteraction +import androidx.compose.ui.test.getUnclippedBoundsInRoot import androidx.compose.ui.test.hasAnyAncestor import androidx.compose.ui.test.hasText import androidx.compose.ui.test.isDialog import androidx.compose.ui.test.junit4.ComposeContentTestRule +import androidx.compose.ui.test.junit4.ComposeTestRule +import androidx.compose.ui.test.onNodeWithTag +import androidx.compose.ui.test.onRoot +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.height +import androidx.compose.ui.unit.width +import com.android.settingslib.spa.framework.theme.SettingsTheme /** Blocks until the found a semantics node that match the given condition. */ fun ComposeContentTestRule.waitUntilExists(matcher: SemanticsMatcher) = waitUntil { @@ -39,3 +54,39 @@ fun ComposeContentTestRule.delay(timeoutMillis: Long = 1_000) = try { /** Finds a text node that within dialog. */ fun ComposeContentTestRule.onDialogText(text: String): SemanticsNodeInteraction = onNode(hasAnyAncestor(isDialog()) and hasText(text)) + +fun ComposeTestRule.rootWidth(): Dp = onRoot().getUnclippedBoundsInRoot().width + +fun ComposeTestRule.rootHeight(): Dp = onRoot().getUnclippedBoundsInRoot().height + +/** + * Constant to emulate very big but finite constraints + */ +private val sizeAssertionMaxSize = 5000.dp + +private const val SIZE_ASSERTION_TAG = "containerForSizeAssertion" + +fun ComposeContentTestRule.setContentForSizeAssertions( + parentMaxWidth: Dp = sizeAssertionMaxSize, + parentMaxHeight: Dp = sizeAssertionMaxSize, + // TODO : figure out better way to make it flexible + content: @Composable () -> Unit +): SemanticsNodeInteraction { + setContent { + SettingsTheme { + Surface { + Box { + Box( + Modifier + .sizeIn(maxWidth = parentMaxWidth, maxHeight = parentMaxHeight) + .testTag(SIZE_ASSERTION_TAG) + ) { + content() + } + } + } + } + } + + return onNodeWithTag(SIZE_ASSERTION_TAG) +} diff --git a/packages/SettingsLib/SpaPrivileged/res/values-ko/strings.xml b/packages/SettingsLib/SpaPrivileged/res/values-ko/strings.xml index ef4ee0dba4a5..3e1b837bf893 100644 --- a/packages/SettingsLib/SpaPrivileged/res/values-ko/strings.xml +++ b/packages/SettingsLib/SpaPrivileged/res/values-ko/strings.xml @@ -23,5 +23,5 @@ <string name="app_permission_summary_allowed" msgid="6115213465364138103">"허용됨"</string> <string name="app_permission_summary_not_allowed" msgid="58396132188553920">"허용되지 않음"</string> <string name="version_text" msgid="4001669804596458577">"버전 <xliff:g id="VERSION_NUM">%1$s</xliff:g>"</string> - <string name="cloned_app_info_label" msgid="1765651167024478391">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> 클론"</string> + <string name="cloned_app_info_label" msgid="1765651167024478391">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> 복제"</string> </resources> diff --git a/packages/SettingsLib/res/values-af/arrays.xml b/packages/SettingsLib/res/values-af/arrays.xml index 41499b0eeb59..a96ea0dcc86e 100644 --- a/packages/SettingsLib/res/values-af/arrays.xml +++ b/packages/SettingsLib/res/values-af/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Oudiobron"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-am/arrays.xml b/packages/SettingsLib/res/values-am/arrays.xml index 6fb1274291f0..5f7aec2abc00 100644 --- a/packages/SettingsLib/res/values-am/arrays.xml +++ b/packages/SettingsLib/res/values-am/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"የኦዲዮ ምንጭ"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ar/arrays.xml b/packages/SettingsLib/res/values-ar/arrays.xml index cb1ec38d1773..461c637ab0eb 100644 --- a/packages/SettingsLib/res/values-ar/arrays.xml +++ b/packages/SettingsLib/res/values-ar/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"مصدر الصوت"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-as/arrays.xml b/packages/SettingsLib/res/values-as/arrays.xml index 2eaf5fa020f6..7e43ab322e60 100644 --- a/packages/SettingsLib/res/values-as/arrays.xml +++ b/packages/SettingsLib/res/values-as/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"ধ্বনিৰ উৎস"</item> <item msgid="8688681727755534982">"এমআইডিআই"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-az/arrays.xml b/packages/SettingsLib/res/values-az/arrays.xml index f01def043282..357a2034ce9f 100644 --- a/packages/SettingsLib/res/values-az/arrays.xml +++ b/packages/SettingsLib/res/values-az/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Audio Mənbə"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml b/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml index 772c3398ae96..0bcd9bcd5346 100644 --- a/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml +++ b/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Izvor zvuka"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-be/arrays.xml b/packages/SettingsLib/res/values-be/arrays.xml index d2537259f1bd..3f5da1119b4d 100644 --- a/packages/SettingsLib/res/values-be/arrays.xml +++ b/packages/SettingsLib/res/values-be/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Крыніца аўдыя"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-bg/arrays.xml b/packages/SettingsLib/res/values-bg/arrays.xml index 6be882718edb..b80b5eb76423 100644 --- a/packages/SettingsLib/res/values-bg/arrays.xml +++ b/packages/SettingsLib/res/values-bg/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Аудиоизточник"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-bn/arrays.xml b/packages/SettingsLib/res/values-bn/arrays.xml index b0a1c29a383a..71228c74a402 100644 --- a/packages/SettingsLib/res/values-bn/arrays.xml +++ b/packages/SettingsLib/res/values-bn/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"অডিও উৎস"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-bs/arrays.xml b/packages/SettingsLib/res/values-bs/arrays.xml index 77d9a207e5eb..f664618483d4 100644 --- a/packages/SettingsLib/res/values-bs/arrays.xml +++ b/packages/SettingsLib/res/values-bs/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Izvor zvuka"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ca/arrays.xml b/packages/SettingsLib/res/values-ca/arrays.xml index 1e333cc2e54f..24761412f5b8 100644 --- a/packages/SettingsLib/res/values-ca/arrays.xml +++ b/packages/SettingsLib/res/values-ca/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Font d\'àudio"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-cs/arrays.xml b/packages/SettingsLib/res/values-cs/arrays.xml index 034a1330e5cc..c0b939543329 100644 --- a/packages/SettingsLib/res/values-cs/arrays.xml +++ b/packages/SettingsLib/res/values-cs/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Zdroj zvuku"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-da/arrays.xml b/packages/SettingsLib/res/values-da/arrays.xml index 9f3db17d6d9d..163ee53535c1 100644 --- a/packages/SettingsLib/res/values-da/arrays.xml +++ b/packages/SettingsLib/res/values-da/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Lydkilde"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-de/arrays.xml b/packages/SettingsLib/res/values-de/arrays.xml index 05c463075157..5e80e3c1e920 100644 --- a/packages/SettingsLib/res/values-de/arrays.xml +++ b/packages/SettingsLib/res/values-de/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Audioquelle"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-el/arrays.xml b/packages/SettingsLib/res/values-el/arrays.xml index 4e8736c1951a..3d60335b57ea 100644 --- a/packages/SettingsLib/res/values-el/arrays.xml +++ b/packages/SettingsLib/res/values-el/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Πηγή ήχου"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-en-rAU/arrays.xml b/packages/SettingsLib/res/values-en-rAU/arrays.xml index df643cd12505..fa637be68f1e 100644 --- a/packages/SettingsLib/res/values-en-rAU/arrays.xml +++ b/packages/SettingsLib/res/values-en-rAU/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Audio Source"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-en-rCA/arrays.xml b/packages/SettingsLib/res/values-en-rCA/arrays.xml index 184d21005cc1..ea8f2c503467 100644 --- a/packages/SettingsLib/res/values-en-rCA/arrays.xml +++ b/packages/SettingsLib/res/values-en-rCA/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Audio Source"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-en-rGB/arrays.xml b/packages/SettingsLib/res/values-en-rGB/arrays.xml index df643cd12505..fa637be68f1e 100644 --- a/packages/SettingsLib/res/values-en-rGB/arrays.xml +++ b/packages/SettingsLib/res/values-en-rGB/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Audio Source"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-en-rIN/arrays.xml b/packages/SettingsLib/res/values-en-rIN/arrays.xml index df643cd12505..fa637be68f1e 100644 --- a/packages/SettingsLib/res/values-en-rIN/arrays.xml +++ b/packages/SettingsLib/res/values-en-rIN/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Audio Source"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-en-rXC/arrays.xml b/packages/SettingsLib/res/values-en-rXC/arrays.xml index dec70f456d1e..6b404a8e2159 100644 --- a/packages/SettingsLib/res/values-en-rXC/arrays.xml +++ b/packages/SettingsLib/res/values-en-rXC/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Audio Source"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-es-rUS/arrays.xml b/packages/SettingsLib/res/values-es-rUS/arrays.xml index b1b1b2e6616b..27cdeeb6bd42 100644 --- a/packages/SettingsLib/res/values-es-rUS/arrays.xml +++ b/packages/SettingsLib/res/values-es-rUS/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Fuente de audio"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml index ae24ff0ce28f..39fd3412a8b9 100644 --- a/packages/SettingsLib/res/values-es-rUS/strings.xml +++ b/packages/SettingsLib/res/values-es-rUS/strings.xml @@ -682,7 +682,7 @@ <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="268234802198852753">"Si transmites <xliff:g id="SWITCHAPP">%1$s</xliff:g> o cambias la salida, tu transmisión actual se detendrá"</string> <string name="bt_le_audio_broadcast_dialog_switch_app" msgid="5749813313369517812">"Transmitir <xliff:g id="SWITCHAPP">%1$s</xliff:g>"</string> <string name="bt_le_audio_broadcast_dialog_different_output" msgid="2638402023060391333">"Cambia la salida"</string> - <string name="back_navigation_animation" msgid="8105467568421689484">"Animaciones de retroceso predictivas"</string> + <string name="back_navigation_animation" msgid="8105467568421689484">"Animaciones de gesto predictivo"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Habilita animaciones del sistema para gestos de retroceso predictivos."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Esta configuración habilita las animaciones del sistema para la animación de gestos predictiva. Se requiere la configuración por app de enableOnBackInvokedCallback en verdadero en el archivo de manifiesto."</string> <string-array name="udfps_accessibility_touch_hints"> diff --git a/packages/SettingsLib/res/values-es/arrays.xml b/packages/SettingsLib/res/values-es/arrays.xml index eee731502db8..a16093aa65bd 100644 --- a/packages/SettingsLib/res/values-es/arrays.xml +++ b/packages/SettingsLib/res/values-es/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Fuente de audio"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-et/arrays.xml b/packages/SettingsLib/res/values-et/arrays.xml index 224583fcf653..d6869614ce87 100644 --- a/packages/SettingsLib/res/values-et/arrays.xml +++ b/packages/SettingsLib/res/values-et/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Heliallikas"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-eu/arrays.xml b/packages/SettingsLib/res/values-eu/arrays.xml index e2867c2e2736..3b980c5a5770 100644 --- a/packages/SettingsLib/res/values-eu/arrays.xml +++ b/packages/SettingsLib/res/values-eu/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Audio-iturburua"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-fa/arrays.xml b/packages/SettingsLib/res/values-fa/arrays.xml index 7feef7030413..0eb381f90f45 100644 --- a/packages/SettingsLib/res/values-fa/arrays.xml +++ b/packages/SettingsLib/res/values-fa/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"منبع صوتی"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml index 33d262fcca74..9f33fa424425 100644 --- a/packages/SettingsLib/res/values-fa/strings.xml +++ b/packages/SettingsLib/res/values-fa/strings.xml @@ -86,7 +86,7 @@ <string name="bluetooth_disconnecting" msgid="7638892134401574338">"در حال قطع اتصال..."</string> <string name="bluetooth_connecting" msgid="5871702668260192755">"در حال اتصال…"</string> <string name="bluetooth_connected" msgid="8065345572198502293">"متصل<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string> - <string name="bluetooth_pairing" msgid="4269046942588193600">"در حال مرتبطسازی..."</string> + <string name="bluetooth_pairing" msgid="4269046942588193600">"درحال جفت کردن..."</string> <string name="bluetooth_connected_no_headset" msgid="2224101138659967604">"متصل (بدون تلفن)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string> <string name="bluetooth_connected_no_a2dp" msgid="8566874395813947092">"متصل (بدون رسانه)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string> <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2893204819854215433">"متصل (بدون تلفن یا رسانه)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string> @@ -247,7 +247,7 @@ <string name="adb_pairing_device_dialog_failed_title" msgid="3426758947882091735">"مرتبطسازی ناموفق"</string> <string name="adb_pairing_device_dialog_failed_msg" msgid="6611097519661997148">"مطمئن شوید که دستگاه به همان شبکه متصل باشد."</string> <string name="adb_wireless_qrcode_summary" msgid="8051414549011801917">"دستگاه را ازطریق Wi‑Fi و با اسکن کردن رمزینه پاسخسریع مرتبط کنید"</string> - <string name="adb_wireless_verifying_qrcode_text" msgid="6123192424916029207">"مرتبطسازی دستگاه…"</string> + <string name="adb_wireless_verifying_qrcode_text" msgid="6123192424916029207">"جفت کردن دستگاه…"</string> <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"جفت کردن دستگاه انجام نشد. یا رمزینه پاسخسریع اشتباه بوده است، یا دستگاه به همان شبکه متصل نیست."</string> <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"نشانی IP و درگاه"</string> <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"اسکن رمزینه پاسخسریع"</string> diff --git a/packages/SettingsLib/res/values-fi/arrays.xml b/packages/SettingsLib/res/values-fi/arrays.xml index 5a1dc182e83a..a3cfd15ad119 100644 --- a/packages/SettingsLib/res/values-fi/arrays.xml +++ b/packages/SettingsLib/res/values-fi/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Äänilähde"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-fr-rCA/arrays.xml b/packages/SettingsLib/res/values-fr-rCA/arrays.xml index 06a703f6b675..3fb18334638d 100644 --- a/packages/SettingsLib/res/values-fr-rCA/arrays.xml +++ b/packages/SettingsLib/res/values-fr-rCA/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Source audio"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-fr/arrays.xml b/packages/SettingsLib/res/values-fr/arrays.xml index bb650c3f4ada..a1a8c99f3eba 100644 --- a/packages/SettingsLib/res/values-fr/arrays.xml +++ b/packages/SettingsLib/res/values-fr/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Source audio"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-gl/arrays.xml b/packages/SettingsLib/res/values-gl/arrays.xml index 797f84b350f4..bd88e8351d2c 100644 --- a/packages/SettingsLib/res/values-gl/arrays.xml +++ b/packages/SettingsLib/res/values-gl/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Fonte de audio"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-gu/arrays.xml b/packages/SettingsLib/res/values-gu/arrays.xml index 93d34324208b..e33c7592cbcc 100644 --- a/packages/SettingsLib/res/values-gu/arrays.xml +++ b/packages/SettingsLib/res/values-gu/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"ઑડિઓ સ્રોત"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-hi/arrays.xml b/packages/SettingsLib/res/values-hi/arrays.xml index 4ee7689a36f2..2403848229bd 100644 --- a/packages/SettingsLib/res/values-hi/arrays.xml +++ b/packages/SettingsLib/res/values-hi/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"ऑडियो स्रोत"</item> <item msgid="8688681727755534982">"एमआईडीआई"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml index 21936c8131d5..bd508d93e50d 100644 --- a/packages/SettingsLib/res/values-hi/strings.xml +++ b/packages/SettingsLib/res/values-hi/strings.xml @@ -355,10 +355,8 @@ <string name="pointer_location_summary" msgid="957120116989798464">"मौजूदा टच डेटा दिखाने वाला स्क्रीन ओवरले"</string> <string name="show_touches" msgid="8437666942161289025">"टैप दिखाएं"</string> <string name="show_touches_summary" msgid="3692861665994502193">"टैप के लिए विज़ुअल फ़ीडबैक दिखाएं"</string> - <!-- no translation found for show_key_presses (6360141722735900214) --> - <skip /> - <!-- no translation found for show_key_presses_summary (725387457373015024) --> - <skip /> + <string name="show_key_presses" msgid="6360141722735900214">"दबाए गए बटन दिखाएं"</string> + <string name="show_key_presses_summary" msgid="725387457373015024">"दबाए गए बटन के लिए विज़ुअल फ़ीडबैक दिखाएं"</string> <string name="show_screen_updates" msgid="2078782895825535494">"सर्फ़ेस अपडेट दिखाएं"</string> <string name="show_screen_updates_summary" msgid="2126932969682087406">"अपडेट होने पर पूरे विंडो सर्फ़ेस फ़्लैश करें"</string> <string name="show_hw_screen_updates" msgid="2021286231267747506">"जीपीयू व्यू के अपडेट दिखाएं"</string> diff --git a/packages/SettingsLib/res/values-hr/arrays.xml b/packages/SettingsLib/res/values-hr/arrays.xml index 8111b7369e94..3cb64abeb9b9 100644 --- a/packages/SettingsLib/res/values-hr/arrays.xml +++ b/packages/SettingsLib/res/values-hr/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Audioizvor"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-hu/arrays.xml b/packages/SettingsLib/res/values-hu/arrays.xml index ee1ace0d16fc..f4c11762035d 100644 --- a/packages/SettingsLib/res/values-hu/arrays.xml +++ b/packages/SettingsLib/res/values-hu/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Hangforrás"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-hy/arrays.xml b/packages/SettingsLib/res/values-hy/arrays.xml index 01b97a8e2043..e9c366d9b25c 100644 --- a/packages/SettingsLib/res/values-hy/arrays.xml +++ b/packages/SettingsLib/res/values-hy/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Ձայնի աղբյուրը"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-in/arrays.xml b/packages/SettingsLib/res/values-in/arrays.xml index 8eac26774e7d..95aeee75d267 100644 --- a/packages/SettingsLib/res/values-in/arrays.xml +++ b/packages/SettingsLib/res/values-in/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Sumber Audio"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-is/arrays.xml b/packages/SettingsLib/res/values-is/arrays.xml index 01ce83f420a1..f0ee71846879 100644 --- a/packages/SettingsLib/res/values-is/arrays.xml +++ b/packages/SettingsLib/res/values-is/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Audio Source"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-it/arrays.xml b/packages/SettingsLib/res/values-it/arrays.xml index be718dbcb5e4..b6b2fdeae2a7 100644 --- a/packages/SettingsLib/res/values-it/arrays.xml +++ b/packages/SettingsLib/res/values-it/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Sorgente audio"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-iw/arrays.xml b/packages/SettingsLib/res/values-iw/arrays.xml index 2600d9c6f19e..ca3a4dd57082 100644 --- a/packages/SettingsLib/res/values-iw/arrays.xml +++ b/packages/SettingsLib/res/values-iw/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"מקור אודיו"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ja/arrays.xml b/packages/SettingsLib/res/values-ja/arrays.xml index ab84488642ff..b3267fe3aa25 100644 --- a/packages/SettingsLib/res/values-ja/arrays.xml +++ b/packages/SettingsLib/res/values-ja/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"オーディオソース"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ka/arrays.xml b/packages/SettingsLib/res/values-ka/arrays.xml index be4403867fec..ab6acfd4f628 100644 --- a/packages/SettingsLib/res/values-ka/arrays.xml +++ b/packages/SettingsLib/res/values-ka/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"აუდიო წყარo"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-kk/arrays.xml b/packages/SettingsLib/res/values-kk/arrays.xml index 7d7169949d19..2b1d700ed58e 100644 --- a/packages/SettingsLib/res/values-kk/arrays.xml +++ b/packages/SettingsLib/res/values-kk/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Аудио көзі"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-km/arrays.xml b/packages/SettingsLib/res/values-km/arrays.xml index 548e2d63399e..0f20bf0d1f81 100644 --- a/packages/SettingsLib/res/values-km/arrays.xml +++ b/packages/SettingsLib/res/values-km/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"ប្រភពអូឌីយ៉ូ"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-kn/arrays.xml b/packages/SettingsLib/res/values-kn/arrays.xml index aa29850738b6..00e8049d02c5 100644 --- a/packages/SettingsLib/res/values-kn/arrays.xml +++ b/packages/SettingsLib/res/values-kn/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"ಆಡಿಯೊ ಮೂಲ"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ko/arrays.xml b/packages/SettingsLib/res/values-ko/arrays.xml index bc739b9e8a27..85a0a4ad98b1 100644 --- a/packages/SettingsLib/res/values-ko/arrays.xml +++ b/packages/SettingsLib/res/values-ko/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"오디오 소스"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ky/arrays.xml b/packages/SettingsLib/res/values-ky/arrays.xml index 71e10da1ee65..eb295ae76134 100644 --- a/packages/SettingsLib/res/values-ky/arrays.xml +++ b/packages/SettingsLib/res/values-ky/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Аудио булак"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-lo/arrays.xml b/packages/SettingsLib/res/values-lo/arrays.xml index 79cdd6f0a225..ccb777b19464 100644 --- a/packages/SettingsLib/res/values-lo/arrays.xml +++ b/packages/SettingsLib/res/values-lo/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"ແຫຼ່ງທີ່ມາຂອງສຽງ"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-lt/arrays.xml b/packages/SettingsLib/res/values-lt/arrays.xml index d37fb32dd98b..010b3b49c9fb 100644 --- a/packages/SettingsLib/res/values-lt/arrays.xml +++ b/packages/SettingsLib/res/values-lt/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Garso šaltinis"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-lv/arrays.xml b/packages/SettingsLib/res/values-lv/arrays.xml index af62148e6048..2c7ac9846bb4 100644 --- a/packages/SettingsLib/res/values-lv/arrays.xml +++ b/packages/SettingsLib/res/values-lv/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Audio avots"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-mk/arrays.xml b/packages/SettingsLib/res/values-mk/arrays.xml index 6cf933e05c02..a276eb3a8200 100644 --- a/packages/SettingsLib/res/values-mk/arrays.xml +++ b/packages/SettingsLib/res/values-mk/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Аудиоизвор"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ml/arrays.xml b/packages/SettingsLib/res/values-ml/arrays.xml index 29c4a5509ed7..6eb432cb2213 100644 --- a/packages/SettingsLib/res/values-ml/arrays.xml +++ b/packages/SettingsLib/res/values-ml/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"ഓഡിയോ ഉറവിടം"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-mn/arrays.xml b/packages/SettingsLib/res/values-mn/arrays.xml index acd559434d0c..925c827d9bf3 100644 --- a/packages/SettingsLib/res/values-mn/arrays.xml +++ b/packages/SettingsLib/res/values-mn/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Аудио эх сурвалж"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-mr/arrays.xml b/packages/SettingsLib/res/values-mr/arrays.xml index 02dd07c28dad..e3b6ae63ee51 100644 --- a/packages/SettingsLib/res/values-mr/arrays.xml +++ b/packages/SettingsLib/res/values-mr/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"ऑडिओ स्रोत"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ms/arrays.xml b/packages/SettingsLib/res/values-ms/arrays.xml index 3ee713182681..6b8bce4aaae9 100644 --- a/packages/SettingsLib/res/values-ms/arrays.xml +++ b/packages/SettingsLib/res/values-ms/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Sumber Audio"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-my/arrays.xml b/packages/SettingsLib/res/values-my/arrays.xml index 50be181f0c75..59e1862b5cbe 100644 --- a/packages/SettingsLib/res/values-my/arrays.xml +++ b/packages/SettingsLib/res/values-my/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"အသံ ရင်းမြစ်"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-nb/arrays.xml b/packages/SettingsLib/res/values-nb/arrays.xml index 302932957401..c364c58d2013 100644 --- a/packages/SettingsLib/res/values-nb/arrays.xml +++ b/packages/SettingsLib/res/values-nb/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Lydkilde"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ne/arrays.xml b/packages/SettingsLib/res/values-ne/arrays.xml index f464f3135f49..eaea3ba41bc2 100644 --- a/packages/SettingsLib/res/values-ne/arrays.xml +++ b/packages/SettingsLib/res/values-ne/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"अडियो स्रोत"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-nl/arrays.xml b/packages/SettingsLib/res/values-nl/arrays.xml index f40eec1ee2bb..b8e945ff7982 100644 --- a/packages/SettingsLib/res/values-nl/arrays.xml +++ b/packages/SettingsLib/res/values-nl/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Audiobron"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-or/arrays.xml b/packages/SettingsLib/res/values-or/arrays.xml index 8c5589c31cb3..d649907966f6 100644 --- a/packages/SettingsLib/res/values-or/arrays.xml +++ b/packages/SettingsLib/res/values-or/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"ଅଡିଓ ଉତ୍ସ"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml index 22f923dffaf7..bf7470cd3dd8 100644 --- a/packages/SettingsLib/res/values-or/strings.xml +++ b/packages/SettingsLib/res/values-or/strings.xml @@ -577,7 +577,7 @@ <string name="delete_blob_confirmation_text" msgid="7807446938920827280">"ଆପଣ ସେୟାର୍ କରାଯାଇଥିବା ଏହି ଡାଟା ଡିଲିଟ୍ କରିବାକୁ ଚାହୁଁଥିବା ନିଶ୍ଚିତ କି?"</string> <string name="user_add_user_item_summary" msgid="5748424612724703400">"ଉପଯୋଗକର୍ତ୍ତାମାନଙ୍କ ପାଖରେ ନିଜର ଆପ୍ ଓ କଣ୍ଟେଣ୍ଟ ଅଛି"</string> <string name="user_add_profile_item_summary" msgid="5418602404308968028">"ନିଜ ଆକାଉଣ୍ଟରୁ ଆପ୍ ତଥା କଣ୍ଟେଣ୍ଟକୁ ଆପଣ ଆକ୍ସେସ୍ ରୋକିପାରିବେ"</string> - <string name="user_add_user_item_title" msgid="2394272381086965029">"ଉପଯୋଗକର୍ତ୍ତା"</string> + <string name="user_add_user_item_title" msgid="2394272381086965029">"ୟୁଜର"</string> <string name="user_add_profile_item_title" msgid="3111051717414643029">"ସୀମିତ ସୁବିଧା ଥିବା ପ୍ରୋଫାଇଲ୍"</string> <string name="user_add_user_title" msgid="5457079143694924885">"ନୂଆ ୟୁଜରଙ୍କୁ ଯୋଗ କରିବେ?"</string> <string name="user_add_user_message_long" msgid="1527434966294733380">"ଅତିରିକ୍ତ ୟୁଜରଙ୍କୁ ଯୋଗ କରି ଆପଣ ଏହି ଡିଭାଇସକୁ ଅନ୍ୟ ଲୋକମାନଙ୍କ ସହିତ ସେୟାର କରିପାରିବେ। ପ୍ରତ୍ୟେକ ୟୁଜରଙ୍କ ନିଜର ସ୍ପେସ ଅଛି ଯାହାକୁ ସେମାନେ ଆପ, ୱାଲପେପର ଓ ଏପରି ଅନେକ କିଛି ସହିତ କଷ୍ଟମାଇଜ କରିପାରିବେ। ୟୁଜର ୱାଇ-ଫାଇ ଭଳି ଡିଭାଇସ ସେଟିଂସକୁ ମଧ୍ୟ ଆଡଜଷ୍ଟ କରିପାରିବେ ଯାହା ସମସ୍ତଙ୍କୁ ପ୍ରଭାବିତ କରିଥାଏ। \n\nଯେତେବେଳେ ଆପଣ ଜଣେ ନୂଆ ୟୁଜରଙ୍କୁ ଯୋଗ କରିବେ, ସେତେବେଳେ ସେହି ବ୍ୟକ୍ତିଙ୍କୁ ନିଜର ସ୍ପେସକୁ ସେଟଅପ କରିବାକୁ ପଡ଼ିବ। \n\nଅନ୍ୟ ୟୁଜରଙ୍କ ପାଇଁ ଯେ କୌଣସି ୟୁଜର ଆପକୁ ଅପଡେଟ କରିପାରିବେ। ଆକ୍ସେସିବିଲିଟୀ ସେଟିଂସ ଏବଂ ସେବାଗୁଡ଼ିକ ନୂଆ ୟୁଜରଙ୍କୁ ସ୍ଥାନାନ୍ତର ହୋଇନପାରେ।"</string> diff --git a/packages/SettingsLib/res/values-pa/arrays.xml b/packages/SettingsLib/res/values-pa/arrays.xml index 4225e02996e4..4f58a3c7f150 100644 --- a/packages/SettingsLib/res/values-pa/arrays.xml +++ b/packages/SettingsLib/res/values-pa/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">" ਆਡੀਓ ਸਰੋਤ"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-pl/arrays.xml b/packages/SettingsLib/res/values-pl/arrays.xml index 031cd9c04910..671ae4129777 100644 --- a/packages/SettingsLib/res/values-pl/arrays.xml +++ b/packages/SettingsLib/res/values-pl/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Źródło dźwięku"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-pt-rBR/arrays.xml b/packages/SettingsLib/res/values-pt-rBR/arrays.xml index 3b61e1a37e33..e3b77017c006 100644 --- a/packages/SettingsLib/res/values-pt-rBR/arrays.xml +++ b/packages/SettingsLib/res/values-pt-rBR/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Fonte de áudio"</item> <item msgid="8688681727755534982">"MIDI (som)"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-pt-rPT/arrays.xml b/packages/SettingsLib/res/values-pt-rPT/arrays.xml index 9b472dd0d5cf..ba302806de8a 100644 --- a/packages/SettingsLib/res/values-pt-rPT/arrays.xml +++ b/packages/SettingsLib/res/values-pt-rPT/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Fonte de áudio"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-pt/arrays.xml b/packages/SettingsLib/res/values-pt/arrays.xml index 3b61e1a37e33..e3b77017c006 100644 --- a/packages/SettingsLib/res/values-pt/arrays.xml +++ b/packages/SettingsLib/res/values-pt/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Fonte de áudio"</item> <item msgid="8688681727755534982">"MIDI (som)"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ro/arrays.xml b/packages/SettingsLib/res/values-ro/arrays.xml index f713051a7b40..613a631811a6 100644 --- a/packages/SettingsLib/res/values-ro/arrays.xml +++ b/packages/SettingsLib/res/values-ro/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Sursă audio"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ru/arrays.xml b/packages/SettingsLib/res/values-ru/arrays.xml index 80ae696c67de..c1bb31ee8d40 100644 --- a/packages/SettingsLib/res/values-ru/arrays.xml +++ b/packages/SettingsLib/res/values-ru/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Источник аудио"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-si/arrays.xml b/packages/SettingsLib/res/values-si/arrays.xml index 01103f515ea6..0fa107448db4 100644 --- a/packages/SettingsLib/res/values-si/arrays.xml +++ b/packages/SettingsLib/res/values-si/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"ශ්රව්ය මූලය"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-sk/arrays.xml b/packages/SettingsLib/res/values-sk/arrays.xml index 5a6eb992446d..ecc4afecc186 100644 --- a/packages/SettingsLib/res/values-sk/arrays.xml +++ b/packages/SettingsLib/res/values-sk/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Zdroj zvuku"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-sl/arrays.xml b/packages/SettingsLib/res/values-sl/arrays.xml index aff47ed32ea3..0f2225ae0ea5 100644 --- a/packages/SettingsLib/res/values-sl/arrays.xml +++ b/packages/SettingsLib/res/values-sl/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Vir zvoka"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-sq/arrays.xml b/packages/SettingsLib/res/values-sq/arrays.xml index 60dba5b5016a..d92ee582ed82 100644 --- a/packages/SettingsLib/res/values-sq/arrays.xml +++ b/packages/SettingsLib/res/values-sq/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Burimi i audios"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-sr/arrays.xml b/packages/SettingsLib/res/values-sr/arrays.xml index d74f55bdd418..69564fa9848d 100644 --- a/packages/SettingsLib/res/values-sr/arrays.xml +++ b/packages/SettingsLib/res/values-sr/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Извор звука"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-sv/arrays.xml b/packages/SettingsLib/res/values-sv/arrays.xml index 5ff90cbf5b3e..daaa1386492b 100644 --- a/packages/SettingsLib/res/values-sv/arrays.xml +++ b/packages/SettingsLib/res/values-sv/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Ljudkälla"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-sw/arrays.xml b/packages/SettingsLib/res/values-sw/arrays.xml index 30cc69f10c65..a5555969bf5c 100644 --- a/packages/SettingsLib/res/values-sw/arrays.xml +++ b/packages/SettingsLib/res/values-sw/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Chanzo cha Sauti"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ta/arrays.xml b/packages/SettingsLib/res/values-ta/arrays.xml index 5774bf9384ac..6195e3c10e6e 100644 --- a/packages/SettingsLib/res/values-ta/arrays.xml +++ b/packages/SettingsLib/res/values-ta/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"ஆடியோ மூலம்"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-te/arrays.xml b/packages/SettingsLib/res/values-te/arrays.xml index d250352ea811..2a31c0dad2d0 100644 --- a/packages/SettingsLib/res/values-te/arrays.xml +++ b/packages/SettingsLib/res/values-te/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"ఆడియో మూలం"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml index 32738bb2eacf..ae1b2519609b 100644 --- a/packages/SettingsLib/res/values-te/strings.xml +++ b/packages/SettingsLib/res/values-te/strings.xml @@ -378,7 +378,7 @@ <string name="transparent_navigation_bar_summary" msgid="5454359021817330722">"నావిగేషన్ బార్ బ్యాక్గ్రౌండ్ రంగును ఆటోమేటిక్గా పారదర్శకంగా చేయండి"</string> <string name="window_blurs" msgid="6831008984828425106">"విండో-స్థాయి బ్లర్ అనుమతించండి"</string> <string name="force_msaa" msgid="4081288296137775550">"4x MSAA అమలు తప్పనిసరి"</string> - <string name="force_msaa_summary" msgid="9070437493586769500">"OpenGL ES 2.0 యాప్లలో 4x MSAAను ప్రారంభించండి"</string> + <string name="force_msaa_summary" msgid="9070437493586769500">"OpenGL ES 2.0 యాప్లలో 4x MSAAను ఎనేబుల్ చేయండి"</string> <string name="show_non_rect_clip" msgid="7499758654867881817">"దీర్ఘ చతురస్రం కాని క్లిప్ ఆపరేషన్స్ను డీబగ్ చేయండి"</string> <string name="track_frame_time" msgid="522674651937771106">"ప్రొఫైల్ HWUI రెండరింగ్"</string> <string name="enable_gpu_debug_layers" msgid="4986675516188740397">"GPU డీబగ్ లేయర్లను ప్రారంభించండి"</string> diff --git a/packages/SettingsLib/res/values-th/arrays.xml b/packages/SettingsLib/res/values-th/arrays.xml index bf6bf177ce0e..b66fe5c8e635 100644 --- a/packages/SettingsLib/res/values-th/arrays.xml +++ b/packages/SettingsLib/res/values-th/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"แหล่งที่มาของเสียง"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-tl/arrays.xml b/packages/SettingsLib/res/values-tl/arrays.xml index 9af30d6fed7b..d9fee742e54c 100644 --- a/packages/SettingsLib/res/values-tl/arrays.xml +++ b/packages/SettingsLib/res/values-tl/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Pinagmulan ng Audio"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-tr/arrays.xml b/packages/SettingsLib/res/values-tr/arrays.xml index 6d8821eb34c5..e22ad902e3a6 100644 --- a/packages/SettingsLib/res/values-tr/arrays.xml +++ b/packages/SettingsLib/res/values-tr/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Ses Kaynağı"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-uk/arrays.xml b/packages/SettingsLib/res/values-uk/arrays.xml index b606d07aeb63..dc02eebc218c 100644 --- a/packages/SettingsLib/res/values-uk/arrays.xml +++ b/packages/SettingsLib/res/values-uk/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Джерело аудіо"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ur/arrays.xml b/packages/SettingsLib/res/values-ur/arrays.xml index 6d4062d03477..be76762d9cde 100644 --- a/packages/SettingsLib/res/values-ur/arrays.xml +++ b/packages/SettingsLib/res/values-ur/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"آڈیو ماخذ"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-uz/arrays.xml b/packages/SettingsLib/res/values-uz/arrays.xml index da14d78538db..860761e0fa6b 100644 --- a/packages/SettingsLib/res/values-uz/arrays.xml +++ b/packages/SettingsLib/res/values-uz/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Audio manbasi"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-vi/arrays.xml b/packages/SettingsLib/res/values-vi/arrays.xml index 29858bd3cebe..4c6392b1a493 100644 --- a/packages/SettingsLib/res/values-vi/arrays.xml +++ b/packages/SettingsLib/res/values-vi/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Nguồn âm thanh"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-zh-rCN/arrays.xml b/packages/SettingsLib/res/values-zh-rCN/arrays.xml index 1eb597ad42f8..679098a8411e 100644 --- a/packages/SettingsLib/res/values-zh-rCN/arrays.xml +++ b/packages/SettingsLib/res/values-zh-rCN/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"音频来源"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-zh-rHK/arrays.xml b/packages/SettingsLib/res/values-zh-rHK/arrays.xml index e14f7199715a..746ac68f3afe 100644 --- a/packages/SettingsLib/res/values-zh-rHK/arrays.xml +++ b/packages/SettingsLib/res/values-zh-rHK/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"音效檔案來源"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-zh-rTW/arrays.xml b/packages/SettingsLib/res/values-zh-rTW/arrays.xml index 16890be75957..b7fb99bcbf4a 100644 --- a/packages/SettingsLib/res/values-zh-rTW/arrays.xml +++ b/packages/SettingsLib/res/values-zh-rTW/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"音訊來源"</item> <item msgid="8688681727755534982">"MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/res/values-zu/arrays.xml b/packages/SettingsLib/res/values-zu/arrays.xml index d20c7db714f1..63b19e25d1b7 100644 --- a/packages/SettingsLib/res/values-zu/arrays.xml +++ b/packages/SettingsLib/res/values-zu/arrays.xml @@ -282,6 +282,4 @@ <item msgid="8828567335701536560">"Umthombo Womsindo"</item> <item msgid="8688681727755534982">"I-MIDI"</item> </string-array> - <string-array name="avatar_image_descriptions"> - </string-array> </resources> diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/InterestingConfigChanges.java b/packages/SettingsLib/src/com/android/settingslib/applications/InterestingConfigChanges.java index 64a0781c4643..5d520ce5d81f 100644 --- a/packages/SettingsLib/src/com/android/settingslib/applications/InterestingConfigChanges.java +++ b/packages/SettingsLib/src/com/android/settingslib/applications/InterestingConfigChanges.java @@ -28,11 +28,11 @@ import android.content.res.Resources; public class InterestingConfigChanges { private final Configuration mLastConfiguration = new Configuration(); private final int mFlags; - private int mLastDensity; public InterestingConfigChanges() { this(ActivityInfo.CONFIG_LOCALE | ActivityInfo.CONFIG_LAYOUT_DIRECTION - | ActivityInfo.CONFIG_UI_MODE | ActivityInfo.CONFIG_ASSETS_PATHS); + | ActivityInfo.CONFIG_UI_MODE | ActivityInfo.CONFIG_ASSETS_PATHS + | ActivityInfo.CONFIG_DENSITY); } public InterestingConfigChanges(int flags) { @@ -50,11 +50,6 @@ public class InterestingConfigChanges { public boolean applyNewConfig(Resources res) { int configChanges = mLastConfiguration.updateFrom( Configuration.generateDelta(mLastConfiguration, res.getConfiguration())); - boolean densityChanged = mLastDensity != res.getDisplayMetrics().densityDpi; - if (densityChanged || (configChanges & (mFlags)) != 0) { - mLastDensity = res.getDisplayMetrics().densityDpi; - return true; - } - return false; + return (configChanges & (mFlags)) != 0; } } diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothLeBroadcastAssistant.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothLeBroadcastAssistant.java index b0392be9d336..bb103b8896fd 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothLeBroadcastAssistant.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothLeBroadcastAssistant.java @@ -221,6 +221,27 @@ public class LocalBluetoothLeBroadcastAssistant implements LocalBluetoothProfile } /** + * Stops an ongoing search for nearby Broadcast Sources. + * + * On success, {@link BluetoothLeBroadcastAssistant.Callback#onSearchStopped(int)} will be + * called with reason code {@link BluetoothStatusCodes#REASON_LOCAL_APP_REQUEST}. + * On failure, {@link BluetoothLeBroadcastAssistant.Callback#onSearchStopFailed(int)} will be + * called with reason code + * + * @throws IllegalStateException if callback was not registered + */ + public void stopSearchingForSources() { + if (DEBUG) { + Log.d(TAG, "stopSearchingForSources()"); + } + if (mService == null) { + Log.d(TAG, "The BluetoothLeBroadcastAssistant is null"); + return; + } + mService.stopSearchingForSources(); + } + + /** * Get information about all Broadcast Sources that a Broadcast Sink knows about. * * @param sink Broadcast Sink from which to get all Broadcast Sources diff --git a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaDevice.java b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaDevice.java index 632120e77c87..b10d7946f57f 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaDevice.java @@ -19,6 +19,7 @@ import static android.media.MediaRoute2Info.TYPE_GROUP; import static android.media.MediaRoute2Info.TYPE_REMOTE_CAR; import static android.media.MediaRoute2Info.TYPE_REMOTE_COMPUTER; import static android.media.MediaRoute2Info.TYPE_REMOTE_GAME_CONSOLE; +import static android.media.MediaRoute2Info.TYPE_REMOTE_SMARTPHONE; import static android.media.MediaRoute2Info.TYPE_REMOTE_SMARTWATCH; import static android.media.MediaRoute2Info.TYPE_REMOTE_SPEAKER; import static android.media.MediaRoute2Info.TYPE_REMOTE_TABLET; @@ -103,6 +104,9 @@ public class InfoMediaDevice extends MediaDevice { case TYPE_REMOTE_SMARTWATCH: resId = R.drawable.ic_media_smartwatch; break; + case TYPE_REMOTE_SMARTPHONE: + resId = R.drawable.ic_smartphone; + break; case TYPE_REMOTE_SPEAKER: default: resId = R.drawable.ic_media_speaker_device; diff --git a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java index ffc0479f01c3..f2abf8727155 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java @@ -26,6 +26,7 @@ import static android.media.MediaRoute2Info.TYPE_REMOTE_AUDIO_VIDEO_RECEIVER; import static android.media.MediaRoute2Info.TYPE_REMOTE_CAR; import static android.media.MediaRoute2Info.TYPE_REMOTE_COMPUTER; import static android.media.MediaRoute2Info.TYPE_REMOTE_GAME_CONSOLE; +import static android.media.MediaRoute2Info.TYPE_REMOTE_SMARTPHONE; import static android.media.MediaRoute2Info.TYPE_REMOTE_SMARTWATCH; import static android.media.MediaRoute2Info.TYPE_REMOTE_SPEAKER; import static android.media.MediaRoute2Info.TYPE_REMOTE_TABLET; @@ -547,6 +548,7 @@ public class InfoMediaManager extends MediaManager { case TYPE_REMOTE_GAME_CONSOLE: case TYPE_REMOTE_CAR: case TYPE_REMOTE_SMARTWATCH: + case TYPE_REMOTE_SMARTPHONE: mediaDevice = new InfoMediaDevice(mContext, mRouterManager, route, mPackageName, mPreferenceItemMap.get(route.getId())); break; diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaDeviceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaDeviceTest.java index 67a045e9a449..19a3db25996e 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaDeviceTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaDeviceTest.java @@ -20,6 +20,7 @@ import static android.media.MediaRoute2Info.TYPE_GROUP; import static android.media.MediaRoute2Info.TYPE_REMOTE_CAR; import static android.media.MediaRoute2Info.TYPE_REMOTE_COMPUTER; import static android.media.MediaRoute2Info.TYPE_REMOTE_GAME_CONSOLE; +import static android.media.MediaRoute2Info.TYPE_REMOTE_SMARTPHONE; import static android.media.MediaRoute2Info.TYPE_REMOTE_SMARTWATCH; import static android.media.MediaRoute2Info.TYPE_REMOTE_SPEAKER; import static android.media.MediaRoute2Info.TYPE_REMOTE_TABLET; @@ -143,5 +144,9 @@ public class InfoMediaDeviceTest { assertThat(mInfoMediaDevice.getDrawableResIdByType()).isEqualTo( R.drawable.ic_media_smartwatch); + + when(mRouteInfo.getType()).thenReturn(TYPE_REMOTE_SMARTPHONE); + + assertThat(mInfoMediaDevice.getDrawableResIdByType()).isEqualTo(R.drawable.ic_smartphone); } } diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java index 48259e165670..9da1ab8ae69c 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java @@ -38,6 +38,7 @@ import android.provider.Settings; import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.ArraySet; +import android.util.Log; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.app.LocalePicker; @@ -238,6 +239,7 @@ public class SettingsHelper { // If we fail to apply the setting, by definition nothing happened sendBroadcast = false; sendBroadcastSystemUI = false; + Log.e(TAG, "Failed to restore setting name: " + name + " + value: " + value, e); } finally { // If this was an element of interest, send the "we just restored it" // broadcast with the historical value now that the new value has diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java index 6a9c4d80d332..23b63089849f 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -3558,11 +3558,11 @@ public class SettingsProvider extends ContentProvider { if (isSecureSettingsKey(key)) { maybeNotifyProfiles(getTypeFromKey(key), userId, uri, name, sSecureCloneToManagedSettings); - maybeNotifyProfiles(SETTINGS_TYPE_SYSTEM, userId, uri, name, - sSystemCloneFromParentOnDependency.values()); } else if (isSystemSettingsKey(key)) { maybeNotifyProfiles(getTypeFromKey(key), userId, uri, name, sSystemCloneToManagedSettings); + maybeNotifyProfiles(SETTINGS_TYPE_SYSTEM, userId, uri, name, + sSystemCloneFromParentOnDependency.keySet()); } } diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-be/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-be/strings.xml index 572d25cae6fa..db1e8b50c4bb 100644 --- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-be/strings.xml +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-be/strings.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="accessibility_menu_service_name" msgid="730136711554740131">"Спецыяльныя магчымасці"</string> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Меню спецыяльных магчымасцей"</string> <string name="accessibility_menu_intro" msgid="3164193281544042394">"Меню спецыяльных магчымасцей – гэта вялікае экраннае меню для кіравання прыладай. Вы можаце блакіраваць прыладу, рэгуляваць гучнасць і яркасць, рабіць здымкі экрана і выконваць іншыя дзеянні."</string> <string name="assistant_label" msgid="6796392082252272356">"Памочнік"</string> <string name="assistant_utterance" msgid="65509599221141377">"Памочнік"</string> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-el/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-el/strings.xml index 60e49ae0fbc1..c51c9afa07cc 100644 --- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-el/strings.xml +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-el/strings.xml @@ -5,7 +5,7 @@ <string name="accessibility_menu_intro" msgid="3164193281544042394">"Το μενού προσβασιμότητας παρέχει ένα μεγάλο μενού στην οθόνη για να ελέγχετε τη συσκευή σας. Μπορείτε να κλειδώνετε τη συσκευή, να ελέγχετε την ένταση ήχου και τη φωτεινότητα, να λαμβάνετε στιγμιότυπα οθόνης και άλλα."</string> <string name="assistant_label" msgid="6796392082252272356">"Βοηθός"</string> <string name="assistant_utterance" msgid="65509599221141377">"Βοηθός"</string> - <string name="a11y_settings_label" msgid="3977714687248445050">"Ρυθμίσεις προσβU+00ADασιμότητας"</string> + <string name="a11y_settings_label" msgid="3977714687248445050">"Ρυθμίσεις προσβασιμότητας"</string> <string name="power_label" msgid="7699720321491287839">"Κουμπί λειτουργίας"</string> <string name="power_utterance" msgid="7444296686402104807">"Επιλογές λειτουργίας"</string> <string name="recent_apps_label" msgid="6583276995616385847">"Πρόσφατες εφαρμογές"</string> diff --git a/packages/SystemUI/res-keyguard/values-af/strings.xml b/packages/SystemUI/res-keyguard/values-af/strings.xml index 39b418394a13..4bd19465985a 100644 --- a/packages/SystemUI/res-keyguard/values-af/strings.xml +++ b/packages/SystemUI/res-keyguard/values-af/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Borrel"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analoog"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Ontsluit jou toestel om voort te gaan"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Voer PIN in om opdatering later te installeer"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Voer wagwoord in om opdatering later te installeer"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Teken patroon om opdatering later te installeer"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Toestel is opgedateer. Voer PIN in om voort te gaan."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Toestel is opgedateer. Voer wagwoord in om voort te gaan."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Toestel is opgedateer. Teken patroon om voort te gaan."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-am/strings.xml b/packages/SystemUI/res-keyguard/values-am/strings.xml index e175007b76e9..daa25e78433a 100644 --- a/packages/SystemUI/res-keyguard/values-am/strings.xml +++ b/packages/SystemUI/res-keyguard/values-am/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"አረፋ"</string> <string name="clock_title_analog" msgid="8409262532900918273">"አናሎግ"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"ለመቀጠል መሣሪያዎን ይክፈቱ"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"ዝማኔን በኋላ ላይ ለመጫን ፒን ያስገቡ"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"ዝማኔን በኋላ ላይ ለመጫን የይለፍ ቃል ያስገቡ"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"ዝማኔን በኋላ ላይ ለመጫን ስርዓተ ጥለት ይሳሉ"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"መሣሪያ ዘምኗል። ለመቀጠል ፒን ያስገቡ።"</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"መሣሪያ ዘምኗል። ለመቀጠል የይለፍ ቃል ያስገቡ።"</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"መሣሪያ ዘምኗል። ለመቀጠል ሥርዓተ ጥለት ይሳሉ።"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ar/strings.xml b/packages/SystemUI/res-keyguard/values-ar/strings.xml index fa0fb441b410..1215c34aa1dc 100644 --- a/packages/SystemUI/res-keyguard/values-ar/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ar/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"فقاعة"</string> <string name="clock_title_analog" msgid="8409262532900918273">"ساعة تقليدية"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"يجب فتح قفل الجهاز للمتابعة"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"أدخِل رقم التعريف الشخصي لتثبيت التحديث لاحقًا."</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"أدخِل كلمة المرور لتثبيت التحديث لاحقًا."</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"ارسم النقش لتثبيت التحديث لاحقًا."</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"تم تحديث الجهاز. أدخِل رقم التعريف الشخصي للمتابعة."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"تم تحديث الجهاز. أدخِل كلمة المرور للمتابعة."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"تم تحديث الجهاز. ارسم النقش للمتابعة."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-as/strings.xml b/packages/SystemUI/res-keyguard/values-as/strings.xml index 5ecf15abe070..7e43a29f0665 100644 --- a/packages/SystemUI/res-keyguard/values-as/strings.xml +++ b/packages/SystemUI/res-keyguard/values-as/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"বাবল"</string> <string name="clock_title_analog" msgid="8409262532900918273">"এনাল’গ"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"অব্যাহত ৰাখিবলৈ আপোনাৰ ডিভাইচটো আনলক কৰক"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"আপডে’ট পাছত ইনষ্টল কৰিবলৈ পিন দিয়ক"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"আপডে’ট পাছত ইনষ্টল কৰিবলৈ পাছৱৰ্ড দিয়ক"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"আপডে’ট পাছত ইনষ্টল কৰিবলৈ আৰ্হি আঁকক"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"ডিভাইচ আপডে’ট কৰা হ’ল। অব্যাহত ৰাখিবলৈ পিন দিয়ক।"</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"ডিভাইচ আপডে’ট কৰা হ’ল। অব্যাহত ৰাখিবলৈ পাছৱৰ্ড দিয়ক।"</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"ডিভাইচ আপডে’ট কৰা হ’ল। অব্যাহত ৰাখিবলৈ আৰ্হি আঁকক।"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-az/strings.xml b/packages/SystemUI/res-keyguard/values-az/strings.xml index 6eb36bd64b66..37d9f0e34df1 100644 --- a/packages/SystemUI/res-keyguard/values-az/strings.xml +++ b/packages/SystemUI/res-keyguard/values-az/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Qabarcıq"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analoq"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Davam etmək üçün cihazınızın kilidini açın"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Güncəllənməni sonra quraşdırmaq üçün PIN daxil edin"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Güncəllənməni sonra quraşdırmaq üçün parol daxil edin"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Güncəllənməni sonra quraşdırmaq üçün model çəkin"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Cihaz güncəlləndi. Davam etmək üçün PIN daxil edin."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Cihaz güncəlləndi. Davam etmək üçün parol daxil edin."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Cihaz güncəlləndi. Davam etmək üçün model çəkin."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml index fb18f1a25818..d8de1ef3626e 100644 --- a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Mehurići"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analogni"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Otključajte uređaj da biste nastavili"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Unesite PIN da biste kasnije istalirali ažuriranje"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Unesite lozinku da biste kasnije instalirali ažuriranje"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Nacrtajte šablon da biste kasnije instalirali ažuriranje"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Uređaj je ažuriran. Unesite PIN da biste nastavili."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Uređaj je ažuriran. Unesite lozinku da biste nastavili."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Uređaj je ažuriran. Nacrtajte šablon da biste nastavili."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-be/strings.xml b/packages/SystemUI/res-keyguard/values-be/strings.xml index 4781c3aa2068..f66ccc7547a2 100644 --- a/packages/SystemUI/res-keyguard/values-be/strings.xml +++ b/packages/SystemUI/res-keyguard/values-be/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Бурбалкі"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Са стрэлкамі"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Каб працягнуць, разблакіруйце прыладу"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Увядзіце PIN-код, каб усталяваць абнаўленне пазней"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Увядзіце пароль, каб усталяваць абнаўленне пазней"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Увядзіце ўзор разблакіроўкі, каб усталяваць абнаўленне пазней"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Прылада абноўлена. Каб працягнуць, увядзіце PIN-код."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Прылада абноўлена. Каб працягнуць, увядзіце пароль."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Прылада абноўлена. Каб працягнуць, увядзіце ўзор разблакіроўкі."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-bg/strings.xml b/packages/SystemUI/res-keyguard/values-bg/strings.xml index da1c52b511ce..646f7f9229cd 100644 --- a/packages/SystemUI/res-keyguard/values-bg/strings.xml +++ b/packages/SystemUI/res-keyguard/values-bg/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Балонен"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Аналогов"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Отключете устройството, за да продължите"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Въведете ПИН код, за да инсталирате актуализацията по-късно"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Въведете парола, за да инсталирате актуализацията по-късно"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Начертайте фигура, за да инсталирате актуализацията по-късно"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Устройството е актуализирано. Въведете ПИН код, за да продължите."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Устройството е актуализирано. Въведете парола, за да продължите."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Устройството е актуализирано. Начертайте фигура, за да продължите."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-bn/strings.xml b/packages/SystemUI/res-keyguard/values-bn/strings.xml index 4dcceab49189..23eb41873ba9 100644 --- a/packages/SystemUI/res-keyguard/values-bn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-bn/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"বাবল"</string> <string name="clock_title_analog" msgid="8409262532900918273">"অ্যানালগ"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"চালিয়ে যেতে আপনার ডিভাইস আনলক করুন"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"পরে ইনস্টল আপডেট করতে পিন লিখুন"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"পরে আপডেট ইনস্টল করতে পাসওয়ার্ড লিখুন"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"পরে আপডেট ইনস্টল করতে প্যাটার্ন আঁকুন"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"ডিভাইস আপডেট করা হয়েছে। চালিয়ে যেতে পিন লিখুন।"</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"ডিভাইস আপডেট করা হয়েছে। চালিয়ে যেতে পাসওয়ার্ড লিখুন।"</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"ডিভাইস আপডেট করা হয়েছে। চালিয়ে যেতে প্যাটার্ন আঁকুন।"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-bs/strings.xml b/packages/SystemUI/res-keyguard/values-bs/strings.xml index 5d8c508d20c1..3ed0958164d0 100644 --- a/packages/SystemUI/res-keyguard/values-bs/strings.xml +++ b/packages/SystemUI/res-keyguard/values-bs/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Mjehurići"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analogni"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Otključajte uređaj da nastavite"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Unesite PIN da kasnije instalirate ažuriranje"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Unesite lozinku da kasnije instalirate ažuriranje"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Unesite uzorak da kasnije instalirate ažuriranje"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Uređaj je ažuriran. Unesite PIN da nastavite."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Uređaj je ažuriran. Unesite lozinku da nastavite."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Uređaj je ažuriran. Unesite uzorak da nastavite."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ca/strings.xml b/packages/SystemUI/res-keyguard/values-ca/strings.xml index 04b6a3d7bfd8..bd1e4a1fb02e 100644 --- a/packages/SystemUI/res-keyguard/values-ca/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ca/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Bombolla"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analògica"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Desbloqueja el dispositiu per continuar"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Introdueix el PIN per instal·lar l\'actualització més tard"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Introdueix la contrasenya per instal·lar l\'actualització més tard"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Dibuixa el patró per instal·lar l\'actualització més tard"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Dispositiu actualitzat. Introdueix el PIN per continuar."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Dispositiu actualitzat. Introdueix la contrasenya per continuar."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Dispositiu actualitzat. Dibuixa el patró per continuar."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-cs/strings.xml b/packages/SystemUI/res-keyguard/values-cs/strings.xml index 22f46a0022ab..88890bbb47fe 100644 --- a/packages/SystemUI/res-keyguard/values-cs/strings.xml +++ b/packages/SystemUI/res-keyguard/values-cs/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Bublina"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analogové"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Pokud chcete pokračovat, odemkněte zařízení"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Pokud aktualizaci chcete nainstalovat později, zadejte PIN"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Pokud aktualizaci chcete nainstalovat později, zadejte heslo"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Pokud aktualizaci chcete nainstalovat později, zadejte gesto"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Zařízení bylo aktualizováno. Pokud chcete pokračovat, zadejte PIN."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Zařízení bylo aktualizováno. Pokud chcete pokračovat, zadejte heslo."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Zařízení bylo aktualizováno. Pokud chcete pokračovat, zadejte gesto."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-da/strings.xml b/packages/SystemUI/res-keyguard/values-da/strings.xml index 5f3c2e788ec9..c4ea98ad35a9 100644 --- a/packages/SystemUI/res-keyguard/values-da/strings.xml +++ b/packages/SystemUI/res-keyguard/values-da/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Boble"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analog"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Lås din enhed op for at fortsætte"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Angiv din pinkode for at installere opdateringen senere"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Angiv din adgangskode for at installere opdateringen senere"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Tegn dit mønster for at installere opdateringen senere"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Enheden er opdateret. Angiv din pinkode for at fortsætte."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Enheden er opdateret. Angiv din adgangskode for at fortsætte."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Enheden er opdateret. Tegn dit mønster for at fortsætte."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-de/strings.xml b/packages/SystemUI/res-keyguard/values-de/strings.xml index 05fcced76a8b..223e74c7868c 100644 --- a/packages/SystemUI/res-keyguard/values-de/strings.xml +++ b/packages/SystemUI/res-keyguard/values-de/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Bubble"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analog"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Gerät entsperren, um fortzufahren"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Gib deine PIN ein, um das Update später zu installieren"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Gib dein Passwort ein, um das Update später zu installieren"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Zeichne dein Muster, um das Update später zu installieren"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Gerät aktualisiert. Gib deine PIN ein, um fortzufahren."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Gerät aktualisiert. Gib dein Passwort ein, um fortzufahren."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Gerät aktualisiert. Zeichne dein Muster, um fortzufahren."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-el/strings.xml b/packages/SystemUI/res-keyguard/values-el/strings.xml index d042b78060ea..6ee323a8430c 100644 --- a/packages/SystemUI/res-keyguard/values-el/strings.xml +++ b/packages/SystemUI/res-keyguard/values-el/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Συννεφάκι"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Αναλογικό"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Ξεκλειδώστε τη συσκευή σας για να συνεχίσετε"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Εισαγάγετε το PIN για να εγκαταστήσετε την ενημέρωση αργότερα"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Εισαγ. τον κωδ. πρόσβασης για να εγκαταστήσετε την ενημέρωση αργότερα"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Σχεδιάστε το μοτίβο για να εγκαταστήσετε την ενημέρωση αργότερα"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Η συσκευή ενημερώθηκε. Εισαγάγετε το PIN για να συνεχίσετε."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Η συσκευή ενημερώθηκε. Εισαγάγ. τον κωδ. πρόσβασης για να συνεχίσετε."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Η συσκευή ενημερώθηκε. Σχεδιάστε το μοτίβο για να συνεχίσετε."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml b/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml index 10b82a4808c9..51306700f64a 100644 --- a/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml +++ b/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Bubble"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analogue"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Unlock your device to continue"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Enter PIN to install update later"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Enter password to install update later"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Draw pattern to install update later"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Device updated Enter PIN to continue."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Device updated Enter password to continue."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Device updated Draw pattern to continue."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml index e134d9eaf25e..9457489c480a 100644 --- a/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml +++ b/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Bubble"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analog"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Unlock your device to continue"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Enter PIN to install update later"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Enter password to install update later"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Draw pattern to install update later"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Device updated. Enter PIN to continue."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Device updated. Enter password to continue."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Device updated. Draw pattern to continue."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml b/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml index 10b82a4808c9..51306700f64a 100644 --- a/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml +++ b/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Bubble"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analogue"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Unlock your device to continue"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Enter PIN to install update later"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Enter password to install update later"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Draw pattern to install update later"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Device updated Enter PIN to continue."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Device updated Enter password to continue."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Device updated Draw pattern to continue."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml b/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml index 10b82a4808c9..51306700f64a 100644 --- a/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml +++ b/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Bubble"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analogue"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Unlock your device to continue"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Enter PIN to install update later"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Enter password to install update later"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Draw pattern to install update later"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Device updated Enter PIN to continue."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Device updated Enter password to continue."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Device updated Draw pattern to continue."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml b/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml index ff9d4f35f130..b2520d797746 100644 --- a/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml +++ b/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Bubble"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analog"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Unlock your device to continue"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Enter PIN to install update later"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Enter password to install update later"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Draw pattern to install update later"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Device updated. Enter PIN to continue."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Device updated. Enter password to continue."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Device updated. Draw pattern to continue."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml index be1c44f046fb..8c5b7bc64a62 100644 --- a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml +++ b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Burbuja"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analógico"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Desbloquea tu dispositivo para continuar"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Ingresa el PIN para instalar la actualización más tarde."</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Ingresa la contraseña para instalar la actualización más tarde."</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Dibuja el patrón para instalar la actualización más tarde."</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Dispositivo actualizado. Ingresa el PIN para continuar."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Dispositivo actualizado. Ingresa la contraseña para continuar."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Dispositivo actualizado. Dibuja el patrón para continuar."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-es/strings.xml b/packages/SystemUI/res-keyguard/values-es/strings.xml index aa09cf96fb10..811e33ae12b2 100644 --- a/packages/SystemUI/res-keyguard/values-es/strings.xml +++ b/packages/SystemUI/res-keyguard/values-es/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Burbuja"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analógico"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Desbloquea tu dispositivo para continuar"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Introduce el PIN para instalar la actualización más tarde"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Introduce la contraseña para instalar la actualización más tarde"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Dibuja el patrón para instalar la actualización más tarde"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Dispositivo actualizado. Introduce el PIN para continuar."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Dispositivo actualizado. Introduce la contraseña para continuar."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Dispositivo actualizado. Dibuja el patrón para continuar."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-et/strings.xml b/packages/SystemUI/res-keyguard/values-et/strings.xml index d6c7f3f9e6c5..484641227c2d 100644 --- a/packages/SystemUI/res-keyguard/values-et/strings.xml +++ b/packages/SystemUI/res-keyguard/values-et/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Mull"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analoog"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Jätkamiseks avage oma seade"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Sisestage PIN-kood, et värskendus hiljem installida"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Sisestage parool, et värskendus hiljem installida"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Joonistage muster, et värskendus hiljem installida"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Seadet värskendati. Jätkamiseks sisestage PIN-kood."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Seadet värskendati. Jätkamiseks sisestage parool."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Seadet värskendati. Jätkamiseks joonistage muster."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-eu/strings.xml b/packages/SystemUI/res-keyguard/values-eu/strings.xml index 4d4c3f9d826e..351badac0107 100644 --- a/packages/SystemUI/res-keyguard/values-eu/strings.xml +++ b/packages/SystemUI/res-keyguard/values-eu/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Puxikak"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analogikoa"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Aurrera egiteko, desblokeatu gailua"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Eguneratzea geroago instalatzeko, idatzi PINa"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Eguneratzea geroago instalatzeko, idatzi pasahitza"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Eguneratzea geroago instalatzeko, marraztu eredua"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Eguneratu egin da gailua. Aurrera egiteko, idatzi PINa."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Eguneratu egin da gailua. Aurrera egiteko, idatzi pasahitza."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Eguneratu egin da gailua. Aurrera egiteko, marraztu eredua."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-fa/strings.xml b/packages/SystemUI/res-keyguard/values-fa/strings.xml index 91a15a47883b..806387356ff1 100644 --- a/packages/SystemUI/res-keyguard/values-fa/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fa/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"حباب"</string> <string name="clock_title_analog" msgid="8409262532900918273">"آنالوگ"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"برای ادامه، قفل دستگاهتان را باز کنید"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"برای نصب بهروزرسانی در فرصتی دیگر، پین را وارد کنید"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"برای نصب بهروزرسانی در فرصتی دیگر، گذرواژه را وارد کنید"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"برای نصب بهروزرسانی در فرصتی دیگر، الگو را وارد کنید"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"دستگاه بهروز شد. برای ادامه، پین را وارد کنید."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"دستگاه بهروز شد. برای ادامه، گذرواژه را وارد کنید."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"دستگاه بهروز شد. برای ادامه، الگو را وارد کنید."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-fi/strings.xml b/packages/SystemUI/res-keyguard/values-fi/strings.xml index 7db4fea86033..f96f61f95706 100644 --- a/packages/SystemUI/res-keyguard/values-fi/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fi/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Kupla"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analoginen"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Jatka avaamalla laitteen lukitus"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Jos haluat asentaa päivityksen myöhemmin, lisää PIN-koodi"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Jos haluat asentaa päivityksen myöhemmin, lisää salasana"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Jos haluat asentaa päivityksen myöhemmin, piirrä kuvio"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Laite päivitetty. Jatka lisäämällä PIN-koodi."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Laite päivitetty. Jatka lisäämällä salasana."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Laite päivitetty. Jatka piirtämällä kuvio."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml index a1dbb9f12605..e880c1e05db3 100644 --- a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Bulle"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analogique"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Déverrouillez votre appareil pour continuer"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Entrez le NIP pour installer la mise à jour plus tard"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Entrez le mot de passe pour installer la mise à jour plus tard"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Dessinez le schéma pour installer la mise à jour plus tard"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Appareil mis à jour. Entrez le NIP pour continuer."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Appareil mis à jour. Entrez le mot de passe pour continuer."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Appareil mis à jour. Dessinez le schéma pour continuer."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-fr/strings.xml b/packages/SystemUI/res-keyguard/values-fr/strings.xml index f746db0c4e7f..f2f037fb8987 100644 --- a/packages/SystemUI/res-keyguard/values-fr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fr/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Bulle"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analogique"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Déverrouillez votre appareil pour continuer"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Saisissez le code pour installer la mise à jour plus tard"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Saisissez le mot de passe pour installer la mise à jour plus tard"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Dessinez le schéma pour installer la mise à jour plus tard"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Appareil mis à jour. Saisissez le code pour continuer."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Appareil mis à jour. Saisissez le mot de passe pour continuer."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Appareil mis à jour. Dessinez le schéma pour continuer."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-gl/strings.xml b/packages/SystemUI/res-keyguard/values-gl/strings.xml index 6f4b667c8efe..2cc2ec2f9609 100644 --- a/packages/SystemUI/res-keyguard/values-gl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-gl/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Burbulla"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analóxico"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Desbloquea o dispositivo para continuar"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Mete o PIN para instalar a actualización máis tarde"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Mete o contrasinal para instalar a actualización máis tarde"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Debuxa o padrón para instalar a actualización máis tarde"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Actualizouse o dispositivo. Mete o PIN para continuar."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Actualizouse o dispositivo. Mete o contrasinal para continuar."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Actualizouse o dispositivo. Debuxa o padrón para continuar."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-gu/strings.xml b/packages/SystemUI/res-keyguard/values-gu/strings.xml index 5c2d09bf1d88..c574e4f27651 100644 --- a/packages/SystemUI/res-keyguard/values-gu/strings.xml +++ b/packages/SystemUI/res-keyguard/values-gu/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"બબલ"</string> <string name="clock_title_analog" msgid="8409262532900918273">"એનાલોગ"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"ચાલુ રાખવા માટે તમારા ડિવાઇસને અનલૉક કરો"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"પછીથી અપડેટ ઇન્સ્ટૉલ કરવા માટે પિન દાખલ કરો"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"પછીથી અપડેટ ઇન્સ્ટૉલ કરવા માટે પાસવર્ડ દાખલ કરો"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"પછીથી અપડેટ ઇન્સ્ટૉલ કરવા માટે પૅટર્ન દોરો"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"ડિવાઇસ અપડેટ કર્યું. ચાલુ રાખવા માટે પિન દાખલ કરો."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"ડિવાઇસ અપડેટ કર્યું. ચાલુ રાખવા માટે પાસવર્ડ દાખલ કરો."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"ડિવાઇસ અપડેટ કર્યું. ચાલુ રાખવા માટે પૅટર્ન દોરો."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-hi/strings.xml b/packages/SystemUI/res-keyguard/values-hi/strings.xml index 10c7aafd9ab2..5d43c32b2d1b 100644 --- a/packages/SystemUI/res-keyguard/values-hi/strings.xml +++ b/packages/SystemUI/res-keyguard/values-hi/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"बबल"</string> <string name="clock_title_analog" msgid="8409262532900918273">"एनालॉग"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"जारी रखने के लिए डिवाइस अनलॉक करें"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"अपडेट को बाद में इंस्टॉल करने के लिए पिन डालें"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"अपडेट को बाद में इंस्टॉल करने के लिए पासवर्ड डालें"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"अपडेट को बाद में इंस्टॉल करने के लिए पैटर्न ड्रॉ करें"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"डिवाइस अपडेट किया गया. जारी रखने के लिए पिन डालें."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"डिवाइस अपडेट किया गया. जारी रखने के लिए पासवर्ड डालें."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"डिवाइस अपडेट किया गया. जारी रखने के लिए पैटर्न ड्रॉ करें."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-hr/strings.xml b/packages/SystemUI/res-keyguard/values-hr/strings.xml index 045c9045563d..6d65df636676 100644 --- a/packages/SystemUI/res-keyguard/values-hr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-hr/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Mjehurić"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analogni"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Otključajte uređaj da biste nastavili"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Unesite PIN da biste ažuriranje instalirali kasnije"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Unesite zaporku da biste ažuriranje instalirali kasnije"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Nacrtajte uzorak da biste ažuriranje instalirali kasnije"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Uređaj je ažuriran. Unesite PIN da biste nastavili."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Uređaj je ažuriran. Unesite zaporku da biste nastavili."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Uređaj je ažuriran. Nacrtajte uzorak da biste nastavili."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-hu/strings.xml b/packages/SystemUI/res-keyguard/values-hu/strings.xml index a98408cf3d70..f1183af34434 100644 --- a/packages/SystemUI/res-keyguard/values-hu/strings.xml +++ b/packages/SystemUI/res-keyguard/values-hu/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Buborék"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analóg"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"A folytatáshoz oldja fel az eszközét"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"A frissítés később történő telepítéséhez adja meg a PIN-kódot"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"A frissítés később történő telepítéséhez adja meg a jelszót"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"A frissítés később történő telepítéséhez rajzolja le a mintát"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Eszköz frissítve. A folytatáshoz adja meg a PIN-kódot."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Eszköz frissítve. A folytatáshoz adja meg a jelszót."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Eszköz frissítve. A folytatáshoz rajzolja le a mintát."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-hy/strings.xml b/packages/SystemUI/res-keyguard/values-hy/strings.xml index 985f77ac5994..bbff3786f896 100644 --- a/packages/SystemUI/res-keyguard/values-hy/strings.xml +++ b/packages/SystemUI/res-keyguard/values-hy/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Պղպջակ"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Անալոգային"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Շարունակելու համար ապակողպեք սարքը"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Թարմացումն ավելի ուշ տեղադրելու համար մուտքագրեք PIN կոդը"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Թարմացումն ավելի ուշ տեղադրելու համար մուտքագրեք գաղտնաբառը"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Թարմացումն ավելի ուշ տեղադրելու համար գծեք նախշը"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Սարքը թարմացվեց։ Շարունակելու համար մուտքագրեք PIN կոդը։"</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Սարքը թարմացվեց։ Շարունակելու համար մուտքագրեք գաղտնաբառը։"</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Սարքը թարմացվեց։ Շարունակելու համար գծեք նախշը։"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-in/strings.xml b/packages/SystemUI/res-keyguard/values-in/strings.xml index 1ba327806258..46390bf2be96 100644 --- a/packages/SystemUI/res-keyguard/values-in/strings.xml +++ b/packages/SystemUI/res-keyguard/values-in/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Balon"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analog"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Buka kunci perangkat untuk melanjutkan"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Masukkan PIN untuk menginstal update nanti"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Masukkan sandi untuk menginstal update nanti"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Gambar pola untuk menginstal update nanti"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Perangkat diupdate. Masukkan PIN untuk melanjutkan."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Perangkat diupdate. Masukkan sandi untuk melanjutkan."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Perangkat diupdate. Gambar pola untuk melanjutkan."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-is/strings.xml b/packages/SystemUI/res-keyguard/values-is/strings.xml index 1f8687f1097c..40992412f8ba 100644 --- a/packages/SystemUI/res-keyguard/values-is/strings.xml +++ b/packages/SystemUI/res-keyguard/values-is/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Blaðra"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Með vísum"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Taktu tækið úr lás til að halda áfram"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Sláðu inn PIN-númer til að setja uppfærsluna upp síðar"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Sláðu inn aðgangsorð til að setja uppfærsluna upp síðar"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Teiknaðu mynstur til að setja uppfærsluna upp síðar"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Tæki uppfært. Sláðu inn PIN-númer til að halda áfram."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Tæki uppfært. Sláðu inn aðgangsorð til að halda áfram."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Tæki uppfært. Teiknaðu mynstur til að halda áfram."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-it/strings.xml b/packages/SystemUI/res-keyguard/values-it/strings.xml index bdfeda7b4c98..bc1922f685d7 100644 --- a/packages/SystemUI/res-keyguard/values-it/strings.xml +++ b/packages/SystemUI/res-keyguard/values-it/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Bolla"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analogico"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Sblocca il dispositivo per continuare"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Inserisci il PIN per installare l\'aggiornamento più tardi"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Inserisci la password per installare l\'aggiornamento più tardi"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Inserisci la sequenza per installare l\'aggiornamento più tardi"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Dispositivo aggiornato. Inserisci il PIN per continuare."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Dispositivo aggiornato. Inserisci la password per continuare."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Dispositivo aggiornato. Inserisci la sequenza per continuare."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-iw/strings.xml b/packages/SystemUI/res-keyguard/values-iw/strings.xml index 08cdd791fbec..7b641dc10bfe 100644 --- a/packages/SystemUI/res-keyguard/values-iw/strings.xml +++ b/packages/SystemUI/res-keyguard/values-iw/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"בועה"</string> <string name="clock_title_analog" msgid="8409262532900918273">"אנלוגי"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"צריך לבטל את הנעילה של המכשיר כדי להמשיך"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"צריך להזין את קוד האימות כדי להתקין את העדכון מאוחר יותר"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"צריך להזין את הסיסמה כדי להתקין את העדכון מאוחר יותר"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"צריך למתוח את קו ביטול הנעילה כדי להתקין את העדכון מאוחר יותר"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"המכשיר עודכן. צריך להזין את קוד האימות כדי להמשיך."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"המכשיר עודכן. צריך להזין את הסיסמה כדי להמשיך."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"המכשיר עודכן. צריך למתוח את קו ביטול הנעילה כדי להמשיך."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ja/strings.xml b/packages/SystemUI/res-keyguard/values-ja/strings.xml index 666f9b147f27..6babdd789b9e 100644 --- a/packages/SystemUI/res-keyguard/values-ja/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ja/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"バブル"</string> <string name="clock_title_analog" msgid="8409262532900918273">"アナログ"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"続行するにはデバイスのロックを解除します"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"アップデートを後でインストールするには、PIN を入力してください"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"アップデートを後でインストールするには、パスワードを入力してください"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"アップデートを後でインストールするには、パターンを入力してください"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"デバイスの更新が完了しました。PIN を入力して続行してください。"</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"デバイスの更新が完了しました。パスワードを入力して続行してください。"</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"デバイスの更新が完了しました。パターンを入力して続行してください。"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ka/strings.xml b/packages/SystemUI/res-keyguard/values-ka/strings.xml index c97964196e1e..c2d22f77ef8f 100644 --- a/packages/SystemUI/res-keyguard/values-ka/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ka/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"ბუშტი"</string> <string name="clock_title_analog" msgid="8409262532900918273">"ანალოგური"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"გასაგრძელებლად განბლოკეთ მოწყობილობა"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"განახლების მოგვიანებით ინსტალაციისთვის PIN-კოდი შეიყვანეთ"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"განახლების მოგვიანებით ინსტალაციისთვის პაროლი შეიყვანეთ"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"განახლების მოგვიანებით ინსტალაციისთვის ნიმუში დახაზეთ"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"მოწყობილობა განახლებულია. გასაგრძელებლად PIN-კოდი შეიყვანეთ."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"მოწყობილობა განახლებულია. გასაგრძელებლად პაროლი შეიყვანეთ."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"მოწყობილობა განახლებულია. გასაგრძელებლად ნიმუში დახაზეთ."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-kk/strings.xml b/packages/SystemUI/res-keyguard/values-kk/strings.xml index 97658c1f858e..d922b23f0be0 100644 --- a/packages/SystemUI/res-keyguard/values-kk/strings.xml +++ b/packages/SystemUI/res-keyguard/values-kk/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Көпіршік"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Аналогтық"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Жалғастыру үшін құлыпты ашыңыз"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Жаңа нұсқаны кейінірек орнату үшін PIN кодын енгізіңіз"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Жаңа нұсқаны кейінірек орнату үшін құпия сөзді енгізіңіз"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Жаңа нұсқаны кейінірек орнату үшін өрнекті салыңыз"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Құрылғы жаңартылды. Жалғастыру үшін PIN кодын енгізіңіз."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Құрылғы жаңартылды. Жалғастыру үшін құпия сөзді енгізіңіз."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Құрылғы жаңартылды. Жалғастыру үшін өрнекті салыңыз."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-km/strings.xml b/packages/SystemUI/res-keyguard/values-km/strings.xml index 4aa479815ce7..dac900210a4d 100644 --- a/packages/SystemUI/res-keyguard/values-km/strings.xml +++ b/packages/SystemUI/res-keyguard/values-km/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"ពពុះ"</string> <string name="clock_title_analog" msgid="8409262532900918273">"អាណាឡូក"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"ដោះសោឧបករណ៍របស់អ្នកដើម្បីបន្ត"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"បញ្ចូលកូដ PIN ដើម្បីដំឡើងកំណែថ្មីនៅពេលក្រោយ"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"បញ្ចូលពាក្យសម្ងាត់ ដើម្បីដំឡើងកំណែថ្មីនៅពេលក្រោយ"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"គូរលំនាំ ដើម្បីដំឡើងកំណែថ្មីនៅពេលក្រោយ"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"ឧបករណ៍ត្រូវបានដំឡើងកំណែ។ សូមបញ្ចូលកូដ PIN ដើម្បីបន្ត។"</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"ឧបករណ៍ត្រូវបានដំឡើងកំណែ។ សូមបញ្ចូលពាក្យសម្ងាត់ដើម្បីបន្ត។"</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"ឧបករណ៍ត្រូវបានដំឡើងកំណែ។ សូមគូរលំនាំដើម្បីបន្ត។"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-kn/strings.xml b/packages/SystemUI/res-keyguard/values-kn/strings.xml index 8b0d60ce2555..73035851b3c6 100644 --- a/packages/SystemUI/res-keyguard/values-kn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-kn/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"ಬಬಲ್"</string> <string name="clock_title_analog" msgid="8409262532900918273">"ಅನಲಾಗ್"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"ಮುಂದುವರಿಸಲು, ನಿಮ್ಮ ಸಾಧನವನ್ನು ಅನ್ಲಾಕ್ ಮಾಡಿ"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"ಅಪ್ಡೇಟ್ ಅನ್ನು ಆನಂತರ ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲು ಪಿನ್ ಅನ್ನು ನಮೂದಿಸಿ"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"ಅಪ್ಡೇಟ್ ಅನ್ನು ಆನಂತರ ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲು ಪಾಸ್ವರ್ಡ್ ನಮೂದಿಸಿ"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"ಅಪ್ಡೇಟ್ ಅನ್ನು ಆನಂತರ ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲು ಪ್ಯಾಟರ್ನ್ ಅನ್ನು ಬಿಡಿಸಿ"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"ಸಾಧನವನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಲಾಗಿದೆ. ಮುಂದುವರಿಸಲು ಪಿನ್ ಅನ್ನು ನಮೂದಿಸಿ."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"ಸಾಧನವನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಲಾಗಿದೆ. ಮುಂದುವರಿಸಲು ಪಾಸ್ವರ್ಡ್ ನಮೂದಿಸಿ."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"ಸಾಧನವನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಲಾಗಿದೆ. ಮುಂದುವರಿಸಲು ಪ್ಯಾಟರ್ನ್ ಅನ್ನು ಬಿಡಿಸಿ."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ko/strings.xml b/packages/SystemUI/res-keyguard/values-ko/strings.xml index cfd053c12d44..5787258123aa 100644 --- a/packages/SystemUI/res-keyguard/values-ko/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ko/strings.xml @@ -61,7 +61,7 @@ <string name="kg_wrong_pin" msgid="4160978845968732624">"잘못된 PIN"</string> <string name="kg_wrong_pin_try_again" msgid="3129729383303430190">"잘못된 PIN입니다. 다시 시도해 주세요."</string> <string name="kg_wrong_input_try_fp_suggestion" msgid="3143861542242024833">"또는 지문으로 잠금 해제하세요."</string> - <string name="kg_fp_not_recognized" msgid="5183108260932029241">"지문이 인식되지 않았습니다."</string> + <string name="kg_fp_not_recognized" msgid="5183108260932029241">"지문이 인식되지 않았습니다"</string> <string name="bouncer_face_not_recognized" msgid="1666128054475597485">"얼굴을 인식할 수 없습니다."</string> <string name="kg_bio_try_again_or_pin" msgid="4752168242723808390">"다시 시도하거나 PIN을 입력하세요."</string> <string name="kg_bio_try_again_or_password" msgid="1473132729225398039">"다시 시도하거나 비밀번호를 입력하세요."</string> @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"버블"</string> <string name="clock_title_analog" msgid="8409262532900918273">"아날로그"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"계속하려면 기기 잠금 해제"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"나중에 업데이트를 설치하려면 PIN을 입력하세요."</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"나중에 업데이트를 설치하려면 비밀번호를 입력하세요."</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"나중에 업데이트를 설치하려면 패턴을 그리세요."</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"기기가 업데이트되었습니다. 계속하려면 PIN을 입력하세요."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"기기가 업데이트되었습니다. 계속 진행하려면 비밀번호를 입력하세요."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"기기가 업데이트되었습니다. 계속하려면 패턴을 그리세요."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ky/strings.xml b/packages/SystemUI/res-keyguard/values-ky/strings.xml index f32d27ff52f2..9e5c7ab3c02d 100644 --- a/packages/SystemUI/res-keyguard/values-ky/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ky/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Көбүк"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Аналог"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Улантуу үчүн түзмөгүңүздүн кулпусун ачыңыз"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Кийинчерээк жаңыртуу үчүн PIN кодду териңиз"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Кийинчерээк жаңыртуу үчүн сырсөздү териңиз"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Кийинчерээк жаңыртуу үчүн графикалык ачкычты тартыңыз"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Түзмөк жаңырды. Улантуу үчүн PIN кодду териңиз."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Түзмөк жаңырды. Улантуу үчүн сырсөздү териңиз."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Түзмөк жаңырды. Улантуу үчүн графикалык ачкычты тартыңыз."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-lo/strings.xml b/packages/SystemUI/res-keyguard/values-lo/strings.xml index deb6a157c3d2..ac766e51826b 100644 --- a/packages/SystemUI/res-keyguard/values-lo/strings.xml +++ b/packages/SystemUI/res-keyguard/values-lo/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"ຟອງ"</string> <string name="clock_title_analog" msgid="8409262532900918273">"ໂມງເຂັມ"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"ປົດລັອກອຸປະກອນຂອງທ່ານເພື່ອສືບຕໍ່"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"ໃສ່ PIN ເພື່ອຕິດຕັ້ງອັບເດດໃນພາຍຫຼັງ"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"ໃສ່ລະຫັດຜ່ານເພື່ອຕິດຕັ້ງອັບເດດໃນພາຍຫຼັງ"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"ແຕ້ມຮູບແບບເພື່ອຕິດຕັ້ງອັບເດດໃນພາຍຫຼັງ"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"ອັບເດດອຸປະກອນແລ້ວ. ໃສ່ PIN ເພື່ອສືບຕໍ່."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"ອັບເດດອຸປະກອນແລ້ວ. ໃສ່ລະຫັດຜ່ານເພື່ອສືບຕໍ່."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"ອັບເດດອຸປະກອນແລ້ວ. ແຕ້ມຮູບແບບເພື່ອສືບຕໍ່."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-lt/strings.xml b/packages/SystemUI/res-keyguard/values-lt/strings.xml index 4e154b0746a0..5e4762235cb1 100644 --- a/packages/SystemUI/res-keyguard/values-lt/strings.xml +++ b/packages/SystemUI/res-keyguard/values-lt/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Debesėlis"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analoginis"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Atrakinkite įrenginį norėdami tęsti"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Įveskite PIN kodą, kad įdiegtumėte naujinį vėliau"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Įveskite slaptažodį, kad įdiegtumėte naujinį vėliau"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Nubrėžkite atrakinimo piešinį, kad įdiegtumėte naujinį vėliau"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Įrenginys atnaujintas. Įveskite PIN kodą, kad galėtumėte tęsti."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Įrenginys atnaujintas. Įveskite slaptažodį, kad galėtumėte tęsti."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Įrenginys atnaujintas. Nubrėžkite atrakinimo piešinį, kad gal. tęsti."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-lv/strings.xml b/packages/SystemUI/res-keyguard/values-lv/strings.xml index 5d992f8444ef..527767130dff 100644 --- a/packages/SystemUI/res-keyguard/values-lv/strings.xml +++ b/packages/SystemUI/res-keyguard/values-lv/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Burbuļi"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analogais"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Lai turpinātu, atbloķējiet ierīci"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Ievadiet PIN, lai instalētu atjauninājumu vēlāk."</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Ievadiet paroli, lai instalētu atjauninājumu vēlāk."</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Zīmējiet kombināciju, lai instalētu atjauninājumu vēlāk."</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Ierīce ir atjaunināta. Ievadiet PIN, lai turpinātu."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Ierīce ir atjaunināta. Ievadiet paroli, lai turpinātu."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Ierīce ir atjaunināta. Zīmējiet kombināciju, lai turpinātu."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-mk/strings.xml b/packages/SystemUI/res-keyguard/values-mk/strings.xml index e39cc9547eb9..5a35808fdd45 100644 --- a/packages/SystemUI/res-keyguard/values-mk/strings.xml +++ b/packages/SystemUI/res-keyguard/values-mk/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Балонче"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Аналоген"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Отклучете го уредот за да продолжите"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Внесете PIN за да го инсталирате ажурирањето подоцна"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Внесете ја лозинката за да го инсталирате ажурирањето подоцна"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Нацртајте ја шемата за да го инсталирате ажурирањето подоцна"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Уредот е ажуриран. Внесете PIN за да продолжите."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Уредот е ажуриран. Внесете лозинка за да продолжите."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Уредот е ажуриран. Нацртајте ја шемата за да продолжите."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ml/strings.xml b/packages/SystemUI/res-keyguard/values-ml/strings.xml index 81813576b51f..20f5b4d69e16 100644 --- a/packages/SystemUI/res-keyguard/values-ml/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ml/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"ബബിൾ"</string> <string name="clock_title_analog" msgid="8409262532900918273">"അനലോഗ്"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"തുടരാൻ നിങ്ങളുടെ ഉപകരണം അൺലോക്ക് ചെയ്യുക"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"അപ്ഡേറ്റ് പിന്നീട് ഇൻസ്റ്റാൾ ചെയ്യാൻ പിൻ നൽകുക"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"അപ്ഡേറ്റ് പിന്നീട് ഇൻസ്റ്റാൾ ചെയ്യാൻ പാസ്വേഡ് നൽകുക"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"അപ്ഡേറ്റ് പിന്നീട് ഇൻസ്റ്റാൾ ചെയ്യാൻ പാറ്റേൺ വരയ്ക്കുക"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"ഉപകരണം അപ്ഡേറ്റ് ചെയ്തു. തുടരുന്നതിന് പിൻ നൽകുക."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"ഉപകരണം അപ്ഡേറ്റ് ചെയ്തു. തുടരുന്നതിന് പാസ്വേഡ് നൽകുക."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"ഉപകരണം അപ്ഡേറ്റ് ചെയ്തു. തുടരുന്നതിന് പാറ്റേൺ വരയ്ക്കുക."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-mn/strings.xml b/packages/SystemUI/res-keyguard/values-mn/strings.xml index 54def0c95583..b326d3ed2049 100644 --- a/packages/SystemUI/res-keyguard/values-mn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-mn/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Бөмбөлөг"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Aналог"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Үргэлжлүүлэхийн тулд төхөөрөмжийнхөө түгжээг тайлна уу"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Дараа шинэчлэлт суулгахын тулд ПИН оруулна уу"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Дараа шинэчлэлт суулгахын тулд нууц үг оруулна уу"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Дараа шинэчлэлт суулгахын тулд хээ зурна уу"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Төхөөрөмжийг шинэчилсэн. Үргэлжлүүлэхийн тулд ПИН оруулна уу."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Төхөөрөмжийг шинэчилсэн. Үргэлжлүүлэхийн тулд нууц үг оруулна уу."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Төхөөрөмжийг шинэчилсэн. Үргэлжлүүлэхийн тулд хээ зурна уу."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-mr/strings.xml b/packages/SystemUI/res-keyguard/values-mr/strings.xml index 206bdf2b36b8..1e25e17f510a 100644 --- a/packages/SystemUI/res-keyguard/values-mr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-mr/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"बबल"</string> <string name="clock_title_analog" msgid="8409262532900918273">"अॅनालॉग"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"पुढे सुरू ठेवण्यासाठी तुमचे डिव्हाइस अनलॉक करा"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"नंतर अपडेट इंस्टॉल करण्यासाठी पिन एंटर करा"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"नंतर अपडेट इंस्टॉल करण्यासाठी पासवर्ड एंटर करा"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"नंतर अपडेट इंस्टॉल करण्यासाठी पॅटर्न ड्रॉ करा"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"डिव्हाइस अपडेट केले आहे. पुढे सुरू ठेवण्यासाठी पिन एंटर करा."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"डिव्हाइस अपडेट केले आहे. पुढे सुरू ठेवण्यासाठी पासवर्ड एंटर करा."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"डिव्हाइस अपडेट केले आहे. पुढे सुरू ठेवण्यासाठी पॅटर्न ड्रॉ करा."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ms/strings.xml b/packages/SystemUI/res-keyguard/values-ms/strings.xml index 2c42f2b50c67..3942dbbba1d8 100644 --- a/packages/SystemUI/res-keyguard/values-ms/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ms/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Gelembung"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analog"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Buka kunci peranti untuk meneruskan"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Masukkan PIN untuk memasang kemaskinian kemudian"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Masukkan kata laluan untuk memasang kemaskinian kemudian"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Lukis corak untuk memasang kemaskinian kemudian"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Peranti dikemaskinikan. Masukkan PIN untuk meneruskan."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Peranti dikemaskinikan. Masukkan kata laluan untuk meneruskan."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Peranti dikemaskinikan. Lukis corak untuk meneruskan."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-my/strings.xml b/packages/SystemUI/res-keyguard/values-my/strings.xml index a2c4aaee99be..311e0725f2f2 100644 --- a/packages/SystemUI/res-keyguard/values-my/strings.xml +++ b/packages/SystemUI/res-keyguard/values-my/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"ပူဖောင်းကွက်"</string> <string name="clock_title_analog" msgid="8409262532900918273">"ရိုးရိုး"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"ရှေ့ဆက်ရန် သင့်စက်ကိုဖွင့်ပါ"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"နောက်ပိုင်းတွင် အပ်ဒိတ်ထည့်သွင်းရန် ပင်နံပါတ်ထည့်ပါ"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"နောက်ပိုင်းတွင် အပ်ဒိတ်ထည့်သွင်းရန် စကားဝှက်ထည့်ပါ"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"နောက်ပိုင်းတွင် အပ်ဒိတ်ထည့်သွင်းရန် ပုံဖော်ရေးဆွဲပါ"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"စက်ပစ္စည်း အပ်ဒိတ်လုပ်ထားသည်။ ရှေ့ဆက်ရန် ပင်နံပါတ်ထည့်ပါ။"</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"စက်ပစ္စည်း အပ်ဒိတ်လုပ်ထားသည်။ ရှေ့ဆက်ရန် စကားဝှက်ထည့်ပါ။"</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"စက်ပစ္စည်း အပ်ဒိတ်လုပ်ထားသည်။ ရှေ့ဆက်ရန် ပုံဖော်ရေးဆွဲပါ။"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-nb/strings.xml b/packages/SystemUI/res-keyguard/values-nb/strings.xml index 501d83637bc8..94a6340a8654 100644 --- a/packages/SystemUI/res-keyguard/values-nb/strings.xml +++ b/packages/SystemUI/res-keyguard/values-nb/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Boble"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analog"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Lås opp enheten for å fortsette"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Oppgi PIN-koden for å installere oppdateringen senere"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Oppgi passordet for å installere oppdateringen senere"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Tegn mønsteret for å installere oppdateringen senere"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Enheten er oppdatert. Oppgi PIN-koden for å fortsette."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Enheten er oppdatert. Oppgi passordet for å fortsette."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Enheten er oppdatert. Tegn mønsteret for å fortsette."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ne/strings.xml b/packages/SystemUI/res-keyguard/values-ne/strings.xml index c89855d2d06c..0b4a4a56e49e 100644 --- a/packages/SystemUI/res-keyguard/values-ne/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ne/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"बबल"</string> <string name="clock_title_analog" msgid="8409262532900918273">"एनालग"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"आफ्नो डिभाइस अनलक गरी जारी राख्नुहोस्"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"पछि अपडेट इन्स्टल गर्न PIN हाल्नुहोस्"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"पछि अपडेट इन्स्टल गर्न पासवर्ड हाल्नुहोस्"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"पछि अपडेट इन्स्टल गर्न प्याटर्न बनाउनुहोस्"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"डिभाइस अपडेट गरिएको छ। जारी राख्न PIN हाल्नुहोस्।"</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"डिभाइस अपडेट गरिएको छ। जारी राख्न पासवर्ड हाल्नुहोस्।"</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"डिभाइस अपडेट गरिएको छ। जारी राख्न प्याटर्न बनाउनुहोस्।"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-nl/strings.xml b/packages/SystemUI/res-keyguard/values-nl/strings.xml index 9b8b72d3367a..c394fb6ce55a 100644 --- a/packages/SystemUI/res-keyguard/values-nl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-nl/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Bel"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analoog"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Ontgrendel je apparaat om door te gaan"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Voer de pincode in om de update later te installeren"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Voer het wachtwoord in om de update later te installeren"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Teken het patroon om de update later te installeren"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Apparaat geüpdatet. Voer de pincode in om door te gaan."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Apparaat geüpdatet. Voer het wachtwoord in om door te gaan."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Apparaat geüpdatet. Teken het patroon om door te gaan."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-or/strings.xml b/packages/SystemUI/res-keyguard/values-or/strings.xml index bcf59847afa5..666dab57f8d3 100644 --- a/packages/SystemUI/res-keyguard/values-or/strings.xml +++ b/packages/SystemUI/res-keyguard/values-or/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"ବବଲ୍"</string> <string name="clock_title_analog" msgid="8409262532900918273">"ଆନାଲଗ୍"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"ଜାରି ରଖିବା ପାଇଁ ଆପଣଙ୍କ ଡିଭାଇସକୁ ଅନଲକ କରନ୍ତୁ"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"ପରେ ଅପଡେଟ ଇନଷ୍ଟଲ କରିବାକୁ PIN ଲେଖନ୍ତୁ"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"ପରେ ଅପଡେଟ ଇନଷ୍ଟଲ କରିବାକୁ ପାସୱାର୍ଡ ଲେଖନ୍ତୁ"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"ପରେ ଅପଡେଟ ଇନଷ୍ଟଲ କରିବାକୁ ପାଟର୍ନ ଡ୍ର କରନ୍ତୁ"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"ଡିଭାଇସ ଅପଡେଟ କରାଯାଇଛି। ଜାରି ରଖିବାକୁ PIN ଲେଖନ୍ତୁ।"</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"ଡିଭାଇସ ଅପଡେଟ କରାଯାଇଛି। ଜାରି ରଖିବାକୁ ପାସୱାର୍ଡ ଲେଖନ୍ତୁ।"</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"ଡିଭାଇସ ଅପଡେଟ କରାଯାଇଛି। ଜାରି ରଖିବାକୁ ପାଟର୍ନ ଡ୍ର କରନ୍ତୁ।"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-pa/strings.xml b/packages/SystemUI/res-keyguard/values-pa/strings.xml index 67ba3ef1e7b2..321c99f6957f 100644 --- a/packages/SystemUI/res-keyguard/values-pa/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pa/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"ਬੁਲਬੁਲਾ"</string> <string name="clock_title_analog" msgid="8409262532900918273">"ਐਨਾਲੌਗ"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"ਜਾਰੀ ਰੱਖਣ ਲਈ ਆਪਣੇ ਡੀਵਾਈਸ ਨੂੰ ਅਣਲਾਕ ਕਰੋ"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"ਅੱਪਡੇਟ ਨੂੰ ਬਾਅਦ ਵਿੱਚ ਸਥਾਪਤ ਕਰਨ ਲਈ ਪਿੰਨ ਦਾਖਲ ਕਰੋ"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"ਅੱਪਡੇਟ ਨੂੰ ਬਾਅਦ ਵਿੱਚ ਸਥਾਪਤ ਕਰਨ ਲਈ ਪਾਸਵਰਡ ਦਾਖਲ ਕਰੋ"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"ਅੱਪਡੇਟ ਨੂੰ ਬਾਅਦ ਵਿੱਚ ਸਥਾਪਤ ਕਰਨ ਲਈ ਪੈਟਰਨ ਬਣਾਓ"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"ਡੀਵਾਈਸ ਅੱਪਡੇਟ ਹੋ ਗਿਆ। ਜਾਰੀ ਰੱਖਣ ਲਈ ਪਿੰਨ ਦਾਖਲ ਕਰੋ।"</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"ਡੀਵਾਈਸ ਅੱਪਡੇਟ ਹੋ ਗਿਆ। ਜਾਰੀ ਰੱਖਣ ਲਈ ਪਾਸਵਰਡ ਦਾਖਲ ਕਰੋ।"</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"ਡੀਵਾਈਸ ਅੱਪਡੇਟ ਹੋ ਗਿਆ। ਜਾਰੀ ਰੱਖਣ ਲਈ ਪੈਟਰਨ ਬਣਾਓ।"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-pl/strings.xml b/packages/SystemUI/res-keyguard/values-pl/strings.xml index 868bf2210d5e..1a3889651c2b 100644 --- a/packages/SystemUI/res-keyguard/values-pl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pl/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Bąbelkowy"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analogowy"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Aby przejść dalej, odblokuj urządzenie"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Podaj kod PIN, żeby zainstalować aktualizację później"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Wpisz hasło, żeby zainstalować aktualizację później"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Narysuj wzór, żeby zainstalować aktualizację później"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Urządzenie zostało zaktualizowane. Podaj kod PIN, aby kontynuować."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Urządzenie zostało zaktualizowane. Wpisz hasło, aby kontynuować."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Urządzenie zostało zaktualizowane. Narysuj wzór, aby kontynuować."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml index 15b3fc00019d..962f1e660072 100644 --- a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Bolha"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analógico"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Desbloqueie o dispositivo para continuar"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Digite o PIN para instalar a atualização mais tarde"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Digite a senha para instalar a atualização mais tarde"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Desenhe o padrão para instalar a atualização mais tarde"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Dispositivo atualizado. Digite o PIN para continuar."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Dispositivo atualizado. Digite a senha para continuar."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Dispositivo atualizado. Desenhe o padrão para continuar."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml index e1a0c43202c4..afec176e4721 100644 --- a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Balão"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analógico"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Desbloqueie o dispositivo para continuar"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Introduza o PIN para instalar a atualização mais tarde"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Introduza a palavra-passe para instalar a atualização mais tarde"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Desenhe o padrão para instalar a atualização mais tarde"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Dispositivo atualizado. Introduza o PIN para continuar."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Dispositivo atualizado. Introduza a palavra-passe para continuar."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Dispositivo atualizado. Desenhe o padrão para continuar."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-pt/strings.xml b/packages/SystemUI/res-keyguard/values-pt/strings.xml index 15b3fc00019d..962f1e660072 100644 --- a/packages/SystemUI/res-keyguard/values-pt/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pt/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Bolha"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analógico"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Desbloqueie o dispositivo para continuar"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Digite o PIN para instalar a atualização mais tarde"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Digite a senha para instalar a atualização mais tarde"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Desenhe o padrão para instalar a atualização mais tarde"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Dispositivo atualizado. Digite o PIN para continuar."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Dispositivo atualizado. Digite a senha para continuar."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Dispositivo atualizado. Desenhe o padrão para continuar."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ro/strings.xml b/packages/SystemUI/res-keyguard/values-ro/strings.xml index 9f568cc79936..caa3d83c5d86 100644 --- a/packages/SystemUI/res-keyguard/values-ro/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ro/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Balon"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analogic"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Deblochează dispozitivul pentru a continua"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Introdu codul PIN pentru a instala actualizarea mai târziu"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Introdu parola pentru a instala actualizarea mai târziu"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Desenează modelul pentru a instala actualizarea mai târziu"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Dispozitivul s-a actualizat. Introdu codul PIN pentru a continua."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Dispozitivul s-a actualizat. Introdu parola pentru a continua."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Dispozitivul s-a actualizat. Desenează modelul pentru a continua."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ru/strings.xml b/packages/SystemUI/res-keyguard/values-ru/strings.xml index bae52556b4c9..bd52b7d2a4f5 100644 --- a/packages/SystemUI/res-keyguard/values-ru/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ru/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Пузырь"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Стрелки"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Чтобы продолжить, разблокируйте устройство"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Введите PIN-код, чтобы установить обновление позже."</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Введите пароль, чтобы установить обновление позже."</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Введите графический ключ, чтобы установить обновление позже."</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Устройство обновлено. Введите PIN-код."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Устройство обновлено. Введите пароль."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Устройство обновлено. Введите графический ключ."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-si/strings.xml b/packages/SystemUI/res-keyguard/values-si/strings.xml index 4bb8aeb499fb..0dfc8d936bc5 100644 --- a/packages/SystemUI/res-keyguard/values-si/strings.xml +++ b/packages/SystemUI/res-keyguard/values-si/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"බුබුළ"</string> <string name="clock_title_analog" msgid="8409262532900918273">"ප්රතිසමය"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"ඉදිරියට යාමට ඔබේ උපාංගය අගුළු හරින්න"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"පසුව යාවත්කාලීනය ස්ථාපනය කිරීමට PIN ඇතුළු කරන්න"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"පසුව යාවත්කාලීනය ස්ථාපනය කිරීමට මුරපදය ඇතුළු කරන්න"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"පසුව යාවත්කාලීනය ස්ථාපනය කිරීමට රටාව අඳින්න"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"උපාංගය යාවත්කාලීන කරන ලදි. ඉදිරියට යාමට PIN ඇතුළු කරන්න."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"උපාංගය යාවත්කාලීන කරන ලදි. ඉදිරියට යාමට මුරපදය ඇතුළු කරන්න."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"උපාංගය යාවත්කාලීන කරන ලදි. ඉදිරියට යාමට රටාව අඳින්න."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-sk/strings.xml b/packages/SystemUI/res-keyguard/values-sk/strings.xml index 08bf30de6b97..5f1028799302 100644 --- a/packages/SystemUI/res-keyguard/values-sk/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sk/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Bublina"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analógový"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Ak chcete pokračovať, odomknite zariadenie"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Zadajte PIN, aby sa aktualizácia nainštalovala neskôr"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Zadajte heslo, aby sa aktualizácia nainštalovala neskôr"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Nakreslite vzor, aby sa aktualizácia nainštalovala neskôr"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Zariadenie bolo aktualizované. Pokračujte zadaním kódu PIN."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Zariadenie bolo aktualizované. Pokračujte zadaním hesla."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Zariadenie bolo aktualizované. Pokračujte nakreslením vzoru."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-sl/strings.xml b/packages/SystemUI/res-keyguard/values-sl/strings.xml index 3f2968886989..26d49513535b 100644 --- a/packages/SystemUI/res-keyguard/values-sl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sl/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Mehurček"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analogno"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Za nadaljevanje odklenite napravo"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Vnesite kodo PIN, če želite posodobitev namestiti pozneje"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Vnesite geslo, če želite posodobitev namestiti pozneje"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Narišite vzorec, če želite posodobitev namestiti pozneje"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Naprava je posodobljena. Vnesite kodo PIN za nadaljevanje."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Naprava je posodobljena. Vnesite geslo za nadaljevanje."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Naprava je posodobljena. Narišite vzorec za nadaljevanje."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-sq/strings.xml b/packages/SystemUI/res-keyguard/values-sq/strings.xml index 149207c49bce..ef4e566d5582 100644 --- a/packages/SystemUI/res-keyguard/values-sq/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sq/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Flluskë"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analoge"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Shkyç pajisjen tënde për të vazhduar"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Fut kodin PIN për ta instaluar përditësimin më vonë"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Fut fjalëkalimin për ta instaluar përditësimin më vonë"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Vizato motivin për ta instaluar përditësimin më vonë"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Pajisja u përditësua. Fut kodin PIN për të vazhduar."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Pajisja u përditësua. Fut fjalëkalimin për të vazhduar."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Pajisja u përditësua. Vizato motivin për të vazhduar."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-sr/strings.xml b/packages/SystemUI/res-keyguard/values-sr/strings.xml index cabf94f6f86a..5ed152ffeec7 100644 --- a/packages/SystemUI/res-keyguard/values-sr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sr/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Мехурићи"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Аналогни"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Откључајте уређај да бисте наставили"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Унесите PIN да бисте касније исталирали ажурирање"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Унесите лозинку да бисте касније инсталирали ажурирање"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Нацртајте шаблон да бисте касније инсталирали ажурирање"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Уређај је ажуриран. Унесите PIN да бисте наставили."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Уређај је ажуриран. Унесите лозинку да бисте наставили."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Уређај је ажуриран. Нацртајте шаблон да бисте наставили."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-sv/strings.xml b/packages/SystemUI/res-keyguard/values-sv/strings.xml index c11e0f1e657d..abd677adc207 100644 --- a/packages/SystemUI/res-keyguard/values-sv/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sv/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Bubbla"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analog"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Lås upp enheten för att fortsätta"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Ange pinkoden för att installera uppdateringen senare"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Ange lösenordet för att installera uppdateringen senare"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Rita mönstret för att installera uppdateringen senare"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Enheten har uppdaterats. Ange pinkoden för att fortsätta."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Enheten har uppdaterats. Ange lösenordet för att fortsätta."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Enheten har uppdaterats. Rita mönstret för att fortsätta."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-sw/strings.xml b/packages/SystemUI/res-keyguard/values-sw/strings.xml index 943c76b79c02..7516d9092e0d 100644 --- a/packages/SystemUI/res-keyguard/values-sw/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sw/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Kiputo"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analogi"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Fungua kifaa chako ili uendelee"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Weka PIN ili usakinishe sasisho baadaye"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Weka nenosiri ili usakinishe sasisho baadaye"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Chora mchoro ili usakinishe sasisho baadaye"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Kifaa kimesasishwa. Weka PIN ili uendelee."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Kifaa kimesasishwa. Weka nenosiri ili uendelee."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Kifaa kimesasishwa. Chora mchoro ili uendelee."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ta/strings.xml b/packages/SystemUI/res-keyguard/values-ta/strings.xml index 3e64755d33e7..92dfc187086c 100644 --- a/packages/SystemUI/res-keyguard/values-ta/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ta/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"பபிள்"</string> <string name="clock_title_analog" msgid="8409262532900918273">"அனலாக்"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"தொடர, சாதனத்தை அன்லாக் செய்யுங்கள்"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"புதுப்பிப்பைப் பின்னர் நிறுவ பின்னை உள்ளிடவும்"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"புதுப்பிப்பைப் பின்னர் நிறுவ கடவுச்சொல்லை உள்ளிடவும்"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"புதுப்பிப்பைப் பின்னர் நிறுவ பேட்டர்னை வரையவும்"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"சாதனம் புதுப்பிக்கப்பட்டது. தொடர பின்னை உள்ளிடவும்."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"சாதனம் புதுப்பிக்கப்பட்டது. தொடர கடவுச்சொல்லை உள்ளிடவும்."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"சாதனம் புதுப்பிக்கப்பட்டது. தொடர பேட்டர்னை வரையவும்."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-te/strings.xml b/packages/SystemUI/res-keyguard/values-te/strings.xml index f8bf307800cc..a12d6ecb0275 100644 --- a/packages/SystemUI/res-keyguard/values-te/strings.xml +++ b/packages/SystemUI/res-keyguard/values-te/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"బబుల్"</string> <string name="clock_title_analog" msgid="8409262532900918273">"ఎనలాగ్"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"కొనసాగించడానికి మీ పరికరాన్ని అన్లాక్ చేయండి"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"అప్డేట్ను తర్వాత ఇన్స్టాల్ చేయడానికి PINను ఎంటర్ చేయండి"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"అప్డేట్ను తర్వాత ఇన్స్టాల్ చేయడానికి పాస్వర్డ్ను ఎంటర్ చేయండి"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"అప్డేట్ను తర్వాత ఇన్స్టాల్ చేయడానికి ఆకృతిని గీయండి"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"పరికరం అప్డేట్ అయింది. కొనసాగడానికి PINను ఎంటర్ చేయండి."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"పరికరం అప్డేట్ అయింది. కొనసాగడానికి పాస్వర్డ్ను ఎంటర్ చేయండి."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"పరికరం అప్డేట్ అయింది. కొనసాగడానికి ఆకృతిని గీయండి."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-th/strings.xml b/packages/SystemUI/res-keyguard/values-th/strings.xml index 4df30dc3be36..bcd097dc8670 100644 --- a/packages/SystemUI/res-keyguard/values-th/strings.xml +++ b/packages/SystemUI/res-keyguard/values-th/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"บับเบิล"</string> <string name="clock_title_analog" msgid="8409262532900918273">"แอนะล็อก"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"ปลดล็อกอุปกรณ์ของคุณเพื่อดำเนินการต่อ"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"ป้อน PIN เพื่อติดตั้งอัปเดตในภายหลัง"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"ป้อนรหัสผ่านเพื่อติดตั้งอัปเดตในภายหลัง"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"วาดรูปแบบเพื่อติดตั้งอัปเดตในภายหลัง"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"อัปเดตอุปกรณ์แล้ว ป้อน PIN เพื่อดำเนินการต่อ"</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"อัปเดตอุปกรณ์แล้ว ป้อนรหัสผ่านเพื่อดำเนินการต่อ"</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"อัปเดตอุปกรณ์แล้ว วาดรูปแบบเพื่อดำเนินการต่อ"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-tl/strings.xml b/packages/SystemUI/res-keyguard/values-tl/strings.xml index 70328866b4e8..a968cb0444e4 100644 --- a/packages/SystemUI/res-keyguard/values-tl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-tl/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Bubble"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analog"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"I-unlock ang iyong device para magpatuloy"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Ilagay ang PIN para i-install ang update sa ibang pagkakataon"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Ilagay ang password para i-install ang update sa ibang pagkakataon"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Iguhit ang pattern para i-install ang update sa ibang pagkakataon"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Na-update na ang device. Ilagay ang PIN para magpatuloy."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Na-update na ang device. Ilagay ang password para magpatuloy."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Na-update na ang device. Iguhit ang pattern para magpatuloy."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-tr/strings.xml b/packages/SystemUI/res-keyguard/values-tr/strings.xml index ff0bc9a867e6..1aad78cf5ef1 100644 --- a/packages/SystemUI/res-keyguard/values-tr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-tr/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Baloncuk"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analog"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Devam etmek için cihazınızın kilidini açın"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Güncellemeyi daha sonra yüklemek için PIN girin."</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Güncellemeyi daha sonra yüklemek için şifre girin."</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Güncellemeyi daha sonra yüklemek için desen çizin."</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Cihaz güncellendi. Devam etmek için PIN girin."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Cihaz güncellendi. Devam etmek için şifre girin."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Cihaz güncellendi. Devam etmek için desen çizin."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-uk/strings.xml b/packages/SystemUI/res-keyguard/values-uk/strings.xml index 2fd193452508..a147d07ef28c 100644 --- a/packages/SystemUI/res-keyguard/values-uk/strings.xml +++ b/packages/SystemUI/res-keyguard/values-uk/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Бульбашковий"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Аналоговий"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Розблокуйте пристрій, щоб продовжити"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Щоб установити оновлення пізніше, введіть PIN-код"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Щоб установити оновлення пізніше, введіть пароль"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Щоб установити оновлення пізніше, намалюйте ключ"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Пристрій оновлено. Щоб продовжити, введіть PIN-код."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Пристрій оновлено. Щоб продовжити, введіть пароль."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Пристрій оновлено. Щоб продовжити, намалюйте ключ."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ur/strings.xml b/packages/SystemUI/res-keyguard/values-ur/strings.xml index dc6ef4dc9ac0..5c9e6b0f0770 100644 --- a/packages/SystemUI/res-keyguard/values-ur/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ur/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"بلبلہ"</string> <string name="clock_title_analog" msgid="8409262532900918273">"اینالاگ"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"جاری رکھنے کے لئے اپنا آلہ غیر مقفل کریں"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"بعد میں اپ ڈیٹ انسٹال کرنے کیلئے PIN درج کریں"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"بعد میں اپ ڈیٹ انسٹال کرنے کیلئے پاس ورڈ درج کریں"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"بعد میں اپ ڈیٹ انسٹال کرنے کیلئے پیٹرن ڈرا کریں"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"آلہ اپ ڈیٹ ہو گیا۔ جاری رکھنے کیلئے PIN درج کریں۔"</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"آلہ اپ ڈیٹ ہو گیا۔ جاری رکھنے کیلئے پاس ورڈ درج کریں۔"</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"آلہ اپ ڈیٹ ہو گیا۔ جاری رکھنے کیلئے پیٹرن ڈرا کریں۔"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-uz/strings.xml b/packages/SystemUI/res-keyguard/values-uz/strings.xml index 0e2a6cfa9513..53c2a2ca4501 100644 --- a/packages/SystemUI/res-keyguard/values-uz/strings.xml +++ b/packages/SystemUI/res-keyguard/values-uz/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Pufaklar"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analog"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Davom etish uchun qurilmangizni qulfdan chiqaring"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Yangilanishni keyinroq oʻrnatish uchun PIN kodni kiriting"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Yangilanishni keyinroq oʻrnatish uchun parolni kiriting"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Yangilanishni keyinroq oʻrnatish uchun grafik kalitni chizing"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Qurilma yangilandi. Davom etish uchun PIN kodni kiriting."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Qurilma yangilandi. Davom etish uchun parolni kiriting."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Qurilma yangilandi. Davom etish uchun grafik kalitni chizing."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-vi/strings.xml b/packages/SystemUI/res-keyguard/values-vi/strings.xml index e2d2525a52a7..b81e1470bb34 100644 --- a/packages/SystemUI/res-keyguard/values-vi/strings.xml +++ b/packages/SystemUI/res-keyguard/values-vi/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Bong bóng"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Đồng hồ kim"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Mở khoá thiết bị của bạn để tiếp tục"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Hãy nhập mã PIN để cài đặt bản cập nhật vào lúc khác"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Hãy nhập mật khẩu để cài đặt bản cập nhật vào lúc khác"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Hãy vẽ hình mở khoá để cài đặt bản cập nhật vào lúc khác"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Đã cập nhật thiết bị. Hãy nhập mã PIN để tiếp tục."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Đã cập nhật thiết bị. Hãy nhập mật khẩu để tiếp tục."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Đã cập nhật thiết bị. Hãy vẽ hình mở khoá để tiếp tục."</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml index 2888c374743c..0f0feb548eb9 100644 --- a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"泡泡"</string> <string name="clock_title_analog" msgid="8409262532900918273">"指针"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"解锁设备才能继续操作"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"需要输入 PIN 码才能稍后安装更新"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"需要输入密码才能稍后安装更新"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"需要绘制解锁图案才能稍后安装更新"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"设备已更新。您需要输入 PIN 码才能继续。"</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"设备已更新。您需要输入密码才能继续。"</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"设备已更新。您需要绘制解锁图案才能继续。"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml index ba40a6510f2a..701100fc44f9 100644 --- a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"泡泡"</string> <string name="clock_title_analog" msgid="8409262532900918273">"指針"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"解鎖裝置以繼續"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"輸入 PIN 即可在稍後安裝更新"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"輸入密碼即可在稍後安裝更新"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"畫出解鎖圖案即可在稍後安裝更新"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"裝置已更新。輸入 PIN 即可繼續。"</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"裝置已更新。輸入密碼即可繼續。"</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"裝置已更新。畫出解鎖圖案即可繼續。"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml index b73e803c5a34..4ac27f2df42f 100644 --- a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"泡泡"</string> <string name="clock_title_analog" msgid="8409262532900918273">"類比"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"解鎖裝置才能繼續操作"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"請輸入 PIN 碼,系統稍後會安裝更新"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"請輸入密碼,系統稍後會安裝更新"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"請畫出解鎖圖案,系統稍後會安裝更新"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"裝置已更新。如要繼續操作,請輸入 PIN 碼。"</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"裝置已更新。如要繼續操作,請輸入密碼。"</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"裝置已更新。如要繼續操作,請畫出解鎖圖案。"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-zu/strings.xml b/packages/SystemUI/res-keyguard/values-zu/strings.xml index 6a2d36810250..e4a4503af5ce 100644 --- a/packages/SystemUI/res-keyguard/values-zu/strings.xml +++ b/packages/SystemUI/res-keyguard/values-zu/strings.xml @@ -125,4 +125,10 @@ <string name="clock_title_bubble" msgid="2204559396790593213">"Ibhamuza"</string> <string name="clock_title_analog" msgid="8409262532900918273">"I-Analog"</string> <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Vula idivayisi yakho ukuze uqhubeke"</string> + <string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"Faka Iphinikhodi ukuze ufake isibuyekezo kamuva"</string> + <string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"Faka iphasiwedi ukuze ufake isibuyekezo kamuva"</string> + <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"Dweba iphethini ukuze ufake isibuyekezo kamuva"</string> + <string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"Idivayisi ibuyekeziwe. Faka Iphinikhodi ukuze uqhubeke."</string> + <string name="kg_prompt_after_update_password" msgid="153703052501352094">"Idivayisi ibuyekeziwe. Faka iphasiwedi ukuze uqhubeke."</string> + <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"Idivayisi ibuyekeziwe. Dweba iphethini ukuze uqhubeke."</string> </resources> diff --git a/packages/SystemUI/res-product/values-it/strings.xml b/packages/SystemUI/res-product/values-it/strings.xml index 5964af809dc7..0b3bb3d8d0b5 100644 --- a/packages/SystemUI/res-product/values-it/strings.xml +++ b/packages/SystemUI/res-product/values-it/strings.xml @@ -42,7 +42,7 @@ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"<xliff:g id="NUMBER_0">%1$d</xliff:g> tentativi errati di inserimento della sequenza di sblocco. Dopo altri <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativi falliti, ti verrà chiesto di sbloccare il telefono con un account email.\n\n Riprova tra <xliff:g id="NUMBER_2">%3$d</xliff:g> secondi."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Il sensore di impronte digitali si trova sul tasto di accensione. Si tratta del tasto piatto accanto al tasto del volume in rilievo sul bordo del tablet."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Il sensore di impronte digitali si trova sul tasto di accensione. Si tratta del tasto piatto accanto al tasto del volume in rilievo sulla parte laterale del dispositivo."</string> - <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Il sensore di impronte digitali si trova sul tasto di accensione. Si tratta del tasto piatto accanto al tasto del volume in rilievo sulla parte laterale del telefono."</string> + <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Il sensore di impronte digitali si trova sul tasto di accensione. Si tratta del tasto piatto accanto al tasto del volume in rilievo sulla parte laterale dello smartphone."</string> <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Sblocca il telefono per visualizzare altre opzioni"</string> <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Sblocca il tablet per visualizzare altre opzioni"</string> <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Sblocca il dispositivo per visualizzare altre opzioni"</string> diff --git a/packages/SystemUI/res-product/values/strings.xml b/packages/SystemUI/res-product/values/strings.xml index 13f72af084b7..42733a20ffae 100644 --- a/packages/SystemUI/res-product/values/strings.xml +++ b/packages/SystemUI/res-product/values/strings.xml @@ -122,6 +122,44 @@ Try again in <xliff:g id="number">%3$d</xliff:g> seconds. </string> + <!-- Title for notification & dialog that the user's phone last shut down because it got too hot. [CHAR LIMIT=40] --> + <string name="thermal_shutdown_title" product="default">Phone turned off due to heat</string> + <!-- Title for notification & dialog that the user's device last shut down because it got too hot. [CHAR LIMIT=40] --> + <string name="thermal_shutdown_title" product="device">Device turned off due to heat</string> + <!-- Title for notification & dialog that the user's tablet last shut down because it got too hot. [CHAR LIMIT=40] --> + <string name="thermal_shutdown_title" product="tablet">Tablet turned off due to heat</string> + <!-- Message body for notification that user's phone last shut down because it got too hot. [CHAR LIMIT=120] --> + <string name="thermal_shutdown_message" product="default">Your phone is now running normally.\nTap for more info</string> + <!-- Message body for notification that user's device last shut down because it got too hot. [CHAR LIMIT=120] --> + <string name="thermal_shutdown_message" product="device">Your device is now running normally.\nTap for more info</string> + <!-- Message body for notification that user's tablet last shut down because it got too hot. [CHAR LIMIT=120] --> + <string name="thermal_shutdown_message" product="tablet">Your tablet is now running normally.\nTap for more info</string> + <!-- Text body for dialog alerting user that their phone last shut down because it got too hot. [CHAR LIMIT=500] --> + <string name="thermal_shutdown_dialog_message" product="default">Your phone was too hot, so it turned off to cool down. Your phone is now running normally.\n\nYour phone may get too hot if you:\n\t• Use resource-intensive apps (such as gaming, video, or navigation apps)\n\t• Download or upload large files\n\t• Use your phone in high temperatures</string> + <!-- Text body for dialog alerting user that their device last shut down because it got too hot. [CHAR LIMIT=500] --> + <string name="thermal_shutdown_dialog_message" product="device">Your device was too hot, so it turned off to cool down. Your device is now running normally.\n\nYour device may get too hot if you:\n\t• Use resource-intensive apps (such as gaming, video, or navigation apps)\n\t• Download or upload large files\n\t• Use your device in high temperatures</string> + <!-- Text body for dialog alerting user that their tablet last shut down because it got too hot. [CHAR LIMIT=500] --> + <string name="thermal_shutdown_dialog_message" product="tablet">Your tablet was too hot, so it turned off to cool down. Your tablet is now running normally.\n\nYour tablet may get too hot if you:\n\t• Use resource-intensive apps (such as gaming, video, or navigation apps)\n\t• Download or upload large files\n\t• Use your tablet in high temperatures</string> + + <!-- Title for notification (and dialog) that user's phone has reached a certain temperature and may start to slow down in order to cool down. [CHAR LIMIT=30] --> + <string name="high_temp_title" product="default">Phone is getting warm</string> + <!-- Title for notification (and dialog) that user's phone has reached a certain temperature and may start to slow down in order to cool down. [CHAR LIMIT=30] --> + <string name="high_temp_title" product="device">Device is getting warm</string> + <!-- Title for notification (and dialog) that user's phone has reached a certain temperature and may start to slow down in order to cool down. [CHAR LIMIT=30] --> + <string name="high_temp_title" product="tablet">Tablet is getting warm</string> + <!-- Message body for notification that user's phone has reached a certain temperature and may start to slow down in order to cool down. [CHAR LIMIT=120] --> + <string name="high_temp_notif_message" product="default">Some features limited while phone cools down.\nTap for more info</string> + <!-- Message body for notification that user's device has reached a certain temperature and may start to slow down in order to cool down. [CHAR LIMIT=120] --> + <string name="high_temp_notif_message" product="device">Some features limited while device cools down.\nTap for more info</string> + <!-- Message body for notification that user's tablet has reached a certain temperature and may start to slow down in order to cool down. [CHAR LIMIT=120] --> + <string name="high_temp_notif_message" product="tablet">Some features limited while tablet cools down.\nTap for more info</string> + <!-- Text body for dialog alerting user that their phone has reached a certain temperature and may start to slow down in order to cool down. [CHAR LIMIT=350] --> + <string name="high_temp_dialog_message" product="default">Your phone will automatically try to cool down. You can still use your phone, but it may run slower.\n\nOnce your phone has cooled down, it will run normally.</string> + <!-- Text body for dialog alerting user that their phone has reached a certain temperature and may start to slow down in order to cool down. [CHAR LIMIT=350] --> + <string name="high_temp_dialog_message" product="device">Your device will automatically try to cool down. You can still use your device, but it may run slower.\n\nOnce your device has cooled down, it will run normally.</string> + <!-- Text body for dialog alerting user that their phone has reached a certain temperature and may start to slow down in order to cool down. [CHAR LIMIT=350] --> + <string name="high_temp_dialog_message" product="tablet">Your tablet will automatically try to cool down. You can still use your tablet, but it may run slower.\n\nOnce your tablet has cooled down, it will run normally.</string> + <!-- Content description of the fingerprint icon when the system-provided fingerprint dialog is showing, to locate the sensor (tablet) for accessibility (not shown on the screen). [CHAR LIMIT=NONE]--> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet">The fingerprint sensor is on the power button. It’s the flat button next to the raised volume button on the edge of the tablet.</string> <!-- Content description of the fingerprint icon when the system-provided fingerprint dialog is showing, to locate the sensor (device) for accessibility (not shown on the screen). [CHAR LIMIT=NONE]--> diff --git a/packages/SystemUI/res/drawable/stat_sys_connected_display.xml b/packages/SystemUI/res/drawable/stat_sys_connected_display.xml new file mode 100644 index 000000000000..3f3d6f573f44 --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_connected_display.xml @@ -0,0 +1,25 @@ +<!-- +Copyright (C) 2023 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:fillColor="@android:color/white" + android:viewportWidth="960" + android:viewportHeight="960"> + <path + android:fillColor="@android:color/white" + android:pathData="M320,840L320,760L400,760L400,680L160,680Q127,680 103.5,656.5Q80,633 80,600L80,200Q80,167 103.5,143.5Q127,120 160,120L800,120Q833,120 856.5,143.5Q880,167 880,200L880,600Q880,633 856.5,656.5Q833,680 800,680L560,680L560,760L640,760L640,840L320,840ZM160,600L800,600Q800,600 800,600Q800,600 800,600L800,200Q800,200 800,200Q800,200 800,200L160,200Q160,200 160,200Q160,200 160,200L160,600Q160,600 160,600Q160,600 160,600ZM160,600Q160,600 160,600Q160,600 160,600L160,200Q160,200 160,200Q160,200 160,200L160,200Q160,200 160,200Q160,200 160,200L160,600Q160,600 160,600Q160,600 160,600L160,600Z" /> +</vector>
\ 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 71b02bfc5dbc..2fa971150f0e 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Kon nie jou batterymeter lees nie"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Tik vir meer inligting"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Geen wekker nie"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"voer skermslot in"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Vingerafdruksensor"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"staaf"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"gaan by toestel in"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"Kom meer te wete"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"Kom meer te wete by <xliff:g id="URL">%s</xliff:g>"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"Maak <xliff:g id="APPNAME">%1$s</xliff:g> oop"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"Om die Wallet-app as ’n kortpad by te voeg, moet jy seker maak dat die app geïnstalleer is"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"Om die Wallet-app as ’n kortpad by te voeg, moet jy seker maak dat minstens een kaart bygevoeg is"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"Om die QR-kodeskandeerder as ’n kortpad by te voeg, moet jy seker maak dat ’n kamera-app geïnstalleer is"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"Om die Home-app as ’n kortpad by te voeg, moet jy seker maak dat die app geïnstalleer is"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• Minstens een toestel beskikbaar is"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Kies ’n versteknotasapp om die notaneemkortpad te gebruik"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Kies app"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Raak en hou kortpad"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Kanselleer"</string> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index e2038fb0ad8e..6d6b435c49ea 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"የባትሪ መለኪያዎን የማንበብ ችግር"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"ለበለጠ መረጃ መታ ያድርጉ"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"ምንም ማንቂያ አልተቀናበረም"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"ማያ ገጽ መቆለፊያ ያስገቡ"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"የጣት አሻራ ዳሳሽ"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"ያረጋግጡ"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"መሣሪያን ያስገቡ"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"የበለጠ ለመረዳት"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"<xliff:g id="URL">%s</xliff:g> ላይ የበለጠ ይወቁ"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"<xliff:g id="APPNAME">%1$s</xliff:g> ይክፈቱ"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"የWallet መተግበሪያን እንደ አቋራጭ ለማከል መተግበሪያው መጫኑን ያረጋግጡ"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"የWallet መተግበሪያን እንደ አቋራጭ ለማከል ቢያንስ አንድ ካርድ መታከሉን ያረጋግጡ"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"የQR ኮድ መቃኛውን እንደ አቋራጭ ለማከል የካሜራ መተግበሪያ መጫኑን ያረጋግጡ"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"የHome መተግበሪያውን እንደ አቋራጭ ለማከል መተግበሪያው እንደተጫነ ያረጋግጡ"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• ቢያንስ አንድ መሣሪያ ይገኛል"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"የማስታወሻ አያያዝ አቋራጭን ለመጠቀም ነባሪ የማስታወሻ መተግበሪያ ይምረጡ"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"መተግበሪያ ይምረጡ"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"የይንኩ እና ይያዙ አቋራጭ"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"ይቅር"</string> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 4d4ee949cc20..614b96873ac2 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -399,7 +399,7 @@ <string name="media_projection_sys_service_dialog_warning" msgid="2443872865267330320">"ستتمكن الخدمة التي تقدّم هذه الوظيفة من الوصول إلى كل المحتوى المعروض على شاشتك أو الذي يتم تشغيله على جهازك أثناء التسجيل أو البثّ. ويشمل ذلك معلومات، مثل كلمات المرور وتفاصيل الدفع والصور والرسائل والمقاطع الصوتية التي تشغِّلها."</string> <string name="screen_share_permission_dialog_option_entire_screen" msgid="3131200488455089620">"الشاشة بالكامل"</string> <string name="screen_share_permission_dialog_option_single_app" msgid="4350961814397220929">"تطبيق واحد"</string> - <string name="screen_share_permission_app_selector_title" msgid="1404878013670347899">"مشاركة محتوى تطبيق أو تسجيله"</string> + <string name="screen_share_permission_app_selector_title" msgid="1404878013670347899">"مشاركة أو تسجيل محتوى تطبيق محدّد"</string> <string name="media_projection_entry_app_permission_dialog_title" msgid="9155535851866407199">"هل تريد بدء التسجيل أو البثّ باستخدام \"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>\"؟"</string> <string name="media_projection_entry_app_permission_dialog_warning_entire_screen" msgid="8736391633234144237">"أثناء المشاركة أو التسجيل أو البثّ، يمكن لتطبيق \"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>\" الوصول إلى كل المحتوى المعروض على شاشتك أو الذي يتم تشغيله على جهاز، لذا يُرجى توخي الحذر بشأن المعلومات، مثل كلمات المرور وتفاصيل الدفع والرسائل والصور وملفات الصوت والفيديو."</string> <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="5211695779082563959">"أثناء مشاركة محتوى تطبيق أو تسجيله أو بثّه، يمكن لتطبيق \"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>\" الوصول إلى كل المحتوى المعروض أو الذي يتم تشغيله في ذلك التطبيق، لذا يُرجى توخي الحذر بشأن المعلومات، مثل كلمات المرور وتفاصيل الدفع والرسائل والصور وملفات الصوت والفيديو."</string> @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"حدثت مشكلة أثناء قراءة مقياس مستوى شحن البطارية."</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"انقر للحصول على مزيد من المعلومات."</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"لم يتم ضبط منبّه."</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"إدخال الرمز لفتح القفل"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"مستشعر بصمات الإصبع"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"المصادقة"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"الدخول إلى الجهاز"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"مزيد من المعلومات"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"مزيد من المعلومات على <xliff:g id="URL">%s</xliff:g>"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"فتح \"<xliff:g id="APPNAME">%1$s</xliff:g>\""</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"لإضافة تطبيق \"محفظة Google\" كاختصار، تأكَّد من أنّ التطبيق مثبَّت."</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"لإضافة تطبيق \"محفظة Google\" كاختصار، تأكَّد من إضافة بطاقة واحدة على الأقل."</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"لإضافة تطبيق الماسح الضوئي لرمز الاستجابة السريعة كاختصار، تأكَّد من أنّ تطبيق الكاميرا مثبَّت."</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"لإضافة تطبيق Home كاختصار، تأكَّد من أنّ التطبيق مثبَّت."</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• توفُّر جهاز واحد على الأقل"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"اختَر تطبيقًا تلقائيًا لتدوين الملاحظات لاستخدام اختصار تدوين الملاحظات."</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"اختيار تطبيق"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"انقر مع الاستمرار على الاختصار."</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"إلغاء"</string> diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index eb07ee39f868..06c9f53dd7bd 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"আপোনাৰ বেটাৰী মিটাৰ পঢ়োঁতে সমস্যা হৈছে"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"অধিক তথ্যৰ বাবে টিপক"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"কোনো এলাৰ্ম ছেট কৰা হোৱা নাই"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"স্ক্ৰীন লকটো দিয়ক"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"ফিংগাৰপ্ৰিণ্ট ছেন্সৰ"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"বিশ্বাসযোগ্যতা প্ৰমাণ কৰক"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"ডিভাইচ আনলক কৰক"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"অধিক জানক"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"<xliff:g id="URL">%s</xliff:g>ত অধিক জানক"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"<xliff:g id="APPNAME">%1$s</xliff:g> খোলক"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"Wallet এপ্টোক এটা শ্বৰ্টকাট হিচাপে যোগ দিবলৈ, এপ্টো ইনষ্টল কৰি থোৱাটো নিশ্চিত কৰক"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"Wallet এপ্টোক এটা শ্বৰ্টকাট হিচাপে যোগ দিবলৈ, কমেও এখন কাৰ্ড যোগ দিয়াটো নিশ্চিত কৰক"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"কিউআৰ ক’ড স্কেনাৰক এটা শ্বৰ্টকাট হিচাপে যোগ দিবলৈ, কেমেৰা এপ্টো ইনষ্টল কৰি থোৱাটো নিশ্চিত কৰক"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"Home এপ্টোক এটা শ্বৰ্টকাট হিচাপে যোগ দিবলৈ, এপ্টো ইনষ্টল কৰি থোৱাটো নিশ্চিত কৰক"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• অতি কমেও এটা ডিভাইচ উপলব্ধ"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"টোকা গ্ৰহণৰ শ্বৰ্টকাটটো ব্যৱহাৰ কৰিবলৈ এটা ডিফ’ল্ট টোকা গ্ৰহণৰ এপ্ বাছনি কৰক"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"এপ্ বাছনি কৰক"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"শ্বৰ্টকাটটোত স্পৰ্শ কৰি ধৰি ৰাখক"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"বাতিল কৰক"</string> diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index a99ea62fde07..a413e6bd9869 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Batareya ölçüsünü oxuyarkən problem yarandı"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Ətraflı məlumat üçün toxunun"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Siqnal ayarlanmayıb"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"ekran kilidi daxil edin"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Barmaq izi sensoru"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"doğrulayın"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"cihaz daxil edin"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"Ətraflı məlumat"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"Ətraflı məlumat: <xliff:g id="URL">%s</xliff:g>"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"<xliff:g id="APPNAME">%1$s</xliff:g> tətbiqini açın"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"Pulqabı tətbiqini qısayol kimi əlavə etmək üçün tətbiq quraşdırılmalıdır"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"Pulqabı tətbiqini qısayol kimi əlavə etmək üçün kart əlavə edilməlidir"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"QR kod skanerini qısayol kimi əlavə etmək üçün kamera tətbiqi quraşdırılmalıdır"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"Home tətbiqini qısayol kimi əlavə etmək üçün tətbiq quraşdırılmalıdır"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• Ən azı bir cihaz əlçatandır"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Qeydgötürmə qısayolu üçün defolt qeyd tətbiqi seçin"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Tətbiq seçin"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Qısayola toxunub saxlayın"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Ləğv edin"</string> diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index 1dfdde30c264..3d52d515c4e9 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problem sa očitavanjem merača baterije"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Dodirnite za više informacija"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Nije podešen"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"unesite zaključavanje ekrana"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Senzor za otisak prsta"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"potvrdite identitet"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"unesite uređaj"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"Saznajte više"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"Saznajte više na <xliff:g id="URL">%s</xliff:g>"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"Otvorite: <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"Da biste dodali aplikaciju Novčanik kao prečicu, uverite se da je aplikacija instalirana"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"Da biste dodali aplikaciju Novčanik kao prečicu, uverite se da je dodata bar jedna kartica"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"Da biste dodali Skener QR koda kao prečicu, uverite se da je aplikacija za kameru instalirana"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"Da biste dodali aplikaciju Home kao prečicu, uverite se da je aplikacija instalirana"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• Dostupan je bar jedan uređaj"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Izaberite podrazumevanu aplikaciju za beleške da biste koristili prečicu za pravljenje beleški"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Izaberi aplikaciju"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Dodirnite i zadržite prečicu"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Otkaži"</string> diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index 05841dceb8ea..5f2d7b5a51da 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Праблема з чытаннем індыкатара зараду акумулятара"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Націсніце, каб убачыць больш"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Няма будзільнікаў"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"прыступіць да разблакіроўкі экрана"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Сканер адбіткаў пальцаў"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"правесці аўтэнтыфікацыю"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"адкрыць галоўны экран прылады"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"Даведацца больш"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"Даведайцеся больш на старонцы <xliff:g id="URL">%s</xliff:g>"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"Адкрыць праграму \"<xliff:g id="APPNAME">%1$s</xliff:g>\""</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"Вы можаце дадаць ярлык праграмы \"Кашалёк\", толькі калі яна ўсталявана"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"Вы можаце дадаць ярлык праграмы \"Кашалёк\", толькі калі дададзена хаця б адна картка"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"Вы можаце дадаць ярлык сканера QR-кодаў, толькі калі ўсталявана праграма камеры"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"Вы можаце дадаць ярлык праграмы Home, толькі калі яна ўсталявана"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• Даступная хаця б адна прылада"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Выберыце стандартную праграму для нататак, якая будзе адкрывацца пры націсканні на ярлык"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Выберыце праграму"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Дакраніцеся і ўтрымлівайце ярлык"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Скасаваць"</string> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index 0345471ea49f..9201f40e29e3 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Възникна проблем при четенето на данните за нивото на батерията"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Докоснете за още информация"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Няма зададен будилник"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"въведете опция за заключване на екрана"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Сензор за отпечатъци"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"удостоверяване"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"вход в устройството"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"Научете повече"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"Научете повече на адрес <xliff:g id="URL">%s</xliff:g>"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"Отваряне на <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"За да добавите пряк път към приложението Wallet, уверете се, че то е инсталирано"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"За да добавите пряк път към приложението Wallet, уверете се, че е добавена поне една карта"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"За да добавите пряк път към скенера за QR кодове, уверете се, че е инсталирано приложение за камера"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"За да добавите пряк път към приложението Home, уверете се, че то е инсталирано"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• Налице е поне едно устройство."</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Изберете стандартно приложение за бележки, за да използвате прекия път за водене на бележки"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Избиране на приложение"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Докоснете и задръжте прекия път"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Отказ"</string> diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index 2d0388dcc780..d8cb70d3df67 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -399,7 +399,7 @@ <string name="media_projection_sys_service_dialog_warning" msgid="2443872865267330320">"যে পরিষেবা এই ফাংশন প্রদান করছে, সেটি রেকর্ড বা কাস্ট করার সময় আপনার স্ক্রিনে দৃশ্যমান বা ডিভাইসে চালানো হয়েছে এমন সব তথ্য অ্যাক্সেস করতে পারবে। এর মধ্যে আপনার পাসওয়ার্ড, পেমেন্টের বিবরণ, ফটো, মেসেজ এবং আপনার চালানো অডিও সম্পর্কিত তথ্য রয়েছে।"</string> <string name="screen_share_permission_dialog_option_entire_screen" msgid="3131200488455089620">"পুরো স্ক্রিন"</string> <string name="screen_share_permission_dialog_option_single_app" msgid="4350961814397220929">"একটি অ্যাপ"</string> - <string name="screen_share_permission_app_selector_title" msgid="1404878013670347899">"অ্যাপ শেয়ার বা এর মাধ্যমে রেকর্ড করুন"</string> + <string name="screen_share_permission_app_selector_title" msgid="1404878013670347899">"অ্যাপ শেয়ার বা রেকর্ড করুন"</string> <string name="media_projection_entry_app_permission_dialog_title" msgid="9155535851866407199">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ব্যবহার করে রেকর্ডিং বা কাস্টিং শুরু করবেন?"</string> <string name="media_projection_entry_app_permission_dialog_warning_entire_screen" msgid="8736391633234144237">"আপনি শেয়ার, রেকর্ড বা কাস্ট করার সময়, স্ক্রিনে দৃশ্যমান বা ডিভাইসে চালানো সব কিছুই <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> অ্যাক্সেস করতে পারবে। তাই পাসওয়ার্ড, পেমেন্টের বিবরণ, মেসেজ, ফটো এবং অডিও ও ভিডিওর মতো বিষয়ে সতর্ক থাকুন।"</string> <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="5211695779082563959">"আপনি কোনও অ্যাপ শেয়ার, রেকর্ড বা কাস্ট করার সময়, সেই অ্যাপে দেখা যায় বা চালানো হয় এমন সব কিছু <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> অ্যাক্সেস করতে পারবে। তাই পাসওয়ার্ড, পেমেন্টের বিবরণ, মেসেজ, ফটো এবং অডিও ও ভিডিওর মতো বিষয়ে সতর্ক থাকুন।"</string> @@ -415,7 +415,7 @@ <string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"আপনার আইটি অ্যাডমিন ব্লক করেছেন"</string> <string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"ডিভাইস নীতির কারণে স্ক্রিন ক্যাপচার করার প্রসেস বন্ধ করা আছে"</string> <string name="clear_all_notifications_text" msgid="348312370303046130">"সব মুছে দিন"</string> - <string name="manage_notifications_text" msgid="6885645344647733116">"পরিচালনা করুন"</string> + <string name="manage_notifications_text" msgid="6885645344647733116">"ম্যানেজ করুন"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"ইতিহাস"</string> <string name="notification_section_header_incoming" msgid="850925217908095197">"নতুন"</string> <string name="notification_section_header_gentle" msgid="6804099527336337197">"আওয়াজ করবে না"</string> @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"ব্যাটারির মিটারের রিডিং নেওয়ার সময় সমস্যা হয়েছে"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"আরও তথ্যের জন্য ট্যাপ করুন"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"কোনও অ্যালার্ম সেট করা নেই"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"স্ক্রিন লক খুলুন"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"ফিঙ্গারপ্রিন্ট সেন্সর"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"যাচাই করিয়ে নিন"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"ডিভাইস আনলক করুন"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"আরও জানুন"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"আরও জানতে <xliff:g id="URL">%s</xliff:g>-এ যান"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"<xliff:g id="APPNAME">%1$s</xliff:g> খুলুন"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"Wallet অ্যাপ, শর্টকাট হিসেবে যোগ করতে, অ্যাপ ইনস্টল করা আছে কিনা তা ভালভাবে দেখে নিন"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"Wallet অ্যাপ, শর্টকাট হিসেবে যোগ করতে, অন্তত একটি কার্ড যোগ করা হয়েছে কিনা তা ভালভাবে দেখে নিন"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"QR কোড স্ক্যানার, শর্টকাট হিসেবে যোগ করতে, ক্যামেরা অ্যাপ ইনস্টল করা আছে কিনা তা ভালভাবে দেখে নিন"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"Home অ্যাপ, শর্টকাট হিসেবে যোগ করতে, অ্যাপ ইনস্টল করা আছে কিনা তা ভালভাবে দেখে নিন"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• অন্তত একটি ডিভাইস উপলভ্য আছে"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"নোট নেওয়ার শর্টকাট ব্যবহার করতে, ডিফল্ট কোনও নোট অ্যাপ বেছে নিন"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"অ্যাপ বেছে নিন"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"শর্টকাট টাচ করে ধরে রাখুন"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"বাতিল করুন"</string> diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index 8e8fb8b84d66..89c964dfdd00 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Došlo je do problema prilikom očitavanja mjerača stanja baterije"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Dodirnite za više informacija"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Nema nijednog alarma"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"unos zaključavanja ekrana"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Senzor za otisak prsta"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"autentificiranje"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"pristup uređaju"</string> @@ -1127,12 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"Saznajte više"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"Saznajte više na <xliff:g id="URL">%s</xliff:g>"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"Otvori aplikaciju <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"Za dodavanje aplikacije Wallet kao prečaca provjerite je li instalirana"</string> - <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"Provjerite je li dodana barem jedna kartica kako biste dodali aplikaciju Wallet kao prečac"</string> - <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"Provjerite je li instalirana aplikacija kamere kako biste dodali čitač QR koda kao prečac"</string> - <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"Provjerite je li aplikacija Home instalirana kako biste je dodali kao prečac"</string> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"Da dodate aplikaciju Novčanik kao prečicu, instalirajte aplikaciju"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"Da dodate aplikaciju Novčanik kao prečicu, dodajte barem jednu karticu"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"Da dodate skener QR koda kao prečicu, instalirajte aplikaciju kamere"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"Da dodate aplikaciju Home kao prečicu, instalirajte aplikaciju"</string> <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• Dostupan je najmanje jedan uređaj"</string> - <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Odaberite zadanu aplikaciju za bilješke da biste koristili prečac za pisanje bilježaka"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Odaberite zadanu aplikaciju za bilješke da koristite prečicu za zapisivanje bilješki"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Odaberi aplikaciju"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Dodirnite i zadržite prečicu"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Otkaži"</string> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 530482fb0473..e0e78ae0ef7a 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Hi ha hagut un problema en llegir el mesurador de la bateria"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Toca per obtenir més informació"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Cap alarma definida"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"utilitza el bloqueig de pantalla"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Sensor d\'empremtes digitals"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"autenticar"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"accedir al dispositiu"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"Més informació"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"Més informació a <xliff:g id="URL">%s</xliff:g>"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"Obre <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"Per afegir l\'aplicació Wallet com a drecera, assegura\'t que estigui instal·lada"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"Per afegir l\'aplicació Wallet com a drecera, assegura\'t que s\'hagi afegit almenys una targeta"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"Per afegir l\'escàner de codis QR com a drecera, assegura\'t que hi hagi una aplicació de càmera instal·lada"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"Per afegir l\'aplicació Home com a drecera, assegura\'t que estigui instal·lada"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• Almenys un dispositiu està disponible."</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Selecciona una aplicació de notes predeterminada per utilitzar la drecera de presa de notes"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Selecciona una aplicació"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Mantén premuda la drecera"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Cancel·la"</string> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index fba856d52fee..522300bcff8e 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problém s načtením měřiče baterie"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Klepnutím zobrazíte další informace"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Budík nenastaven"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"zadejte zámek obrazovky"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Snímač otisků prstů"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"ověříte"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"zadáte zařízení"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"Další informace"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"Další informace najdete na adrese <xliff:g id="URL">%s</xliff:g>."</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"Otevřít <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"Pokud chcete přidat aplikaci Peněženka jako zkratku, nainstalujte ji"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"Pokud chcete přidat aplikaci Peněženka jako zkratku, přidejte alespoň jednu kartu"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"Pokud chcete přidat skener QR kódů jako zkratku, ujistěte se, že je nainstalována aplikace k focení a natáčení"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"Pokud chcete přidat aplikaci Home jako zkratku, nainstalujte ji"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• Je k dispozici alespoň jedno zařízení"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Vyberte výchozí aplikaci k psaní poznámek, ke které přidružíte zkratku pro poznámky"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Vyberte aplikaci"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Podržte zkratku"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Zrušit"</string> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 386f809f42e5..e9a522ffc60c 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Der er problemer med at læse dit batteriniveau"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Tryk for at få flere oplysninger"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Ingen alarm er indstillet"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"angiv skærmlås"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Fingeraftrykssensor"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"godkende"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"få adgang til enheden"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"Få flere oplysninger"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"Få flere oplysninger på <xliff:g id="URL">%s</xliff:g>"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"Åbn <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"Hvis du vil tilføje en genvej til Wallet-appen, skal du sørge for, at appen er installeret"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"Hvis du vil tilføje en genvej til Wallet-appen, skal du sørge for, at du har tilføjet mindst ét kort"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"Hvis du vil tilføje en genvej til QR-kodescanneren, skal du sørge for, at kameraappen er installeret"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"Hvis du vil tilføje en genvej til Home-appen, skal du sørge for, at appen er installeret"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• Mindst én enhed er tilgængelig"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Vælg en standardapp til noter for at bruge genvejen til notetagning"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Vælg app"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Hold fingeren på genvejen"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Annuller"</string> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index b57f023197eb..dc06ee1c86ad 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problem beim Lesen des Akkustands"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Für weitere Informationen tippen"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Kein Wecker gestellt"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"Displaysperre-Anmeldedaten eingeben"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Fingerabdrucksensor"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"Authentifizieren"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"Eingeben des Geräts"</string> @@ -1127,26 +1126,20 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"Weitere Informationen"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"Weitere Informationen unter <xliff:g id="URL">%s</xliff:g>"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"<xliff:g id="APPNAME">%1$s</xliff:g> öffnen"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"Damit du die Wallet App als Verknüpfung hinzufügen kannst, muss die App installiert sein"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"Damit du die Wallet App als Verknüpfung hinzufügen kannst, muss mindestens eine Karte hinzugefügt sein"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"Damit du den QR-Code-Scanner als Verknüpfung hinzufügen kannst, muss eine Kamera-App installiert sein"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"Damit du die Home App als Verknüpfung hinzufügen kannst, muss die App installiert sein"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• Mindestens ein Gerät ist verfügbar"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Wähle eine Standard-App für Notizen aus, die du für die Verknüpfung verwenden möchtest"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"App wählen"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Verknüpfung berühren & halten"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Abbrechen"</string> - <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Bildschirm jetzt wechseln"</string> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Jetzt umdrehen"</string> <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Smartphone auffalten"</string> <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Bildschirm wechseln?"</string> <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Mit der Rückkamera lassen sich Fotos mit höherer Auflösung aufnehmen"</string> - <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Smartphone umdrehen, um Fotos mit höherer Auflösung aufzunehmen"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Für höhere Auflösung Smartphone umdrehen"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Faltbares Gerät wird geöffnet"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Faltbares Gerät wird umgeklappt"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Akku bei <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index 421307ee94bd..08d5b4b8d302 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Υπάρχει κάποιο πρόβλημα με την ανάγνωση του μετρητή μπαταρίας"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Πατήστε για περισσότερες πληροφορίες."</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Δεν ορίστηκε ξυπνητ."</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"εισαγωγή κλειδώματος οθόνης"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Αισθητήρας δακτυλικών αποτυπωμάτων"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"έλεγχος ταυτότητας"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"εισαγωγή συσκευής"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"Μάθετε περισσότερα"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"Μάθετε περισσότερα στο <xliff:g id="URL">%s</xliff:g>."</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"Άνοιγμα <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"Για να προσθέσετε ως συντόμευση την εφαρμογή Πορτοφόλι, βεβαιωθείτε ότι έχει εγκατασταθεί η εφαρμογή"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"Για να προσθέσετε ως συντόμευση την εφαρμογή Πορτοφόλι, βεβαιωθείτε ότι έχει προστεθεί τουλάχιστον μία κάρτα"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"Για να προσθέσετε ως συντόμευση τη Σάρωση κωδικών QR, βεβαιωθείτε ότι η εφαρμογή κάμερας είναι εγκατεστημένη"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"Για να προσθέσετε την εφαρμογή Home ως συντόμευση, βεβαιωθείτε ότι η εφαρμογή είναι εγκατεστημένη"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• Είναι διαθέσιμη τουλάχιστον μία συσκευή"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Επιλέξτε μια προεπιλεγμένη εφαρμογή σημειώσεων για να χρησιμοποιήσετε τη συντόμευση δημιουργίας σημειώσεων"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Επιλογή εφαρμογής"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Παρατεταμένο άγγιγμα συντόμευσης"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Ακύρωση"</string> diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index eb4ccf576a21..e4719e46b5ee 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problem reading your battery meter"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Tap for more information"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"No alarm set"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"enter screen lock"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Fingerprint sensor"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"Authenticate"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"enter device"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"Learn more"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"Learn more at <xliff:g id="URL">%s</xliff:g>"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"Open <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"To add the Wallet app as a shortcut, make sure that the app is installed"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"To add the Wallet app as a shortcut, make sure that at least one card has been added"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"To add the QR code scanner as a shortcut, make sure that a camera app is installed"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"To add the Home app as a shortcut, make sure that the app is installed"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• At least one device is available"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Select a default notes app to use the note-taking shortcut"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Select app"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Touch & hold shortcut"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Cancel"</string> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index eb4ccf576a21..e4719e46b5ee 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problem reading your battery meter"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Tap for more information"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"No alarm set"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"enter screen lock"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Fingerprint sensor"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"Authenticate"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"enter device"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"Learn more"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"Learn more at <xliff:g id="URL">%s</xliff:g>"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"Open <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"To add the Wallet app as a shortcut, make sure that the app is installed"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"To add the Wallet app as a shortcut, make sure that at least one card has been added"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"To add the QR code scanner as a shortcut, make sure that a camera app is installed"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"To add the Home app as a shortcut, make sure that the app is installed"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• At least one device is available"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Select a default notes app to use the note-taking shortcut"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Select app"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Touch & hold shortcut"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Cancel"</string> diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index eb4ccf576a21..e4719e46b5ee 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problem reading your battery meter"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Tap for more information"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"No alarm set"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"enter screen lock"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Fingerprint sensor"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"Authenticate"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"enter device"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"Learn more"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"Learn more at <xliff:g id="URL">%s</xliff:g>"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"Open <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"To add the Wallet app as a shortcut, make sure that the app is installed"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"To add the Wallet app as a shortcut, make sure that at least one card has been added"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"To add the QR code scanner as a shortcut, make sure that a camera app is installed"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"To add the Home app as a shortcut, make sure that the app is installed"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• At least one device is available"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Select a default notes app to use the note-taking shortcut"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Select app"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Touch & hold shortcut"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Cancel"</string> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 5358a26cfab5..0678e6832afe 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problema al leer el medidor de batería"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Presiona para obtener más información"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"No establecida"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"ingresa el bloqueo pantalla"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Sensor de huellas dactilares"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"autenticar"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"ingresar al dispositivo"</string> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 42e390db3473..0dfd63ca2589 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -412,7 +412,7 @@ <string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Cuando compartes, grabas o envías contenido, Android puede acceder a todo lo que se muestre en la pantalla o se reproduzca en tu dispositivo. Debes tener cuidado con elementos como contraseñas, detalles de pagos, mensajes, fotos, audio y vídeo."</string> <string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Cuando compartes, grabas o envías una aplicación, Android puede acceder a todo lo que se muestre o se reproduzca en ella. Debes tener cuidado con elementos como contraseñas, detalles de pagos, mensajes, fotos, audio y vídeo."</string> <string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Empezar"</string> - <string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Bloqueadas por tu administrador de TI"</string> + <string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Bloqueado por tu administrador de TI"</string> <string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Las capturas de pantalla están inhabilitadas debido a la política de dispositivos"</string> <string name="clear_all_notifications_text" msgid="348312370303046130">"Borrar todo"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Gestionar"</string> @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"No se ha podido leer el indicador de batería"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Toca la pantalla para consultar más información"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Ninguna alarma puesta"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"Poner bloqueo de pantalla"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Sensor de huellas digitales"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"autenticarte"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"acceder al dispositivo"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"Más información"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"Más información en <xliff:g id="URL">%s</xliff:g>"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"Abrir <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"Para añadir la aplicación Wallet como acceso directo, asegúrate de que está instalada"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"Para añadir la aplicación Wallet como acceso directo, asegúrate de haber añadido al menos una tarjeta"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"Para añadir el escáner de códigos QR como acceso directo, asegúrate de que hay instalada una aplicación de cámara"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"Para añadir la aplicación Home como acceso directo, asegúrate de que está instalada"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• Al menos un dispositivo debe estar disponible"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Selecciona una aplicación de notas predeterminada para usar el acceso directo de toma de notas"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Seleccionar aplicación"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Mantén pulsado el acceso directo"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Cancelar"</string> diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index cd6b47c0bcbe..ae75d09bd409 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Probleem akumõõdiku lugemisel"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Puudutage lisateabe saamiseks"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Äratust pole"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"sisesta ekraanilukk"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Sõrmejäljeandur"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"autentimiseks"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"seadmesse sisenemiseks"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"Lisateave"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"Lisateave: <xliff:g id="URL">%s</xliff:g>"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"Ava <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"Rahakotirakenduse otsetee lisamiseks veenduge, et rakendus oleks installitud"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"Rahakotirakenduse otsetee lisamiseks veenduge, et vähemalt üks kaart oleks lisatud"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"QR-koodi skanneri otsetee lisamiseks veenduge, et kaamerarakendus oleks installitud"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"Rakenduse Home otsetee lisamiseks veenduge, et rakendus oleks installitud"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• Vähemalt üks seade on saadaval"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Valige märkmete tegemise vaikerakendus, et kasutada märkmete tegemise otseteed"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Valige rakendus"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Pikalt puudutamise otsetee"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Tühista"</string> diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index a670166bb115..ff78952a6bf7 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Arazo bat izan da bateria-neurgailua irakurtzean"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Informazio gehiago lortzeko, sakatu hau"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Ez da ezarri alarmarik"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"erabili pantailaren blokeoa"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Hatz-marken sentsorea"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"autentifikatu"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"sartu gailuan"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"Lortu informazio gehiago"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"Lortu informazio gehiago <xliff:g id="URL">%s</xliff:g> helbidean"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"Ireki <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"Diru-zorroa aplikazioa lasterbide gisa gehitzeko, ziurtatu aplikazioa instalatuta dagoela."</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"Diru-zorroa aplikazioa lasterbide gisa gehitzeko, ziurtatu gutxienez txartel bat gehitu dela."</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"QR kodeen eskanerra lasterbide gisa gehitzeko, ziurtatu kameraren aplikazioa instalatuta dagoela."</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"Home aplikazioa lasterbide gisa gehitzeko, ziurtatu aplikazioa instalatuta dagoela."</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• Gutxienez gailu bat erabilgarri dago."</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Oharrak idazteko lasterbidea erabiltzeko, hautatu oharretarako aplikazio lehenetsia."</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Hautatu aplikazioa"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Eduki sakatuta lasterbidea"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Utzi"</string> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index dc24a3dfb810..cc26355f052a 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"مشکلی در خواندن میزان باتری وجود دارد"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"برای اطلاعات بیشتر ضربه بزنید"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"هشداری تنظیم نشده"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"وارد کردن قفل صفحه"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"حسگر اثرانگشت"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"اصالتسنجی کردن"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"وارد شدن به دستگاه"</string> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index b6303da6ea52..2b93430148fd 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Ongelma akkumittarin lukemisessa"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Saat lisätietoja napauttamalla"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Ei herätyksiä"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"käytä näytön lukitustapaa"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Sormenjälkitunnistin"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"todentaaksesi"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"avataksesi laitteen"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"Lue lisää"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"Lue lisää: <xliff:g id="URL">%s</xliff:g>"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"Avaa <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"Jos haluat lisätä Wallet-sovelluksen pikakuvakkeena, varmista, että se on asennettuna"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"Jos haluat lisätä Wallet-sovelluksen pikakuvakkeena, varmista, että lisättynä on vähintään yksi kortti"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"Jos haluat lisätä QR-koodiskannerin pikakuvakkeena, varmista, että kamerasovellus on asennettuna"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"Jos haluat lisätä Home-sovelluksen pikakuvakkeena, varmista, että se on asennettuna"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• Ainakin yksi laite on käytettävissä"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Valitse muistiinpanojen tekemisen oletussovellus, jota käytetään pikakuvakkeen avulla"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Valitse sovellus"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Kosketa pikakuvaketta pitkään"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Peru"</string> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index d88c9e0807d3..2ac73099eb3c 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -249,7 +249,7 @@ <string name="accessibility_quick_settings_rotation" msgid="4800050198392260738">"Rotation automatique de l\'écran"</string> <string name="quick_settings_location_label" msgid="2621868789013389163">"Localisation"</string> <string name="quick_settings_screensaver_label" msgid="1495003469366524120">"Écran de veille"</string> - <string name="quick_settings_camera_label" msgid="5612076679385269339">"Accès à l\'appareil photo"</string> + <string name="quick_settings_camera_label" msgid="5612076679385269339">"Accès à la caméra"</string> <string name="quick_settings_mic_label" msgid="8392773746295266375">"Accès au micro"</string> <string name="quick_settings_camera_mic_available" msgid="1453719768420394314">"Accessible"</string> <string name="quick_settings_camera_mic_blocked" msgid="4710884905006788281">"Bloqué"</string> @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Un problème est survenu lors de la lecture du niveau de charge de la pile"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Touchez pour en savoir plus"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Aucune alarme définie"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"entrer verrouillage de l\'écran"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Capteur d\'empreintes digitales"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"authentifier"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"accéder à l\'appareil"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"En savoir plus"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"En savoir plus : <xliff:g id="URL">%s</xliff:g>"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"Ouvrir <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"Pour ajouter l\'application portefeuille sous forme de raccourci, assurez-vous que l\'application est installée"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"Pour ajouter l\'application Portefeuille sous forme de raccourci, assurez-vous qu\'au moins une carte a été ajoutée"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"Pour ajouter le numériseur de code QR sous forme de raccourci, assurez-vous qu\'une application d\'appareil photo est installée"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"Pour ajouter l\'application Home sous forme de raccourci, assurez-vous que l\'application est installée"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• qu\'au moins un appareil est utilisable;"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Sélectionnez une application de prise de notes par défaut pour utiliser le raccourci de prise de notes"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Sélectionner l\'application"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Maintenir le doigt sur raccourci"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Annuler"</string> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index b4cfb3418b11..7646a88cfe8a 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -412,7 +412,7 @@ <string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Lorsque vous partagez, enregistrez ou castez, Android a accès à tout ce qui est visible sur votre écran ou lu sur votre appareil. Faites donc attention aux éléments tels que les mots de passe, détails de mode de paiement, messages, photos et contenus audio et vidéo."</string> <string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Lorsque vous partagez, enregistrez ou castez une appli, Android a accès à tout ce qui est visible sur votre écran ou lu sur votre appareil. Faites donc attention aux éléments tels que les mots de passe, détails de mode de paiement, messages et contenus audio et vidéo."</string> <string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Commencer"</string> - <string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Bloquée par votre administrateur informatique"</string> + <string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Bloqué par votre administrateur informatique"</string> <string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"La capture d\'écran est désactivée conformément aux règles relatives à l\'appareil"</string> <string name="clear_all_notifications_text" msgid="348312370303046130">"Tout effacer"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Gérer"</string> @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Un problème est survenu au niveau de la lecture de votre outil de mesure de batterie"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Appuyer pour en savoir plus"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Pas d\'alarme définie"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"accéder au verrouillage de l\'écran"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Lecteur d\'empreinte digitale"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"s\'authentifier"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"accéder à l\'appareil"</string> diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index 014d8baf81c8..cb2375f23a2c 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Produciuse un problema ao ler o medidor da batería"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Toca para obter máis información"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Sen alarmas postas"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"introducir bloqueo de pantalla"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Sensor de impresión dixital"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"autenticar"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"poñer o dispositivo"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"Máis información"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"Máis información en <xliff:g id="URL">%s</xliff:g>"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"Abrir <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"Para engadir a aplicación Wallet como atallo, asegúrate de que estea instalada"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"Para engadir a aplicación Wallet como atallo, asegúrate de que se incluíse polo menos unha tarxeta"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"Para engadir o escáner de códigos QR como atallo, asegúrate de que a aplicación de cámara estea instalada"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"Para engadir a aplicación Google Home como atallo, asegúrate de que estea instalada"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• Ten que haber polo menos un dispositivo dispoñible"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Selecciona unha aplicación de notas predeterminada para usar o atallo de tomar notas"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Seleccionar aplicación"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Mantén premido o atallo"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Cancelar"</string> diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index cd264e2b5338..c3be28ca1149 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"તમારું બૅટરી મીટર વાંચવામાં સમસ્યા આવી"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"વધુ માહિતી માટે ટૅપ કરો"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"કોઈ અલાર્મ સેટ નથી"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"સ્ક્રીન લૉક દાખલ કરો"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"ફિંગરપ્રિન્ટ સેન્સર"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"ખાતરી કરો"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"ડિવાઇસ અનલૉક કરો"</string> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index e5c798bdb92e..60fd6800e0fe 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -142,8 +142,7 @@ <string name="biometric_dialog_face_icon_description_authenticated" msgid="2242167416140740920">"चेहरे की पुष्टि हो गई"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"पुष्टि हो गई"</string> <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"\'पुष्टि करें\' पर टैप करके पूरा करें"</string> - <!-- no translation found for biometric_dialog_tap_confirm_with_face (2378151312221818694) --> - <skip /> + <string name="biometric_dialog_tap_confirm_with_face" msgid="2378151312221818694">"चेहरे से अनलॉक किया गया"</string> <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"चेहरे से अनलॉक किया गया. जारी रखने के लिए टैप करें."</string> <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"चेहरे की पहचान हो गई. जारी रखने के लिए टैप करें."</string> <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"चेहरे की पहचान हो गई. जारी रखने के लिए अनलॉक आइकॉन को टैप करें."</string> @@ -1047,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"आपके डिवाइस के बैटरी मीटर की रीडिंग लेने में समस्या आ रही है"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"ज़्यादा जानकारी के लिए टैप करें"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"कोई अलार्म सेट नहीं है"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"स्क्रीन लॉक डालें"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"फ़िंगरप्रिंट सेंसर"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"पुष्टि करें"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"डिवाइस की होम स्क्रीन पर जाएं"</string> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index e921679418d5..02c1be7a0f06 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -399,7 +399,7 @@ <string name="media_projection_sys_service_dialog_warning" msgid="2443872865267330320">"Usluga koja pruža ovu funkciju imat će pristup svim podacima koji su vidljivi na vašem zaslonu ili koji se reproduciraju s vašeg uređaja tijekom snimanja ili emitiranja. To uključuje podatke kao što su zaporke, podaci o plaćanju, fotografije, poruke i audiozapisi koje reproducirate."</string> <string name="screen_share_permission_dialog_option_entire_screen" msgid="3131200488455089620">"Cijeli zaslon"</string> <string name="screen_share_permission_dialog_option_single_app" msgid="4350961814397220929">"Jedna aplikacija"</string> - <string name="screen_share_permission_app_selector_title" msgid="1404878013670347899">"Dijeljenje ili snimanje pomoću aplikacije"</string> + <string name="screen_share_permission_app_selector_title" msgid="1404878013670347899">"Dijeljenje ili snimanje aplikacije"</string> <string name="media_projection_entry_app_permission_dialog_title" msgid="9155535851866407199">"Želite li započeti snimanje ili emitiranje pomoću aplikacije <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string> <string name="media_projection_entry_app_permission_dialog_warning_entire_screen" msgid="8736391633234144237">"Kad dijelite, snimate ili emitirate, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ima pristup svemu što je vidljivo na vašem zaslonu ili se reproducira na vašem uređaju. Stoga pazite na stvari kao što su zaporke, podaci o plaćanju, poruke, fotografije te audio i videozapisi."</string> <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="5211695779082563959">"Kad dijelite, snimate ili emitirate aplikaciju, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ima pristup svemu što se prikazuje ili reproducira u toj aplikaciji. Stoga pazite na stvari kao što su zaporke, podaci o plaćanju, poruke, fotografije te audio i videozapisi."</string> @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problem s očitavanjem mjerača baterije"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Dodirnite za više informacija"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Nema nijednog alarma"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"unesite zaključavanje zaslona"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Senzor otiska prsta"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"autentificirali"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"pristupili uređaju"</string> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index b0050cf494e8..b5081d0268ba 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Probléma merült fel az akkumulátor-töltésmérő olvasásakor"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Koppintással további információkat érhet el."</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Nincs ébresztés"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"képernyőzár megadása"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Ujjlenyomat-érzékelő"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"a hitelesítéshez"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"eszköz megadásához"</string> diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index 59ec076f56de..cfc92a49fd82 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Մարտկոցի ցուցիչի ցուցմունքը կարդալու հետ կապված խնդիր կա"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Հպեք՝ ավելին իմանալու համար"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Զարթուցիչ դրված չէ"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"ապակողպել էկրանը"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Մատնահետքի սկաներ"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"նույնականացնել"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"նշել սարքը"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"Իմանալ ավելին"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"Իմացեք ավելին <xliff:g id="URL">%s</xliff:g> էջում"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"Բացել <xliff:g id="APPNAME">%1$s</xliff:g> հավելվածը"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"Wallet հավելվածի դյուրանցումն ավելացնելու համար համոզվեք, որ հավելվածը տեղադրված է"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"Wallet հավելվածի դյուրանցումն ավելացնելու համար համոզվեք, որ առնվազն մեկ քարտ ավելացված է"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"QR կոդերի սկաների դյուրանցումն ավելացնելու համար համոզվեք, որ տեսախցիկի հավելվածը տեղադրված է"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"Home հավելվածի դյուրանցումն ավելացնելու համար համոզվեք, որ հավելվածը տեղադրված է"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• Հասանելի է առնվազն մեկ սարք"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Ընտրեք նշումների կանխադրված հավելված՝ նշումների ստեղծման դյուրանցումն օգտագործելու համար"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Ընտրել հավելված"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Հպեք դյուրանցմանը և պահեք"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Չեղարկել"</string> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index 7b3feaabc51f..515f80f67580 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Terjadi error saat membaca indikator baterai"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Ketuk untuk informasi selengkapnya"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Alarm tidak disetel"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"masukkan kunci layar"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Sensor sidik jari"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"autentikasi"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"masukkan perangkat"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"Pelajari lebih lanjut"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"Pelajari lebih lanjut di <xliff:g id="URL">%s</xliff:g>"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"Buka <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"Untuk menambahkan aplikasi Wallet sebagai pintasan, pastikan aplikasi sudah diinstal"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"Untuk menambahkan aplikasi Wallet sebagai pintasan, pastikan minimal satu kartu telah ditambahkan"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"Untuk menambahkan pemindai kode QR sebagai pintasan, pastikan aplikasi kamera sudah diinstal"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"Untuk menambahkan aplikasi Home sebagai pintasan, pastikan aplikasi sudah diinstal"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• Tersedia minimal satu perangkat"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Pilih aplikasi catatan default untuk menggunakan pintasan pembuatan catatan"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Pilih aplikasi"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Sentuh lama pintasan"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Batal"</string> diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index 788320741f2a..fb73c0b161b0 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Vandamál við að lesa stöðu rafhlöðu"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Ýttu til að fá frekari upplýsingar"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Enginn vekjari"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"sláðu inn skjálás"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Fingrafaralesari"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"auðkenna"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"opna tæki"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"Nánar"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"Nánar á <xliff:g id="URL">%s</xliff:g>"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"Opna <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"Til að bæta Veskisforritinu við sem flýtileið skaltu ganga úr skugga um að forritið sé uppsett"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"Til að bæta Veskisforritinu við sem flýtileið skaltu ganga úr skugga um að hafa bætt að minnsta kosti einu korti við"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"Til að bæta QR-kóðaskanna við sem flýtileið skaltu ganga úr skugga um að myndavélarforrit sé uppsett"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"Til að bæta Home-forritinu við sem flýtileið skaltu ganga úr skugga um að forritið sé uppsett"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• Að minnsta kosti eitt tæki er tiltækt"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Veldu sjálfgefið glósuforrit til að nota flýtileið fyrir glósugerð"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Velja forrit"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Haltu flýtilyklinum inni"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Hætta við"</string> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index fef0fe57f5ee..62d5a4677f34 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problema durante la lettura dell\'indicatore di livello della batteria"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Tocca per ulteriori informazioni"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Nessuna"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"inserisci blocco schermo"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Sensore di impronte digitali"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"effettuare l\'autenticazione"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"accedere al dispositivo"</string> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 255c1da2984d..7497bd43965d 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -412,7 +412,7 @@ <string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"בזמן שיתוף, הקלטה או העברה (cast) תהיה ל-Android גישה לכל הפרטים שגלויים במסך שלך או מופעלים מהמכשיר שלך. מומלץ להיזהר עם סיסמאות, פרטי תשלום, הודעות, תמונות, אודיו וסרטונים."</string> <string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"בזמן שיתוף, הקלטה או העברה (cast) של אפליקציה, תהיה ל-Android גישה לכל מה שגלוי באפליקציה או מופעל מהאפליקציה. מומלץ להיזהר עם סיסמאות, פרטי תשלום, הודעות, תמונות, אודיו וסרטונים."</string> <string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"התחלה"</string> - <string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"נחסם על ידי מנהל ה-IT"</string> + <string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"האפשרות נחסמה על ידי אדמין ב-IT"</string> <string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"צילום המסך מושבת בגלל מדיניות המכשיר"</string> <string name="clear_all_notifications_text" msgid="348312370303046130">"ניקוי הכול"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"ניהול"</string> @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"בעיה בקריאת מדדי הסוללה"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"יש להקיש כדי להציג מידע נוסף"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"לא הוגדרה"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"הזנת קוד נעילת המסך"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"חיישן טביעות אצבע"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"אימות"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"הזנת מכשיר"</string> diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index 053989eda04c..8662f98f96a3 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"თქვენი ბატარეის მზომის წაკითხვასთან დაკავშირებით პრობლემა დაფიქსირდა"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"შეეხეთ მეტი ინფორმაციისთვის"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"მაღვიძარა არ არის"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"ეკრანის დაბლოკვის შეყვანა"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"თითის ანაბეჭდის სენსორი"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"ავტორიზაცია"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"მოწყობილობის შეყვანა"</string> diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index ef1a4d3756b0..4fd32423d7b1 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -135,7 +135,7 @@ <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Жіберу"</string> <string name="cancel" msgid="1089011503403416730">"Бас тарту"</string> <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Растау"</string> - <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Қайталап көріңіз"</string> + <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Қайта көру"</string> <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Аутентификациядан бас тарту үшін түртіңіз."</string> <string name="biometric_dialog_face_icon_description_idle" msgid="4351777022315116816">"Қайталап көріңіз."</string> <string name="biometric_dialog_face_icon_description_authenticating" msgid="3401633342366146535">"Құрылғы бетіңізді талдап жатыр."</string> @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Батарея зарядының дерегі алынбай жатыр"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Толығырақ ақпарат алу үшін түртіңіз."</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Оятқыш орнатылмаған."</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"экран құлпын енгізу"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Саусақ ізін оқу сканері"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"аутентификациялау"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"құрылғыны енгізу"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"Толық ақпарат"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"Толық ақпарат: <xliff:g id="URL">%s</xliff:g>"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"<xliff:g id="APPNAME">%1$s</xliff:g> ашу"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"Wallet қолданбасын таңбаша ретінде қосу үшін қолданбаның орнатылғанын тексеріңіз."</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"Wallet қолданбасын таңбаша ретінде қосу үшін кемінде бір картаның қосылғанын тексеріңіз."</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"QR кодының сканерін таңбаша ретінде қосу үшін камера қолданбасының орнатылғанын тексеріңіз."</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"Home қолданбасын таңбаша ретінде қосу үшін қолданбаның орнатылғанын тексеріңіз."</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• Кемінде бір құрылғы қолжетімді."</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Жазба жазу таңбашасын пайдалану үшін әдепкі жазба қолданбаны таңдаңыз."</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Қолданба таңдау"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Таңбашаны басып тұрыңыз."</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Бас тарту"</string> diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index 150546cfd09d..5132ac030c30 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"មានបញ្ហាក្នុងការអានឧបករណ៍រង្វាស់កម្រិតថ្មរបស់អ្នក"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"ចុចដើម្បីទទួលបានព័ត៌មានបន្ថែម"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"មិនបានកំណត់ម៉ោងរោទ៍ទេ"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"បញ្ចូលព័ត៌មានផ្ទៀងផ្ទាត់សម្រាប់ការចាក់សោអេក្រង់"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"ឧបករណ៍ចាប់ស្នាមម្រាមដៃ"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"ផ្ទៀងផ្ទាត់"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"បញ្ចូលឧបករណ៍"</string> diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index 96e955e38190..5fa9464f1fe1 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"ನಿಮ್ಮ ಬ್ಯಾಟರಿ ಮೀಟರ್ ಓದುವಾಗ ಸಮಸ್ಯೆ ಎದುರಾಗಿದೆ"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"ಇನ್ನಷ್ಟು ಮಾಹಿತಿಗಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಿ"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"ಅಲಾರಾಂ ಸೆಟ್ ಆಗಿಲ್ಲ"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"ಸ್ಕ್ರೀನ್ ಲಾಕ್ ನಮೂದಿಸಿ"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಸೆನ್ಸರ್"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"ದೃಢೀಕರಿಸಿ"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"ಸಾಧನವನ್ನು ಪ್ರವೇಶಿಸಿ"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"<xliff:g id="URL">%s</xliff:g> ನಲ್ಲಿ ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"<xliff:g id="APPNAME">%1$s</xliff:g> ಅನ್ನು ತೆರೆಯಿರಿ"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"ವಾಲೆಟ್ ಆ್ಯಪ್ ಅನ್ನು ಶಾರ್ಟ್ಕಟ್ ಆಗಿ ಸೇರಿಸಲು, ಆ್ಯಪ್ ಅನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲಾಗಿದೆಯೇ ಎಂಬುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"ವಾಲೆಟ್ ಆ್ಯಪ್ ಅನ್ನು ಶಾರ್ಟ್ಕಟ್ ಆಗಿ ಸೇರಿಸಲು, ಕನಿಷ್ಠ ಒಂದು ಕಾರ್ಡ್ ಅನ್ನು ಸೇರಿಸಲಾಗಿದೆಯೇ ಎಂಬುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"QR ಕೋಡ್ ಸ್ಕ್ಯಾನರ್ ಅನ್ನು ಶಾರ್ಟ್ಕಟ್ ಆಗಿ ಸೇರಿಸಲು, ಕ್ಯಾಮರಾ ಆ್ಯಪ್ ಅನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲಾಗಿದೆಯೇ ಎಂಬುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"Home ಆ್ಯಪ್ ಅನ್ನು ಶಾರ್ಟ್ಕಟ್ ಆಗಿ ಸೇರಿಸಲು, ಆ್ಯಪ್ ಇನ್ಸ್ಟಾಲ್ ಆಗಿದೆಯೇ ಎಂಬುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• ಕನಿಷ್ಠ ಒಂದು ಸಾಧನ ಲಭ್ಯವಿದೆ"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"ನೋಟ್ಸ್ ಮಾಡಿಕೊಳ್ಳುವಿಕೆ ಶಾರ್ಟ್ಕಟ್ ಅನ್ನು ಬಳಸಲು ಡೀಫಾಲ್ಟ್ ಟಿಪ್ಪಣಿಗಳ ಆ್ಯಪ್ ಆಯ್ಕೆಮಾಡಿ"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"ಆ್ಯಪ್ ಆಯ್ಕೆಮಾಡಿ"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"ಸ್ಪರ್ಶಿಸಿ ಹೋಲ್ಡ್ ಮಾಡಿ ಶಾರ್ಟ್ಕಟ್"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"ರದ್ದುಗೊಳಿಸಿ"</string> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index 2a82ddcffcb8..eb4afbb133df 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"배터리 수준을 읽는 중에 문제가 발생함"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"탭하여 자세한 정보를 확인하세요."</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"설정된 알람 없음"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"화면 잠금 입력"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"지문 센서"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"인증"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"기기 입력"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"자세히 알아보기"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"<xliff:g id="URL">%s</xliff:g>에서 자세히 알아보세요."</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"<xliff:g id="APPNAME">%1$s</xliff:g> 열기"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"월렛 앱을 바로가기로 추가하려면 앱이 설치되어 있는지 확인하세요."</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"월렛 앱을 바로가기로 추가하려면 하나 이상의 카드가 추가되어 있는지 확인하세요."</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"QR 코드 스캐너를 바로가기로 추가하려면 카메라 앱이 설치되어 있는지 확인하세요."</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"Home 앱을 바로가기로 추가하려면 앱이 설치되어 있는지 확인하세요."</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• 1대 이상의 기기를 사용할 수 있습니다."</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"메모 바로가기를 사용하려면 기본 메모 앱을 선택합니다."</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"앱 선택"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"바로가기를 길게 터치하세요."</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"취소"</string> diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index 6ceb1e7686c8..c8f6c3710a6e 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Батареяңыздын кубаты аныкталбай жатат"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Кеңири маалымат алуу үчүн таптап коюңуз"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Ойготкуч коюлган жок"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"экран кулпусун киргизүү"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Манжа изинин сенсору"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"аныктыгын текшерүү"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"түзмөккө кирүү"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"Кеңири маалымат"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"Кеңири маалымат: <xliff:g id="URL">%s</xliff:g>"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"<xliff:g id="APPNAME">%1$s</xliff:g> ачуу"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"Капчык колдонмосун ыкчам баскыч катары кошуу үчүн колдонмону орнотуу керек"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"Капчык колдонмосун ыкчам баскыч катары кошуу үчүн кеминде бир картаны кошуу керек"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"QR кодунун сканерин ыкчам баскыч катары кошуу үчүн камера колдонмосун орнотуу керек"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"Home колдонмосун ыкчам баскыч катары кошуу үчүн колдонмону орнотуу керек"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• Кеминде бир түзмөк жеткиликтүү"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Эскертме жазуу ыкчам баскычын колдонуу үчүн демейки эскертме жазуу колдонмосун тандаңыз"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Колдонмо тандоо"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Ыкчам баскычты басып туруңуз"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Токтотуу"</string> diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index deec7d03f6de..756444d80c99 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"ເກີດບັນຫາໃນການອ່ານຕົວວັດແທກແບັດເຕີຣີຂອງທ່ານ"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"ແຕະເພື່ອເບິ່ງຂໍ້ມູນເພີ່ມເຕີມ"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"ບໍ່ໄດ້ຕັ້ງໂມງປຸກ"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"ໃສ່ຂໍ້ມູນການລັອກໜ້າຈໍ"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"ເຊັນເຊີລາຍນິ້ວມື"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"ພິສູດຢືນຢັນ"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"ເຂົ້າອຸປະກອນ"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"ສຶກສາເພີ່ມເຕີມ"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"ສຶກສາເພີ່ມເຕີມຢູ່ <xliff:g id="URL">%s</xliff:g>"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"ເປີດ <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"ເພື່ອເພີ່ມແອັບ Wallet ເປັນທາງລັດ, ກະລຸນາກວດສອບໃຫ້ແນ່ໃຈວ່າໄດ້ຕິດຕັ້ງແອັບແລ້ວ"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"ເພື່ອເພີ່ມແອັ Wallet ເປັນທາງລັດ, ກະລຸນາກວດສອບໃຫ້ແນ່ໃຈວ່າໄດ້ເພີ່ມຢ່າງໜ້ອຍ 1 ບັດແລ້ວ"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"ເພື່ອເພີ່ມຕົວສະແກນລະຫັດ QR ເປັນທາງລັດ, ກະລຸນາກວດສອບໃຫ້ແນ່ໃຈວ່າໄດ້ຕິດຕັ້ງແອັບກ້ອງຖ່າຍຮູບແລ້ວ"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"ເພື່ອເພີ່ມແອັບ Home ເປັນທາງລັດ, ກະລຸນາກວດສອບໃຫ້ແນ່ໃຈວ່າໄດ້ຕິດຕັ້ງແອັບແລ້ວ"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• ມີຢ່າງໜ້ອຍ 1 ອຸປະກອນພ້ອມໃຫ້ນຳໃຊ້"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"ເລືອກແອັບບັນທຶກເລີ່ມຕົ້ນເພື່ອໃຊ້ທາງລັດການຈົດບັນທຶກ"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"ເລືອກແອັບ"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"ແຕະທາງລັດຄ້າງໄວ້"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"ຍົກເລີກ"</string> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index 44f7b68ef59c..ff745b5f6f63 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Nuskaitant akumuliatoriaus skaitiklį iškilo problema"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Palieskite, kad sužinotumėte daugiau informacijos"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Nenustatyta signalų"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"įvesti ekrano užraktą"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Kontrolinio kodo jutiklis"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"nustatytumėte tapatybę"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"pasiektumėte įrenginį"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"Sužinokite daugiau"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"Sužinokite daugiau adresu <xliff:g id="URL">%s</xliff:g>"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"Atidaryti „<xliff:g id="APPNAME">%1$s</xliff:g>“"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"Jei norite pridėti programą „Wallet“ kaip šaukinį, įsitikinkite, kad programa įdiegta"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"Jei norite pridėti programą „Wallet“ kaip šaukinį, įsitikinkite, kad pridėta bent viena kortelė"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"Jei norite pridėti QR kodų skaitytuvą kaip šaukinį, įsitikinkite, kad fotoaparato programa įdiegta"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"Jei norite pridėti programą „Home“ kaip šaukinį, įsitikinkite, kad programa įdiegta"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• Pasiekiamas bent vienas įrenginys"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Pasirinkite numatytąją užrašų programą, kuriai norite naudoti užrašų kūrimo šaukinį"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Pasirinkite programą"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Paliesk. ir palaik. spart. klav."</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Atšaukti"</string> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index fc227f00a429..c8c18fb3537c 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Nevar iegūt informāciju par akumulatora uzlādes līmeni."</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Pieskarieties, lai iegūtu plašāku informāciju."</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Nav iestatīts signāls"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"ievadīt ekrāna bloķēšanas informāciju"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Pirksta nospieduma sensors"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"veiktu autentificēšanu"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"izmantotu ierīci"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"Uzzināt vairāk"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"Uzziniet vairāk vietnē <xliff:g id="URL">%s</xliff:g>"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"Atvērt lietotni <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"Lai varētu pievienot lietotni Maks kā saīsni, lietotnei ir jābūt instalētai."</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"Lai varētu pievienot lietotni Maks kā saīsni, ir jābūt pievienotai vismaz vienai kartei."</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"Lai varētu pievienot lietotni Kvadrātkoda skeneris kā saīsni, ir jābūt instalētai kameras lietotnei."</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"Lai varētu pievienot lietotni Home kā saīsni, lietotnei ir jābūt instalētai."</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• Ir pieejama vismaz viena ierīce."</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Atlasiet noklusējuma piezīmju lietotni, lai izmantotu piezīmju pierakstīšanas saīsni."</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Atlasīt lietotni"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Pieskarieties saīsnei un turiet."</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Atcelt"</string> diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index 5dad015d0986..e4299794146b 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -170,7 +170,7 @@ <string name="biometric_re_enroll_notification_content" msgid="8685925877186288180">"Ова е потребно за да се подобрат сигурноста и изведбата"</string> <string name="fingerprint_re_enroll_notification_title" msgid="4539432429683916604">"Поставете „Отклучување со отпечаток“ повторно"</string> <string name="fingerprint_re_enroll_notification_name" msgid="630798657797645704">"Отклучување со отпечаток"</string> - <string name="fingerprint_re_enroll_dialog_title" msgid="3526033128113925780">"Поставување „Отклучување со отпечаток“"</string> + <string name="fingerprint_re_enroll_dialog_title" msgid="3526033128113925780">"Поставете „Отклучување со отпечаток“"</string> <string name="fingerprint_re_enroll_dialog_content" msgid="4866561176695984879">"За да поставите „Отклучување со отпечаток“ повторно, вашите сегашни слики и модели на отпечаток ќе се избришат.\n\nОткако ќе се избришат, ќе треба повторно да поставите „Отклучување со отпечаток“ за да го користите отпечатокот за отклучување на телефонот или потврда дека сте вие."</string> <string name="fingerprint_re_enroll_dialog_content_singular" msgid="3083663339787381218">"За да поставите „Отклучување со отпечаток“ повторно, вашите сегашните слики и модели на отпечаток ќе бидат избришат.\n\nОткако ќе се избришат, ќе треба повторно да поставите „Отклучување со отпечаток“ за да го користите отпечатокот за да го отклучите телефонот или да потврдите дека сте вие."</string> <string name="fingerprint_reenroll_failure_dialog_content" msgid="4733768492747300666">"Не можеше да се постави „Отклучување со отпечаток“. Отворете „Поставки“ за да се обидете повторно."</string> @@ -399,7 +399,7 @@ <string name="media_projection_sys_service_dialog_warning" msgid="2443872865267330320">"Услугата што ја обезбедува функцијава ќе има пристап до сите податоци што се видливи на екранот или пуштени од вашиот уред додека се снима или емитува. Ова вклучува податоци како лозинките, деталите за плаќање, фотографиите, пораките и аудиото што го пуштате."</string> <string name="screen_share_permission_dialog_option_entire_screen" msgid="3131200488455089620">"Цел екран"</string> <string name="screen_share_permission_dialog_option_single_app" msgid="4350961814397220929">"Една апликација"</string> - <string name="screen_share_permission_app_selector_title" msgid="1404878013670347899">"Споделете или снимете апликација"</string> + <string name="screen_share_permission_app_selector_title" msgid="1404878013670347899">"Споделување или снимање апликација"</string> <string name="media_projection_entry_app_permission_dialog_title" msgid="9155535851866407199">"Да почне снимање или емитување со <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string> <string name="media_projection_entry_app_permission_dialog_warning_entire_screen" msgid="8736391633234144237">"Кога споделувате, снимате или емитувате, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> има пристап до сѐ што е видливо на вашиот екран или пуштено на вашиот уред. Затоа, бидете внимателни со работи како лозинки, детали за плаќање, пораки, фотографии и аудио и видео."</string> <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="5211695779082563959">"Кога споделувате, снимате или емитувате апликација, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> има пристап до сѐ што се прикажува или пушта на таа апликација. Затоа, бидете внимателни со работи како лозинки, детали за плаќање, пораки, фотографии и аудио и видео."</string> @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Проблем при читањето на мерачот на батеријата"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Допрете за повеќе информации"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Не е поставен аларм"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"внесете PIN/шема/лозинка"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Сензор за отпечатоци"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"автентицирате"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"внесете уред"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"Дознајте повеќе"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"Дознајте повеќе на <xliff:g id="URL">%s</xliff:g>"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"Отворете ја <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"За да ја додадете апликацијата Wallet како кратенка, апликацијата мора да е инсталирана"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"За да ја додадете апликацијата Wallet како кратенка, мора да имате додадено најмалку една картичка"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"За да го додадете скенерот на QR-кодови како кратенка, погрижете се дека имате инсталирано апликација за камера"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"За да ја додадете апликацијата Home како кратенка, апликацијата мора да е инсталирана"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• достапен е најмалку еден уред"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Изберете стандардна апликација за белешки за да ја користите кратенката за фаќање белешки"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Изберете апликација"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Допрете и задржете ја кратенката"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Откажи"</string> diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index 5c6bef3801cc..98d0ddd5e3fb 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Таны батарей хэмжигчийг уншихад асуудал гарлаа"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Нэмэлт мэдээлэл авахын тулд товшино уу"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Сэрүүлэг тавиагүй"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"дэлгэцийн түгжээ оруулах"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Хурууны хээ мэдрэгч"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"баталгаажуулах"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"төхөөрөмж оруулах"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"Нэмэлт мэдээлэл авах"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"<xliff:g id="URL">%s</xliff:g>-с нэмэлт мэдээлэл авна уу"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"<xliff:g id="APPNAME">%1$s</xliff:g>-г нээх"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"Wallet аппыг товчлолоор нэмэхийн тулд уг аппыг суулгасан эсэхийг шалгана уу"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"Wallet аппыг товчлолоор нэмэхийн тулд дор хаяж нэг карт нэмсэн эсэхийг шалгана уу"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"QR код сканнерыг товчлолоор нэмэхийн тулд камерын аппыг суулгасан эсэхийг шалгана уу"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"Home аппыг товчлолоор нэмэхийн тулд уг аппыг суулгасан эсэхийг шалгана уу"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• Дор хаяж нэг төхөөрөмж боломжтой"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Тэмдэглэл хөтлөх товчлолыг ашиглахын тулд тэмдэглэлийн өгөгдмөл аппыг сонгоно уу"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Апп сонгох"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Товчлолд хүрээд удаан дарна уу"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Цуцлах"</string> diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index 55198be48449..6547cfe3d38c 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"तुमचे बॅटरी मीटर वाचताना समस्या आली"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"अधिक माहितीसाठी टॅप करा"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"अलार्म सेट केला नाही"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"स्क्रीन लॉक एंटर करा"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"फिंगरप्रिंट सेन्सर"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"ऑथेंटिकेट करा"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"डिव्हाइस एंटर करा"</string> diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index 100feac95bea..3d1a2223bb2f 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Masalah membaca meter bateri anda"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Ketik untuk mendapatkan maklumat lanjut"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Tiada penggera"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"masukkan kunci skrin"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Penderia cap jari"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"sahkan"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"akses peranti"</string> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index d516e507dcbc..a6111d98f2e2 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Kunne ikke lese batterimåleren"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Trykk for å få mer informasjon"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Ingen alarm angitt"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"legg inn skjermlåsen"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Fingeravtrykkssensor"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"autentiser"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"åpne enheten"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"Finn ut mer"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"Finn ut mer på <xliff:g id="URL">%s</xliff:g>"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"Åpne <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"For å legge til Wallet-appen som snarvei, sørg for at appen er installert"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"For å legge til Wallet-appen som snarvei, sørg for at minst ett kort er lagt til"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"For å legge til QR-kodeskanneren som snarvei, sørg for at du har en kameraapp installert"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"For å legge til Home-appen som snarvei, sørg for at appen er installert"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• minst én enhet er tilgjengelig"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Velg en standard notatapp du vil bruke med notatsnarveien"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Velg app"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Trykk på og hold inne snarveien"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Avbryt"</string> diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index 70d3d5b98eac..610e28be9444 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -79,7 +79,7 @@ <string name="screenshot_failed_to_save_unknown_text" msgid="1506621600548684129">"स्क्रिनसट फेरि लिएर हेर्नुहोस्"</string> <string name="screenshot_failed_to_save_text" msgid="7232739948999195960">"स्क्रिनसट सुरक्षित गर्न सकिएन"</string> <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"उक्त एप वा तपाईंको संगठनले स्क्रिनसटहरू लिन दिँदैन"</string> - <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"तपाईंको सूचना प्रविधि व्यवस्थापकले स्क्रिनसट लिने सुविधा ब्लक गर्नुभएको छ"</string> + <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"तपाईंको IT एड्मिनले स्क्रिनसट लिने सुविधा ब्लक गर्नुभएको छ"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"सम्पादन गर्नुहोस्"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"स्क्रिनसट सम्पादन गर्नुहोस्"</string> <string name="screenshot_share_description" msgid="2861628935812656612">"स्क्रिनसट सेयर गर्नुहोस्"</string> @@ -412,11 +412,11 @@ <string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"तपाईंले सेयर गर्दा, रेकर्ड गर्दा वा कास्ट गर्दा Android ले तपाईंको स्क्रिनमा देखिने वा डिभाइसमा प्ले गरिने सबै कुरा हेर्न तथा प्रयोग गर्न सक्छ। त्यसैले पासवर्ड, भुक्तानीसम्बन्धी विवरण, म्यासेज, फोटो र अडियो तथा भिडियो जस्ता कुरा हेर्दा वा प्ले गर्दा सावधानी अपनाउनुहोला।"</string> <string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"तपाईंले कुनै एप सेयर गर्दा, रेकर्ड गर्दा वा कास्ट गर्दा Android ले उक्त एपमा देखाइने वा प्ले गरिने सबै कुरा हेर्न तथा प्रयोग गर्न सक्छ। त्यसैले पासवर्ड, भुक्तानीसम्बन्धी विवरण, म्यासेज, फोटो र अडियो तथा भिडियो जस्ता कुरा हेर्दा वा प्ले गर्दा सावधानी अपनाउनुहोला।"</string> <string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"सुरु गर्नुहोस्"</string> - <string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"तपाईंका सूचना प्रविधि व्यवस्थापकले ब्लक गर्नुभएको छ"</string> + <string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"तपाईंका IT एड्मिनले ब्लक गर्नुभएको छ"</string> <string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"डिभाइसको नीतिका कारण स्क्रिन क्याप्चर गर्ने सुविधा अफ गरिएको छ"</string> <string name="clear_all_notifications_text" msgid="348312370303046130">"सबै हटाउनुहोस्"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"व्यवस्थित गर्नुहोस्"</string> - <string name="manage_notifications_history_text" msgid="57055985396576230">"इतिहास"</string> + <string name="manage_notifications_history_text" msgid="57055985396576230">"हिस्ट्री"</string> <string name="notification_section_header_incoming" msgid="850925217908095197">"नयाँ"</string> <string name="notification_section_header_gentle" msgid="6804099527336337197">"साइलेन्ट"</string> <string name="notification_section_header_alerting" msgid="5581175033680477651">"सूचनाहरू"</string> @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"डिभाइसको ब्याट्रीको मिटर रिडिङ क्रममा समस्या भयो"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"थप जानकारी प्राप्त गर्न ट्याप गर्नुहोस्"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"अलार्म राखिएको छैन"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"स्क्रिन लक हाल्नुहोस्"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"फिंगरप्रिन्ट सेन्सर"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"प्रमाणित गर्नुहोस्"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"डिभाइस हाल्नुहोस्"</string> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index 5dfdb86b7d7c..3f7f829a32ad 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Probleem bij het lezen van je batterijmeter"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Tik hier voor meer informatie"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Geen wekker gezet"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"schermvergrendeling invoeren"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Vingerafdruksensor"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"verifiëren"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"apparaat opgeven"</string> diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index 5266083fe2f3..3728d5a92288 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -254,7 +254,7 @@ <string name="quick_settings_camera_mic_available" msgid="1453719768420394314">"ଉପଲବ୍ଧ"</string> <string name="quick_settings_camera_mic_blocked" msgid="4710884905006788281">"ବ୍ଲକ୍ କରାଯାଇଛି"</string> <string name="quick_settings_media_device_label" msgid="8034019242363789941">"ମିଡିଆ ଡିଭାଇସ୍"</string> - <string name="quick_settings_user_title" msgid="8673045967216204537">"ଉପଯୋଗକର୍ତ୍ତା"</string> + <string name="quick_settings_user_title" msgid="8673045967216204537">"ୟୁଜର"</string> <string name="quick_settings_wifi_label" msgid="2879507532983487244">"ୱାଇ-ଫାଇ"</string> <string name="quick_settings_internet_label" msgid="6603068555872455463">"ଇଣ୍ଟରନେଟ"</string> <string name="quick_settings_networks_available" msgid="1875138606855420438">"ନେଟୱାର୍କଗୁଡ଼ିକ ଉପଲବ୍ଧ"</string> @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"ଆପଣଙ୍କ ବ୍ୟାଟେରୀ ମିଟର୍ ପଢ଼ିବାରେ ସମସ୍ୟା ହେଉଛି"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"ଅଧିକ ସୂଚନା ପାଇଁ ଟାପ୍ କରନ୍ତୁ"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"ଆଲାରାମ ସେଟ ହୋଇନାହିଁ"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"ସ୍କ୍ରିନ ଲକ ଲେଖନ୍ତୁ"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"ଟିପଚିହ୍ନ ସେନ୍ସର୍"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"ପ୍ରମାଣୀକରଣ କରନ୍ତୁ"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"ଡିଭାଇସ୍ ବିଷୟରେ ସୂଚନା ଲେଖନ୍ତୁ"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"ଅଧିକ ଜାଣନ୍ତୁ"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"<xliff:g id="URL">%s</xliff:g>ରେ ଅଧିକ ଜାଣନ୍ତୁ"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"<xliff:g id="APPNAME">%1$s</xliff:g> ଖୋଲନ୍ତୁ"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"ଏକ ସର୍ଟକଟ ଭାବେ Wallet ଆପ ଯୋଗ କରିବା ପାଇଁ ଏହି ଆପ ଇନଷ୍ଟଲ କରାଯାଇଥିବା ସୁନିଶ୍ଚିତ କରନ୍ତୁ"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"ଏକ ସର୍ଟକଟ ଭାବେ Wallet ଆପ ଯୋଗ କରିବାକୁ ଅତିକମରେ ଗୋଟିଏ ଆପ ଯୋଗ କରାଯାଇଥିବା ସୁନିଶ୍ଚିତ କରନ୍ତୁ"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"ଏକ ସର୍ଟକଟ ଭାବେ QR କୋଡ ସ୍କାନର ଯୋଗ କରିବାକୁ ଏକ କେମେରା ଆପ ଇନଷ୍ଟଲ କରାଯାଇଥିବା ସୁନିଶ୍ଚିତ କରନ୍ତୁ"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"ଏକ ସର୍ଟକଟ ଭାବେ Home ଆପ ଯୋଗ କରିବା ପାଇଁ ଏହି ଆପ ଇନଷ୍ଟଲ କରାଯାଇଥିବା ସୁନିଶ୍ଚିତ କରନ୍ତୁ"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• ଅତିକମରେ ଗୋଟିଏ ଡିଭାଇସ ଉପଲବ୍ଧ ଅଛି"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"ନୋଟଟେକିଂ ସର୍ଟକଟ ବ୍ୟବହାର କରିବାକୁ ଏକ ଡିଫଲ୍ଟ ନୋଟ୍ସ ଆପ୍ସ ଚୟନ କରନ୍ତୁ"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"ଆପ ଚୟନ କରନ୍ତୁ"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"ସର୍ଟକଟକୁ ସ୍ପର୍ଶ କରି ଧରି ରଖନ୍ତୁ"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"ବାତିଲ କରନ୍ତୁ"</string> diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index bee58780ff28..bb511e39bb6b 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"ਤੁਹਾਡੇ ਬੈਟਰੀ ਮੀਟਰ ਨੂੰ ਪੜ੍ਹਨ ਵਿੱਚ ਸਮੱਸਿਆ ਹੋ ਰਹੀ ਹੈ"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"ਹੋਰ ਜਾਣਕਾਰੀ ਲਈ ਟੈਪ ਕਰੋ"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"ਕੋਈ ਅਲਾਰਮ ਸੈੱਟ ਨਹੀਂ"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"ਸਕ੍ਰੀਨ ਲਾਕ ਦਾਖਲ ਕਰੋ"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਸੈਂਸਰ"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"ਪ੍ਰਮਾਣਿਤ ਕਰੋ"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"ਡੀਵਾਈਸ ਵਿੱਚ ਦਾਖਲ ਹੋਵੋ"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"ਹੋਰ ਜਾਣੋ"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"<xliff:g id="URL">%s</xliff:g> \'ਤੇ ਹੋਰ ਜਾਣੋ"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"<xliff:g id="APPNAME">%1$s</xliff:g> ਖੋਲ੍ਹੋ"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"Wallet ਐਪ ਨੂੰ ਸ਼ਾਰਟਕੱਟ ਵਜੋਂ ਸ਼ਾਮਲ ਕਰਨ ਲਈ, ਪੱਕਾ ਕਰੋ ਕਿ ਐਪ ਸਥਾਪਤ ਹੈ"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"Wallet ਐਪ ਨੂੰ ਸ਼ਾਰਟਕੱਟ ਵਜੋਂ ਸ਼ਾਮਲ ਕਰਨ ਲਈ, ਪੱਕਾ ਕਰੋ ਕਿ ਘੱਟੋ-ਘੱਟ ਇੱਕ ਕਾਰਡ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ ਹੈ"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"QR ਕੋਡ ਸਕੈਨਰ ਨੂੰ ਸ਼ਾਰਟਕੱਟ ਵਜੋਂ ਸ਼ਾਮਲ ਕਰਨ ਲਈ, ਪੱਕਾ ਕਰੋ ਕਿ ਕੈਮਰਾ ਐਪ ਸਥਾਪਤ ਹੈ"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"Home ਐਪ ਨੂੰ ਸ਼ਾਰਟਕੱਟ ਵਜੋਂ ਸ਼ਾਮਲ ਕਰਨ ਲਈ, ਪੱਕਾ ਕਰੋ ਕਿ ਐਪ ਸਥਾਪਤ ਹੈ"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• ਘੱਟੋ-ਘੱਟ ਇੱਕ ਡੀਵਾਈਸ ਉਪਲਬਧ ਹੈ"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"ਨੋਟ ਬਣਾਉਣ ਵਾਲੇ ਸ਼ਾਰਟਕੱਟ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ ਪੂਰਵ-ਨਿਰਧਾਰਿਤ ਨੋਟ ਐਪ ਚੁਣੋ"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"ਐਪ ਚੁਣੋ"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"ਸ਼ਾਰਟਕੱਟ ਨੂੰ ਸਪਰਸ਼ ਕਰ ਕੇ ਰੱਖੋ"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"ਰੱਦ ਕਰੋ"</string> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index 899460e43468..5dcdd7e60401 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -399,7 +399,7 @@ <string name="media_projection_sys_service_dialog_warning" msgid="2443872865267330320">"Podczas nagrywania i przesyłania usługa udostępniająca tę funkcję będzie miała dostęp do wszystkich informacji widocznych na ekranie lub odtwarzanych na urządzeniu. Dotyczy to m.in. haseł, szczegółów płatności, zdjęć, wiadomości i odtwarzanych dźwięków."</string> <string name="screen_share_permission_dialog_option_entire_screen" msgid="3131200488455089620">"Cały ekran"</string> <string name="screen_share_permission_dialog_option_single_app" msgid="4350961814397220929">"Pojedyncza aplikacja"</string> - <string name="screen_share_permission_app_selector_title" msgid="1404878013670347899">"Udostępnianie i nagrywanie za pomocą aplikacji"</string> + <string name="screen_share_permission_app_selector_title" msgid="1404878013670347899">"Udostępnianie i nagrywanie aplikacji"</string> <string name="media_projection_entry_app_permission_dialog_title" msgid="9155535851866407199">"Rozpocząć nagrywanie lub przesyłanie za pomocą aplikacji <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string> <string name="media_projection_entry_app_permission_dialog_warning_entire_screen" msgid="8736391633234144237">"Podczas udostępniania, nagrywania lub przesyłania treści aplikacja <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ma dostęp do wszystkiego, co jest widoczne na ekranie lub odtwarzane na urządzeniu. Dlatego zachowaj ostrożność w zakresie haseł, danych do płatności, wiadomości, zdjęć, audio i filmów."</string> <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="5211695779082563959">"Podczas udostępniania, nagrywania lub przesyłania treści aplikacja <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ma dostęp do wszystkiego, co jest w niej wyświetlane lub odtwarzane. Dlatego zachowaj ostrożność w zakresie haseł, danych do płatności, wiadomości, zdjęć, audio i filmów."</string> @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problem z odczytaniem pomiaru wykorzystania baterii"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Kliknij, aby uzyskać więcej informacji"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Nie ustawiono alarmu"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"Wprowadź blokadę ekranu"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Czytnik linii papilarnych"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"uwierzytelnij"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"otwórz urządzenie"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"Więcej informacji"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"Więcej informacji: <xliff:g id="URL">%s</xliff:g>"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"Otwórz: <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"Aby dodać aplikację Portfel jako skrót, upewnij się, że jest zainstalowana"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"Aby dodać aplikację Portfel jako skrót, upewnij się, że została dodana co najmniej 1 karta"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"Aby dodać Skaner kodów QR jako skrót, upewnij się, że jest zainstalowana aplikacja aparatu"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"Aby dodać aplikację Home jako skrót, upewnij się, że jest zainstalowana"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• Dostępne jest co najmniej 1 urządzenie."</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Wybierz domyślną aplikację do obsługi notatek, której skrótu będziesz używać do funkcji notowania"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Wybierz aplikację"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Skrót – naciśnij i przytrzymaj"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Anuluj"</string> diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index 785856ef4723..3ac3692b9840 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problema para ler seu medidor de bateria"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Toque para mais informações"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Nenhum alarme definido"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"inserir bloqueio de tela"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Sensor de impressão digital"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"autenticar"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"acessar o dispositivo"</string> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index c6612a7010e1..6d54a64984ef 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Ocorreu um problema ao ler o medidor da bateria"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Toque para obter mais informações"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Nenhum alarme defin."</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"introduzir bloqueio de ecrã"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Sensor de impressões digitais"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"autenticar"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"entrar no dispositivo"</string> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 785856ef4723..3ac3692b9840 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problema para ler seu medidor de bateria"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Toque para mais informações"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Nenhum alarme definido"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"inserir bloqueio de tela"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Sensor de impressão digital"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"autenticar"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"acessar o dispositivo"</string> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index a7a2731201f8..d0764dd9f73e 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -399,7 +399,7 @@ <string name="media_projection_sys_service_dialog_warning" msgid="2443872865267330320">"Serviciul care oferă această funcție va avea acces la toate informațiile vizibile pe ecran sau redate pe dispozitiv în timp ce înregistrezi sau proiectezi. Între aceste informații se numără parole, detalii de plată, fotografii, mesaje și conținutul audio pe care îl redai."</string> <string name="screen_share_permission_dialog_option_entire_screen" msgid="3131200488455089620">"Tot ecranul"</string> <string name="screen_share_permission_dialog_option_single_app" msgid="4350961814397220929">"O singură aplicație"</string> - <string name="screen_share_permission_app_selector_title" msgid="1404878013670347899">"Permite accesul la o aplicație sau înregistreaz-o"</string> + <string name="screen_share_permission_app_selector_title" msgid="1404878013670347899">"Distribuie o aplicație sau înregistreaz-o"</string> <string name="media_projection_entry_app_permission_dialog_title" msgid="9155535851866407199">"Începi să înregistrezi sau să proiectezi cu <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string> <string name="media_projection_entry_app_permission_dialog_warning_entire_screen" msgid="8736391633234144237">"Când permiți accesul, înregistrezi sau proiectezi, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> are acces la orice este vizibil pe ecran sau se redă pe dispozitiv. Prin urmare, ai grijă cu parolele, detaliile de plată, mesajele, fotografiile și conținutul audio și video."</string> <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="5211695779082563959">"Când permiți accesul, înregistrezi sau proiectezi o aplicație, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> are acces la orice se afișează pe ecran sau se redă în aplicație. Prin urmare, ai grijă cu informații cum ar fi parolele, detaliile de plată, mesajele, fotografiile și conținutul audio și video."</string> @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problemă la citirea măsurării bateriei"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Atinge pentru mai multe informații"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Nicio alarmă setată"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"intră în blocarea ecranului"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Senzor de amprentă"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"autentifică-te"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"Accesează dispozitivul"</string> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index 279d9a629409..91a853488092 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -981,7 +981,7 @@ <string name="media_output_dialog_multiple_devices" msgid="1093771040315422350">"Выбрано устройств: <xliff:g id="COUNT">%1$d</xliff:g>"</string> <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(нет подключения)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Не удается переключиться. Нажмите, чтобы повторить попытку."</string> - <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Подключите устройство"</string> + <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Подключить устройство"</string> <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Чтобы начать трансляцию сеанса, откройте приложение"</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Неизвестное приложение"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Остановить трансляцию"</string> @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Не удалось узнать уровень заряда батареи"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Нажмите, чтобы узнать больше."</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Нет будильников"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"разблокировать экран"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Сканер отпечатков пальцев"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"выполнить аутентификацию"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"указать устройство"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"Подробнее"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"Подробнее: <xliff:g id="URL">%s</xliff:g>."</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"Открыть \"<xliff:g id="APPNAME">%1$s</xliff:g>\""</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"Вы можете добавить ярлык приложения \"Кошелек\", только если оно установлено."</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"Вы можете добавить ярлык приложения \"Кошелек\", только если добавлена хотя бы одна карта."</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"Вы можете добавить ярлык сканера QR-кодов, только если установлено приложение камеры."</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"Вы можете добавить ярлык приложения Home, только если оно установлено."</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• Доступно хотя бы одно устройство."</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Выберите стандартное приложение для заметок, которое будет открываться при нажатии на ярлык."</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Выбрать приложение"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Нажмите и удерживайте ярлык"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Отмена"</string> diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index ddca7f5b5078..1efb408216a8 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"ඔබගේ බැටරි මනුව කියවීමේ දෝෂයකි"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"තවත් තොරතුරු සඳහා තට්ටු කරන්න"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"එලාම සකසා නැත"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"තිර අගුල ඇතුළු කරන්න"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"ඇඟිලි සලකුණු සංවේදකය"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"සත්යාපනය කරන්න"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"උපාංගය ඇතුළු කරන්න"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"තව දැන ගන්න"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"<xliff:g id="URL">%s</xliff:g> තුළින් තව දැන ගන්න"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"<xliff:g id="APPNAME">%1$s</xliff:g> විවෘත කරන්න"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"කෙටිමඟක් ලෙස Wallet යෙදුම එක් කිරීම සඳහා, යෙදුම ස්ථාපනය කර ඇති බවට වග බලා ගන්න"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"කෙටිමඟක් ලෙස Wallet යෙදුම එක් කිරීම සඳහා, අවම වශයෙන් එක් කාඩ්පතක් එක් කර ඇති බවට වග බලා ගන්න"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"කෙටිමඟක් ලෙස QR කේත ස්කෑනරය එක් කිරීම සඳහා, කැමරා යෙදුමක් ස්ථාපනය කර ඇති බවට වග බලා ගන්න"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"Home යෙදුම කෙටිමඟක් ලෙස එක් කිරීම සඳහා, යෙදුම ස්ථාපනය කර ඇති බව සහතික කර ගන්න"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• අවම වශයෙන් එක උපාංගයක් ලැබේ"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"සටහන් ගැනීමේ කෙටිමඟ භාවිතා කිරීමට පෙරනිමි සටහන් යෙදුමක් තෝරන්න"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"යෙදුම තෝරන්න"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"ස්පර්ශ කර අල්ලා සිටීමේ කෙටිමඟ"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"අවලංගු කරන්න"</string> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index 996f45440381..b353293bd3d4 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -399,7 +399,7 @@ <string name="media_projection_sys_service_dialog_warning" msgid="2443872865267330320">"Služba poskytujúca túto funkciu bude mať prístup k všetkým informáciám zobrazovaným na obrazovke alebo prehrávaným v zariadení počas nahrávania či prenosu. Patria medzi ne informácie, ako sú heslá, platobné údaje, fotky, správy a prehrávaný zvuk."</string> <string name="screen_share_permission_dialog_option_entire_screen" msgid="3131200488455089620">"Celá obrazovka"</string> <string name="screen_share_permission_dialog_option_single_app" msgid="4350961814397220929">"Jedna aplikácia"</string> - <string name="screen_share_permission_app_selector_title" msgid="1404878013670347899">"Aplikácia na zdieľanie alebo nahrávanie"</string> + <string name="screen_share_permission_app_selector_title" msgid="1404878013670347899">"Vyberte aplikáciu, ktorú chcete zdieľať alebo nahrávať"</string> <string name="media_projection_entry_app_permission_dialog_title" msgid="9155535851866407199">"Chcete spustiť nahrávanie alebo prenos s aktivovaným povolením <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string> <string name="media_projection_entry_app_permission_dialog_warning_entire_screen" msgid="8736391633234144237">"Počas zdieľania, nahrávania alebo prenosu bude mať <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> prístup k všetkému, čo sa zobrazuje na obrazovke alebo prehráva v zariadení. Preto zvýšte pozornosť v prípade položiek, ako sú heslá, platobné údaje, správy, fotky a zvuk či video."</string> <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="5211695779082563959">"Počas zdieľania, nahrávania alebo prenosu v aplikácii bude mať <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> prístup k všetkému, čo sa v danej aplikácii zobrazuje alebo prehráva. Preto zvýšte pozornosť v prípade položiek, ako sú heslá, platobné údaje, správy, fotky a zvuk či video."</string> @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Pri čítaní meradla batérie sa vyskytol problém"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Klepnutím si zobrazíte ďalšie informácie"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Žiadny budík"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"zadať zámku obrazovky"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Senzor odtlačkov prstov"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"overte"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"vstúpte do zariadenia"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"Ďalšie informácie"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"Viac sa dozviete na <xliff:g id="URL">%s</xliff:g>"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"Otvoriť <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"Ak chcete pridať aplikáciu Peňaženka ako odkaz, uistite sa, že je nainštalovaná"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"Ak chcete pridať aplikáciu Peňaženka ako odkaz, uistite sa, že bola pridaná aspoň jedna karta"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"Ak chcete pridať skener QR kódov ako odkaz, uistite, že je nainštalovaná aplikácia fotoaparátu"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"Ak chcete pridať aplikáciu Home ako odkaz, uistite sa, že je nainštalovaná"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• K dispozícii je minimálne jedno zariadenie"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Ak chcete používať odkaz na písanie poznámok, vyberte predvolenú aplikáciu na písanie poznámok"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Výber aplikácie"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Pridržte skratku"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Zrušiť"</string> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index 6bebdccb42bf..4dd753ba34c4 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Težava z branjem indikatorja stanja napolnjenosti baterije"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Dotaknite se za več informacij"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Ni nastavljenih alarmov"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"odklenite zaslon"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Tipalo prstnih odtisov"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"preverjanje pristnosti"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"vstop v napravo"</string> diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index 24d5fca5d5c9..475e7998cda1 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problem me leximin e matësit të baterisë"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Trokit për më shumë informacione"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Nuk është caktuar asnjë alarm"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"hyr te kyçja e ekranit"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Sensori i gjurmës së gishtit"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"për ta vërtetuar"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"për të hyrë në pajisje"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"Mëso më shumë"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"Mëso më shumë në <xliff:g id="URL">%s</xliff:g>"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"Hap \"<xliff:g id="APPNAME">%1$s</xliff:g>\""</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"Për të shtuar aplikacionin \"Portofoli\" si një shkurtore, sigurohu që aplikacioni të jetë i instaluar"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"Për të shtuar aplikacionin \"Portofoli\" si një shkurtore, sigurohu që të jetë shtuar të paktën një kartë"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"Për të shtuar skanerin e kodeve QR si një shkurtore, sigurohu që aplikacioni i kamerës të jetë i instaluar"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"Për të shtuar aplikacionin Home si një shkurtore, sigurohu që aplikacioni të jetë i instaluar"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• Ofrohet të paktën një pajisje"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Zgjidh një aplikacion të parazgjedhur shënimesh për të përdorur shkurtoren e mbajtjes së shënimeve"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Zgjidh aplikacionin"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Prek dhe mbaj shtypur shkurtoren"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Anulo"</string> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index 9ca97b9ca863..eb69224fdcfe 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Проблем са очитавањем мерача батерије"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Додирните за више информација"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Није подешен"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"унесите закључавање екрана"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Сензор за отисак прста"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"потврдите идентитет"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"унесите уређај"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"Сазнајте више"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"Сазнајте више на <xliff:g id="URL">%s</xliff:g>"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"Отворите: <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"Да бисте додали апликацију Новчаник као пречицу, уверите се да је апликација инсталирана"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"Да бисте додали апликацију Новчаник као пречицу, уверите се да је додата бар једна картица"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"Да бисте додали Скенер QR кода као пречицу, уверите се да је апликација за камеру инсталирана"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"Да бисте додали апликацију Home као пречицу, уверите се да је апликација инсталирана"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• Доступан је бар један уређај"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Изаберите подразумевану апликацију за белешке да бисте користили пречицу за прављење белешки"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Изабери апликацију"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Додирните и задржите пречицу"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Откажи"</string> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index 82468cb6da37..7e2e006d565b 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Batteriindikatorn visas inte"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Tryck för mer information"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Inget inställt alarm"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"ange skärmlåset"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Fingeravtryckssensor"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"autentisera"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"ange enhet"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"Läs mer"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"Läs mer på <xliff:g id="URL">%s</xliff:g>"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"Öppna <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"Se till att Wallet-appen är installerad om du vill lägga till den som genväg"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"Se till att minst ett kort har lagts till om du vill lägga till Wallet-appen som genväg"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"Se till att en kameraapp är installerad om du vill lägga till QR-skannern som genväg"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"Se till att Home-appen är installerad om du vill lägga till den som genväg"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• minst en enhet är tillgänglig"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Välj en standardapp för anteckningar om du vill använda genvägen för anteckningar"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Välj app"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Tryck länge på genvägen"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Avbryt"</string> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index ef92eb6291be..676edb756d1c 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Tatizo la kusoma mita ya betri yako"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Gusa ili upate maelezo zaidi"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Hujaweka kengele"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"weka kifunga skrini"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Kitambua alama ya kidole"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"thibitisha"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"weka kifaa"</string> diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index b277f558e98a..390bd47cb45a 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"பேட்டரி அளவை அறிவதில் சிக்கல்"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"மேலும் தகவல்களுக்கு தட்டவும்"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"அலாரம் எதுவுமில்லை"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"திரைப் பூட்டை உள்ளிடலாம்"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"கைரேகை சென்சார்"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"அங்கீகரி"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"சாதனத்தைத் திற"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"மேலும் அறிக"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"மேலும் அறிக: <xliff:g id="URL">%s</xliff:g>"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"<xliff:g id="APPNAME">%1$s</xliff:g> ஆப்ஸைத் திற"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"Wallet ஆப்ஸை ஷார்ட்கட்டாகச் சேர்க்க, அந்த ஆப்ஸ் நிறுவப்பட்டுள்ளதை உறுதிசெய்துகொள்ளவும்"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"Wallet ஆப்ஸை ஷார்ட்கட்டாகச் சேர்க்க, அதில் குறைந்தது ஒரு கார்டாவது சேர்க்கப்பட்டுள்ளதை உறுதிசெய்துகொள்ளவும்"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"QR குறியீடு ஸ்கேனரை ஷார்ட்கட்டாகச் சேர்க்க, கேமரா ஆப்ஸ் நிறுவப்பட்டுள்ளதை உறுதிசெய்துகொள்ளவும்"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"Home ஆப்ஸை ஷார்ட்கட்டாகச் சேர்க்க, அந்த ஆப்ஸ் நிறுவப்பட்டுள்ளதை உறுதிசெய்துகொள்ளவும்"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• குறைந்தபட்சம் ஒரு சாதனமாவது இருக்கிறது"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"குறிப்பெடுத்தல் ஷார்ட்கட்டைப் பயன்படுத்த, குறிப்பெடுப்பதற்கான இயல்புநிலை ஆப்ஸைத் தேர்ந்தெடுக்கவும்"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"ஆப்ஸைத் தேர்ந்தெடு"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"ஷார்ட்கட்டை தொட்டுப் பிடிக்கவும்"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"ரத்துசெய்"</string> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index 4b1530904bef..307d1134bb6a 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"พบปัญหาในการอ่านเครื่องวัดแบตเตอรี่"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"แตะดูข้อมูลเพิ่มเติม"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"ไม่มีการตั้งปลุก"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"ป้อนข้อมูลการล็อกหน้าจอ"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"เซ็นเซอร์ลายนิ้วมือ"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"ตรวจสอบสิทธิ์"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"เข้าถึงอุปกรณ์"</string> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 395c07c7255d..6962aa406202 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Pil ölçeriniz okunurken sorun oluştu"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Daha fazla bilgi için dokunun"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Alarm yok"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"ekran kilidini gir"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Parmak izi sensörü"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"kimlik doğrulaması yapın"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"cihaz girin"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"Daha fazla bilgi"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"Daha fazla bilgiyi <xliff:g id="URL">%s</xliff:g> sayfasında bulabilirsiniz"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"<xliff:g id="APPNAME">%1$s</xliff:g> uygulamasını aç"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"Cüzdan uygulamasını kısayol olarak eklemek için uygulamanın yüklü olduğundan emin olun"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"Cüzdan uygulamasını kısayol olarak eklemek için en az bir kart eklendiğinden emin olun"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"QR kodu tarayıcıyı kısayol olarak eklemek için bir kamera uygulamasının yüklü olduğundan emin olun"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"Home uygulamasını kısayol olarak eklemek için uygulamanın yüklü olduğundan emin olun"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• En az bir cihaz mevcut olmalıdır"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Not alma kısayolunu kullanmak için varsayılan bir notlar uygulaması seçin"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Uygulama seçin"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Kısayola dokunup basılı tutun"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"İptal"</string> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 86b609bea3e3..93807d093225 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Не вдалось отримати дані про рівень заряду акумулятора"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Натисніть, щоб дізнатися більше"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Немає будильників"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"показати способи розблокування екрана"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Сканер відбитків пальців"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"пройти автентифікацію"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"відкрити пристрій"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"Докладніше"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"Докладніше: <xliff:g id="URL">%s</xliff:g>"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"Відкрити <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"Щоб додати ярлик для запуску додатка Google Гаманець, переконайтеся, що додаток установлено"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"Щоб додати ярлик для запуску додатка Google Гаманець, переконайтеся, що він містить дані принаймні однієї картки"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"Щоб додати ярлик для запуску сканера QR-коду, переконайтеся, що встановлено додаток для камери"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"Щоб додати ярлик для запуску додатка Google Home, переконайтеся, що додаток установлено"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• Принаймні один пристрій доступний"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Виберіть стандартний додаток для нотаток, щоб створювати їх за допомогою ярлика"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Вибрати додаток"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Натисніть і утримуйте ярлик"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Скасувати"</string> diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index 2069d26200ff..ff4965f05015 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"آپ کے بیٹری میٹر کو پڑھنے میں دشواری"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"مزید معلومات کے لیے تھپتھپائیں"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"کوئی الارم سیٹ نہیں ہے"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"اسکرین لاک درج کریں"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"فنگر پرنٹ سینسر"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"تصدیق کریں"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"آلہ درج کریں"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"مزید جانیں"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"مزید جاننے کیلئے <xliff:g id="URL">%s</xliff:g> ملاحظہ کریں"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"<xliff:g id="APPNAME">%1$s</xliff:g> کھولیں"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"والٹ ایپ کو شارٹ کٹ کے طور پر شامل کرنے کے لیے، یقینی بنائیں کہ ایپ انسٹال ہے"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"والٹ ایپ کو شارٹ کٹ کے طور پر شامل کرنے کے لیے، یقینی بنائیں کہ کم از کم ایک کارڈ شامل کیا گیا ہے"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"QR کوڈ اسکینر کو شارٹ کٹ کے طور پر شامل کرنے کے لیے، یقینی بنائیں کہ کیمرا ایپ انسٹال ہے"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"ہوم ایپ کو شارٹ کٹ کے طور پر شامل کرنے کے لیے، یقینی بنائیں کہ ایپ انسٹال ہے"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• کم از کم ایک آلہ دستیاب ہے"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"نوٹ لینے والے شارٹ کٹ کا استعمال کرنے کے لیے ڈیفالٹ نوٹس ایپ منتخب کریں"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"ایپ منتخب کریں"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"شارٹ کٹ ٹچ کریں اور دبائے رکھیں"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"منسوخ کریں"</string> diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index e6a941412890..538fe16d41c4 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -176,7 +176,7 @@ <string name="fingerprint_reenroll_failure_dialog_content" msgid="4733768492747300666">"Barmoq izi bilan ochish sozlanmadi. Sozlamalarni ochib, qaytadan urining."</string> <string name="face_re_enroll_notification_title" msgid="1850838867718410520">"Yuz bilan ochishni qayta sozlash"</string> <string name="face_re_enroll_notification_name" msgid="7384545252206120659">"Yuz bilan ochish"</string> - <string name="face_re_enroll_dialog_title" msgid="6392173708176069994">"Yuz bilan ochish funksiyasini sozlash"</string> + <string name="face_re_enroll_dialog_title" msgid="6392173708176069994">"Yuz bilan ochishni sozlash"</string> <string name="face_re_enroll_dialog_content" msgid="7353502359464038511">"Yuz bilan ochish funksiyasini qayta sozlash uchun joriy yuz modelingiz oʻchirib tashlanadi.\n\nTelefonni qulfdan chiqarish maqsadida yuzingizdan foydalanish uchun bu funksiyani qayta sozlashingiz kerak."</string> <string name="face_reenroll_failure_dialog_content" msgid="7073947334397236935">"Yuz bilan ochish sozlanmadimi. Sozlamalarni ochib, qaytadan urining."</string> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Barmoq izi skaneriga tegining"</string> @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Batareya quvvati aniqlanmadi"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Batafsil axborot olish uchun bosing"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Signal sozlanmagan"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"ekran qulfini kiriting"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Barmoq izi skaneri"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"autentifikatsiya"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"qurilmani ochish"</string> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 33ae91ea0689..4120e57ec60d 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -399,7 +399,7 @@ <string name="media_projection_sys_service_dialog_warning" msgid="2443872865267330320">"Dịch vụ cung cấp chức năng này có quyền truy cập vào tất cả thông tin xuất hiện trên màn hình của bạn hoặc phát trên thiết bị của bạn trong khi ghi hoặc truyền, bao gồm cả thông tin như mật khẩu, thông tin thanh toán, ảnh, tin nhắn và âm thanh mà bạn phát."</string> <string name="screen_share_permission_dialog_option_entire_screen" msgid="3131200488455089620">"Toàn màn hình"</string> <string name="screen_share_permission_dialog_option_single_app" msgid="4350961814397220929">"Một ứng dụng"</string> - <string name="screen_share_permission_app_selector_title" msgid="1404878013670347899">"Chia sẻ hoặc ghi ứng dụng"</string> + <string name="screen_share_permission_app_selector_title" msgid="1404878013670347899">"Chia sẻ hoặc ghi màn hình ứng dụng"</string> <string name="media_projection_entry_app_permission_dialog_title" msgid="9155535851866407199">"Bắt đầu ghi hoặc truyền bằng <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string> <string name="media_projection_entry_app_permission_dialog_warning_entire_screen" msgid="8736391633234144237">"Khi bạn chia sẻ, ghi hoặc truyền, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> sẽ có quyền truy cập vào mọi nội dung xuất hiện trên màn hình hoặc phát trên thiết bị của bạn. Vì vậy, hãy thận trọng để không làm lộ thông tin như mật khẩu, thông tin thanh toán, tin nhắn, ảnh, âm thanh và video."</string> <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="5211695779082563959">"Khi bạn chia sẻ, ghi hoặc truyền ứng dụng, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> sẽ có quyền truy cập vào mọi nội dung xuất hiện hoặc phát trên ứng dụng đó. Vì vậy, hãy thận trọng để không làm lộ các thông tin như mật khẩu, thông tin thanh toán, tin nhắn, ảnh, âm thanh và video."</string> @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Đã xảy ra vấn đề khi đọc dung lượng pin của bạn"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Nhấn để biết thêm thông tin"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Chưa đặt chuông báo"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"nhập phương thức mở khoá màn hình"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Cảm biến vân tay"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"xác thực"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"truy cập thiết bị"</string> @@ -1127,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"Tìm hiểu thêm"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"Tìm hiểu thêm tại <xliff:g id="URL">%s</xliff:g>"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"Mở <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"Để tạo lối tắt cho ứng dụng Wallet, hãy đảm bảo bạn đã cài đặt ứng dụng đó"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"Để tạo lối tắt cho ứng dụng Wallet, hãy đảm bảo bạn đã thêm ít nhất một thẻ"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"Để tạo lối tắt cho Trình quét mã QR, hãy đảm bảo rằng bạn đã cài đặt một ứng dụng máy ảnh"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"Để tạo lối tắt cho ứng dụng Home, hãy đảm bảo bạn đã cài đặt ứng dụng đó"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• Có ít nhất một thiết bị đang hoạt động"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Chọn một ứng dụng ghi chú mặc định để dùng lối tắt ghi chú"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Chọn ứng dụng"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Chạm và giữ phím tắt"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Huỷ"</string> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index 6c6f5042523d..4066a89895df 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -1126,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"瞭解詳情"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"詳情請瀏覽 <xliff:g id="URL">%s</xliff:g>"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"開啟「<xliff:g id="APPNAME">%1$s</xliff:g>」"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"如要將「錢包」應用程式新增為捷徑,請確認已安裝該應用程式"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"如要將「錢包」應用程式新增為捷徑,請確認已新增至少一張付款卡"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"如要將 QR 碼掃瞄器新增為捷徑,請確認已安裝相機應用程式"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"如要將 Home 應用程式新增為捷徑,請確認已安裝該應用程式"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• 至少一部裝置可用"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"選取預設的筆記應用程式,即可使用筆記捷徑"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"選取應用程式"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"輕觸並按住快速鍵"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"取消"</string> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 888908aaa8ac..7abe1dee3d1d 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -770,8 +770,8 @@ <string name="high_temp_alarm_title" msgid="8654754369605452169">"拔除裝置"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"裝置的充電埠附近越來越熱。如果裝置已連接充電器或 USB 配件,請立即拔除。此外,電線也可能會變熱,請特別留意。"</string> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"查看處理步驟"</string> - <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"向左快速鍵"</string> - <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"向右快速鍵"</string> + <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"左側捷徑"</string> + <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"右側捷徑"</string> <string name="lockscreen_unlock_left" msgid="1417801334370269374">"向左快速鍵可一併解鎖裝置"</string> <string name="lockscreen_unlock_right" msgid="4658008735541075346">"向右快速鍵可一併解鎖裝置"</string> <string name="lockscreen_none" msgid="4710862479308909198">"無"</string> @@ -1126,18 +1126,12 @@ <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"瞭解詳情"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"如要瞭解詳情,請前往 <xliff:g id="URL">%s</xliff:g>"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"開啟「<xliff:g id="APPNAME">%1$s</xliff:g>」"</string> - <!-- no translation found for wallet_quick_affordance_unavailable_install_the_app (7298552910007208368) --> - <skip /> - <!-- no translation found for wallet_quick_affordance_unavailable_configure_the_app (4387433357429873258) --> - <skip /> - <!-- no translation found for qr_scanner_quick_affordance_unavailable_explanation (3049582306241150946) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_install_the_app (6187820778998446168) --> - <skip /> - <!-- no translation found for home_quick_affordance_unavailable_configure_the_app (7953595390775156839) --> - <skip /> - <!-- no translation found for notes_app_quick_affordance_unavailable_explanation (4796955161600178530) --> - <skip /> + <string name="wallet_quick_affordance_unavailable_install_the_app" msgid="7298552910007208368">"如要將錢包應用程式新增為捷徑,請確認已安裝該應用程式"</string> + <string name="wallet_quick_affordance_unavailable_configure_the_app" msgid="4387433357429873258">"如要將錢包應用程式新增為捷徑,請確認已新增至少一張卡片"</string> + <string name="qr_scanner_quick_affordance_unavailable_explanation" msgid="3049582306241150946">"如要將 QR code 掃描器新增為捷徑,請確認已安裝相機應用程式"</string> + <string name="home_quick_affordance_unavailable_install_the_app" msgid="6187820778998446168">"如要將 Google Home 應用程式新增為捷徑,請確認已安裝該應用程式"</string> + <string name="home_quick_affordance_unavailable_configure_the_app" msgid="7953595390775156839">"• 至少要有一部可用裝置"</string> + <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"選取預設的記事應用程式,即可使用筆記捷徑"</string> <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"選取應用程式"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"按住快速鍵"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"取消"</string> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index e57e60b9a6f4..e5b4c14a8d94 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -1046,8 +1046,7 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Kube khona inkinga ngokufunda imitha yakho yebhethri"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Thepha ukuze uthole olunye ulwazi"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Akukho alamu esethiwe"</string> - <!-- no translation found for accessibility_bouncer (5896923685673320070) --> - <skip /> + <string name="accessibility_bouncer" msgid="5896923685673320070">"faka ukukhiya isikrini"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Inzwa yesigxivizo somunwe"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"gunyaza"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"faka idivayisi"</string> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 25f3d224dc4d..a36f318a4cf4 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -2089,23 +2089,11 @@ <!-- Tuner string --> <!-- Tuner string --> - <!-- Title for notification & dialog that the user's phone last shut down because it got too hot. [CHAR LIMIT=40] --> - <string name="thermal_shutdown_title">Phone turned off due to heat</string> - <!-- Message body for notification that user's phone last shut down because it got too hot. [CHAR LIMIT=120] --> - <string name="thermal_shutdown_message">Your phone is now running normally.\nTap for more info</string> - <!-- Text body for dialog alerting user that their phone last shut down because it got too hot. [CHAR LIMIT=500] --> - <string name="thermal_shutdown_dialog_message">Your phone was too hot, so it turned off to cool down. Your phone is now running normally.\n\nYour phone may get too hot if you:\n\t• Use resource-intensive apps (such as gaming, video, or navigation apps)\n\t• Download or upload large files\n\t• Use your phone in high temperatures</string> <!-- Text help link for care instructions for overheating devices [CHAR LIMIT=40] --> <string name="thermal_shutdown_dialog_help_text">See care steps</string> <!-- URL for care instructions for overheating devices --> <string name="thermal_shutdown_dialog_help_url" translatable="false"></string> - <!-- Title for notification (and dialog) that user's phone has reached a certain temperature and may start to slow down in order to cool down. [CHAR LIMIT=30] --> - <string name="high_temp_title">Phone is getting warm</string> - <!-- Message body for notification that user's phone has reached a certain temperature and may start to slow down in order to cool down. [CHAR LIMIT=120] --> - <string name="high_temp_notif_message">Some features limited while phone cools down.\nTap for more info</string> - <!-- Text body for dialog alerting user that their phone has reached a certain temperature and may start to slow down in order to cool down. [CHAR LIMIT=350] --> - <string name="high_temp_dialog_message">Your phone will automatically try to cool down. You can still use your phone, but it may run slower.\n\nOnce your phone has cooled down, it will run normally.</string> <!-- Text help link for care instructions for overheating devices [CHAR LIMIT=40] --> <string name="high_temp_dialog_help_text">See care steps</string> <!-- URL for care instructions for overheating devices --> diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java index 3e16d559742d..6f596843bf9f 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java @@ -43,6 +43,15 @@ public class KeyguardPinViewController private long mPinLength; private boolean mDisabledAutoConfirmation; + /** + * Responsible for identifying if PIN hinting is to be enabled or not + */ + private boolean mIsPinHinting; + + /** + * Responsible for identifying if auto confirm is enabled or not in Settings + */ + private boolean mIsAutoPinConfirmEnabledInSettings; protected KeyguardPinViewController(KeyguardPINView view, KeyguardUpdateMonitor keyguardUpdateMonitor, @@ -63,6 +72,9 @@ public class KeyguardPinViewController mFeatureFlags = featureFlags; mBackspaceKey = view.findViewById(R.id.delete_button); mPinLength = mLockPatternUtils.getPinLength(KeyguardUpdateMonitor.getCurrentUser()); + mIsPinHinting = mPinLength == DEFAULT_PIN_LENGTH; + mIsAutoPinConfirmEnabledInSettings = mLockPatternUtils.isAutoPinConfirmEnabled( + KeyguardUpdateMonitor.getCurrentUser()); } @Override @@ -82,7 +94,7 @@ public class KeyguardPinViewController protected void onUserInput() { super.onUserInput(); - if (isAutoPinConfirmEnabledInSettings()) { + if (mIsAutoPinConfirmEnabledInSettings) { updateAutoConfirmationState(); if (mPasswordEntry.getText().length() == mPinLength && mOkButton.getVisibility() == View.INVISIBLE) { @@ -130,7 +142,7 @@ public class KeyguardPinViewController * Updates the visibility of the OK button for auto confirm feature */ private void updateOKButtonVisibility() { - if (isAutoPinConfirmEnabledInSettings() && !mDisabledAutoConfirmation) { + if (mIsPinHinting && !mDisabledAutoConfirmation) { mOkButton.setVisibility(View.INVISIBLE); } else { mOkButton.setVisibility(View.VISIBLE); @@ -142,10 +154,9 @@ public class KeyguardPinViewController * Visibility changes are only for auto confirmation configuration. */ private void updateBackSpaceVisibility() { - boolean isAutoConfirmation = isAutoPinConfirmEnabledInSettings(); mBackspaceKey.setTransparentMode(/* isTransparentMode= */ - isAutoConfirmation && !mDisabledAutoConfirmation); - if (isAutoConfirmation) { + mIsAutoPinConfirmEnabledInSettings && !mDisabledAutoConfirmation); + if (mIsAutoPinConfirmEnabledInSettings) { if (mPasswordEntry.getText().length() > 0 || mDisabledAutoConfirmation) { mBackspaceKey.setVisibility(View.VISIBLE); @@ -155,24 +166,8 @@ public class KeyguardPinViewController } } /** Updates whether to use pin hinting or not. */ - void updatePinHinting() { - mPasswordEntry.setIsPinHinting(isAutoPinConfirmEnabledInSettings() && isPinHinting() + private void updatePinHinting() { + mPasswordEntry.setIsPinHinting(mIsAutoPinConfirmEnabledInSettings && mIsPinHinting && !mDisabledAutoConfirmation); } - - /** - * Responsible for identifying if PIN hinting is to be enabled or not - */ - private boolean isPinHinting() { - return mLockPatternUtils.getPinLength(KeyguardUpdateMonitor.getCurrentUser()) - == DEFAULT_PIN_LENGTH; - } - - /** - * Responsible for identifying if auto confirm is enabled or not in Settings - */ - private boolean isAutoPinConfirmEnabledInSettings() { - //Checks if user has enabled the auto confirm in Settings - return mLockPatternUtils.isAutoPinConfirmEnabled(KeyguardUpdateMonitor.getCurrentUser()); - } } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java index 841b5b3a1e82..6853f815a1ff 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java @@ -281,6 +281,8 @@ public class KeyguardSecurityContainer extends ConstraintLayout { public interface SwipeListener { void onSwipeUp(); + /** */ + void onSwipeDown(); } @VisibleForTesting @@ -543,6 +545,11 @@ public class KeyguardSecurityContainer extends ConstraintLayout { if (mSwipeListener != null) { mSwipeListener.onSwipeUp(); } + } else if (getTranslationY() > TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, + MIN_DRAG_SIZE, getResources().getDisplayMetrics())) { + if (mSwipeListener != null) { + mSwipeListener.onSwipeDown(); + } } } return true; diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java index 7c511a32bb36..880f242c5938 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java @@ -70,11 +70,11 @@ import com.android.systemui.Gefingerpoken; import com.android.systemui.R; import com.android.systemui.biometrics.SideFpsController; import com.android.systemui.biometrics.SideFpsUiRequestSource; +import com.android.systemui.bouncer.domain.interactor.BouncerMessageInteractor; import com.android.systemui.classifier.FalsingA11yDelegate; import com.android.systemui.classifier.FalsingCollector; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.Flags; -import com.android.systemui.bouncer.domain.interactor.BouncerMessageInteractor; import com.android.systemui.keyguard.domain.interactor.KeyguardFaceAuthInteractor; import com.android.systemui.log.SessionTracker; import com.android.systemui.plugins.ActivityStarter; @@ -319,6 +319,11 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard "swipeUpOnBouncer"); } } + + @Override + public void onSwipeDown() { + mViewMediatorCallback.onBouncerSwipeDown(); + } }; private final ConfigurationController.ConfigurationListener mConfigurationListener = new ConfigurationController.ConfigurationListener() { diff --git a/packages/SystemUI/src/com/android/keyguard/ViewMediatorCallback.java b/packages/SystemUI/src/com/android/keyguard/ViewMediatorCallback.java index 50f8f7e61230..14ec27ae6739 100644 --- a/packages/SystemUI/src/com/android/keyguard/ViewMediatorCallback.java +++ b/packages/SystemUI/src/com/android/keyguard/ViewMediatorCallback.java @@ -104,4 +104,9 @@ public interface ViewMediatorCallback { * Call when cancel button is pressed in bouncer. */ void onCancelClicked(); + + /** + * Determines if bouncer has swiped down. + */ + void onBouncerSwipeDown(); } diff --git a/packages/SystemUI/src/com/android/systemui/authentication/AuthenticationModule.kt b/packages/SystemUI/src/com/android/systemui/authentication/AuthenticationModule.kt index 7c394a62a5f4..6128d9195d19 100644 --- a/packages/SystemUI/src/com/android/systemui/authentication/AuthenticationModule.kt +++ b/packages/SystemUI/src/com/android/systemui/authentication/AuthenticationModule.kt @@ -16,8 +16,11 @@ package com.android.systemui.authentication +import com.android.keyguard.KeyguardSecurityModel import com.android.systemui.authentication.data.repository.AuthenticationRepositoryModule import dagger.Module +import dagger.Provides +import java.util.function.Function @Module( includes = @@ -25,4 +28,12 @@ import dagger.Module AuthenticationRepositoryModule::class, ], ) -object AuthenticationModule +object AuthenticationModule { + + @Provides + fun getSecurityMode( + model: KeyguardSecurityModel, + ): Function<Int, KeyguardSecurityModel.SecurityMode> { + return Function { userId -> model.getSecurityMode(userId) } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/authentication/data/repository/AuthenticationRepository.kt b/packages/SystemUI/src/com/android/systemui/authentication/data/repository/AuthenticationRepository.kt index 0530aed912bc..0b251840ce4e 100644 --- a/packages/SystemUI/src/com/android/systemui/authentication/data/repository/AuthenticationRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/authentication/data/repository/AuthenticationRepository.kt @@ -16,13 +16,25 @@ package com.android.systemui.authentication.data.repository +import com.android.internal.widget.LockPatternUtils +import com.android.keyguard.KeyguardSecurityModel import com.android.systemui.authentication.shared.model.AuthenticationMethodModel +import com.android.systemui.dagger.qualifiers.Application +import com.android.systemui.dagger.qualifiers.Background +import com.android.systemui.keyguard.data.repository.KeyguardRepository +import com.android.systemui.user.data.repository.UserRepository import dagger.Binds import dagger.Module +import java.util.function.Function import javax.inject.Inject +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.withContext /** Defines interface for classes that can access authentication-related application state. */ interface AuthenticationRepository { @@ -38,12 +50,6 @@ interface AuthenticationRepository { val isUnlocked: StateFlow<Boolean> /** - * The currently-configured authentication method. This determines how the authentication - * challenge is completed in order to unlock an otherwise locked device. - */ - val authenticationMethod: StateFlow<AuthenticationMethodModel> - - /** * Whether lock screen bypass is enabled. When enabled, the lock screen will be automatically * dismisses once the authentication challenge is completed. For example, completing a biometric * authentication challenge via face unlock or fingerprint sensor can automatically bypass the @@ -57,11 +63,11 @@ interface AuthenticationRepository { */ val failedAuthenticationAttempts: StateFlow<Int> - /** See [isUnlocked]. */ - fun setUnlocked(isUnlocked: Boolean) - - /** See [authenticationMethod]. */ - fun setAuthenticationMethod(authenticationMethod: AuthenticationMethodModel) + /** + * Returns the currently-configured authentication method. This determines how the + * authentication challenge is completed in order to unlock an otherwise locked device. + */ + suspend fun getAuthenticationMethod(): AuthenticationMethodModel /** See [isBypassEnabled]. */ fun setBypassEnabled(isBypassEnabled: Boolean) @@ -70,18 +76,23 @@ interface AuthenticationRepository { fun setFailedAuthenticationAttempts(failedAuthenticationAttempts: Int) } -class AuthenticationRepositoryImpl @Inject constructor() : AuthenticationRepository { - // TODO(b/280883900): get data from real data sources in SysUI. - - private val _isUnlocked = MutableStateFlow(false) - override val isUnlocked: StateFlow<Boolean> = _isUnlocked.asStateFlow() - - private val _authenticationMethod = - MutableStateFlow<AuthenticationMethodModel>( - AuthenticationMethodModel.Pin(listOf(1, 2, 3, 4), autoConfirm = false) +class AuthenticationRepositoryImpl +@Inject +constructor( + @Application private val applicationScope: CoroutineScope, + private val getSecurityMode: Function<Int, KeyguardSecurityModel.SecurityMode>, + @Background private val backgroundDispatcher: CoroutineDispatcher, + private val userRepository: UserRepository, + private val lockPatternUtils: LockPatternUtils, + keyguardRepository: KeyguardRepository, +) : AuthenticationRepository { + + override val isUnlocked: StateFlow<Boolean> = + keyguardRepository.isKeyguardUnlocked.stateIn( + scope = applicationScope, + started = SharingStarted.WhileSubscribed(), + initialValue = false, ) - override val authenticationMethod: StateFlow<AuthenticationMethodModel> = - _authenticationMethod.asStateFlow() private val _isBypassEnabled = MutableStateFlow(false) override val isBypassEnabled: StateFlow<Boolean> = _isBypassEnabled.asStateFlow() @@ -90,18 +101,45 @@ class AuthenticationRepositoryImpl @Inject constructor() : AuthenticationReposit override val failedAuthenticationAttempts: StateFlow<Int> = _failedAuthenticationAttempts.asStateFlow() - override fun setUnlocked(isUnlocked: Boolean) { - _isUnlocked.value = isUnlocked + override suspend fun getAuthenticationMethod(): AuthenticationMethodModel { + return withContext(backgroundDispatcher) { + val selectedUserId = userRepository.getSelectedUserInfo().id + when (getSecurityMode.apply(selectedUserId)) { + KeyguardSecurityModel.SecurityMode.PIN, + KeyguardSecurityModel.SecurityMode.SimPin -> + AuthenticationMethodModel.Pin( + code = listOf(1, 2, 3, 4), // TODO(b/280883900): remove this + autoConfirm = lockPatternUtils.isAutoPinConfirmEnabled(selectedUserId), + ) + KeyguardSecurityModel.SecurityMode.Password, + KeyguardSecurityModel.SecurityMode.SimPuk -> + AuthenticationMethodModel.Password( + password = "password", // TODO(b/280883900): remove this + ) + KeyguardSecurityModel.SecurityMode.Pattern -> + AuthenticationMethodModel.Pattern( + coordinates = + listOf( + AuthenticationMethodModel.Pattern.PatternCoordinate(2, 0), + AuthenticationMethodModel.Pattern.PatternCoordinate(2, 1), + AuthenticationMethodModel.Pattern.PatternCoordinate(2, 2), + AuthenticationMethodModel.Pattern.PatternCoordinate(1, 1), + AuthenticationMethodModel.Pattern.PatternCoordinate(0, 0), + AuthenticationMethodModel.Pattern.PatternCoordinate(0, 1), + AuthenticationMethodModel.Pattern.PatternCoordinate(0, 2), + ), // TODO(b/280883900): remove this + ) + KeyguardSecurityModel.SecurityMode.None -> AuthenticationMethodModel.None + KeyguardSecurityModel.SecurityMode.Invalid -> error("Invalid security mode!") + null -> error("Invalid security is null!") + } + } } override fun setBypassEnabled(isBypassEnabled: Boolean) { _isBypassEnabled.value = isBypassEnabled } - override fun setAuthenticationMethod(authenticationMethod: AuthenticationMethodModel) { - _authenticationMethod.value = authenticationMethod - } - override fun setFailedAuthenticationAttempts(failedAuthenticationAttempts: Int) { _failedAuthenticationAttempts.value = failedAuthenticationAttempts } diff --git a/packages/SystemUI/src/com/android/systemui/authentication/domain/interactor/AuthenticationInteractor.kt b/packages/SystemUI/src/com/android/systemui/authentication/domain/interactor/AuthenticationInteractor.kt index 20e82f70d8f5..15e579d6d72e 100644 --- a/packages/SystemUI/src/com/android/systemui/authentication/domain/interactor/AuthenticationInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/authentication/domain/interactor/AuthenticationInteractor.kt @@ -25,9 +25,8 @@ import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.launch /** Hosts application business logic related to authentication. */ @SysUISingleton @@ -38,12 +37,6 @@ constructor( private val repository: AuthenticationRepository, ) { /** - * The currently-configured authentication method. This determines how the authentication - * challenge is completed in order to unlock an otherwise locked device. - */ - val authenticationMethod: StateFlow<AuthenticationMethodModel> = repository.authenticationMethod - - /** * Whether the device is unlocked. * * A device that is not yet unlocked requires unlocking by completing an authentication @@ -52,20 +45,18 @@ constructor( * Note that this state has no real bearing on whether the lock screen is showing or dismissed. */ val isUnlocked: StateFlow<Boolean> = - combine(authenticationMethod, repository.isUnlocked) { authMethod, isUnlocked -> - isUnlockedWithAuthMethod( - isUnlocked = isUnlocked, - authMethod = authMethod, - ) + repository.isUnlocked + .map { isUnlocked -> + if (getAuthenticationMethod() is AuthenticationMethodModel.None) { + true + } else { + isUnlocked + } } .stateIn( scope = applicationScope, started = SharingStarted.Eagerly, - initialValue = - isUnlockedWithAuthMethod( - isUnlocked = repository.isUnlocked.value, - authMethod = repository.authenticationMethod.value, - ) + initialValue = true, ) /** @@ -82,41 +73,20 @@ constructor( */ val failedAuthenticationAttempts: StateFlow<Int> = repository.failedAuthenticationAttempts - init { - // UNLOCKS WHEN AUTH METHOD REMOVED. - // - // Unlocks the device if the auth method becomes None. - applicationScope.launch { - repository.authenticationMethod.collect { - if (it is AuthenticationMethodModel.None) { - unlockDevice() - } - } - } - } - - /** - * Returns `true` if the device currently requires authentication before content can be viewed; - * `false` if content can be displayed without unlocking first. - */ - fun isAuthenticationRequired(): Boolean { - return !isUnlocked.value && authenticationMethod.value.isSecure - } - /** - * Unlocks the device, assuming that the authentication challenge has been completed - * successfully. + * Returns the currently-configured authentication method. This determines how the + * authentication challenge is completed in order to unlock an otherwise locked device. */ - fun unlockDevice() { - repository.setUnlocked(true) + suspend fun getAuthenticationMethod(): AuthenticationMethodModel { + return repository.getAuthenticationMethod() } /** - * Locks the device. From now on, the device will remain locked until [authenticate] is called - * with the correct input. + * Returns `true` if the device currently requires authentication before content can be viewed; + * `false` if content can be displayed without unlocking first. */ - fun lockDevice() { - repository.setUnlocked(false) + suspend fun isAuthenticationRequired(): Boolean { + return !isUnlocked.value && getAuthenticationMethod().isSecure } /** @@ -133,8 +103,8 @@ constructor( * @return `true` if the authentication succeeded and the device is now unlocked; `false` when * authentication failed, `null` if the check was not performed. */ - fun authenticate(input: List<Any>, tryAutoConfirm: Boolean = false): Boolean? { - val authMethod = this.authenticationMethod.value + suspend fun authenticate(input: List<Any>, tryAutoConfirm: Boolean = false): Boolean? { + val authMethod = getAuthenticationMethod() if (tryAutoConfirm) { if ((authMethod as? AuthenticationMethodModel.Pin)?.autoConfirm != true) { // Do not attempt to authenticate unless the PIN lock is set to auto-confirm. @@ -160,7 +130,6 @@ constructor( if (isSuccessful) { repository.setFailedAuthenticationAttempts(0) - repository.setUnlocked(true) } else { repository.setFailedAuthenticationAttempts( repository.failedAuthenticationAttempts.value + 1 @@ -170,34 +139,12 @@ constructor( return isSuccessful } - /** Triggers a biometric-powered unlock of the device. */ - fun biometricUnlock() { - // TODO(b/280883900): only allow this if the biometric is enabled and there's a match. - repository.setUnlocked(true) - } - - /** See [authenticationMethod]. */ - fun setAuthenticationMethod(authenticationMethod: AuthenticationMethodModel) { - repository.setAuthenticationMethod(authenticationMethod) - } - /** See [isBypassEnabled]. */ fun toggleBypassEnabled() { repository.setBypassEnabled(!repository.isBypassEnabled.value) } companion object { - private fun isUnlockedWithAuthMethod( - isUnlocked: Boolean, - authMethod: AuthenticationMethodModel, - ): Boolean { - return if (authMethod is AuthenticationMethodModel.None) { - true - } else { - isUnlocked - } - } - /** * Returns a PIN code from the given list. It's assumed the given list elements are all * [Int] in the range [0-9]. diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java index 0dc7974475fa..dc9ba8719717 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java @@ -75,6 +75,8 @@ import com.android.systemui.biometrics.udfps.NormalizedTouchData; import com.android.systemui.biometrics.udfps.SinglePointerTouchProcessor; import com.android.systemui.biometrics.udfps.TouchProcessor; import com.android.systemui.biometrics.udfps.TouchProcessorResult; +import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor; +import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.doze.DozeReceiver; @@ -82,9 +84,7 @@ import com.android.systemui.dump.DumpManager; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.Flags; import com.android.systemui.keyguard.ScreenLifecycle; -import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor; import com.android.systemui.keyguard.domain.interactor.KeyguardFaceAuthInteractor; -import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor; import com.android.systemui.log.SessionTracker; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.statusbar.StatusBarStateController; @@ -189,6 +189,8 @@ public class UdfpsController implements DozeReceiver, Dumpable { @Nullable private VelocityTracker mVelocityTracker; // The ID of the pointer for which ACTION_DOWN has occurred. -1 means no pointer is active. private int mActivePointerId = -1; + // Whether a pointer has been pilfered for current gesture + private boolean mPointerPilfered = false; // The timestamp of the most recent touch log. private long mTouchLogTime; // The timestamp of the most recent log of a touch InteractionEvent. @@ -258,10 +260,6 @@ public class UdfpsController implements DozeReceiver, Dumpable { @Override public void showUdfpsOverlay(long requestId, int sensorId, int reason, @NonNull IUdfpsOverlayControllerCallback callback) { - if (mFeatureFlags.isEnabled(Flags.NEW_UDFPS_OVERLAY)) { - return; - } - mFgExecutor.execute(() -> UdfpsController.this.showUdfpsOverlay( new UdfpsControllerOverlay(mContext, mFingerprintManager, mInflater, mWindowManager, mAccessibilityManager, mStatusBarStateController, @@ -279,10 +277,6 @@ public class UdfpsController implements DozeReceiver, Dumpable { @Override public void hideUdfpsOverlay(int sensorId) { - if (mFeatureFlags.isEnabled(Flags.NEW_UDFPS_OVERLAY)) { - return; - } - mFgExecutor.execute(() -> { if (mKeyguardUpdateMonitor.isFingerprintDetectionRunning()) { // if we get here, we expect keyguardUpdateMonitor's fingerprintRunningState @@ -560,6 +554,11 @@ public class UdfpsController implements DozeReceiver, Dumpable { || mPrimaryBouncerInteractor.isInTransit()) { return false; } + if (event.getAction() == MotionEvent.ACTION_DOWN + || event.getAction() == MotionEvent.ACTION_HOVER_ENTER) { + // Reset on ACTION_DOWN, start of new gesture + mPointerPilfered = false; + } final TouchProcessorResult result = mTouchProcessor.processTouch(event, mActivePointerId, mOverlayParams); @@ -633,10 +632,11 @@ public class UdfpsController implements DozeReceiver, Dumpable { shouldPilfer = true; } - // Execute the pilfer - if (shouldPilfer) { + // Pilfer only once per gesture + if (shouldPilfer && !mPointerPilfered) { mInputManager.pilferPointers( mOverlay.getOverlayView().getViewRootImpl().getInputToken()); + mPointerPilfered = true; } return processedTouch.getTouchData().isWithinBounds(mOverlayParams.getNativeSensorBounds()); diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/BouncerInteractor.kt b/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/BouncerInteractor.kt index 256c63515fc8..5dd24b27d19c 100644 --- a/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/BouncerInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/BouncerInteractor.kt @@ -35,6 +35,9 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.flatMapLatest +import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch @@ -68,44 +71,44 @@ constructor( ) ) - /** - * The currently-configured authentication method. This determines how the authentication - * challenge is completed in order to unlock an otherwise locked device. - */ - val authenticationMethod: StateFlow<AuthenticationMethodModel> = - authenticationInteractor.authenticationMethod - /** The current authentication throttling state. If `null`, there's no throttling. */ val throttling: StateFlow<AuthenticationThrottledModel?> = repository.throttling init { + // UNLOCKING SHOWS Gone. + // + // Move to the gone scene if the device becomes unlocked while on the bouncer scene. applicationScope.launch { - combine( - sceneInteractor.currentScene(containerName), - authenticationInteractor.authenticationMethod, - ::Pair, - ) - .collect { (currentScene, authMethod) -> + sceneInteractor + .currentScene(containerName) + .flatMapLatest { currentScene -> if (currentScene.key == SceneKey.Bouncer) { - when (authMethod) { - is AuthenticationMethodModel.None -> - sceneInteractor.setCurrentScene( - containerName, - SceneModel(SceneKey.Gone), - ) - is AuthenticationMethodModel.Swipe -> - sceneInteractor.setCurrentScene( - containerName, - SceneModel(SceneKey.Lockscreen), - ) - else -> Unit - } + authenticationInteractor.isUnlocked + } else { + flowOf(false) + } + } + .distinctUntilChanged() + .collect { isUnlocked -> + if (isUnlocked) { + sceneInteractor.setCurrentScene( + containerName = containerName, + scene = SceneModel(SceneKey.Gone), + ) } } } } /** + * Returns the currently-configured authentication method. This determines how the + * authentication challenge is completed in order to unlock an otherwise locked device. + */ + suspend fun getAuthenticationMethod(): AuthenticationMethodModel { + return authenticationInteractor.getAuthenticationMethod() + } + + /** * Either shows the bouncer or unlocks the device, if the bouncer doesn't need to be shown. * * @param containerName The name of the scene container to show the bouncer in. @@ -115,18 +118,19 @@ constructor( containerName: String, message: String? = null, ) { - if (authenticationInteractor.isAuthenticationRequired()) { - repository.setMessage(message ?: promptMessage(authenticationMethod.value)) - sceneInteractor.setCurrentScene( - containerName = containerName, - scene = SceneModel(SceneKey.Bouncer), - ) - } else { - authenticationInteractor.unlockDevice() - sceneInteractor.setCurrentScene( - containerName = containerName, - scene = SceneModel(SceneKey.Gone), - ) + applicationScope.launch { + if (authenticationInteractor.isAuthenticationRequired()) { + repository.setMessage(message ?: promptMessage(getAuthenticationMethod())) + sceneInteractor.setCurrentScene( + containerName = containerName, + scene = SceneModel(SceneKey.Bouncer), + ) + } else { + sceneInteractor.setCurrentScene( + containerName = containerName, + scene = SceneModel(SceneKey.Gone), + ) + } } } @@ -135,7 +139,7 @@ constructor( * method. */ fun resetMessage() { - repository.setMessage(promptMessage(authenticationMethod.value)) + applicationScope.launch { repository.setMessage(promptMessage(getAuthenticationMethod())) } } /** Removes the user-facing message. */ @@ -160,7 +164,7 @@ constructor( * @return `true` if the authentication succeeded and the device is now unlocked; `false` when * authentication failed, `null` if the check was not performed. */ - fun authenticate( + suspend fun authenticate( input: List<Any>, tryAutoConfirm: Boolean = false, ): Boolean? { @@ -198,7 +202,7 @@ constructor( repository.setThrottling(null) clearMessage() } - else -> repository.setMessage(errorMessage(authenticationMethod.value)) + else -> repository.setMessage(errorMessage(getAuthenticationMethod())) } return isAuthenticated diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/BouncerViewModel.kt b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/BouncerViewModel.kt index 527fe6ec847d..b293ea604636 100644 --- a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/BouncerViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/BouncerViewModel.kt @@ -22,10 +22,13 @@ import com.android.systemui.authentication.shared.model.AuthenticationMethodMode import com.android.systemui.bouncer.domain.interactor.BouncerInteractor import com.android.systemui.bouncer.shared.model.AuthenticationThrottledModel import com.android.systemui.dagger.qualifiers.Application +import com.android.systemui.util.kotlin.pairwise import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.channels.BufferOverflow +import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow @@ -66,6 +69,7 @@ constructor( private val password: PasswordBouncerViewModel by lazy { PasswordBouncerViewModel( + applicationScope = applicationScope, interactor = interactor, isInputEnabled = isInputEnabled, ) @@ -81,14 +85,30 @@ constructor( } /** View-model for the current UI, based on the current authentication method. */ + private val _authMethod = + MutableSharedFlow<AuthMethodBouncerViewModel?>( + replay = 1, + onBufferOverflow = BufferOverflow.DROP_OLDEST, + ) val authMethod: StateFlow<AuthMethodBouncerViewModel?> = - interactor.authenticationMethod - .map { authMethod -> toViewModel(authMethod) } - .stateIn( - scope = applicationScope, - started = SharingStarted.WhileSubscribed(), - initialValue = toViewModel(interactor.authenticationMethod.value), - ) + _authMethod.stateIn( + scope = applicationScope, + started = SharingStarted.WhileSubscribed(), + initialValue = null, + ) + + init { + applicationScope.launch { + _authMethod.subscriptionCount + .pairwise() + .map { (previousCount, currentCount) -> currentCount > previousCount } + .collect { subscriberAdded -> + if (subscriberAdded) { + reloadAuthMethod() + } + } + } + } /** The user-facing message to show in the bouncer. */ val message: StateFlow<MessageViewModel> = @@ -125,7 +145,7 @@ constructor( interactor.throttling .map { model -> model?.let { - when (interactor.authenticationMethod.value) { + when (interactor.getAuthenticationMethod()) { is AuthenticationMethodModel.Pin -> R.string.kg_too_many_failed_pin_attempts_dialog_message is AuthenticationMethodModel.Password -> @@ -161,17 +181,6 @@ constructor( _throttlingDialogMessage.value = null } - private fun toViewModel( - authMethod: AuthenticationMethodModel, - ): AuthMethodBouncerViewModel? { - return when (authMethod) { - is AuthenticationMethodModel.Pin -> pin - is AuthenticationMethodModel.Password -> password - is AuthenticationMethodModel.Pattern -> pattern - else -> null - } - } - private fun toMessageViewModel( message: String?, throttling: AuthenticationThrottledModel?, @@ -182,6 +191,17 @@ constructor( ) } + private suspend fun reloadAuthMethod() { + _authMethod.tryEmit( + when (interactor.getAuthenticationMethod()) { + is AuthenticationMethodModel.Pin -> pin + is AuthenticationMethodModel.Password -> password + is AuthenticationMethodModel.Pattern -> pattern + else -> null + } + ) + } + data class MessageViewModel( val text: String, diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PasswordBouncerViewModel.kt b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PasswordBouncerViewModel.kt index 0146e406703c..ca15f4e063a9 100644 --- a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PasswordBouncerViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PasswordBouncerViewModel.kt @@ -17,12 +17,15 @@ package com.android.systemui.bouncer.ui.viewmodel import com.android.systemui.bouncer.domain.interactor.BouncerInteractor +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch /** Holds UI state and handles user input for the password bouncer UI. */ class PasswordBouncerViewModel( + private val applicationScope: CoroutineScope, private val interactor: BouncerInteractor, isInputEnabled: StateFlow<Boolean>, ) : @@ -50,10 +53,13 @@ class PasswordBouncerViewModel( /** Notifies that the user has pressed the key for attempting to authenticate the password. */ fun onAuthenticateKeyPressed() { - if (interactor.authenticate(password.value.toCharArray().toList()) != true) { - showFailureAnimation() - } - + val password = _password.value.toCharArray().toList() _password.value = "" + + applicationScope.launch { + if (interactor.authenticate(password) != true) { + showFailureAnimation() + } + } } } diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PatternBouncerViewModel.kt b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PatternBouncerViewModel.kt index 700703ee3560..5efa6f073f7a 100644 --- a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PatternBouncerViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PatternBouncerViewModel.kt @@ -29,13 +29,15 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.launch /** Holds UI state and handles user input for the pattern bouncer UI. */ class PatternBouncerViewModel( private val applicationContext: Context, - applicationScope: CoroutineScope, + private val applicationScope: CoroutineScope, private val interactor: BouncerInteractor, isInputEnabled: StateFlow<Boolean>, ) : @@ -69,12 +71,17 @@ class PatternBouncerViewModel( /** Whether the pattern itself should be rendered visibly. */ val isPatternVisible: StateFlow<Boolean> = - interactor.authenticationMethod - .map { authMethod -> isPatternVisible(authMethod) } + flow { + emit(null) + emit(interactor.getAuthenticationMethod()) + } + .map { authMethod -> + (authMethod as? AuthenticationMethodModel.Pattern)?.isPatternVisible ?: false + } .stateIn( scope = applicationScope, started = SharingStarted.Eagerly, - initialValue = isPatternVisible(interactor.authenticationMethod.value), + initialValue = false, ) /** Notifies that the UI has been shown to the user. */ @@ -154,17 +161,15 @@ class PatternBouncerViewModel( /** Notifies that the user has ended the drag gesture across the dot grid. */ fun onDragEnd() { val pattern = _selectedDots.value.map { it.toCoordinate() } - if (interactor.authenticate(pattern) != true) { - showFailureAnimation() - } - _dots.value = defaultDots() _currentDot.value = null _selectedDots.value = linkedSetOf() - } - private fun isPatternVisible(authMethodModel: AuthenticationMethodModel): Boolean { - return (authMethodModel as? AuthenticationMethodModel.Pattern)?.isPatternVisible ?: false + applicationScope.launch { + if (interactor.authenticate(pattern) != true) { + showFailureAnimation() + } + } } private fun defaultDots(): List<PatternDotViewModel> { diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PinBouncerViewModel.kt b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PinBouncerViewModel.kt index 1944c74f1d6a..014ebc321d46 100644 --- a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PinBouncerViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PinBouncerViewModel.kt @@ -22,13 +22,14 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.launch /** Holds UI state and handles user input for the PIN code bouncer UI. */ class PinBouncerViewModel( - applicationScope: CoroutineScope, + private val applicationScope: CoroutineScope, private val interactor: BouncerInteractor, isInputEnabled: StateFlow<Boolean>, ) : @@ -39,40 +40,45 @@ class PinBouncerViewModel( private val mutablePinEntries = MutableStateFlow<List<EnteredKey>>(emptyList()) val pinEntries: StateFlow<List<EnteredKey>> = mutablePinEntries - /** The length of the hinted PIN, or null if pin length hint should not be shown. */ + /** The length of the hinted PIN, or `null` if pin length hint should not be shown. */ val hintedPinLength: StateFlow<Int?> = - interactor.authenticationMethod - .map { authMethod -> computeHintedPinLength(authMethod) } + flow { emit(interactor.getAuthenticationMethod()) } + .map { authMethod -> + // Hinting is enabled for 6-digit codes only + autoConfirmPinLength(authMethod).takeIf { it == HINTING_PASSCODE_LENGTH } + } .stateIn( scope = applicationScope, started = SharingStarted.Eagerly, - initialValue = computeHintedPinLength(interactor.authenticationMethod.value), + initialValue = null, ) /** Appearance of the backspace button. */ val backspaceButtonAppearance: StateFlow<ActionButtonAppearance> = - combine(interactor.authenticationMethod, mutablePinEntries) { authMethod, enteredPin -> - computeBackspaceButtonAppearance(authMethod, enteredPin) + mutablePinEntries + .map { mutablePinEntries -> + computeBackspaceButtonAppearance( + interactor.getAuthenticationMethod(), + mutablePinEntries + ) } .stateIn( scope = applicationScope, started = SharingStarted.Eagerly, - initialValue = - computeBackspaceButtonAppearance( - interactor.authenticationMethod.value, - mutablePinEntries.value - ), + initialValue = ActionButtonAppearance.Hidden, ) /** Appearance of the confirm button. */ val confirmButtonAppearance: StateFlow<ActionButtonAppearance> = - interactor.authenticationMethod + flow { + emit(null) + emit(interactor.getAuthenticationMethod()) + } .map { authMethod -> computeConfirmButtonAppearance(authMethod) } .stateIn( scope = applicationScope, started = SharingStarted.Eagerly, - initialValue = - computeConfirmButtonAppearance(interactor.authenticationMethod.value), + initialValue = ActionButtonAppearance.Hidden, ) /** Notifies that the UI has been shown to the user. */ @@ -111,30 +117,28 @@ class PinBouncerViewModel( private fun tryAuthenticate(useAutoConfirm: Boolean) { val pinCode = mutablePinEntries.value.map { it.input } - val isSuccess = interactor.authenticate(pinCode, useAutoConfirm) ?: return - if (!isSuccess) { - showFailureAnimation() - } + applicationScope.launch { + val isSuccess = interactor.authenticate(pinCode, useAutoConfirm) ?: return@launch - mutablePinEntries.value = emptyList() + if (!isSuccess) { + showFailureAnimation() + } + + mutablePinEntries.value = emptyList() + } } - private fun isAutoConfirmEnabled(authMethodModel: AuthenticationMethodModel): Boolean { + private fun isAutoConfirmEnabled(authMethodModel: AuthenticationMethodModel?): Boolean { return (authMethodModel as? AuthenticationMethodModel.Pin)?.autoConfirm == true } - private fun autoConfirmPinLength(authMethodModel: AuthenticationMethodModel): Int? { + private fun autoConfirmPinLength(authMethodModel: AuthenticationMethodModel?): Int? { if (!isAutoConfirmEnabled(authMethodModel)) return null return (authMethodModel as? AuthenticationMethodModel.Pin)?.code?.size } - private fun computeHintedPinLength(authMethodModel: AuthenticationMethodModel): Int? { - // Hinting is enabled for 6-digit codes only - return autoConfirmPinLength(authMethodModel).takeIf { it == HINTING_PASSCODE_LENGTH } - } - private fun computeBackspaceButtonAppearance( authMethodModel: AuthenticationMethodModel, enteredPin: List<EnteredKey> @@ -149,7 +153,7 @@ class PinBouncerViewModel( } } private fun computeConfirmButtonAppearance( - authMethodModel: AuthenticationMethodModel + authMethodModel: AuthenticationMethodModel? ): ActionButtonAppearance { return if (isAutoConfirmEnabled(authMethodModel)) { ActionButtonAppearance.Hidden diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java index 9ab9e7a76a25..8f3c3d6e1dd5 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java @@ -47,6 +47,7 @@ import com.android.systemui.controls.dagger.ControlsModule; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dagger.qualifiers.SystemUser; import com.android.systemui.demomode.dagger.DemoModeModule; +import com.android.systemui.display.DisplayModule; import com.android.systemui.doze.dagger.DozeComponent; import com.android.systemui.dreams.dagger.DreamModule; import com.android.systemui.dump.DumpManager; @@ -163,6 +164,7 @@ import javax.inject.Named; ClipboardOverlayModule.class, ClockRegistryModule.class, CommonRepositoryModule.class, + DisplayModule.class, ConnectivityModule.class, CoroutinesModule.class, DreamModule.class, diff --git a/packages/SystemUI/src/com/android/systemui/display/DisplayModule.kt b/packages/SystemUI/src/com/android/systemui/display/DisplayModule.kt new file mode 100644 index 000000000000..65cd84bc4da1 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/display/DisplayModule.kt @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.display + +import com.android.systemui.display.data.repository.DisplayRepository +import com.android.systemui.display.data.repository.DisplayRepositoryImpl +import com.android.systemui.display.domain.interactor.ConnectedDisplayInteractor +import com.android.systemui.display.domain.interactor.ConnectedDisplayInteractorImpl +import dagger.Binds +import dagger.Module + +/** Module binding display related classes. */ +@Module +interface DisplayModule { + @Binds + fun bindConnectedDisplayInteractor( + provider: ConnectedDisplayInteractorImpl + ): ConnectedDisplayInteractor + + @Binds fun bindsDisplayRepository(displayRepository: DisplayRepositoryImpl): DisplayRepository +} diff --git a/packages/SystemUI/src/com/android/systemui/display/data/repository/DisplayMetricsRepository.kt b/packages/SystemUI/src/com/android/systemui/display/data/repository/DisplayMetricsRepository.kt new file mode 100644 index 000000000000..c962e5155697 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/display/data/repository/DisplayMetricsRepository.kt @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.display.data.repository + +import android.content.Context +import android.content.res.Configuration +import android.util.DisplayMetrics +import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.dagger.qualifiers.Application +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel +import com.android.systemui.log.dagger.DisplayMetricsRepoLog +import com.android.systemui.statusbar.policy.ConfigurationController +import javax.inject.Inject +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.channels.awaitClose +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.flow.stateIn + +/** Repository tracking display-related metrics like display height and width. */ +@SysUISingleton +class DisplayMetricsRepository +@Inject +constructor( + @Application scope: CoroutineScope, + configurationController: ConfigurationController, + displayMetricsHolder: DisplayMetrics, + context: Context, + @DisplayMetricsRepoLog logBuffer: LogBuffer, +) { + + private val displayMetrics: StateFlow<DisplayMetrics> = + conflatedCallbackFlow { + val callback = + object : ConfigurationController.ConfigurationListener { + override fun onConfigChanged(newConfig: Configuration?) { + context.display.getMetrics(displayMetricsHolder) + trySend(displayMetricsHolder) + } + } + configurationController.addCallback(callback) + awaitClose { configurationController.removeCallback(callback) } + } + .onEach { + logBuffer.log( + "DisplayMetrics", + LogLevel.INFO, + { str1 = it.toString() }, + { "New metrics: $str1" }, + ) + } + .stateIn(scope, SharingStarted.Eagerly, displayMetricsHolder) + + /** Returns the current display height in pixels. */ + val heightPixels: Int + get() = displayMetrics.value.heightPixels +} diff --git a/packages/SystemUI/src/com/android/systemui/display/data/repository/DisplayRepository.kt b/packages/SystemUI/src/com/android/systemui/display/data/repository/DisplayRepository.kt new file mode 100644 index 000000000000..b18f7bfe7acc --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/display/data/repository/DisplayRepository.kt @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.display.data.repository + +import android.hardware.display.DisplayManager +import android.hardware.display.DisplayManager.DisplayListener +import android.hardware.display.DisplayManager.EVENT_FLAG_DISPLAY_ADDED +import android.hardware.display.DisplayManager.EVENT_FLAG_DISPLAY_CHANGED +import android.hardware.display.DisplayManager.EVENT_FLAG_DISPLAY_REMOVED +import android.os.Handler +import android.view.Display +import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.dagger.qualifiers.Application +import com.android.systemui.dagger.qualifiers.Background +import com.android.systemui.util.traceSection +import javax.inject.Inject +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.channels.awaitClose +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.flowOn +import kotlinx.coroutines.flow.stateIn + +/** Provides a [Flow] of [Display] as returned by [DisplayManager]. */ +interface DisplayRepository { + /** Provides a nullable set of displays. */ + val displays: Flow<Set<Display>> +} + +@SysUISingleton +class DisplayRepositoryImpl +@Inject +constructor( + private val displayManager: DisplayManager, + @Background backgroundHandler: Handler, + @Application applicationScope: CoroutineScope, + @Background backgroundCoroutineDispatcher: CoroutineDispatcher +) : DisplayRepository { + + override val displays: Flow<Set<Display>> = + conflatedCallbackFlow { + val callback = + object : DisplayListener { + override fun onDisplayAdded(displayId: Int) { + trySend(getDisplays()) + } + + override fun onDisplayRemoved(displayId: Int) { + trySend(getDisplays()) + } + + override fun onDisplayChanged(displayId: Int) { + trySend(getDisplays()) + } + } + displayManager.registerDisplayListener( + callback, + backgroundHandler, + EVENT_FLAG_DISPLAY_ADDED or + EVENT_FLAG_DISPLAY_CHANGED or + EVENT_FLAG_DISPLAY_REMOVED, + ) + awaitClose { displayManager.unregisterDisplayListener(callback) } + } + .flowOn(backgroundCoroutineDispatcher) + .stateIn( + applicationScope, + started = SharingStarted.WhileSubscribed(), + initialValue = getDisplays() + ) + + fun getDisplays(): Set<Display> = + traceSection("DisplayRepository#getDisplays()") { + displayManager.displays?.toSet() ?: emptySet() + } +} diff --git a/packages/SystemUI/src/com/android/systemui/display/domain/interactor/ConnectedDisplayInteractor.kt b/packages/SystemUI/src/com/android/systemui/display/domain/interactor/ConnectedDisplayInteractor.kt new file mode 100644 index 000000000000..4b957c7f435c --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/display/domain/interactor/ConnectedDisplayInteractor.kt @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.display.domain.interactor + +import android.view.Display +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.display.data.repository.DisplayRepository +import com.android.systemui.display.domain.interactor.ConnectedDisplayInteractor.State +import javax.inject.Inject +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.map + +/** Provides information about an external connected display. */ +interface ConnectedDisplayInteractor { + /** + * Provides the current external display state. + * + * The state is: + * - [State.CONNECTED] when there is at least one display with [TYPE_EXTERNAL]. + * - [State.CONNECTED_SECURE] when is at least one display with both [TYPE_EXTERNAL] AND + * [Display.FLAG_SECURE] set + */ + val connectedDisplayState: Flow<State> + + /** Possible connected display state. */ + enum class State { + DISCONNECTED, + CONNECTED, + CONNECTED_SECURE, + } +} + +@SysUISingleton +class ConnectedDisplayInteractorImpl +@Inject +constructor( + displayRepository: DisplayRepository, +) : ConnectedDisplayInteractor { + + override val connectedDisplayState: Flow<State> = + displayRepository.displays + .map { displays -> + val externalDisplays = + displays.filter { display -> display.type == Display.TYPE_EXTERNAL } + + val secureExternalDisplays = + externalDisplays.filter { it.flags and Display.FLAG_SECURE != 0 } + + if (externalDisplays.isEmpty()) { + State.DISCONNECTED + } else if (!secureExternalDisplays.isEmpty()) { + State.CONNECTED_SECURE + } else { + State.CONNECTED + } + } + .distinctUntilChanged() +} diff --git a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt index b50c6dea4a22..db5f5465d56d 100644 --- a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt +++ b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt @@ -151,12 +151,6 @@ object Flags { // TODO(b/255607168): Tracking Bug @JvmField val DOZING_MIGRATION_1 = unreleasedFlag(213, "dozing_migration_1") - // TODO(b/252897742): Tracking Bug - @JvmField val NEW_ELLIPSE_DETECTION = unreleasedFlag(214, "new_ellipse_detection") - - // TODO(b/252897742): Tracking Bug - @JvmField val NEW_UDFPS_OVERLAY = unreleasedFlag(215, "new_udfps_overlay") - /** * Whether to enable the code powering customizable lock screen quick affordances. * @@ -314,7 +308,7 @@ object Flags { ) @JvmField - val QS_PIPELINE_NEW_HOST = unreleasedFlag(504, "qs_pipeline_new_host", teamfood = true) + val QS_PIPELINE_NEW_HOST = releasedFlag(504, "qs_pipeline_new_host") // TODO(b/278068252): Tracking Bug @JvmField @@ -730,6 +724,11 @@ object Flags { val SPLIT_SHADE_SUBPIXEL_OPTIMIZATION = releasedFlag(2805, "split_shade_subpixel_optimization") + // TODO(b/288868056): Tracking Bug + @JvmField + val PARTIAL_SCREEN_SHARING_TASK_SWITCHER = + unreleasedFlag(288868056, "pss_task_switcher") + // TODO(b/278761837): Tracking Bug @JvmField val USE_NEW_ACTIVITY_STARTER = releasedFlag(2801, name = "use_new_activity_starter") diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index c629ebf9496f..155e0231e9d2 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -835,6 +835,11 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, } @Override + public void onBouncerSwipeDown() { + mKeyguardViewControllerLazy.get().reset(/* hideBouncerWhenShowing= */ true); + } + + @Override public void playTrustedSound() { KeyguardViewMediator.this.playTrustedSound(); } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt index 81f62b687e6c..edc0b45d27f2 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt @@ -302,7 +302,15 @@ constructor( trySendWithFailureLogging( keyguardStateController.isUnlocked, TAG, - "updated isKeyguardUnlocked" + "updated isKeyguardUnlocked due to onUnlockedChanged" + ) + } + + override fun onKeyguardShowingChanged() { + trySendWithFailureLogging( + keyguardStateController.isUnlocked, + TAG, + "updated isKeyguardUnlocked due to onKeyguardShowingChanged" ) } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractor.kt index 38eaccee7284..8f0b91b6d864 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractor.kt @@ -22,7 +22,6 @@ import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository import com.android.systemui.keyguard.shared.model.KeyguardState -import com.android.systemui.keyguard.shared.model.TransitionInfo import com.android.systemui.keyguard.shared.model.WakefulnessState import com.android.systemui.util.kotlin.Utils.Companion.toQuad import com.android.systemui.util.kotlin.Utils.Companion.toQuint @@ -38,11 +37,14 @@ import kotlinx.coroutines.launch class FromAlternateBouncerTransitionInteractor @Inject constructor( + override val transitionRepository: KeyguardTransitionRepository, + override val transitionInteractor: KeyguardTransitionInteractor, @Application private val scope: CoroutineScope, private val keyguardInteractor: KeyguardInteractor, - private val keyguardTransitionRepository: KeyguardTransitionRepository, - private val keyguardTransitionInteractor: KeyguardTransitionInteractor, -) : TransitionInteractor(FromAlternateBouncerTransitionInteractor::class.simpleName!!) { +) : + TransitionInteractor( + fromState = KeyguardState.ALTERNATE_BOUNCER, + ) { override fun start() { listenForAlternateBouncerToGone() @@ -60,7 +62,7 @@ constructor( .sample( combine( keyguardInteractor.primaryBouncerShowing, - keyguardTransitionInteractor.startedKeyguardTransitionStep, + transitionInteractor.startedKeyguardTransitionStep, keyguardInteractor.wakefulnessModel, keyguardInteractor.isAodAvailable, ::toQuad @@ -92,14 +94,7 @@ constructor( } else { KeyguardState.LOCKSCREEN } - keyguardTransitionRepository.startTransition( - TransitionInfo( - ownerName = name, - from = KeyguardState.ALTERNATE_BOUNCER, - to = to, - animator = getAnimator(), - ) - ) + startTransitionTo(to) } } } @@ -108,17 +103,10 @@ constructor( private fun listenForAlternateBouncerToGone() { scope.launch { keyguardInteractor.isKeyguardGoingAway - .sample(keyguardTransitionInteractor.finishedKeyguardState, ::Pair) + .sample(transitionInteractor.finishedKeyguardState, ::Pair) .collect { (isKeyguardGoingAway, keyguardState) -> if (isKeyguardGoingAway && keyguardState == KeyguardState.ALTERNATE_BOUNCER) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - ownerName = name, - from = KeyguardState.ALTERNATE_BOUNCER, - to = KeyguardState.GONE, - animator = getAnimator(), - ) - ) + startTransitionTo(KeyguardState.GONE) } } } @@ -127,26 +115,19 @@ constructor( private fun listenForAlternateBouncerToPrimaryBouncer() { scope.launch { keyguardInteractor.primaryBouncerShowing - .sample(keyguardTransitionInteractor.startedKeyguardTransitionStep, ::Pair) + .sample(transitionInteractor.startedKeyguardTransitionStep, ::Pair) .collect { (isPrimaryBouncerShowing, startedKeyguardState) -> if ( isPrimaryBouncerShowing && startedKeyguardState.to == KeyguardState.ALTERNATE_BOUNCER ) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - ownerName = name, - from = KeyguardState.ALTERNATE_BOUNCER, - to = KeyguardState.PRIMARY_BOUNCER, - animator = getAnimator(), - ) - ) + startTransitionTo(KeyguardState.PRIMARY_BOUNCER) } } } } - private fun getAnimator(): ValueAnimator { + override fun getDefaultAnimatorForTransitionsToState(toState: KeyguardState): ValueAnimator { return ValueAnimator().apply { interpolator = Interpolators.LINEAR duration = TRANSITION_DURATION_MS diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractor.kt index 7e9cbc1a9772..2085c877064d 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractor.kt @@ -24,7 +24,6 @@ import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepositor import com.android.systemui.keyguard.shared.model.BiometricUnlockModel.Companion.isWakeAndUnlock import com.android.systemui.keyguard.shared.model.DozeStateModel import com.android.systemui.keyguard.shared.model.KeyguardState -import com.android.systemui.keyguard.shared.model.TransitionInfo import com.android.systemui.util.kotlin.sample import javax.inject.Inject import kotlinx.coroutines.CoroutineScope @@ -34,11 +33,14 @@ import kotlinx.coroutines.launch class FromAodTransitionInteractor @Inject constructor( + override val transitionRepository: KeyguardTransitionRepository, + override val transitionInteractor: KeyguardTransitionInteractor, @Application private val scope: CoroutineScope, private val keyguardInteractor: KeyguardInteractor, - private val keyguardTransitionRepository: KeyguardTransitionRepository, - private val keyguardTransitionInteractor: KeyguardTransitionInteractor, -) : TransitionInteractor(FromAodTransitionInteractor::class.simpleName!!) { +) : + TransitionInteractor( + fromState = KeyguardState.AOD, + ) { override fun start() { listenForAodToLockscreen() @@ -49,18 +51,11 @@ constructor( scope.launch { keyguardInteractor .dozeTransitionTo(DozeStateModel.FINISH) - .sample(keyguardTransitionInteractor.startedKeyguardTransitionStep, ::Pair) + .sample(transitionInteractor.startedKeyguardTransitionStep, ::Pair) .collect { pair -> val (dozeToAod, lastStartedStep) = pair if (lastStartedStep.to == KeyguardState.AOD) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - name, - KeyguardState.AOD, - KeyguardState.LOCKSCREEN, - getAnimator(), - ) - ) + startTransitionTo(KeyguardState.LOCKSCREEN) } } } @@ -69,29 +64,22 @@ constructor( private fun listenForAodToGone() { scope.launch { keyguardInteractor.biometricUnlockState - .sample(keyguardTransitionInteractor.finishedKeyguardState, ::Pair) + .sample(transitionInteractor.finishedKeyguardState, ::Pair) .collect { pair -> val (biometricUnlockState, keyguardState) = pair if ( keyguardState == KeyguardState.AOD && isWakeAndUnlock(biometricUnlockState) ) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - name, - KeyguardState.AOD, - KeyguardState.GONE, - getAnimator(), - ) - ) + startTransitionTo(KeyguardState.GONE) } } } } - private fun getAnimator(): ValueAnimator { + override fun getDefaultAnimatorForTransitionsToState(toState: KeyguardState): ValueAnimator { return ValueAnimator().apply { - setInterpolator(Interpolators.LINEAR) - setDuration(TRANSITION_DURATION_MS) + interpolator = Interpolators.LINEAR + duration = TRANSITION_DURATION_MS } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractor.kt index ee2c2df41624..c867c43b1646 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractor.kt @@ -23,10 +23,8 @@ import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository import com.android.systemui.keyguard.shared.model.BiometricUnlockModel.Companion.isWakeAndUnlock import com.android.systemui.keyguard.shared.model.KeyguardState -import com.android.systemui.keyguard.shared.model.TransitionInfo import com.android.systemui.util.kotlin.sample import javax.inject.Inject -import kotlin.time.Duration import kotlin.time.Duration.Companion.milliseconds import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch @@ -35,11 +33,14 @@ import kotlinx.coroutines.launch class FromDozingTransitionInteractor @Inject constructor( + override val transitionRepository: KeyguardTransitionRepository, + override val transitionInteractor: KeyguardTransitionInteractor, @Application private val scope: CoroutineScope, private val keyguardInteractor: KeyguardInteractor, - private val keyguardTransitionRepository: KeyguardTransitionRepository, - private val keyguardTransitionInteractor: KeyguardTransitionInteractor, -) : TransitionInteractor(FromDozingTransitionInteractor::class.simpleName!!) { +) : + TransitionInteractor( + fromState = KeyguardState.DOZING, + ) { override fun start() { listenForDozingToLockscreen() @@ -49,20 +50,13 @@ constructor( private fun listenForDozingToLockscreen() { scope.launch { keyguardInteractor.wakefulnessModel - .sample(keyguardTransitionInteractor.startedKeyguardTransitionStep, ::Pair) + .sample(transitionInteractor.startedKeyguardTransitionStep, ::Pair) .collect { (wakefulnessModel, lastStartedTransition) -> if ( wakefulnessModel.isStartingToWakeOrAwake() && lastStartedTransition.to == KeyguardState.DOZING ) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - name, - KeyguardState.DOZING, - KeyguardState.LOCKSCREEN, - getAnimator(), - ) - ) + startTransitionTo(KeyguardState.LOCKSCREEN) } } } @@ -71,29 +65,22 @@ constructor( private fun listenForDozingToGone() { scope.launch { keyguardInteractor.biometricUnlockState - .sample(keyguardTransitionInteractor.startedKeyguardTransitionStep, ::Pair) + .sample(transitionInteractor.startedKeyguardTransitionStep, ::Pair) .collect { (biometricUnlockState, lastStartedTransition) -> if ( lastStartedTransition.to == KeyguardState.DOZING && isWakeAndUnlock(biometricUnlockState) ) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - name, - KeyguardState.DOZING, - KeyguardState.GONE, - getAnimator(), - ) - ) + startTransitionTo(KeyguardState.GONE) } } } } - private fun getAnimator(duration: Duration = DEFAULT_DURATION): ValueAnimator { + override fun getDefaultAnimatorForTransitionsToState(toState: KeyguardState): ValueAnimator { return ValueAnimator().apply { - setInterpolator(Interpolators.LINEAR) - setDuration(duration.inWholeMilliseconds) + interpolator = Interpolators.LINEAR + duration = DEFAULT_DURATION.inWholeMilliseconds } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractor.kt index ccf4bc1588f6..98d7434166b4 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractor.kt @@ -24,11 +24,9 @@ import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepositor import com.android.systemui.keyguard.shared.model.BiometricUnlockModel import com.android.systemui.keyguard.shared.model.DozeStateModel import com.android.systemui.keyguard.shared.model.KeyguardState -import com.android.systemui.keyguard.shared.model.TransitionInfo import com.android.systemui.util.kotlin.Utils.Companion.toTriple import com.android.systemui.util.kotlin.sample import javax.inject.Inject -import kotlin.time.Duration import kotlin.time.Duration.Companion.milliseconds import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.delay @@ -40,11 +38,14 @@ import kotlinx.coroutines.launch class FromDreamingTransitionInteractor @Inject constructor( + override val transitionRepository: KeyguardTransitionRepository, + override val transitionInteractor: KeyguardTransitionInteractor, @Application private val scope: CoroutineScope, private val keyguardInteractor: KeyguardInteractor, - private val keyguardTransitionRepository: KeyguardTransitionRepository, - private val keyguardTransitionInteractor: KeyguardTransitionInteractor, -) : TransitionInteractor(FromDreamingTransitionInteractor::class.simpleName!!) { +) : + TransitionInteractor( + fromState = KeyguardState.DREAMING, + ) { override fun start() { listenForDreamingToOccluded() @@ -54,15 +55,8 @@ constructor( fun startToLockscreenTransition() { scope.launch { - if (keyguardTransitionInteractor.startedKeyguardState.value == KeyguardState.DREAMING) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - name, - KeyguardState.DREAMING, - KeyguardState.LOCKSCREEN, - getAnimator(TO_LOCKSCREEN_DURATION), - ) - ) + if (transitionInteractor.startedKeyguardState.value == KeyguardState.DREAMING) { + startTransitionTo(KeyguardState.LOCKSCREEN) } } } @@ -76,7 +70,7 @@ constructor( .sample( combine( keyguardInteractor.isKeyguardOccluded, - keyguardTransitionInteractor.startedKeyguardTransitionStep, + transitionInteractor.startedKeyguardTransitionStep, ::Pair, ), ::toTriple @@ -92,14 +86,7 @@ constructor( // action. There's no great signal to determine when the dream is ending // and a transition to OCCLUDED is beginning directly. For now, the solution // is DREAMING->LOCKSCREEN->OCCLUDED - keyguardTransitionRepository.startTransition( - TransitionInfo( - name, - lastStartedTransition.to, - KeyguardState.OCCLUDED, - getAnimator(), - ) - ) + startTransitionTo(KeyguardState.OCCLUDED) } } } @@ -109,14 +96,7 @@ constructor( scope.launch { keyguardInteractor.biometricUnlockState.collect { biometricUnlockState -> if (biometricUnlockState == BiometricUnlockModel.WAKE_AND_UNLOCK_FROM_DREAM) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - name, - KeyguardState.DREAMING, - KeyguardState.GONE, - getAnimator(), - ) - ) + startTransitionTo(KeyguardState.GONE) } } } @@ -126,7 +106,7 @@ constructor( scope.launch { combine( keyguardInteractor.dozeTransitionModel, - keyguardTransitionInteractor.finishedKeyguardState, + transitionInteractor.finishedKeyguardState, ::Pair ) .collect { (dozeTransitionModel, keyguardState) -> @@ -134,23 +114,18 @@ constructor( dozeTransitionModel.to == DozeStateModel.DOZE && keyguardState == KeyguardState.DREAMING ) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - name, - KeyguardState.DREAMING, - KeyguardState.DOZING, - getAnimator(), - ) - ) + startTransitionTo(KeyguardState.DOZING) } } } } - private fun getAnimator(duration: Duration = DEFAULT_DURATION): ValueAnimator { + override fun getDefaultAnimatorForTransitionsToState(toState: KeyguardState): ValueAnimator { return ValueAnimator().apply { - setInterpolator(Interpolators.LINEAR) - setDuration(duration.inWholeMilliseconds) + interpolator = Interpolators.LINEAR + duration = + if (toState == KeyguardState.LOCKSCREEN) TO_LOCKSCREEN_DURATION.inWholeMilliseconds + else DEFAULT_DURATION.inWholeMilliseconds } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractor.kt index cfcb65471d8b..f82633fbba27 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractor.kt @@ -22,12 +22,10 @@ import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository import com.android.systemui.keyguard.shared.model.KeyguardState -import com.android.systemui.keyguard.shared.model.TransitionInfo import com.android.systemui.keyguard.shared.model.WakefulnessState import com.android.systemui.util.kotlin.Utils.Companion.toTriple import com.android.systemui.util.kotlin.sample import javax.inject.Inject -import kotlin.time.Duration import kotlin.time.Duration.Companion.milliseconds import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.combine @@ -37,11 +35,14 @@ import kotlinx.coroutines.launch class FromGoneTransitionInteractor @Inject constructor( + override val transitionRepository: KeyguardTransitionRepository, + override val transitionInteractor: KeyguardTransitionInteractor, @Application private val scope: CoroutineScope, private val keyguardInteractor: KeyguardInteractor, - private val keyguardTransitionRepository: KeyguardTransitionRepository, - private val keyguardTransitionInteractor: KeyguardTransitionInteractor, -) : TransitionInteractor(FromGoneTransitionInteractor::class.simpleName!!) { +) : + TransitionInteractor( + fromState = KeyguardState.GONE, + ) { override fun start() { listenForGoneToAodOrDozing() @@ -53,17 +54,10 @@ constructor( private fun listenForGoneToLockscreen() { scope.launch { keyguardInteractor.isKeyguardShowing - .sample(keyguardTransitionInteractor.startedKeyguardTransitionStep, ::Pair) + .sample(transitionInteractor.startedKeyguardTransitionStep, ::Pair) .collect { (isKeyguardShowing, lastStartedStep) -> if (isKeyguardShowing && lastStartedStep.to == KeyguardState.GONE) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - name, - KeyguardState.GONE, - KeyguardState.LOCKSCREEN, - getAnimator(), - ) - ) + startTransitionTo(KeyguardState.LOCKSCREEN) } } } @@ -72,17 +66,10 @@ constructor( private fun listenForGoneToDreaming() { scope.launch { keyguardInteractor.isAbleToDream - .sample(keyguardTransitionInteractor.startedKeyguardTransitionStep, ::Pair) + .sample(transitionInteractor.startedKeyguardTransitionStep, ::Pair) .collect { (isAbleToDream, lastStartedStep) -> if (isAbleToDream && lastStartedStep.to == KeyguardState.GONE) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - name, - KeyguardState.GONE, - KeyguardState.DREAMING, - getAnimator(TO_DREAMING_DURATION), - ) - ) + startTransitionTo(KeyguardState.DREAMING) } } } @@ -93,7 +80,7 @@ constructor( keyguardInteractor.wakefulnessModel .sample( combine( - keyguardTransitionInteractor.startedKeyguardTransitionStep, + transitionInteractor.startedKeyguardTransitionStep, keyguardInteractor.isAodAvailable, ::Pair ), @@ -104,30 +91,24 @@ constructor( lastStartedStep.to == KeyguardState.GONE && wakefulnessState.state == WakefulnessState.STARTING_TO_SLEEP ) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - name, - KeyguardState.GONE, - if (isAodAvailable) { - KeyguardState.AOD - } else { - KeyguardState.DOZING - }, - getAnimator(), - ) + startTransitionTo( + if (isAodAvailable) KeyguardState.AOD else KeyguardState.DOZING ) } } } } - private fun getAnimator(duration: Duration = DEFAULT_DURATION): ValueAnimator { + override fun getDefaultAnimatorForTransitionsToState(toState: KeyguardState): ValueAnimator { return ValueAnimator().apply { - setInterpolator(Interpolators.LINEAR) - setDuration(duration.inWholeMilliseconds) + interpolator = Interpolators.LINEAR + duration = + when (toState) { + KeyguardState.DREAMING -> TO_DREAMING_DURATION + else -> DEFAULT_DURATION + }.inWholeMilliseconds } } - companion object { private val DEFAULT_DURATION = 500.milliseconds val TO_DREAMING_DURATION = 933.milliseconds diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractor.kt index b5e289f2ac6e..b7963340228b 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractor.kt @@ -32,7 +32,6 @@ import com.android.systemui.util.kotlin.Utils.Companion.toTriple import com.android.systemui.util.kotlin.sample import java.util.UUID import javax.inject.Inject -import kotlin.time.Duration import kotlin.time.Duration.Companion.milliseconds import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.combine @@ -42,12 +41,15 @@ import kotlinx.coroutines.launch class FromLockscreenTransitionInteractor @Inject constructor( + override val transitionRepository: KeyguardTransitionRepository, + override val transitionInteractor: KeyguardTransitionInteractor, @Application private val scope: CoroutineScope, private val keyguardInteractor: KeyguardInteractor, private val shadeRepository: ShadeRepository, - private val keyguardTransitionInteractor: KeyguardTransitionInteractor, - private val keyguardTransitionRepository: KeyguardTransitionRepository, -) : TransitionInteractor(FromLockscreenTransitionInteractor::class.simpleName!!) { +) : + TransitionInteractor( + fromState = KeyguardState.LOCKSCREEN, + ) { override fun start() { listenForLockscreenToGone() @@ -66,8 +68,8 @@ constructor( keyguardInteractor.isAbleToDream .sample( combine( - keyguardTransitionInteractor.startedKeyguardTransitionStep, - keyguardTransitionInteractor.finishedKeyguardState, + transitionInteractor.startedKeyguardTransitionStep, + transitionInteractor.finishedKeyguardState, ::Pair ), ::toTriple @@ -78,14 +80,7 @@ constructor( lastStartedTransition.to == KeyguardState.LOCKSCREEN && !invalidFromStates.contains(lastStartedTransition.from) if (isAbleToDream && (isOnLockscreen || isTransitionInterruptible)) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - name, - KeyguardState.LOCKSCREEN, - KeyguardState.DREAMING, - getAnimator(TO_DREAMING_DURATION), - ) - ) + startTransitionTo(KeyguardState.DREAMING) } } } @@ -94,20 +89,13 @@ constructor( private fun listenForLockscreenToPrimaryBouncer() { scope.launch { keyguardInteractor.primaryBouncerShowing - .sample(keyguardTransitionInteractor.startedKeyguardTransitionStep, ::Pair) + .sample(transitionInteractor.startedKeyguardTransitionStep, ::Pair) .collect { pair -> val (isBouncerShowing, lastStartedTransitionStep) = pair if ( isBouncerShowing && lastStartedTransitionStep.to == KeyguardState.LOCKSCREEN ) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - ownerName = name, - from = KeyguardState.LOCKSCREEN, - to = KeyguardState.PRIMARY_BOUNCER, - animator = getAnimator(), - ) - ) + startTransitionTo(KeyguardState.PRIMARY_BOUNCER) } } } @@ -116,21 +104,14 @@ constructor( private fun listenForLockscreenToAlternateBouncer() { scope.launch { keyguardInteractor.alternateBouncerShowing - .sample(keyguardTransitionInteractor.startedKeyguardTransitionStep, ::Pair) + .sample(transitionInteractor.startedKeyguardTransitionStep, ::Pair) .collect { pair -> val (isAlternateBouncerShowing, lastStartedTransitionStep) = pair if ( isAlternateBouncerShowing && lastStartedTransitionStep.to == KeyguardState.LOCKSCREEN ) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - ownerName = name, - from = KeyguardState.LOCKSCREEN, - to = KeyguardState.ALTERNATE_BOUNCER, - animator = getAnimator(), - ) - ) + startTransitionTo(KeyguardState.ALTERNATE_BOUNCER) } } } @@ -143,7 +124,7 @@ constructor( shadeRepository.shadeModel .sample( combine( - keyguardTransitionInteractor.startedKeyguardTransitionStep, + transitionInteractor.startedKeyguardTransitionStep, keyguardInteractor.statusBarState, keyguardInteractor.isKeyguardUnlocked, ::Triple @@ -164,7 +145,7 @@ constructor( } else { TransitionState.RUNNING } - keyguardTransitionRepository.updateTransition( + transitionRepository.updateTransition( id, 1f - shadeModel.expansionAmount, nextState, @@ -178,13 +159,17 @@ constructor( } // If canceled, just put the state back + // TODO: This logic should happen in FromPrimaryBouncerInteractor. if (nextState == TransitionState.CANCELED) { - keyguardTransitionRepository.startTransition( + transitionRepository.startTransition( TransitionInfo( ownerName = name, from = KeyguardState.PRIMARY_BOUNCER, to = KeyguardState.LOCKSCREEN, - animator = getAnimator(0.milliseconds) + animator = + getDefaultAnimatorForTransitionsToState(KeyguardState.LOCKSCREEN).apply { + duration = 0 + } ) ) } @@ -198,15 +183,7 @@ constructor( !isKeyguardUnlocked && statusBarState == KEYGUARD ) { - transitionId = - keyguardTransitionRepository.startTransition( - TransitionInfo( - ownerName = name, - from = KeyguardState.LOCKSCREEN, - to = KeyguardState.PRIMARY_BOUNCER, - animator = null, - ) - ) + transitionId = startTransitionTo(KeyguardState.PRIMARY_BOUNCER) } } } @@ -216,18 +193,11 @@ constructor( private fun listenForLockscreenToGone() { scope.launch { keyguardInteractor.isKeyguardGoingAway - .sample(keyguardTransitionInteractor.startedKeyguardTransitionStep, ::Pair) + .sample(transitionInteractor.startedKeyguardTransitionStep, ::Pair) .collect { pair -> val (isKeyguardGoingAway, lastStartedStep) = pair if (isKeyguardGoingAway && lastStartedStep.to == KeyguardState.LOCKSCREEN) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - name, - KeyguardState.LOCKSCREEN, - KeyguardState.GONE, - getAnimator(), - ) - ) + startTransitionTo(KeyguardState.GONE) } } } @@ -238,7 +208,7 @@ constructor( keyguardInteractor.isKeyguardOccluded .sample( combine( - keyguardTransitionInteractor.finishedKeyguardState, + transitionInteractor.finishedKeyguardState, keyguardInteractor.isDreaming, ::Pair ), @@ -246,14 +216,7 @@ constructor( ) .collect { (isOccluded, keyguardState, isDreaming) -> if (isOccluded && !isDreaming && keyguardState == KeyguardState.LOCKSCREEN) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - name, - keyguardState, - KeyguardState.OCCLUDED, - getAnimator(TO_OCCLUDED_DURATION), - ) - ) + startTransitionTo(KeyguardState.OCCLUDED) } } } @@ -263,7 +226,7 @@ constructor( private fun listenForLockscreenToCamera() { scope.launch { keyguardInteractor.onCameraLaunchDetected - .sample(keyguardTransitionInteractor.startedKeyguardTransitionStep, ::Pair) + .sample(transitionInteractor.startedKeyguardTransitionStep, ::Pair) .collect { (_, lastStartedStep) -> // DREAMING/AOD/OFF may trigger on the first power button push, so include this // state in order to cancel and correct the transition @@ -274,14 +237,7 @@ constructor( lastStartedStep.to == KeyguardState.AOD || lastStartedStep.to == KeyguardState.OFF ) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - name, - KeyguardState.LOCKSCREEN, - KeyguardState.OCCLUDED, - getAnimator(TO_OCCLUDED_DURATION), - ) - ) + startTransitionTo(KeyguardState.OCCLUDED) } } } @@ -292,7 +248,7 @@ constructor( keyguardInteractor.wakefulnessModel .sample( combine( - keyguardTransitionInteractor.startedKeyguardTransitionStep, + transitionInteractor.startedKeyguardTransitionStep, keyguardInteractor.isAodAvailable, ::Pair ), @@ -303,27 +259,23 @@ constructor( lastStartedStep.to == KeyguardState.LOCKSCREEN && wakefulnessState.state == WakefulnessState.STARTING_TO_SLEEP ) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - name, - KeyguardState.LOCKSCREEN, - if (isAodAvailable) { - KeyguardState.AOD - } else { - KeyguardState.DOZING - }, - getAnimator(), - ) + startTransitionTo( + if (isAodAvailable) KeyguardState.AOD else KeyguardState.DOZING ) } } } } - private fun getAnimator(duration: Duration = DEFAULT_DURATION): ValueAnimator { + override fun getDefaultAnimatorForTransitionsToState(toState: KeyguardState): ValueAnimator { return ValueAnimator().apply { - setInterpolator(Interpolators.LINEAR) - setDuration(duration.inWholeMilliseconds) + interpolator = Interpolators.LINEAR + duration = + when (toState) { + KeyguardState.DREAMING -> TO_DREAMING_DURATION + KeyguardState.OCCLUDED -> TO_OCCLUDED_DURATION + else -> DEFAULT_DURATION + }.inWholeMilliseconds } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractor.kt index b0dbc591dd15..a8147d0c2cf6 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractor.kt @@ -22,12 +22,10 @@ import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository import com.android.systemui.keyguard.shared.model.KeyguardState -import com.android.systemui.keyguard.shared.model.TransitionInfo import com.android.systemui.keyguard.shared.model.WakefulnessState import com.android.systemui.util.kotlin.Utils.Companion.toTriple import com.android.systemui.util.kotlin.sample import javax.inject.Inject -import kotlin.time.Duration import kotlin.time.Duration.Companion.milliseconds import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.combine @@ -37,11 +35,14 @@ import kotlinx.coroutines.launch class FromOccludedTransitionInteractor @Inject constructor( + override val transitionRepository: KeyguardTransitionRepository, + override val transitionInteractor: KeyguardTransitionInteractor, @Application private val scope: CoroutineScope, private val keyguardInteractor: KeyguardInteractor, - private val keyguardTransitionRepository: KeyguardTransitionRepository, - private val keyguardTransitionInteractor: KeyguardTransitionInteractor, -) : TransitionInteractor(FromOccludedTransitionInteractor::class.simpleName!!) { +) : + TransitionInteractor( + fromState = KeyguardState.OCCLUDED, + ) { override fun start() { listenForOccludedToLockscreen() @@ -54,18 +55,11 @@ constructor( private fun listenForOccludedToDreaming() { scope.launch { keyguardInteractor.isAbleToDream - .sample(keyguardTransitionInteractor.finishedKeyguardState, ::Pair) + .sample(transitionInteractor.finishedKeyguardState, ::Pair) .collect { pair -> val (isAbleToDream, keyguardState) = pair if (isAbleToDream && keyguardState == KeyguardState.OCCLUDED) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - name, - KeyguardState.OCCLUDED, - KeyguardState.DREAMING, - getAnimator(), - ) - ) + startTransitionTo(KeyguardState.DREAMING) } } } @@ -77,7 +71,7 @@ constructor( .sample( combine( keyguardInteractor.isKeyguardShowing, - keyguardTransitionInteractor.startedKeyguardTransitionStep, + transitionInteractor.startedKeyguardTransitionStep, ::Pair ), ::toTriple @@ -90,14 +84,7 @@ constructor( isShowing && lastStartedKeyguardState.to == KeyguardState.OCCLUDED ) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - name, - KeyguardState.OCCLUDED, - KeyguardState.LOCKSCREEN, - getAnimator(TO_LOCKSCREEN_DURATION), - ) - ) + startTransitionTo(KeyguardState.LOCKSCREEN) } } } @@ -109,7 +96,7 @@ constructor( .sample( combine( keyguardInteractor.isKeyguardShowing, - keyguardTransitionInteractor.startedKeyguardTransitionStep, + transitionInteractor.startedKeyguardTransitionStep, ::Pair ), ::toTriple @@ -122,14 +109,7 @@ constructor( !isShowing && lastStartedKeyguardState.to == KeyguardState.OCCLUDED ) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - name, - KeyguardState.OCCLUDED, - KeyguardState.GONE, - getAnimator(), - ) - ) + startTransitionTo(KeyguardState.GONE) } } } @@ -140,7 +120,7 @@ constructor( keyguardInteractor.wakefulnessModel .sample( combine( - keyguardTransitionInteractor.startedKeyguardTransitionStep, + transitionInteractor.startedKeyguardTransitionStep, keyguardInteractor.isAodAvailable, ::Pair ), @@ -151,17 +131,8 @@ constructor( lastStartedStep.to == KeyguardState.OCCLUDED && wakefulnessState.state == WakefulnessState.STARTING_TO_SLEEP ) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - name, - KeyguardState.OCCLUDED, - if (isAodAvailable) { - KeyguardState.AOD - } else { - KeyguardState.DOZING - }, - getAnimator(), - ) + startTransitionTo( + if (isAodAvailable) KeyguardState.AOD else KeyguardState.DOZING ) } } @@ -171,29 +142,26 @@ constructor( private fun listenForOccludedToAlternateBouncer() { scope.launch { keyguardInteractor.alternateBouncerShowing - .sample(keyguardTransitionInteractor.startedKeyguardTransitionStep, ::Pair) + .sample(transitionInteractor.startedKeyguardTransitionStep, ::Pair) .collect { (isAlternateBouncerShowing, lastStartedTransitionStep) -> if ( isAlternateBouncerShowing && lastStartedTransitionStep.to == KeyguardState.OCCLUDED ) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - ownerName = name, - from = KeyguardState.OCCLUDED, - to = KeyguardState.ALTERNATE_BOUNCER, - animator = getAnimator(), - ) - ) + startTransitionTo(KeyguardState.ALTERNATE_BOUNCER) } } } } - private fun getAnimator(duration: Duration = DEFAULT_DURATION): ValueAnimator { + override fun getDefaultAnimatorForTransitionsToState(toState: KeyguardState): ValueAnimator { return ValueAnimator().apply { - setInterpolator(Interpolators.LINEAR) - setDuration(duration.inWholeMilliseconds) + interpolator = Interpolators.LINEAR + duration = + when (toState) { + KeyguardState.LOCKSCREEN -> TO_LOCKSCREEN_DURATION + else -> DEFAULT_DURATION + }.inWholeMilliseconds } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractor.kt index da09e1f0f4d2..e1754f55b1dd 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractor.kt @@ -25,12 +25,10 @@ import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository import com.android.systemui.keyguard.shared.model.KeyguardState -import com.android.systemui.keyguard.shared.model.TransitionInfo import com.android.systemui.keyguard.shared.model.WakefulnessState import com.android.systemui.util.kotlin.Utils.Companion.toQuad import com.android.systemui.util.kotlin.sample import javax.inject.Inject -import kotlin.time.Duration import kotlin.time.Duration.Companion.milliseconds import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.combine @@ -40,12 +38,15 @@ import kotlinx.coroutines.launch class FromPrimaryBouncerTransitionInteractor @Inject constructor( + override val transitionRepository: KeyguardTransitionRepository, + override val transitionInteractor: KeyguardTransitionInteractor, @Application private val scope: CoroutineScope, private val keyguardInteractor: KeyguardInteractor, - private val keyguardTransitionRepository: KeyguardTransitionRepository, - private val keyguardTransitionInteractor: KeyguardTransitionInteractor, private val keyguardSecurityModel: KeyguardSecurityModel, -) : TransitionInteractor(FromPrimaryBouncerTransitionInteractor::class.simpleName!!) { +) : + TransitionInteractor( + fromState = KeyguardState.PRIMARY_BOUNCER, + ) { override fun start() { listenForPrimaryBouncerToGone() @@ -59,7 +60,7 @@ constructor( .sample( combine( keyguardInteractor.wakefulnessModel, - keyguardTransitionInteractor.startedKeyguardTransitionStep, + transitionInteractor.startedKeyguardTransitionStep, keyguardInteractor.isKeyguardOccluded, ::Triple ), @@ -73,20 +74,8 @@ constructor( (wakefulnessState.state == WakefulnessState.AWAKE || wakefulnessState.state == WakefulnessState.STARTING_TO_WAKE) ) { - val to = - if (occluded) { - KeyguardState.OCCLUDED - } else { - KeyguardState.LOCKSCREEN - } - - keyguardTransitionRepository.startTransition( - TransitionInfo( - ownerName = name, - from = KeyguardState.PRIMARY_BOUNCER, - to = to, - animator = getAnimator(), - ) + startTransitionTo( + if (occluded) KeyguardState.OCCLUDED else KeyguardState.LOCKSCREEN ) } } @@ -99,7 +88,7 @@ constructor( .sample( combine( keyguardInteractor.wakefulnessModel, - keyguardTransitionInteractor.startedKeyguardTransitionStep, + transitionInteractor.startedKeyguardTransitionStep, keyguardInteractor.isAodAvailable, ::Triple ), @@ -114,20 +103,8 @@ constructor( (wakefulnessState.state == WakefulnessState.STARTING_TO_SLEEP || wakefulnessState.state == WakefulnessState.ASLEEP) ) { - val to = - if (isAodAvailable) { - KeyguardState.AOD - } else { - KeyguardState.DOZING - } - - keyguardTransitionRepository.startTransition( - TransitionInfo( - ownerName = name, - from = KeyguardState.PRIMARY_BOUNCER, - to = to, - animator = getAnimator(), - ) + startTransitionTo( + if (isAodAvailable) KeyguardState.AOD else KeyguardState.DOZING ) } } @@ -137,7 +114,7 @@ constructor( private fun listenForPrimaryBouncerToGone() { scope.launch { keyguardInteractor.isKeyguardGoingAway - .sample(keyguardTransitionInteractor.startedKeyguardTransitionStep, ::Pair) + .sample(transitionInteractor.startedKeyguardTransitionStep, ::Pair) .collect { (isKeyguardGoingAway, lastStartedTransitionStep) -> if ( isKeyguardGoingAway && @@ -154,24 +131,24 @@ constructor( } else { TO_GONE_DURATION } - keyguardTransitionRepository.startTransition( - TransitionInfo( - ownerName = name, - from = KeyguardState.PRIMARY_BOUNCER, - to = KeyguardState.GONE, - animator = getAnimator(duration), - ), - resetIfCanceled = true, + + startTransitionTo( + toState = KeyguardState.GONE, + animator = + getDefaultAnimatorForTransitionsToState(KeyguardState.GONE).apply { + this.duration = duration.inWholeMilliseconds + }, + resetIfCancelled = true ) } } } } - private fun getAnimator(duration: Duration = DEFAULT_DURATION): ValueAnimator { + override fun getDefaultAnimatorForTransitionsToState(toState: KeyguardState): ValueAnimator { return ValueAnimator().apply { - setInterpolator(Interpolators.LINEAR) - setDuration(duration.inWholeMilliseconds) + interpolator = Interpolators.LINEAR + duration = DEFAULT_DURATION.inWholeMilliseconds } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractor.kt index ea9c2b28742c..d1ac49bd4409 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractor.kt @@ -433,6 +433,10 @@ constructor( KeyguardPickerFlag( name = Contract.FlagsTable.FLAG_NAME_WALLPAPER_PICKER_UI_FOR_AIWP, value = featureFlags.isEnabled(Flags.WALLPAPER_PICKER_UI_FOR_AIWP) + ), + KeyguardPickerFlag( + name = Contract.FlagsTable.FLAG_NAME_TRANSIT_CLOCK, + value = featureFlags.isEnabled(Flags.TRANSIT_CLOCK) ) ) } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt index 42f12f82d9a7..df7c79ff4264 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt @@ -47,6 +47,8 @@ constructor( private val repository: KeyguardTransitionRepository, @Application val scope: CoroutineScope, ) { + private val TAG = this::class.simpleName + /** (any)->GONE transition information */ val anyStateToGoneTransition: Flow<TransitionStep> = repository.transitions.filter { step -> step.to == KeyguardState.GONE } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/LockscreenSceneInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/LockscreenSceneInteractor.kt index d0bc25fd26f4..c8f7efbeb397 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/LockscreenSceneInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/LockscreenSceneInteractor.kt @@ -23,7 +23,6 @@ import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.scene.domain.interactor.SceneInteractor import com.android.systemui.scene.shared.model.SceneKey import com.android.systemui.scene.shared.model.SceneModel -import com.android.systemui.util.kotlin.pairwise import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject @@ -61,23 +60,16 @@ constructor( /** Whether it's currently possible to swipe up to dismiss the lockscreen. */ val isSwipeToDismissEnabled: StateFlow<Boolean> = - combine( - authenticationInteractor.isUnlocked, - authenticationInteractor.authenticationMethod, - ) { isUnlocked, authMethod -> - isSwipeToUnlockEnabled( - isUnlocked = isUnlocked, - authMethod = authMethod, - ) + authenticationInteractor.isUnlocked + .map { isUnlocked -> + !isUnlocked && + authenticationInteractor.getAuthenticationMethod() is + AuthenticationMethodModel.Swipe } .stateIn( scope = applicationScope, started = SharingStarted.WhileSubscribed(), - initialValue = - isSwipeToUnlockEnabled( - isUnlocked = authenticationInteractor.isUnlocked.value, - authMethod = authenticationInteractor.authenticationMethod.value, - ), + initialValue = false, ) init { @@ -118,51 +110,6 @@ constructor( } } } - - // SWIPE TO DISMISS Lockscreen. - // - // If switched from the lockscreen to the gone scene and the auth method was a swipe, - // unlocks the device. - applicationScope.launch { - combine( - authenticationInteractor.authenticationMethod, - sceneInteractor.currentScene(containerName).pairwise(), - ::Pair, - ) - .collect { (authMethod, scenes) -> - val (previousScene, currentScene) = scenes - if ( - authMethod is AuthenticationMethodModel.Swipe && - previousScene.key == SceneKey.Lockscreen && - currentScene.key == SceneKey.Gone - ) { - authenticationInteractor.unlockDevice() - } - } - } - - // DISMISS Lockscreen IF AUTH METHOD IS REMOVED. - // - // If the auth method becomes None while on the lockscreen scene, dismisses the lock - // screen. - applicationScope.launch { - combine( - authenticationInteractor.authenticationMethod, - sceneInteractor.currentScene(containerName), - ::Pair, - ) - .collect { (authMethod, scene) -> - if ( - scene.key == SceneKey.Lockscreen && - authMethod == AuthenticationMethodModel.None - ) { - sceneInteractor.setCurrentScene( - containerName = containerName, - scene = SceneModel(SceneKey.Gone), - ) - } - } - } } /** Attempts to dismiss the lockscreen. This will cause the bouncer to show, if needed. */ @@ -170,13 +117,6 @@ constructor( bouncerInteractor.showOrUnlockDevice(containerName = containerName) } - private fun isSwipeToUnlockEnabled( - isUnlocked: Boolean, - authMethod: AuthenticationMethodModel, - ): Boolean { - return !isUnlocked && authMethod is AuthenticationMethodModel.Swipe - } - @AssistedFactory interface Factory { fun create( diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/TransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/TransitionInteractor.kt index b7dd1a5f42b5..ae6fc9e6e6dc 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/TransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/TransitionInteractor.kt @@ -15,6 +15,14 @@ */ package com.android.systemui.keyguard.domain.interactor + +import android.animation.ValueAnimator +import android.util.Log +import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository +import com.android.systemui.keyguard.shared.model.KeyguardState +import com.android.systemui.keyguard.shared.model.TransitionInfo +import java.util.UUID + /** * Each TransitionInteractor is responsible for determining under which conditions to notify * [KeyguardTransitionRepository] to signal a transition. When (and if) the transition occurs is @@ -26,6 +34,50 @@ package com.android.systemui.keyguard.domain.interactor * MUST list implementing classes in dagger module [StartKeyguardTransitionModule] and also in the * 'when' clause of [KeyguardTransitionCoreStartable] */ -sealed class TransitionInteractor(val name: String) { +sealed class TransitionInteractor( + val fromState: KeyguardState, +) { + val name = this::class.simpleName ?: "UnknownTransitionInteractor" + + abstract val transitionRepository: KeyguardTransitionRepository + abstract val transitionInteractor: KeyguardTransitionInteractor abstract fun start() + + fun startTransitionTo( + toState: KeyguardState, + animator: ValueAnimator? = getDefaultAnimatorForTransitionsToState(toState), + resetIfCancelled: Boolean = false + ): UUID? { + if ( + fromState != transitionInteractor.startedKeyguardState.value && + fromState != transitionInteractor.finishedKeyguardState.value + ) { + Log.e( + name, + "startTransition: We were asked to transition from " + + "$fromState to $toState, however we last finished a transition to " + + "${transitionInteractor.finishedKeyguardState.value}, " + + "and last started a transition to " + + "${transitionInteractor.startedKeyguardState.value}. " + + "Ignoring startTransition, but this should never happen." + ) + return null + } + + return transitionRepository.startTransition( + TransitionInfo( + name, + fromState, + toState, + animator, + ), + resetIfCancelled + ) + } + + /** + * Returns a ValueAnimator to be used for transitions to [toState], if one is not explicitly + * passed to [startTransitionTo]. + */ + abstract fun getDefaultAnimatorForTransitionsToState(toState: KeyguardState): ValueAnimator? } diff --git a/core/java/android/hardware/fingerprint/IUdfpsOverlay.aidl b/packages/SystemUI/src/com/android/systemui/log/dagger/DisplayMetricsRepoLog.kt index c99fcccc68ea..fa9ec880244b 100644 --- a/core/java/android/hardware/fingerprint/IUdfpsOverlay.aidl +++ b/packages/SystemUI/src/com/android/systemui/log/dagger/DisplayMetricsRepoLog.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,16 +14,12 @@ * limitations under the License. */ -package android.hardware.fingerprint; +package com.android.systemui.log.dagger -/** - * Interface for interacting with the under-display fingerprint sensor (UDFPS) overlay. - * @hide - */ -oneway interface IUdfpsOverlay { - // Shows the overlay. - void show(long requestId, int sensorId, int reason); +import javax.inject.Qualifier - // Hides the overlay. - void hide(int sensorId); -} +/** A [com.android.systemui.log.LogBuffer] for display metrics related logging. */ +@Qualifier +@MustBeDocumented +@Retention(AnnotationRetention.RUNTIME) +annotation class DisplayMetricsRepoLog 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 3497285d6929..b5759e3a3140 100644 --- a/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java +++ b/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java @@ -488,4 +488,12 @@ public class LogModule { public static LogBuffer provideDreamLogBuffer(LogBufferFactory factory) { return factory.create("DreamLog", 250); } + + /** Provides a {@link LogBuffer} for display metrics related logs. */ + @Provides + @SysUISingleton + @DisplayMetricsRepoLog + public static LogBuffer provideDisplayMetricsRepoLogBuffer(LogBufferFactory factory) { + return factory.create("DisplayMetricsRepo", 50); + } } diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/resume/MediaResumeListener.kt b/packages/SystemUI/src/com/android/systemui/media/controls/resume/MediaResumeListener.kt index b0389b50cd7d..23ee00d88fdc 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/resume/MediaResumeListener.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/resume/MediaResumeListener.kt @@ -122,9 +122,9 @@ constructor( Log.e(TAG, "Error getting package information", e) } - Log.d(TAG, "Adding resume controls $desc") + Log.d(TAG, "Adding resume controls for ${browser.userId}: $desc") mediaDataManager.addResumptionControls( - currentUserId, + browser.userId, desc, resumeAction, token, @@ -196,7 +196,11 @@ constructor( } resumeComponents.add(component to lastPlayed) } - Log.d(TAG, "loaded resume components ${resumeComponents.toArray().contentToString()}") + Log.d( + TAG, + "loaded resume components for $currentUserId: " + + "${resumeComponents.toArray().contentToString()}" + ) if (needsUpdate) { // Save any missing times that we had to fill in @@ -210,11 +214,21 @@ constructor( return } + val pm = context.packageManager val now = systemClock.currentTimeMillis() resumeComponents.forEach { if (now.minus(it.second) <= RESUME_MEDIA_TIMEOUT) { - val browser = mediaBrowserFactory.create(mediaBrowserCallback, it.first) - browser.findRecentMedia() + // Verify that the service exists for this user + val intent = Intent(MediaBrowserService.SERVICE_INTERFACE) + intent.component = it.first + val inf = pm.resolveServiceAsUser(intent, 0, currentUserId) + if (inf != null) { + val browser = + mediaBrowserFactory.create(mediaBrowserCallback, it.first, currentUserId) + browser.findRecentMedia() + } else { + Log.d(TAG, "User $currentUserId does not have component ${it.first}") + } } } } @@ -244,7 +258,7 @@ constructor( Log.d(TAG, "Checking for service component for " + data.packageName) val pm = context.packageManager val serviceIntent = Intent(MediaBrowserService.SERVICE_INTERFACE) - val resumeInfo = pm.queryIntentServices(serviceIntent, 0) + val resumeInfo = pm.queryIntentServicesAsUser(serviceIntent, 0, currentUserId) val inf = resumeInfo?.filter { it.serviceInfo.packageName == data.packageName } if (inf != null && inf.size > 0) { @@ -280,13 +294,17 @@ constructor( browser: ResumeMediaBrowser ) { // Since this is a test, just save the component for later - Log.d(TAG, "Can get resumable media from $componentName") + Log.d( + TAG, + "Can get resumable media for ${browser.userId} from $componentName" + ) mediaDataManager.setResumeAction(key, getResumeAction(componentName)) updateResumptionList(componentName) mediaBrowser = null } }, - componentName + componentName, + currentUserId ) mediaBrowser?.testConnection() } @@ -326,7 +344,7 @@ constructor( /** Get a runnable which will resume media playback */ private fun getResumeAction(componentName: ComponentName): Runnable { return Runnable { - mediaBrowser = mediaBrowserFactory.create(null, componentName) + mediaBrowser = mediaBrowserFactory.create(null, componentName, currentUserId) mediaBrowser?.restart() } } diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/resume/ResumeMediaBrowser.java b/packages/SystemUI/src/com/android/systemui/media/controls/resume/ResumeMediaBrowser.java index d460b5b5d782..ceaccafd8f40 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/resume/ResumeMediaBrowser.java +++ b/packages/SystemUI/src/com/android/systemui/media/controls/resume/ResumeMediaBrowser.java @@ -17,6 +17,7 @@ package com.android.systemui.media.controls.resume; import android.annotation.Nullable; +import android.annotation.UserIdInt; import android.app.PendingIntent; import android.content.ComponentName; import android.content.Context; @@ -53,6 +54,7 @@ public class ResumeMediaBrowser { private final ResumeMediaBrowserLogger mLogger; private final ComponentName mComponentName; private final MediaController.Callback mMediaControllerCallback = new SessionDestroyCallback(); + @UserIdInt private final int mUserId; private MediaBrowser mMediaBrowser; @Nullable private MediaController mMediaController; @@ -62,18 +64,21 @@ public class ResumeMediaBrowser { * @param context the context * @param callback used to report media items found * @param componentName Component name of the MediaBrowserService this browser will connect to + * @param userId ID of the current user */ public ResumeMediaBrowser( Context context, @Nullable Callback callback, ComponentName componentName, MediaBrowserFactory browserFactory, - ResumeMediaBrowserLogger logger) { + ResumeMediaBrowserLogger logger, + @UserIdInt int userId) { mContext = context; mCallback = callback; mComponentName = componentName; mBrowserFactory = browserFactory; mLogger = logger; + mUserId = userId; } /** @@ -285,6 +290,14 @@ public class ResumeMediaBrowser { } /** + * Get the ID of the user associated with this broswer + * @return the user ID + */ + public @UserIdInt int getUserId() { + return mUserId; + } + + /** * Get the media session token * @return the token, or null if the MediaBrowser is null or disconnected */ diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/resume/ResumeMediaBrowserFactory.java b/packages/SystemUI/src/com/android/systemui/media/controls/resume/ResumeMediaBrowserFactory.java index c558227df0b5..e37419127f5b 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/resume/ResumeMediaBrowserFactory.java +++ b/packages/SystemUI/src/com/android/systemui/media/controls/resume/ResumeMediaBrowserFactory.java @@ -16,6 +16,7 @@ package com.android.systemui.media.controls.resume; +import android.annotation.UserIdInt; import android.content.ComponentName; import android.content.Context; @@ -42,10 +43,12 @@ public class ResumeMediaBrowserFactory { * * @param callback will be called on connection or error, and addTrack when media item found * @param componentName component to browse + * @param userId ID of the current user * @return */ public ResumeMediaBrowser create(ResumeMediaBrowser.Callback callback, - ComponentName componentName) { - return new ResumeMediaBrowser(mContext, callback, componentName, mBrowserFactory, mLogger); + ComponentName componentName, @UserIdInt int userId) { + return new ResumeMediaBrowser(mContext, callback, componentName, mBrowserFactory, mLogger, + userId); } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/AutoAddTracker.kt b/packages/SystemUI/src/com/android/systemui/qs/AutoAddTracker.kt index c70cce9fec26..2fafba1f188a 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/AutoAddTracker.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/AutoAddTracker.kt @@ -120,6 +120,7 @@ class AutoAddTracker @VisibleForTesting constructor( val tilesToRemove = restoredAutoAdded.filter { it !in restoredTiles } if (tilesToRemove.isNotEmpty()) { + Log.d(TAG, "Removing tiles: $tilesToRemove") qsHost.removeTiles(tilesToRemove) } val tiles = synchronized(autoAdded) { @@ -255,6 +256,7 @@ class AutoAddTracker @VisibleForTesting constructor( override fun dump(pw: PrintWriter, args: Array<out String>) { pw.println("Current user: $userId") + pw.println("Restored tiles: $restoredTiles") pw.println("Added tiles: $autoAdded") } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java index d2568ac79105..432147f00186 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java @@ -152,6 +152,7 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, P mQsFactories.add(defaultFactory); pluginManager.addPluginListener(this, QSFactory.class, true); mUserTracker = userTracker; + mCurrentUser = userTracker.getUserId(); mSecureSettings = secureSettings; mCustomTileStatePersister = customTileStatePersister; @@ -161,7 +162,9 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, P // finishes before creating any tiles. tunerService.addTunable(this, TILES_SETTING); // AutoTileManager can modify mTiles so make sure mTiles has already been initialized. - mAutoTiles = autoTiles.get(); + if (!mFeatureFlags.isEnabled(Flags.QS_PIPELINE_AUTO_ADD)) { + mAutoTiles = autoTiles.get(); + } }); } @@ -272,6 +275,13 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, P if (!TILES_SETTING.equals(key)) { return; } + int currentUser = mUserTracker.getUserId(); + if (currentUser != mCurrentUser) { + mUserContext = mUserTracker.getUserContext(); + if (mAutoTiles != null) { + mAutoTiles.changeUser(UserHandle.of(currentUser)); + } + } // Do not process tiles if the flag is enabled. if (mFeatureFlags.isEnabled(Flags.QS_PIPELINE_NEW_HOST)) { return; @@ -280,13 +290,6 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, P newValue = mContext.getResources().getString(R.string.quick_settings_tiles_retail_mode); } final List<String> tileSpecs = loadTileSpecs(mContext, newValue); - int currentUser = mUserTracker.getUserId(); - if (currentUser != mCurrentUser) { - mUserContext = mUserTracker.getUserContext(); - if (mAutoTiles != null) { - mAutoTiles.changeUser(UserHandle.of(currentUser)); - } - } if (tileSpecs.equals(mTileSpecs) && currentUser == mCurrentUser) return; Log.d(TAG, "Recreating tiles: " + tileSpecs); mTiles.entrySet().stream().filter(tile -> !tileSpecs.contains(tile.getKey())).forEach( @@ -301,7 +304,7 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, P if (tile != null && (!(tile instanceof CustomTile) || ((CustomTile) tile).getUser() == currentUser)) { if (tile.isAvailable()) { - if (DEBUG) Log.d(TAG, "Adding " + tile); + Log.d(TAG, "Adding " + tile); tile.removeCallbacks(); if (!(tile instanceof CustomTile) && mCurrentUser != currentUser) { tile.userSwitch(currentUser); @@ -420,6 +423,7 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, P // When calling this, you may want to modify mTilesListDirty accordingly. @MainThread private void saveTilesToSettings(List<String> tileSpecs) { + Log.d(TAG, "Saving tiles: " + tileSpecs + " for user: " + mCurrentUser); mSecureSettings.putStringForUser(TILES_SETTING, TextUtils.join(",", tileSpecs), null /* tag */, false /* default */, mCurrentUser, true /* overrideable by restore */); @@ -493,7 +497,7 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, P lifecycleManager.flushMessagesAndUnbind(); } } - if (DEBUG) Log.d(TAG, "saveCurrentTiles " + newTiles); + Log.d(TAG, "saveCurrentTiles " + newTiles); mTilesListDirty = true; saveTilesToSettings(newTiles); } @@ -564,9 +568,9 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, P if (TextUtils.isEmpty(tileList)) { tileList = res.getString(R.string.quick_settings_tiles); - if (DEBUG) Log.d(TAG, "Loaded tile specs from default config: " + tileList); + Log.d(TAG, "Loaded tile specs from default config: " + tileList); } else { - if (DEBUG) Log.d(TAG, "Loaded tile specs from setting: " + tileList); + Log.d(TAG, "Loaded tile specs from setting: " + tileList); } final ArrayList<String> tiles = new ArrayList<String>(); boolean addedDefault = false; @@ -612,6 +616,10 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, P @Override public void dump(PrintWriter pw, String[] args) { pw.println("QSTileHost:"); + pw.println("tile specs: " + mTileSpecs); + pw.println("current user: " + mCurrentUser); + pw.println("is dirty: " + mTilesListDirty); + pw.println("tiles:"); mTiles.values().stream().filter(obj -> obj instanceof Dumpable) .forEach(o -> ((Dumpable) o).dump(pw, args)); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/dagger/QSModule.java b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSModule.java index dffe7fd5f818..03de3a02da13 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/dagger/QSModule.java +++ b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSModule.java @@ -19,9 +19,9 @@ package com.android.systemui.qs.dagger; import static com.android.systemui.qs.dagger.QSFlagsModule.RBC_AVAILABLE; import android.content.Context; -import android.hardware.display.NightDisplayListener; import android.os.Handler; +import com.android.systemui.dagger.NightDisplayListenerModule; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.media.dagger.MediaModule; @@ -41,14 +41,14 @@ import com.android.systemui.statusbar.policy.SafetyController; import com.android.systemui.statusbar.policy.WalletController; import com.android.systemui.util.settings.SecureSettings; -import dagger.Module; -import dagger.Provides; -import dagger.multibindings.Multibinds; - import java.util.Map; import javax.inject.Named; +import dagger.Module; +import dagger.Provides; +import dagger.multibindings.Multibinds; + /** * Module for QS dependencies */ @@ -79,7 +79,7 @@ public interface QSModule { HotspotController hotspotController, DataSaverController dataSaverController, ManagedProfileController managedProfileController, - NightDisplayListener nightDisplayListener, + NightDisplayListenerModule.Builder nightDisplayListenerBuilder, CastController castController, ReduceBrightColorsController reduceBrightColorsController, DeviceControlsController deviceControlsController, @@ -95,7 +95,7 @@ public interface QSModule { hotspotController, dataSaverController, managedProfileController, - nightDisplayListener, + nightDisplayListenerBuilder, castController, reduceBrightColorsController, deviceControlsController, diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/dagger/BaseAutoAddableModule.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/dagger/BaseAutoAddableModule.kt new file mode 100644 index 000000000000..adea26e5aa26 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/dagger/BaseAutoAddableModule.kt @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.qs.pipeline.dagger + +import android.content.res.Resources +import com.android.systemui.dagger.qualifiers.Main +import com.android.systemui.qs.pipeline.domain.autoaddable.AutoAddableSetting +import com.android.systemui.qs.pipeline.domain.autoaddable.AutoAddableSettingList +import com.android.systemui.qs.pipeline.domain.autoaddable.CastAutoAddable +import com.android.systemui.qs.pipeline.domain.autoaddable.DataSaverAutoAddable +import com.android.systemui.qs.pipeline.domain.autoaddable.DeviceControlsAutoAddable +import com.android.systemui.qs.pipeline.domain.autoaddable.HotspotAutoAddable +import com.android.systemui.qs.pipeline.domain.autoaddable.NightDisplayAutoAddable +import com.android.systemui.qs.pipeline.domain.autoaddable.ReduceBrightColorsAutoAddable +import com.android.systemui.qs.pipeline.domain.autoaddable.WalletAutoAddable +import com.android.systemui.qs.pipeline.domain.autoaddable.WorkTileAutoAddable +import com.android.systemui.qs.pipeline.domain.model.AutoAddable +import dagger.Binds +import dagger.Module +import dagger.Provides +import dagger.multibindings.ElementsIntoSet +import dagger.multibindings.IntoSet + +@Module +interface BaseAutoAddableModule { + + companion object { + @Provides + @ElementsIntoSet + fun providesAutoAddableSetting( + @Main resources: Resources, + autoAddableSettingFactory: AutoAddableSetting.Factory + ): Set<AutoAddable> { + return AutoAddableSettingList.parseSettingsResource( + resources, + autoAddableSettingFactory + ) + .toSet() + } + } + + @Binds @IntoSet fun bindCastAutoAddable(impl: CastAutoAddable): AutoAddable + + @Binds @IntoSet fun bindDataSaverAutoAddable(impl: DataSaverAutoAddable): AutoAddable + + @Binds @IntoSet fun bindDeviceControlsAutoAddable(impl: DeviceControlsAutoAddable): AutoAddable + + @Binds @IntoSet fun bindHotspotAutoAddable(impl: HotspotAutoAddable): AutoAddable + + @Binds @IntoSet fun bindNightDisplayAutoAddable(impl: NightDisplayAutoAddable): AutoAddable + + @Binds + @IntoSet + fun bindReduceBrightColorsAutoAddable(impl: ReduceBrightColorsAutoAddable): AutoAddable + + @Binds @IntoSet fun bindWalletAutoAddable(impl: WalletAutoAddable): AutoAddable + + @Binds @IntoSet fun bindWorkModeAutoAddable(impl: WorkTileAutoAddable): AutoAddable +} diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/dagger/QSAutoAddLog.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/dagger/QSAutoAddLog.kt new file mode 100644 index 000000000000..91cb5bb60e13 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/dagger/QSAutoAddLog.kt @@ -0,0 +1,22 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.qs.pipeline.dagger + +import javax.inject.Qualifier + +/** A [LogBuffer] for the QS pipeline to track auto-added tiles */ +@Qualifier @MustBeDocumented @Retention(AnnotationRetention.RUNTIME) annotation class QSAutoAddLog diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/dagger/QSAutoAddModule.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/dagger/QSAutoAddModule.kt index 99792286d962..a010ac46a553 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/pipeline/dagger/QSAutoAddModule.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/dagger/QSAutoAddModule.kt @@ -16,13 +16,40 @@ package com.android.systemui.qs.pipeline.dagger +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogBufferFactory import com.android.systemui.qs.pipeline.data.repository.AutoAddRepository import com.android.systemui.qs.pipeline.data.repository.AutoAddSettingRepository +import com.android.systemui.qs.pipeline.domain.model.AutoAddable +import com.android.systemui.qs.pipeline.shared.logging.QSPipelineLogger import dagger.Binds import dagger.Module +import dagger.Provides +import dagger.multibindings.Multibinds -@Module +@Module( + includes = + [ + BaseAutoAddableModule::class, + ] +) abstract class QSAutoAddModule { @Binds abstract fun bindAutoAddRepository(impl: AutoAddSettingRepository): AutoAddRepository + + @Multibinds abstract fun providesAutoAddableSet(): Set<AutoAddable> + + companion object { + /** + * Provides a logging buffer for all logs related to the new Quick Settings pipeline to log + * auto added tiles. + */ + @Provides + @SysUISingleton + @QSAutoAddLog + fun provideQSAutoAddLogBuffer(factory: LogBufferFactory): LogBuffer { + return factory.create(QSPipelineLogger.AUTO_ADD_TAG, maxSize = 100, systrace = false) + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/dagger/QSPipelineModule.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/dagger/QSPipelineModule.kt index d7ae575724dd..a4600fbbf4bd 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/pipeline/dagger/QSPipelineModule.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/dagger/QSPipelineModule.kt @@ -26,7 +26,7 @@ import com.android.systemui.qs.pipeline.data.repository.TileSpecRepository import com.android.systemui.qs.pipeline.data.repository.TileSpecSettingsRepository import com.android.systemui.qs.pipeline.domain.interactor.CurrentTilesInteractor import com.android.systemui.qs.pipeline.domain.interactor.CurrentTilesInteractorImpl -import com.android.systemui.qs.pipeline.prototyping.PrototypeCoreStartable +import com.android.systemui.qs.pipeline.domain.startable.QSPipelineCoreStartable import com.android.systemui.qs.pipeline.shared.logging.QSPipelineLogger import dagger.Binds import dagger.Module @@ -53,8 +53,8 @@ abstract class QSPipelineModule { @Binds @IntoMap - @ClassKey(PrototypeCoreStartable::class) - abstract fun providePrototypeCoreStartable(startable: PrototypeCoreStartable): CoreStartable + @ClassKey(QSPipelineCoreStartable::class) + abstract fun provideCoreStartable(startable: QSPipelineCoreStartable): CoreStartable companion object { /** diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/dagger/QSTileListLog.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/dagger/QSTileListLog.kt index ad8bfeabc676..c56ca8c27a1f 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/pipeline/dagger/QSTileListLog.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/dagger/QSTileListLog.kt @@ -19,5 +19,5 @@ import java.lang.annotation.Retention import java.lang.annotation.RetentionPolicy import javax.inject.Qualifier -/** A {@link LogBuffer} for the new QS Pipeline for logging changes to the set of current tiles. */ +/** A [LogBuffer] for the new QS Pipeline for logging changes to the set of current tiles. */ @Qualifier @MustBeDocumented @Retention(RetentionPolicy.RUNTIME) annotation class QSTileListLog diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/autoaddable/AutoAddableSetting.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/autoaddable/AutoAddableSetting.kt new file mode 100644 index 000000000000..45129b937b48 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/autoaddable/AutoAddableSetting.kt @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.qs.pipeline.domain.autoaddable + +import com.android.systemui.dagger.qualifiers.Background +import com.android.systemui.qs.pipeline.domain.model.AutoAddSignal +import com.android.systemui.qs.pipeline.domain.model.AutoAddTracking +import com.android.systemui.qs.pipeline.domain.model.AutoAddable +import com.android.systemui.qs.pipeline.shared.TileSpec +import com.android.systemui.util.settings.SecureSettings +import com.android.systemui.util.settings.SettingsProxyExt.observerFlow +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject +import java.util.Objects +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.filter +import kotlinx.coroutines.flow.flowOn +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.onStart + +/** + * It tracks a specific `Secure` int [setting] and when its value changes to non-zero, it will emit + * a [AutoAddSignal.Add] for [spec]. + */ +class AutoAddableSetting +@AssistedInject +constructor( + private val secureSettings: SecureSettings, + @Background private val bgDispatcher: CoroutineDispatcher, + @Assisted private val setting: String, + @Assisted private val spec: TileSpec, +) : AutoAddable { + + override fun autoAddSignal(userId: Int): Flow<AutoAddSignal> { + return secureSettings + .observerFlow(userId, setting) + .onStart { emit(Unit) } + .map { secureSettings.getIntForUser(setting, 0, userId) != 0 } + .distinctUntilChanged() + .filter { it } + .map { AutoAddSignal.Add(spec) } + .flowOn(bgDispatcher) + } + + override val autoAddTracking = AutoAddTracking.IfNotAdded(spec) + + override val description = "AutoAddableSetting: $setting:$spec ($autoAddTracking)" + + override fun equals(other: Any?): Boolean { + return other is AutoAddableSetting && spec == other.spec && setting == other.setting + } + + override fun hashCode(): Int { + return Objects.hash(spec, setting) + } + + override fun toString(): String { + return description + } + + @AssistedFactory + interface Factory { + fun create(setting: String, spec: TileSpec): AutoAddableSetting + } +} diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/autoaddable/AutoAddableSettingList.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/autoaddable/AutoAddableSettingList.kt new file mode 100644 index 000000000000..b1c7433770de --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/autoaddable/AutoAddableSettingList.kt @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.qs.pipeline.domain.autoaddable + +import android.content.res.Resources +import android.util.Log +import com.android.systemui.R +import com.android.systemui.qs.pipeline.domain.model.AutoAddable +import com.android.systemui.qs.pipeline.shared.TileSpec + +object AutoAddableSettingList { + + /** Parses [R.array.config_quickSettingsAutoAdd] into a collection of [AutoAddableSetting]. */ + fun parseSettingsResource( + resources: Resources, + autoAddableSettingFactory: AutoAddableSetting.Factory, + ): Iterable<AutoAddable> { + val autoAddList = resources.getStringArray(R.array.config_quickSettingsAutoAdd) + return autoAddList.mapNotNull { + val elements = it.split(SETTING_SEPARATOR, limit = 2) + if (elements.size == 2) { + val setting = elements[0] + val spec = elements[1] + val tileSpec = TileSpec.create(spec) + if (tileSpec == TileSpec.Invalid) { + Log.w(TAG, "Malformed item in array: $it") + null + } else { + autoAddableSettingFactory.create(setting, TileSpec.create(spec)) + } + } else { + Log.w(TAG, "Malformed item in array: $it") + null + } + } + } + + private const val SETTING_SEPARATOR = ":" + private const val TAG = "AutoAddableSettingList" +} diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/autoaddable/CallbackControllerAutoAddable.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/autoaddable/CallbackControllerAutoAddable.kt new file mode 100644 index 000000000000..88a49ee109aa --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/autoaddable/CallbackControllerAutoAddable.kt @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.qs.pipeline.domain.autoaddable + +import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow +import com.android.systemui.qs.pipeline.domain.model.AutoAddSignal +import com.android.systemui.qs.pipeline.domain.model.AutoAddTracking +import com.android.systemui.qs.pipeline.domain.model.AutoAddable +import com.android.systemui.qs.pipeline.shared.TileSpec +import com.android.systemui.statusbar.policy.CallbackController +import kotlinx.coroutines.channels.ProducerScope +import kotlinx.coroutines.channels.awaitClose +import kotlinx.coroutines.flow.Flow + +/** Generic [AutoAddable] for tiles that are added based on a signal from a [CallbackController]. */ +abstract class CallbackControllerAutoAddable< + Callback : Any, Controller : CallbackController<Callback>>( + private val controller: Controller, +) : AutoAddable { + + /** [TileSpec] for the tile to add. */ + protected abstract val spec: TileSpec + + /** + * Callback to be used to determine when to add the tile. When the callback determines that the + * feature has been enabled, it should call [sendAdd]. + */ + protected abstract fun ProducerScope<AutoAddSignal>.getCallback(): Callback + + /** Sends an [AutoAddSignal.Add] for [spec]. */ + protected fun ProducerScope<AutoAddSignal>.sendAdd() { + trySend(AutoAddSignal.Add(spec)) + } + + final override fun autoAddSignal(userId: Int): Flow<AutoAddSignal> { + return conflatedCallbackFlow { + val callback = getCallback() + controller.addCallback(callback) + + awaitClose { controller.removeCallback(callback) } + } + } + + override val autoAddTracking: AutoAddTracking + get() = AutoAddTracking.IfNotAdded(spec) +} diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/autoaddable/CastAutoAddable.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/autoaddable/CastAutoAddable.kt new file mode 100644 index 000000000000..b5bef9f6ebe8 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/autoaddable/CastAutoAddable.kt @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.qs.pipeline.domain.autoaddable + +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.qs.pipeline.domain.model.AutoAddSignal +import com.android.systemui.qs.pipeline.shared.TileSpec +import com.android.systemui.qs.tiles.CastTile +import com.android.systemui.statusbar.policy.CastController +import javax.inject.Inject +import kotlinx.coroutines.channels.ProducerScope + +/** + * [AutoAddable] for [CastTile.TILE_SPEC]. + * + * It will send a signal to add the tile when there's a casting device connected or connecting. + */ +@SysUISingleton +class CastAutoAddable +@Inject +constructor( + private val controller: CastController, +) : CallbackControllerAutoAddable<CastController.Callback, CastController>(controller) { + + override val spec: TileSpec + get() = TileSpec.create(CastTile.TILE_SPEC) + + override fun ProducerScope<AutoAddSignal>.getCallback(): CastController.Callback { + return CastController.Callback { + val isCasting = + controller.castDevices.any { + it.state == CastController.CastDevice.STATE_CONNECTED || + it.state == CastController.CastDevice.STATE_CONNECTING + } + if (isCasting) { + sendAdd() + } + } + } + + override val description = "CastAutoAddable ($autoAddTracking)" +} diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/autoaddable/DataSaverAutoAddable.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/autoaddable/DataSaverAutoAddable.kt new file mode 100644 index 000000000000..a877aee335f4 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/autoaddable/DataSaverAutoAddable.kt @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.qs.pipeline.domain.autoaddable + +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.qs.pipeline.domain.model.AutoAddSignal +import com.android.systemui.qs.pipeline.shared.TileSpec +import com.android.systemui.qs.tiles.DataSaverTile +import com.android.systemui.statusbar.policy.DataSaverController +import javax.inject.Inject +import kotlinx.coroutines.channels.ProducerScope + +/** + * [AutoAddable] for [DataSaverTile.TILE_SPEC]. + * + * It will send a signal to add the tile when data saver is enabled. + */ +@SysUISingleton +class DataSaverAutoAddable +@Inject +constructor( + dataSaverController: DataSaverController, +) : + CallbackControllerAutoAddable<DataSaverController.Listener, DataSaverController>( + dataSaverController + ) { + + override val spec + get() = TileSpec.create(DataSaverTile.TILE_SPEC) + + override fun ProducerScope<AutoAddSignal>.getCallback(): DataSaverController.Listener { + return DataSaverController.Listener { enabled -> + if (enabled) { + sendAdd() + } + } + } + + override val description = "DataSaverAutoAddable ($autoAddTracking)" +} diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/autoaddable/DeviceControlsAutoAddable.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/autoaddable/DeviceControlsAutoAddable.kt new file mode 100644 index 000000000000..76bfad936116 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/autoaddable/DeviceControlsAutoAddable.kt @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.qs.pipeline.domain.autoaddable + +import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.qs.pipeline.domain.model.AutoAddSignal +import com.android.systemui.qs.pipeline.domain.model.AutoAddTracking +import com.android.systemui.qs.pipeline.domain.model.AutoAddable +import com.android.systemui.qs.pipeline.shared.TileSpec +import com.android.systemui.qs.tiles.DeviceControlsTile +import com.android.systemui.statusbar.policy.DeviceControlsController +import javax.inject.Inject +import kotlinx.coroutines.channels.awaitClose +import kotlinx.coroutines.flow.Flow + +/** + * [AutoAddable] for [DeviceControlsTile.TILE_SPEC]. + * + * It will send a signal to add the tile when updating to a device that supports device controls. It + * will send a signal to remove the tile when the device does not support controls. + */ +@SysUISingleton +class DeviceControlsAutoAddable +@Inject +constructor( + private val deviceControlsController: DeviceControlsController, +) : AutoAddable { + + private val spec = TileSpec.create(DeviceControlsTile.TILE_SPEC) + + override fun autoAddSignal(userId: Int): Flow<AutoAddSignal> { + return conflatedCallbackFlow { + val callback = + object : DeviceControlsController.Callback { + override fun onControlsUpdate(position: Int?) { + position?.let { trySend(AutoAddSignal.Add(spec, position)) } + deviceControlsController.removeCallback() + } + + override fun removeControlsAutoTracker() { + trySend(AutoAddSignal.Remove(spec)) + } + } + + deviceControlsController.setCallback(callback) + + awaitClose { deviceControlsController.removeCallback() } + } + } + + override val autoAddTracking: AutoAddTracking + get() = AutoAddTracking.Always + + override val description = "DeviceControlsAutoAddable ($autoAddTracking)" +} diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/autoaddable/HotspotAutoAddable.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/autoaddable/HotspotAutoAddable.kt new file mode 100644 index 000000000000..9c59e1268695 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/autoaddable/HotspotAutoAddable.kt @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.qs.pipeline.domain.autoaddable + +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.qs.pipeline.domain.model.AutoAddSignal +import com.android.systemui.qs.pipeline.shared.TileSpec +import com.android.systemui.qs.tiles.HotspotTile +import com.android.systemui.statusbar.policy.HotspotController +import javax.inject.Inject +import kotlinx.coroutines.channels.ProducerScope + +/** + * [AutoAddable] for [HotspotTile.TILE_SPEC]. + * + * It will send a signal to add the tile when hotspot is enabled. + */ +@SysUISingleton +class HotspotAutoAddable +@Inject +constructor( + hotspotController: HotspotController, +) : + CallbackControllerAutoAddable<HotspotController.Callback, HotspotController>( + hotspotController + ) { + + override val spec + get() = TileSpec.create(HotspotTile.TILE_SPEC) + + override fun ProducerScope<AutoAddSignal>.getCallback(): HotspotController.Callback { + return HotspotController.Callback { enabled, _ -> + if (enabled) { + sendAdd() + } + } + } + + override val description = "HotspotAutoAddable ($autoAddTracking)" +} diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/autoaddable/NightDisplayAutoAddable.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/autoaddable/NightDisplayAutoAddable.kt new file mode 100644 index 000000000000..31ea734fb842 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/autoaddable/NightDisplayAutoAddable.kt @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.qs.pipeline.domain.autoaddable + +import android.content.Context +import android.hardware.display.ColorDisplayManager +import android.hardware.display.NightDisplayListener +import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow +import com.android.systemui.dagger.NightDisplayListenerModule +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.qs.pipeline.domain.model.AutoAddSignal +import com.android.systemui.qs.pipeline.domain.model.AutoAddTracking +import com.android.systemui.qs.pipeline.domain.model.AutoAddable +import com.android.systemui.qs.pipeline.shared.TileSpec +import com.android.systemui.qs.tiles.NightDisplayTile +import javax.inject.Inject +import kotlinx.coroutines.channels.awaitClose +import kotlinx.coroutines.flow.Flow + +/** + * [AutoAddable] for [NightDisplayTile.TILE_SPEC]. + * + * It will send a signal to add the tile when night display is enabled or when the auto mode changes + * to one that supports night display. + */ +@SysUISingleton +class NightDisplayAutoAddable +@Inject +constructor( + private val nightDisplayListenerBuilder: NightDisplayListenerModule.Builder, + context: Context, +) : AutoAddable { + + private val enabled = ColorDisplayManager.isNightDisplayAvailable(context) + private val spec = TileSpec.create(NightDisplayTile.TILE_SPEC) + + override fun autoAddSignal(userId: Int): Flow<AutoAddSignal> { + return conflatedCallbackFlow { + val nightDisplayListener = nightDisplayListenerBuilder.setUser(userId).build() + + val callback = + object : NightDisplayListener.Callback { + override fun onActivated(activated: Boolean) { + if (activated) { + sendAdd() + } + } + + override fun onAutoModeChanged(autoMode: Int) { + if ( + autoMode == ColorDisplayManager.AUTO_MODE_CUSTOM_TIME || + autoMode == ColorDisplayManager.AUTO_MODE_TWILIGHT + ) { + sendAdd() + } + } + + private fun sendAdd() { + trySend(AutoAddSignal.Add(spec)) + } + } + + nightDisplayListener.setCallback(callback) + + awaitClose { nightDisplayListener.setCallback(null) } + } + } + + override val autoAddTracking = + if (enabled) { + AutoAddTracking.IfNotAdded(spec) + } else { + AutoAddTracking.Disabled + } + + override val description = "NightDisplayAutoAddable ($autoAddTracking)" +} diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/autoaddable/ReduceBrightColorsAutoAddable.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/autoaddable/ReduceBrightColorsAutoAddable.kt new file mode 100644 index 000000000000..267e2b7d0609 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/autoaddable/ReduceBrightColorsAutoAddable.kt @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.qs.pipeline.domain.autoaddable + +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.qs.ReduceBrightColorsController +import com.android.systemui.qs.dagger.QSFlagsModule.RBC_AVAILABLE +import com.android.systemui.qs.pipeline.domain.model.AutoAddSignal +import com.android.systemui.qs.pipeline.domain.model.AutoAddTracking +import com.android.systemui.qs.pipeline.shared.TileSpec +import com.android.systemui.qs.tiles.ReduceBrightColorsTile +import javax.inject.Inject +import javax.inject.Named +import kotlinx.coroutines.channels.ProducerScope + +/** + * [AutoAddable] for [ReduceBrightColorsTile.TILE_SPEC]. + * + * It will send a signal to add the tile when reduce bright colors is enabled. + */ +@SysUISingleton +class ReduceBrightColorsAutoAddable +@Inject +constructor( + controller: ReduceBrightColorsController, + @Named(RBC_AVAILABLE) private val available: Boolean, +) : + CallbackControllerAutoAddable< + ReduceBrightColorsController.Listener, ReduceBrightColorsController + >(controller) { + + override val spec: TileSpec + get() = TileSpec.create(ReduceBrightColorsTile.TILE_SPEC) + + override fun ProducerScope<AutoAddSignal>.getCallback(): ReduceBrightColorsController.Listener { + return object : ReduceBrightColorsController.Listener { + override fun onActivated(activated: Boolean) { + if (activated) { + sendAdd() + } + } + } + } + + override val autoAddTracking + get() = + if (available) { + super.autoAddTracking + } else { + AutoAddTracking.Disabled + } + + override val description = "ReduceBrightColorsAutoAddable ($autoAddTracking)" +} diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/autoaddable/SafetyCenterAutoAddable.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/autoaddable/SafetyCenterAutoAddable.kt new file mode 100644 index 000000000000..58a31bc22a57 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/autoaddable/SafetyCenterAutoAddable.kt @@ -0,0 +1,94 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.qs.pipeline.domain.autoaddable + +import android.content.ComponentName +import android.content.pm.PackageManager +import android.content.res.Resources +import android.text.TextUtils +import com.android.systemui.R +import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.dagger.qualifiers.Background +import com.android.systemui.dagger.qualifiers.Main +import com.android.systemui.qs.pipeline.domain.model.AutoAddSignal +import com.android.systemui.qs.pipeline.domain.model.AutoAddTracking +import com.android.systemui.qs.pipeline.domain.model.AutoAddable +import com.android.systemui.qs.pipeline.shared.TileSpec +import com.android.systemui.statusbar.policy.SafetyController +import javax.inject.Inject +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.channels.awaitClose +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.withContext + +/** + * [AutoAddable] for the safety tile. + * + * It will send a signal to add the tile when the feature is enabled, indicating the component + * corresponding to the tile. If the feature is disabled, it will send a signal to remove the tile. + */ +@SysUISingleton +class SafetyCenterAutoAddable +@Inject +constructor( + private val safetyController: SafetyController, + private val packageManager: PackageManager, + @Main private val resources: Resources, + @Background private val bgDispatcher: CoroutineDispatcher, +) : AutoAddable { + + private suspend fun getSpec(): TileSpec? { + val specClass = resources.getString(R.string.safety_quick_settings_tile_class) + return if (TextUtils.isEmpty(specClass)) { + null + } else { + val packageName = + withContext(bgDispatcher) { packageManager.permissionControllerPackageName } + TileSpec.create(ComponentName(packageName, specClass)) + } + } + + override fun autoAddSignal(userId: Int): Flow<AutoAddSignal> { + return conflatedCallbackFlow { + val spec = getSpec() + if (spec != null) { + // If not added, we always try to add it + trySend(AutoAddSignal.Add(spec)) + val listener = + SafetyController.Listener { isSafetyCenterEnabled -> + if (isSafetyCenterEnabled) { + trySend(AutoAddSignal.Add(spec)) + } else { + trySend(AutoAddSignal.Remove(spec)) + } + } + + safetyController.addCallback(listener) + + awaitClose { safetyController.removeCallback(listener) } + } else { + awaitClose {} + } + } + } + + override val autoAddTracking: AutoAddTracking + get() = AutoAddTracking.Always + + override val description = "SafetyCenterAutoAddable ($autoAddTracking)" +} diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/autoaddable/WalletAutoAddable.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/autoaddable/WalletAutoAddable.kt new file mode 100644 index 000000000000..b3bc25fcfd69 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/autoaddable/WalletAutoAddable.kt @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.qs.pipeline.domain.autoaddable + +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.qs.pipeline.domain.model.AutoAddSignal +import com.android.systemui.qs.pipeline.domain.model.AutoAddTracking +import com.android.systemui.qs.pipeline.domain.model.AutoAddable +import com.android.systemui.qs.pipeline.shared.TileSpec +import com.android.systemui.qs.tiles.QuickAccessWalletTile +import com.android.systemui.statusbar.policy.WalletController +import javax.inject.Inject +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flow + +/** + * [AutoAddable] for [QuickAccessWalletTile.TILE_SPEC]. + * + * It will always try to add the tile if [WalletController.getWalletPosition] is non-null. + */ +@SysUISingleton +class WalletAutoAddable +@Inject +constructor( + private val walletController: WalletController, +) : AutoAddable { + + private val spec = TileSpec.create(QuickAccessWalletTile.TILE_SPEC) + + override fun autoAddSignal(userId: Int): Flow<AutoAddSignal> { + return flow { + val position = walletController.getWalletPosition() + if (position != null) { + emit(AutoAddSignal.Add(spec, position)) + } + } + } + + override val autoAddTracking: AutoAddTracking + get() = AutoAddTracking.IfNotAdded(spec) + + override val description = "WalletAutoAddable ($autoAddTracking)" +} diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/autoaddable/WorkTileAutoAddable.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/autoaddable/WorkTileAutoAddable.kt new file mode 100644 index 000000000000..5e3c34841c50 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/autoaddable/WorkTileAutoAddable.kt @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.qs.pipeline.domain.autoaddable + +import android.content.pm.UserInfo +import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.qs.pipeline.domain.model.AutoAddSignal +import com.android.systemui.qs.pipeline.domain.model.AutoAddTracking +import com.android.systemui.qs.pipeline.domain.model.AutoAddable +import com.android.systemui.qs.pipeline.shared.TileSpec +import com.android.systemui.qs.tiles.WorkModeTile +import com.android.systemui.settings.UserTracker +import javax.inject.Inject +import kotlinx.coroutines.channels.awaitClose +import kotlinx.coroutines.flow.Flow + +/** + * [AutoAddable] for [WorkModeTile.TILE_SPEC]. + * + * It will send a signal to add the tile when there is a managed profile for the current user, and a + * signal to remove it if there is not. + */ +@SysUISingleton +class WorkTileAutoAddable @Inject constructor(private val userTracker: UserTracker) : AutoAddable { + + private val spec = TileSpec.create(WorkModeTile.TILE_SPEC) + + override fun autoAddSignal(userId: Int): Flow<AutoAddSignal> { + return conflatedCallbackFlow { + fun maybeSend(profiles: List<UserInfo>) { + if (profiles.any { it.id == userId }) { + // We are looking at the profiles of the correct user. + if (profiles.any { it.isManagedProfile }) { + trySend(AutoAddSignal.Add(spec)) + } else { + trySend(AutoAddSignal.Remove(spec)) + } + } + } + + val callback = + object : UserTracker.Callback { + override fun onProfilesChanged(profiles: List<UserInfo>) { + maybeSend(profiles) + } + } + + userTracker.addCallback(callback) { it.run() } + maybeSend(userTracker.userProfiles) + + awaitClose { userTracker.removeCallback(callback) } + } + } + + override val autoAddTracking = AutoAddTracking.Always + + override val description = "WorkTileAutoAddable ($autoAddTracking)" +} diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/interactor/AutoAddInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/interactor/AutoAddInteractor.kt new file mode 100644 index 000000000000..b74739322fcd --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/interactor/AutoAddInteractor.kt @@ -0,0 +1,123 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.qs.pipeline.domain.interactor + +import com.android.systemui.Dumpable +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.dagger.qualifiers.Application +import com.android.systemui.dump.DumpManager +import com.android.systemui.qs.pipeline.data.repository.AutoAddRepository +import com.android.systemui.qs.pipeline.domain.model.AutoAddSignal +import com.android.systemui.qs.pipeline.domain.model.AutoAddTracking +import com.android.systemui.qs.pipeline.domain.model.AutoAddable +import com.android.systemui.qs.pipeline.shared.logging.QSPipelineLogger +import com.android.systemui.util.asIndenting +import com.android.systemui.util.indentIfPossible +import java.io.PrintWriter +import java.util.concurrent.atomic.AtomicBoolean +import javax.inject.Inject +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.flow.emptyFlow +import kotlinx.coroutines.flow.filterIsInstance +import kotlinx.coroutines.flow.merge +import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.flow.take +import kotlinx.coroutines.launch + +/** + * Collects the signals coming from all registered [AutoAddable] and adds/removes tiles accordingly. + */ +@SysUISingleton +class AutoAddInteractor +@Inject +constructor( + private val autoAddables: Set<@JvmSuppressWildcards AutoAddable>, + private val repository: AutoAddRepository, + private val dumpManager: DumpManager, + private val qsPipelineLogger: QSPipelineLogger, + @Application private val scope: CoroutineScope, +) : Dumpable { + + private val initialized = AtomicBoolean(false) + + /** Start collection of signals following the user from [currentTilesInteractor]. */ + fun init(currentTilesInteractor: CurrentTilesInteractor) { + if (!initialized.compareAndSet(false, true)) { + return + } + + dumpManager.registerNormalDumpable(TAG, this) + + scope.launch { + currentTilesInteractor.userId.collectLatest { userId -> + coroutineScope { + val previouslyAdded = repository.autoAddedTiles(userId).stateIn(this) + + autoAddables + .map { addable -> + val autoAddSignal = addable.autoAddSignal(userId) + when (val lifecycle = addable.autoAddTracking) { + is AutoAddTracking.Always -> autoAddSignal + is AutoAddTracking.Disabled -> emptyFlow() + is AutoAddTracking.IfNotAdded -> { + if (lifecycle.spec !in previouslyAdded.value) { + autoAddSignal.filterIsInstance<AutoAddSignal.Add>().take(1) + } else { + emptyFlow() + } + } + } + } + .merge() + .collect { signal -> + when (signal) { + is AutoAddSignal.Add -> { + if (signal.spec !in previouslyAdded.value) { + currentTilesInteractor.addTile(signal.spec, signal.position) + qsPipelineLogger.logTileAutoAdded( + userId, + signal.spec, + signal.position + ) + repository.markTileAdded(userId, signal.spec) + } + } + is AutoAddSignal.Remove -> { + currentTilesInteractor.removeTiles(setOf(signal.spec)) + qsPipelineLogger.logTileAutoRemoved(userId, signal.spec) + repository.unmarkTileAdded(userId, signal.spec) + } + } + } + } + } + } + } + + override fun dump(pw: PrintWriter, args: Array<out String>) { + with(pw.asIndenting()) { + println("AutoAddables:") + indentIfPossible { autoAddables.forEach { println(it.description) } } + } + } + + companion object { + private const val TAG = "AutoAddInteractor" + } +} diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/model/AutoAddSignal.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/model/AutoAddSignal.kt new file mode 100644 index 000000000000..ed7b8bd4c2f4 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/model/AutoAddSignal.kt @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.qs.pipeline.domain.model + +import com.android.systemui.qs.pipeline.data.repository.TileSpecRepository.Companion.POSITION_AT_END +import com.android.systemui.qs.pipeline.shared.TileSpec + +/** Signal indicating when a tile needs to be auto-added or removed */ +sealed interface AutoAddSignal { + /** Tile for this object */ + val spec: TileSpec + + /** Signal for auto-adding a tile at [position]. */ + data class Add( + override val spec: TileSpec, + val position: Int = POSITION_AT_END, + ) : AutoAddSignal + + /** Signal for removing a tile. */ + data class Remove( + override val spec: TileSpec, + ) : AutoAddSignal +} diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/model/AutoAddTracking.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/model/AutoAddTracking.kt new file mode 100644 index 000000000000..154d0455713b --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/model/AutoAddTracking.kt @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.qs.pipeline.domain.model + +import com.android.systemui.qs.pipeline.shared.TileSpec + +/** Strategy for when to track a particular [AutoAddable]. */ +sealed interface AutoAddTracking { + + /** + * Indicates that the signals from the associated [AutoAddable] should all be collected and + * reacted accordingly. It may have [AutoAddSignal.Add] and [AutoAddSignal.Remove]. + */ + object Always : AutoAddTracking { + override fun toString(): String { + return "Always" + } + } + + /** + * Indicates that the associated [AutoAddable] is [Disabled] and doesn't need to be collected. + */ + object Disabled : AutoAddTracking { + override fun toString(): String { + return "Disabled" + } + } + + /** + * Only the first [AutoAddSignal.Add] for each flow of signals needs to be collected, and only + * if the tile hasn't been auto-added yet. The associated [AutoAddable] will only emit + * [AutoAddSignal.Add]. + */ + data class IfNotAdded(val spec: TileSpec) : AutoAddTracking +} diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/model/AutoAddable.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/model/AutoAddable.kt new file mode 100644 index 000000000000..61fe5b4c9079 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/model/AutoAddable.kt @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.qs.pipeline.domain.model + +import kotlinx.coroutines.flow.Flow + +/** + * Tracks conditions for auto-adding or removing specific tiles. + * + * When creating a new [AutoAddable], it needs to be registered in a [Module] like + * [BaseAutoAddableModule], for example: + * ``` + * @Binds + * @IntoSet + * fun providesMyAutoAddable(autoAddable: MyAutoAddable): AutoAddable + * ``` + */ +interface AutoAddable { + + /** + * Signals associated with a particular user indicating whether a particular tile needs to be + * auto-added or auto-removed. + */ + fun autoAddSignal(userId: Int): Flow<AutoAddSignal> + + /** + * Lifecycle for this object. It indicates in which cases [autoAddSignal] should be collected + */ + val autoAddTracking: AutoAddTracking + + /** Human readable description */ + val description: String +} diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/startable/QSPipelineCoreStartable.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/startable/QSPipelineCoreStartable.kt new file mode 100644 index 000000000000..224fc1ae864f --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/startable/QSPipelineCoreStartable.kt @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.qs.pipeline.domain.startable + +import com.android.systemui.CoreStartable +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.flags.FeatureFlags +import com.android.systemui.flags.Flags +import com.android.systemui.qs.pipeline.domain.interactor.AutoAddInteractor +import com.android.systemui.qs.pipeline.domain.interactor.CurrentTilesInteractor +import javax.inject.Inject + +@SysUISingleton +class QSPipelineCoreStartable +@Inject +constructor( + private val currentTilesInteractor: CurrentTilesInteractor, + private val autoAddInteractor: AutoAddInteractor, + private val featureFlags: FeatureFlags, +) : CoreStartable { + + override fun start() { + if ( + featureFlags.isEnabled(Flags.QS_PIPELINE_NEW_HOST) && + featureFlags.isEnabled(Flags.QS_PIPELINE_AUTO_ADD) + ) { + autoAddInteractor.init(currentTilesInteractor) + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/prototyping/PrototypeCoreStartable.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/prototyping/PrototypeCoreStartable.kt deleted file mode 100644 index bbd72341acc6..000000000000 --- a/packages/SystemUI/src/com/android/systemui/qs/pipeline/prototyping/PrototypeCoreStartable.kt +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright (C) 2023 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.qs.pipeline.prototyping - -import android.util.Log -import com.android.systemui.CoreStartable -import com.android.systemui.dagger.SysUISingleton -import com.android.systemui.dagger.qualifiers.Application -import com.android.systemui.flags.FeatureFlags -import com.android.systemui.flags.Flags -import com.android.systemui.qs.pipeline.data.repository.AutoAddRepository -import com.android.systemui.qs.pipeline.data.repository.TileSpecRepository -import com.android.systemui.qs.pipeline.shared.TileSpec -import com.android.systemui.statusbar.commandline.Command -import com.android.systemui.statusbar.commandline.CommandRegistry -import com.android.systemui.user.data.repository.UserRepository -import java.io.PrintWriter -import javax.inject.Inject -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.flow.flatMapLatest -import kotlinx.coroutines.launch - -/** - * Class for observing results while prototyping. - * - * The flows do their own logging, so we just need to make sure that they collect. - * - * This will be torn down together with the last of the new pipeline flags remaining here. - */ -// TODO(b/270385608) -@SysUISingleton -class PrototypeCoreStartable -@Inject -constructor( - private val tileSpecRepository: TileSpecRepository, - private val autoAddRepository: AutoAddRepository, - private val userRepository: UserRepository, - private val featureFlags: FeatureFlags, - @Application private val scope: CoroutineScope, - private val commandRegistry: CommandRegistry, -) : CoreStartable { - - @OptIn(ExperimentalCoroutinesApi::class) - override fun start() { - if (featureFlags.isEnabled(Flags.QS_PIPELINE_NEW_HOST)) { - scope.launch { - userRepository.selectedUserInfo - .flatMapLatest { user -> tileSpecRepository.tilesSpecs(user.id) } - .collect {} - } - if (featureFlags.isEnabled(Flags.QS_PIPELINE_AUTO_ADD)) { - scope.launch { - userRepository.selectedUserInfo - .flatMapLatest { user -> autoAddRepository.autoAddedTiles(user.id) } - .collect { tiles -> Log.d(TAG, "Auto-added tiles: $tiles") } - } - } - commandRegistry.registerCommand(COMMAND, ::CommandExecutor) - } - } - - private inner class CommandExecutor : Command { - override fun execute(pw: PrintWriter, args: List<String>) { - if (args.size < 2) { - pw.println("Error: needs at least two arguments") - return - } - val spec = TileSpec.create(args[1]) - if (spec == TileSpec.Invalid) { - pw.println("Error: Invalid tile spec ${args[1]}") - } - if (args[0] == "add") { - performAdd(args, spec) - pw.println("Requested tile added") - } else if (args[0] == "remove") { - performRemove(args, spec) - pw.println("Requested tile removed") - } else { - pw.println("Error: unknown command") - } - } - - private fun performAdd(args: List<String>, spec: TileSpec) { - val position = args.getOrNull(2)?.toInt() ?: TileSpecRepository.POSITION_AT_END - val user = args.getOrNull(3)?.toInt() ?: userRepository.getSelectedUserInfo().id - scope.launch { tileSpecRepository.addTile(user, spec, position) } - } - - private fun performRemove(args: List<String>, spec: TileSpec) { - val user = args.getOrNull(2)?.toInt() ?: userRepository.getSelectedUserInfo().id - scope.launch { tileSpecRepository.removeTiles(user, listOf(spec)) } - } - - override fun help(pw: PrintWriter) { - pw.println("Usage: adb shell cmd statusbar $COMMAND:") - pw.println(" add <spec> [position] [user]") - pw.println(" remove <spec> [user]") - } - } - - companion object { - private const val COMMAND = "qs-pipeline" - private const val TAG = "PrototypeCoreStartable" - } -} diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/shared/TileSpec.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/shared/TileSpec.kt index af1cd0995a21..11b5dd7cb036 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/pipeline/shared/TileSpec.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/shared/TileSpec.kt @@ -52,7 +52,11 @@ sealed class TileSpec private constructor(open val spec: String) { internal constructor( override val spec: String, val componentName: ComponentName, - ) : TileSpec(spec) + ) : TileSpec(spec) { + override fun toString(): String { + return "CustomTileSpec(${componentName.toShortString()})" + } + } companion object { /** Create a [TileSpec] from the string [spec]. */ diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/shared/logging/QSPipelineLogger.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/shared/logging/QSPipelineLogger.kt index 8318ec99e530..d400faa3091e 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/pipeline/shared/logging/QSPipelineLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/shared/logging/QSPipelineLogger.kt @@ -19,6 +19,7 @@ package com.android.systemui.qs.pipeline.shared.logging import android.annotation.UserIdInt import com.android.systemui.log.LogBuffer import com.android.systemui.log.LogLevel +import com.android.systemui.qs.pipeline.dagger.QSAutoAddLog import com.android.systemui.qs.pipeline.dagger.QSTileListLog import com.android.systemui.qs.pipeline.shared.TileSpec import javax.inject.Inject @@ -32,10 +33,12 @@ class QSPipelineLogger @Inject constructor( @QSTileListLog private val tileListLogBuffer: LogBuffer, + @QSAutoAddLog private val tileAutoAddLogBuffer: LogBuffer, ) { companion object { const val TILE_LIST_TAG = "QSTileListLog" + const val AUTO_ADD_TAG = "QSAutoAddableLog" } /** @@ -136,6 +139,31 @@ constructor( ) } + fun logTileAutoAdded(userId: Int, spec: TileSpec, position: Int) { + tileAutoAddLogBuffer.log( + AUTO_ADD_TAG, + LogLevel.DEBUG, + { + int1 = userId + int2 = position + str1 = spec.toString() + }, + { "Tile $str1 auto added for user $int1 at position $int2" } + ) + } + + fun logTileAutoRemoved(userId: Int, spec: TileSpec) { + tileAutoAddLogBuffer.log( + AUTO_ADD_TAG, + LogLevel.DEBUG, + { + int1 = userId + str1 = spec.toString() + }, + { "Tile $str1 auto removed for user $int1" } + ) + } + /** Reasons for destroying an existing tile. */ enum class TileDestroyedReason(val readable: String) { TILE_REMOVED("Tile removed from current set"), diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/QsFrameTranslateController.java b/packages/SystemUI/src/com/android/systemui/statusbar/QsFrameTranslateController.java index 59afb18195dd..9702bfc14873 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/QsFrameTranslateController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/QsFrameTranslateController.java @@ -18,19 +18,19 @@ package com.android.systemui.statusbar; import android.view.View; +import com.android.systemui.display.data.repository.DisplayMetricsRepository; import com.android.systemui.plugins.qs.QS; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController; -import com.android.systemui.statusbar.phone.CentralSurfaces; /** * Calculates and moves the QS frame vertically. */ public abstract class QsFrameTranslateController { - protected CentralSurfaces mCentralSurfaces; + protected DisplayMetricsRepository mDisplayMetricsRepository; - public QsFrameTranslateController(CentralSurfaces centralSurfaces) { - mCentralSurfaces = centralSurfaces; + public QsFrameTranslateController(DisplayMetricsRepository displayMetricsRepository) { + mDisplayMetricsRepository = displayMetricsRepository; } /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/QsFrameTranslateImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/QsFrameTranslateImpl.java index 85b522cbd9d5..e429b8b4815a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/QsFrameTranslateImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/QsFrameTranslateImpl.java @@ -19,9 +19,9 @@ package com.android.systemui.statusbar; import android.view.View; import com.android.systemui.dagger.SysUISingleton; +import com.android.systemui.display.data.repository.DisplayMetricsRepository; import com.android.systemui.plugins.qs.QS; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController; -import com.android.systemui.statusbar.phone.CentralSurfaces; import javax.inject.Inject; @@ -34,8 +34,8 @@ import javax.inject.Inject; public class QsFrameTranslateImpl extends QsFrameTranslateController { @Inject - public QsFrameTranslateImpl(CentralSurfaces centralSurfaces) { - super(centralSurfaces); + public QsFrameTranslateImpl(DisplayMetricsRepository displayMetricsRepository) { + super(displayMetricsRepository); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifCollection.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifCollection.java index 2796340c598f..5c72731e71a7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifCollection.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifCollection.java @@ -875,6 +875,7 @@ public class NotifCollection implements Dumpable, PipelineDumpable { && !hasFlag(entry, Notification.FLAG_ONGOING_EVENT) && !hasFlag(entry, Notification.FLAG_BUBBLE) && !hasFlag(entry, Notification.FLAG_NO_CLEAR) + && (entry.getChannel() == null || !entry.getChannel().isImportantConversation()) && entry.getDismissState() != DISMISSED; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java index f6d53b3bc9b3..5eafa9e97088 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java @@ -20,6 +20,7 @@ import android.annotation.Nullable; import android.content.ComponentName; import android.content.Context; import android.content.res.Resources; +import android.database.ContentObserver; import android.hardware.display.ColorDisplayManager; import android.hardware.display.NightDisplayListener; import android.os.Handler; @@ -28,6 +29,7 @@ import android.util.Log; import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.R; +import com.android.systemui.dagger.NightDisplayListenerModule; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.qs.AutoAddTracker; @@ -82,7 +84,8 @@ public class AutoTileManager implements UserAwareController { private final HotspotController mHotspotController; private final DataSaverController mDataSaverController; private final ManagedProfileController mManagedProfileController; - private final NightDisplayListener mNightDisplayListener; + private final NightDisplayListenerModule.Builder mNightDisplayListenerBuilder; + private NightDisplayListener mNightDisplayListener; private final CastController mCastController; private final DeviceControlsController mDeviceControlsController; private final WalletController mWalletController; @@ -98,7 +101,7 @@ public class AutoTileManager implements UserAwareController { HotspotController hotspotController, DataSaverController dataSaverController, ManagedProfileController managedProfileController, - NightDisplayListener nightDisplayListener, + NightDisplayListenerModule.Builder nightDisplayListenerBuilder, CastController castController, ReduceBrightColorsController reduceBrightColorsController, DeviceControlsController deviceControlsController, @@ -114,7 +117,7 @@ public class AutoTileManager implements UserAwareController { mHotspotController = hotspotController; mDataSaverController = dataSaverController; mManagedProfileController = managedProfileController; - mNightDisplayListener = nightDisplayListener; + mNightDisplayListenerBuilder = nightDisplayListenerBuilder; mCastController = castController; mReduceBrightColorsController = reduceBrightColorsController; mIsReduceBrightColorsAvailable = isReduceBrightColorsAvailable; @@ -157,6 +160,10 @@ public class AutoTileManager implements UserAwareController { mDataSaverController.addCallback(mDataSaverListener); } mManagedProfileController.addCallback(mProfileCallback); + + mNightDisplayListener = mNightDisplayListenerBuilder + .setUser(mCurrentUser.getIdentifier()) + .build(); if (!mAutoTracker.isAdded(NIGHT) && ColorDisplayManager.isNightDisplayAvailable(mContext)) { mNightDisplayListener.setCallback(mNightDisplayCallback); @@ -193,7 +200,8 @@ public class AutoTileManager implements UserAwareController { mHotspotController.removeCallback(mHotspotCallback); mDataSaverController.removeCallback(mDataSaverListener); mManagedProfileController.removeCallback(mProfileCallback); - if (ColorDisplayManager.isNightDisplayAvailable(mContext)) { + if (ColorDisplayManager.isNightDisplayAvailable(mContext) + && mNightDisplayListener != null) { mNightDisplayListener.setCallback(null); } if (mIsReduceBrightColorsAvailable) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java index 0242e913e573..4ba09e175b8b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java @@ -40,6 +40,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.keyguard.AuthKeyguardMessageArea; import com.android.systemui.Dumpable; import com.android.systemui.animation.ActivityLaunchAnimator; +import com.android.systemui.display.data.repository.DisplayMetricsRepository; import com.android.systemui.navigationbar.NavigationBarView; import com.android.systemui.plugins.ActivityStarter.OnDismissAction; import com.android.systemui.qs.QSPanelController; @@ -250,8 +251,12 @@ public interface CentralSurfaces extends Dumpable, LifecycleOwner { @Override void dump(PrintWriter pwOriginal, String[] args); + /** @deprecated Use {@link DisplayMetricsRepository} instead. */ + @Deprecated float getDisplayWidth(); + /** @deprecated Use {@link DisplayMetricsRepository} instead. */ + @Deprecated float getDisplayHeight(); void readyForKeyguardDone(); @@ -394,6 +399,9 @@ public interface CentralSurfaces extends Dumpable, LifecycleOwner { void setLaunchEmergencyActionOnFinishedWaking(boolean launch); QSPanelController getQSPanelController(); + + /** @deprecated Use {@link DisplayMetricsRepository} instead. */ + @Deprecated float getDisplayDensity(); void extendDozePulse(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java index 4ae4c52d19ba..88ccae624dd0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java @@ -2114,16 +2114,19 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { } @Override + @Deprecated public float getDisplayDensity() { return mDisplayMetrics.density; } @Override + @Deprecated public float getDisplayWidth() { return mDisplayMetrics.widthPixels; } @Override + @Deprecated public float getDisplayHeight() { return mDisplayMetrics.heightPixels; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java index e6b76ad0e00c..3b5aaeac6c21 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java @@ -48,6 +48,7 @@ import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.qualifiers.DisplayId; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dagger.qualifiers.UiBackground; +import com.android.systemui.display.domain.interactor.ConnectedDisplayInteractor; import com.android.systemui.privacy.PrivacyItem; import com.android.systemui.privacy.PrivacyItemController; import com.android.systemui.privacy.PrivacyType; @@ -74,6 +75,7 @@ import com.android.systemui.statusbar.policy.SensorPrivacyController; import com.android.systemui.statusbar.policy.UserInfoController; import com.android.systemui.statusbar.policy.ZenModeController; import com.android.systemui.util.RingerModeTracker; +import com.android.systemui.util.kotlin.JavaAdapter; import com.android.systemui.util.time.DateFormatUtil; import java.io.PrintWriter; @@ -121,9 +123,12 @@ public class PhoneStatusBarPolicy private final String mSlotCamera; private final String mSlotSensorsOff; private final String mSlotScreenRecord; + private final String mSlotConnectedDisplay; private final int mDisplayId; private final SharedPreferences mSharedPreferences; private final DateFormatUtil mDateFormatUtil; + private final JavaAdapter mJavaAdapter; + private final ConnectedDisplayInteractor mConnectedDisplayInteractor; private final TelecomManager mTelecomManager; private final Handler mHandler; @@ -182,9 +187,13 @@ public class PhoneStatusBarPolicy @Main SharedPreferences sharedPreferences, DateFormatUtil dateFormatUtil, RingerModeTracker ringerModeTracker, PrivacyItemController privacyItemController, - PrivacyLogger privacyLogger) { + PrivacyLogger privacyLogger, + ConnectedDisplayInteractor connectedDisplayInteractor, + JavaAdapter javaAdapter + ) { mIconController = iconController; mCommandQueue = commandQueue; + mConnectedDisplayInteractor = connectedDisplayInteractor; mBroadcastDispatcher = broadcastDispatcher; mHandler = new Handler(looper); mResources = resources; @@ -211,8 +220,11 @@ public class PhoneStatusBarPolicy mTelecomManager = telecomManager; mRingerModeTracker = ringerModeTracker; mPrivacyLogger = privacyLogger; + mJavaAdapter = javaAdapter; mSlotCast = resources.getString(com.android.internal.R.string.status_bar_cast); + mSlotConnectedDisplay = resources.getString( + com.android.internal.R.string.status_bar_connected_display); mSlotHotspot = resources.getString(com.android.internal.R.string.status_bar_hotspot); mSlotBluetooth = resources.getString(com.android.internal.R.string.status_bar_bluetooth); mSlotTty = resources.getString(com.android.internal.R.string.status_bar_tty); @@ -285,6 +297,10 @@ public class PhoneStatusBarPolicy mIconController.setIcon(mSlotCast, R.drawable.stat_sys_cast, null); mIconController.setIconVisibility(mSlotCast, false); + // connected display + mIconController.setIcon(mSlotConnectedDisplay, R.drawable.stat_sys_connected_display, null); + mIconController.setIconVisibility(mSlotConnectedDisplay, false); + // hotspot mIconController.setIcon(mSlotHotspot, R.drawable.stat_sys_hotspot, mResources.getString(R.string.accessibility_status_bar_hotspot)); @@ -342,6 +358,8 @@ public class PhoneStatusBarPolicy mSensorPrivacyController.addCallback(mSensorPrivacyListener); mLocationController.addCallback(this); mRecordingController.addCallback(this); + mJavaAdapter.alwaysCollectFlow(mConnectedDisplayInteractor.getConnectedDisplayState(), + this::onConnectedDisplayAvailabilityChanged); mCommandQueue.addCallback(this); } @@ -800,4 +818,14 @@ public class PhoneStatusBarPolicy if (DEBUG) Log.d(TAG, "screenrecord: hiding icon"); mHandler.post(() -> mIconController.setIconVisibility(mSlotScreenRecord, false)); } + + private void onConnectedDisplayAvailabilityChanged(ConnectedDisplayInteractor.State state) { + boolean visible = state != ConnectedDisplayInteractor.State.DISCONNECTED; + + if (DEBUG) { + Log.d(TAG, "connected_display: " + (visible ? "showing" : "hiding") + " icon"); + } + + mIconController.setIconVisibility(mSlotConnectedDisplay, visible); + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java index e63875b92b64..cb2a78d8be35 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -703,7 +703,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb @Override public void reset(boolean hideBouncerWhenShowing) { - if (mKeyguardStateController.isShowing()) { + if (mKeyguardStateController.isShowing() && !bouncerIsAnimatingAway()) { final boolean isOccluded = mKeyguardStateController.isOccluded(); // Hide quick settings. mShadeViewController.resetViews(/* animate= */ !isOccluded); diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPinViewControllerTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPinViewControllerTest.kt index d3b41902499c..5a56bafc1992 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPinViewControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPinViewControllerTest.kt @@ -97,21 +97,7 @@ class KeyguardPinViewControllerTest : SysuiTestCase() { `when`(keyguardPinView.findViewById<NumPadButton>(R.id.delete_button)) .thenReturn(deleteButton) `when`(keyguardPinView.findViewById<View>(R.id.key_enter)).thenReturn(enterButton) - pinViewController = - KeyguardPinViewController( - keyguardPinView, - keyguardUpdateMonitor, - securityMode, - lockPatternUtils, - mKeyguardSecurityCallback, - keyguardMessageAreaControllerFactory, - mLatencyTracker, - liftToActivateListener, - mEmergencyButtonController, - falsingCollector, - postureController, - featureFlags - ) + constructViewController() } @Test @@ -135,8 +121,10 @@ class KeyguardPinViewControllerTest : SysuiTestCase() { `when`(lockPatternUtils.isAutoPinConfirmEnabled(anyInt())).thenReturn(true) `when`(lockPatternUtils.getCurrentFailedPasswordAttempts(anyInt())).thenReturn(3) `when`(passwordTextView.text).thenReturn("") + constructViewController() pinViewController.startAppearAnimation() + verify(deleteButton).visibility = View.INVISIBLE verify(enterButton).visibility = View.INVISIBLE verify(passwordTextView).setUsePinShapes(true) @@ -150,8 +138,10 @@ class KeyguardPinViewControllerTest : SysuiTestCase() { `when`(lockPatternUtils.isAutoPinConfirmEnabled(anyInt())).thenReturn(true) `when`(lockPatternUtils.getCurrentFailedPasswordAttempts(anyInt())).thenReturn(6) `when`(passwordTextView.text).thenReturn("") + constructViewController() pinViewController.startAppearAnimation() + verify(deleteButton).visibility = View.VISIBLE verify(enterButton).visibility = View.VISIBLE verify(passwordTextView).setUsePinShapes(true) @@ -163,4 +153,22 @@ class KeyguardPinViewControllerTest : SysuiTestCase() { pinViewController.handleAttemptLockout(0) verify(lockPatternUtils).getCurrentFailedPasswordAttempts(anyInt()) } + + fun constructViewController() { + pinViewController = + KeyguardPinViewController( + keyguardPinView, + keyguardUpdateMonitor, + securityMode, + lockPatternUtils, + mKeyguardSecurityCallback, + keyguardMessageAreaControllerFactory, + mLatencyTracker, + liftToActivateListener, + mEmergencyButtonController, + falsingCollector, + postureController, + featureFlags + ) + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/authentication/domain/interactor/AuthenticationInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/authentication/domain/interactor/AuthenticationInteractorTest.kt index ac2d492f3320..ea3289cc3836 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/authentication/domain/interactor/AuthenticationInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/authentication/domain/interactor/AuthenticationInteractorTest.kt @@ -25,7 +25,6 @@ import com.android.systemui.coroutines.collectLastValue import com.android.systemui.scene.SceneTestUtils import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.runCurrent import kotlinx.coroutines.test.runTest import org.junit.Test @@ -37,8 +36,8 @@ import org.junit.runners.JUnit4 @RunWith(JUnit4::class) class AuthenticationInteractorTest : SysuiTestCase() { - private val testScope = TestScope() - private val utils = SceneTestUtils(this, testScope) + private val utils = SceneTestUtils(this) + private val testScope = utils.testScope private val repository: AuthenticationRepository = utils.authenticationRepository() private val underTest = utils.authenticationInteractor( @@ -46,47 +45,23 @@ class AuthenticationInteractorTest : SysuiTestCase() { ) @Test - fun authMethod() = + fun getAuthenticationMethod() = testScope.runTest { - val authMethod by collectLastValue(underTest.authenticationMethod) - assertThat(authMethod).isEqualTo(AuthenticationMethodModel.Pin(1234)) + assertThat(underTest.getAuthenticationMethod()) + .isEqualTo(AuthenticationMethodModel.Pin(1234)) - underTest.setAuthenticationMethod(AuthenticationMethodModel.Password("password")) - assertThat(authMethod).isEqualTo(AuthenticationMethodModel.Password("password")) + utils.authenticationRepository.setAuthenticationMethod( + AuthenticationMethodModel.Password("password") + ) + assertThat(underTest.getAuthenticationMethod()) + .isEqualTo(AuthenticationMethodModel.Password("password")) } @Test fun isUnlocked_whenAuthMethodIsNone_isTrue() = testScope.runTest { + utils.authenticationRepository.setAuthenticationMethod(AuthenticationMethodModel.None) val isUnlocked by collectLastValue(underTest.isUnlocked) - assertThat(isUnlocked).isFalse() - - underTest.setAuthenticationMethod(AuthenticationMethodModel.None) - - assertThat(isUnlocked).isTrue() - } - - @Test - fun unlockDevice() = - testScope.runTest { - val isUnlocked by collectLastValue(underTest.isUnlocked) - assertThat(isUnlocked).isFalse() - - underTest.unlockDevice() - runCurrent() - - assertThat(isUnlocked).isTrue() - } - - @Test - fun biometricUnlock() = - testScope.runTest { - val isUnlocked by collectLastValue(underTest.isUnlocked) - assertThat(isUnlocked).isFalse() - - underTest.biometricUnlock() - runCurrent() - assertThat(isUnlocked).isTrue() } @@ -106,9 +81,11 @@ class AuthenticationInteractorTest : SysuiTestCase() { @Test fun isAuthenticationRequired_lockedAndSecured_true() = testScope.runTest { - underTest.lockDevice() + utils.authenticationRepository.setUnlocked(false) runCurrent() - underTest.setAuthenticationMethod(AuthenticationMethodModel.Password("password")) + utils.authenticationRepository.setAuthenticationMethod( + AuthenticationMethodModel.Password("password") + ) assertThat(underTest.isAuthenticationRequired()).isTrue() } @@ -116,9 +93,9 @@ class AuthenticationInteractorTest : SysuiTestCase() { @Test fun isAuthenticationRequired_lockedAndNotSecured_false() = testScope.runTest { - underTest.lockDevice() + utils.authenticationRepository.setUnlocked(false) runCurrent() - underTest.setAuthenticationMethod(AuthenticationMethodModel.Swipe) + utils.authenticationRepository.setAuthenticationMethod(AuthenticationMethodModel.Swipe) assertThat(underTest.isAuthenticationRequired()).isFalse() } @@ -126,9 +103,11 @@ class AuthenticationInteractorTest : SysuiTestCase() { @Test fun isAuthenticationRequired_unlockedAndSecured_false() = testScope.runTest { - underTest.unlockDevice() + utils.authenticationRepository.setUnlocked(true) runCurrent() - underTest.setAuthenticationMethod(AuthenticationMethodModel.Password("password")) + utils.authenticationRepository.setAuthenticationMethod( + AuthenticationMethodModel.Password("password") + ) assertThat(underTest.isAuthenticationRequired()).isFalse() } @@ -136,67 +115,63 @@ class AuthenticationInteractorTest : SysuiTestCase() { @Test fun isAuthenticationRequired_unlockedAndNotSecured_false() = testScope.runTest { - underTest.unlockDevice() + utils.authenticationRepository.setUnlocked(true) runCurrent() - underTest.setAuthenticationMethod(AuthenticationMethodModel.Swipe) + utils.authenticationRepository.setAuthenticationMethod(AuthenticationMethodModel.Swipe) assertThat(underTest.isAuthenticationRequired()).isFalse() } @Test - fun authenticate_withCorrectPin_returnsTrueAndUnlocksDevice() = + fun authenticate_withCorrectPin_returnsTrue() = testScope.runTest { val failedAttemptCount by collectLastValue(underTest.failedAuthenticationAttempts) - val isUnlocked by collectLastValue(underTest.isUnlocked) - underTest.setAuthenticationMethod(AuthenticationMethodModel.Pin(1234)) - assertThat(isUnlocked).isFalse() + utils.authenticationRepository.setAuthenticationMethod( + AuthenticationMethodModel.Pin(1234) + ) assertThat(underTest.authenticate(listOf(1, 2, 3, 4))).isTrue() - assertThat(isUnlocked).isTrue() assertThat(failedAttemptCount).isEqualTo(0) } @Test - fun authenticate_withIncorrectPin_returnsFalseAndDoesNotUnlockDevice() = + fun authenticate_withIncorrectPin_returnsFalse() = testScope.runTest { val failedAttemptCount by collectLastValue(underTest.failedAuthenticationAttempts) - val isUnlocked by collectLastValue(underTest.isUnlocked) - underTest.setAuthenticationMethod(AuthenticationMethodModel.Pin(1234)) - assertThat(isUnlocked).isFalse() + utils.authenticationRepository.setAuthenticationMethod( + AuthenticationMethodModel.Pin(1234) + ) assertThat(underTest.authenticate(listOf(9, 8, 7))).isFalse() - assertThat(isUnlocked).isFalse() assertThat(failedAttemptCount).isEqualTo(1) } @Test - fun authenticate_withEmptyPin_returnsFalseAndDoesNotUnlockDevice() = + fun authenticate_withEmptyPin_returnsFalse() = testScope.runTest { val failedAttemptCount by collectLastValue(underTest.failedAuthenticationAttempts) - val isUnlocked by collectLastValue(underTest.isUnlocked) - underTest.setAuthenticationMethod(AuthenticationMethodModel.Pin(1234)) - assertThat(isUnlocked).isFalse() + utils.authenticationRepository.setAuthenticationMethod( + AuthenticationMethodModel.Pin(1234) + ) assertThat(underTest.authenticate(listOf())).isFalse() - assertThat(isUnlocked).isFalse() assertThat(failedAttemptCount).isEqualTo(1) } @Test - fun authenticate_withCorrectMaxLengthPin_returnsTrueAndUnlocksDevice() = + fun authenticate_withCorrectMaxLengthPin_returnsTrue() = testScope.runTest { val failedAttemptCount by collectLastValue(underTest.failedAuthenticationAttempts) - val isUnlocked by collectLastValue(underTest.isUnlocked) - underTest.setAuthenticationMethod(AuthenticationMethodModel.Pin(9999999999999999)) - assertThat(isUnlocked).isFalse() + utils.authenticationRepository.setAuthenticationMethod( + AuthenticationMethodModel.Pin(9999999999999999) + ) assertThat(underTest.authenticate(List(16) { 9 })).isTrue() - assertThat(isUnlocked).isTrue() assertThat(failedAttemptCount).isEqualTo(0) } @Test - fun authenticate_withCorrectTooLongPin_returnsFalseAndDoesNotUnlockDevice() = + fun authenticate_withCorrectTooLongPin_returnsFalse() = testScope.runTest { // Max pin length is 16 digits. To avoid issues with overflows, this test ensures // that all pins > 16 decimal digits are rejected. @@ -205,47 +180,43 @@ class AuthenticationInteractorTest : SysuiTestCase() { assertThat(DevicePolicyManager.MAX_PASSWORD_LENGTH).isLessThan(17) val failedAttemptCount by collectLastValue(underTest.failedAuthenticationAttempts) - val isUnlocked by collectLastValue(underTest.isUnlocked) - underTest.setAuthenticationMethod(AuthenticationMethodModel.Pin(99999999999999999)) - assertThat(isUnlocked).isFalse() + utils.authenticationRepository.setAuthenticationMethod( + AuthenticationMethodModel.Pin(99999999999999999) + ) assertThat(underTest.authenticate(List(17) { 9 })).isFalse() - assertThat(isUnlocked).isFalse() assertThat(failedAttemptCount).isEqualTo(1) } @Test - fun authenticate_withCorrectPassword_returnsTrueAndUnlocksDevice() = + fun authenticate_withCorrectPassword_returnsTrue() = testScope.runTest { val failedAttemptCount by collectLastValue(underTest.failedAuthenticationAttempts) - val isUnlocked by collectLastValue(underTest.isUnlocked) - underTest.setAuthenticationMethod(AuthenticationMethodModel.Password("password")) - assertThat(isUnlocked).isFalse() + utils.authenticationRepository.setAuthenticationMethod( + AuthenticationMethodModel.Password("password") + ) assertThat(underTest.authenticate("password".toList())).isTrue() - assertThat(isUnlocked).isTrue() assertThat(failedAttemptCount).isEqualTo(0) } @Test - fun authenticate_withIncorrectPassword_returnsFalseAndDoesNotUnlockDevice() = + fun authenticate_withIncorrectPassword_returnsFalse() = testScope.runTest { val failedAttemptCount by collectLastValue(underTest.failedAuthenticationAttempts) - val isUnlocked by collectLastValue(underTest.isUnlocked) - underTest.setAuthenticationMethod(AuthenticationMethodModel.Password("password")) - assertThat(isUnlocked).isFalse() + utils.authenticationRepository.setAuthenticationMethod( + AuthenticationMethodModel.Password("password") + ) assertThat(underTest.authenticate("alohomora".toList())).isFalse() - assertThat(isUnlocked).isFalse() assertThat(failedAttemptCount).isEqualTo(1) } @Test - fun authenticate_withCorrectPattern_returnsTrueAndUnlocksDevice() = + fun authenticate_withCorrectPattern_returnsTrue() = testScope.runTest { val failedAttemptCount by collectLastValue(underTest.failedAuthenticationAttempts) - val isUnlocked by collectLastValue(underTest.isUnlocked) - underTest.setAuthenticationMethod( + utils.authenticationRepository.setAuthenticationMethod( AuthenticationMethodModel.Pattern( listOf( AuthenticationMethodModel.Pattern.PatternCoordinate( @@ -263,7 +234,6 @@ class AuthenticationInteractorTest : SysuiTestCase() { ) ) ) - assertThat(isUnlocked).isFalse() assertThat( underTest.authenticate( @@ -284,16 +254,14 @@ class AuthenticationInteractorTest : SysuiTestCase() { ) ) .isTrue() - assertThat(isUnlocked).isTrue() assertThat(failedAttemptCount).isEqualTo(0) } @Test - fun authenticate_withIncorrectPattern_returnsFalseAndDoesNotUnlockDevice() = + fun authenticate_withIncorrectPattern_returnsFalse() = testScope.runTest { val failedAttemptCount by collectLastValue(underTest.failedAuthenticationAttempts) - val isUnlocked by collectLastValue(underTest.isUnlocked) - underTest.setAuthenticationMethod( + utils.authenticationRepository.setAuthenticationMethod( AuthenticationMethodModel.Pattern( listOf( AuthenticationMethodModel.Pattern.PatternCoordinate( @@ -311,7 +279,6 @@ class AuthenticationInteractorTest : SysuiTestCase() { ) ) ) - assertThat(isUnlocked).isFalse() assertThat( underTest.authenticate( @@ -332,22 +299,18 @@ class AuthenticationInteractorTest : SysuiTestCase() { ) ) .isFalse() - assertThat(isUnlocked).isFalse() assertThat(failedAttemptCount).isEqualTo(1) } @Test - fun tryAutoConfirm_withAutoConfirmPinAndEmptyInput_returnsNullAndHasNoEffect() = + fun tryAutoConfirm_withAutoConfirmPinAndEmptyInput_returnsNull() = testScope.runTest { val failedAttemptCount by collectLastValue(underTest.failedAuthenticationAttempts) - val isUnlocked by collectLastValue(underTest.isUnlocked) - underTest.setAuthenticationMethod( + utils.authenticationRepository.setAuthenticationMethod( AuthenticationMethodModel.Pin(1234, autoConfirm = true) ) - assertThat(isUnlocked).isFalse() assertThat(underTest.authenticate(listOf(), tryAutoConfirm = true)).isNull() - assertThat(isUnlocked).isFalse() assertThat(failedAttemptCount).isEqualTo(0) } @@ -355,14 +318,11 @@ class AuthenticationInteractorTest : SysuiTestCase() { fun tryAutoConfirm_withAutoConfirmPinAndShorterPin_returnsNullAndHasNoEffect() = testScope.runTest { val failedAttemptCount by collectLastValue(underTest.failedAuthenticationAttempts) - val isUnlocked by collectLastValue(underTest.isUnlocked) - underTest.setAuthenticationMethod( + utils.authenticationRepository.setAuthenticationMethod( AuthenticationMethodModel.Pin(1234, autoConfirm = true) ) - assertThat(isUnlocked).isFalse() assertThat(underTest.authenticate(listOf(1, 2, 3), tryAutoConfirm = true)).isNull() - assertThat(isUnlocked).isFalse() assertThat(failedAttemptCount).isEqualTo(0) } @@ -370,14 +330,11 @@ class AuthenticationInteractorTest : SysuiTestCase() { fun tryAutoConfirm_withAutoConfirmWrongPinCorrectLength_returnsFalseAndDoesNotUnlockDevice() = testScope.runTest { val failedAttemptCount by collectLastValue(underTest.failedAuthenticationAttempts) - val isUnlocked by collectLastValue(underTest.isUnlocked) - underTest.setAuthenticationMethod( + utils.authenticationRepository.setAuthenticationMethod( AuthenticationMethodModel.Pin(1234, autoConfirm = true) ) - assertThat(isUnlocked).isFalse() assertThat(underTest.authenticate(listOf(1, 2, 4, 4), tryAutoConfirm = true)).isFalse() - assertThat(isUnlocked).isFalse() assertThat(failedAttemptCount).isEqualTo(1) } @@ -385,15 +342,12 @@ class AuthenticationInteractorTest : SysuiTestCase() { fun tryAutoConfirm_withAutoConfirmLongerPin_returnsFalseAndDoesNotUnlockDevice() = testScope.runTest { val failedAttemptCount by collectLastValue(underTest.failedAuthenticationAttempts) - val isUnlocked by collectLastValue(underTest.isUnlocked) - underTest.setAuthenticationMethod( + utils.authenticationRepository.setAuthenticationMethod( AuthenticationMethodModel.Pin(1234, autoConfirm = true) ) - assertThat(isUnlocked).isFalse() assertThat(underTest.authenticate(listOf(1, 2, 3, 4, 5), tryAutoConfirm = true)) .isFalse() - assertThat(isUnlocked).isFalse() assertThat(failedAttemptCount).isEqualTo(1) } @@ -401,14 +355,11 @@ class AuthenticationInteractorTest : SysuiTestCase() { fun tryAutoConfirm_withAutoConfirmCorrectPin_returnsTrueAndUnlocksDevice() = testScope.runTest { val failedAttemptCount by collectLastValue(underTest.failedAuthenticationAttempts) - val isUnlocked by collectLastValue(underTest.isUnlocked) - underTest.setAuthenticationMethod( + utils.authenticationRepository.setAuthenticationMethod( AuthenticationMethodModel.Pin(1234, autoConfirm = true) ) - assertThat(isUnlocked).isFalse() assertThat(underTest.authenticate(listOf(1, 2, 4, 4), tryAutoConfirm = true)).isFalse() - assertThat(isUnlocked).isFalse() assertThat(failedAttemptCount).isEqualTo(1) } @@ -416,14 +367,11 @@ class AuthenticationInteractorTest : SysuiTestCase() { fun tryAutoConfirm_withoutAutoConfirmButCorrectPin_returnsNullAndHasNoEffects() = testScope.runTest { val failedAttemptCount by collectLastValue(underTest.failedAuthenticationAttempts) - val isUnlocked by collectLastValue(underTest.isUnlocked) - underTest.setAuthenticationMethod( + utils.authenticationRepository.setAuthenticationMethod( AuthenticationMethodModel.Pin(1234, autoConfirm = false) ) - assertThat(isUnlocked).isFalse() assertThat(underTest.authenticate(listOf(1, 2, 3, 4), tryAutoConfirm = true)).isNull() - assertThat(isUnlocked).isFalse() assertThat(failedAttemptCount).isEqualTo(0) } @@ -431,23 +379,11 @@ class AuthenticationInteractorTest : SysuiTestCase() { fun tryAutoConfirm_withoutCorrectPassword_returnsNullAndHasNoEffects() = testScope.runTest { val failedAttemptCount by collectLastValue(underTest.failedAuthenticationAttempts) - val isUnlocked by collectLastValue(underTest.isUnlocked) - underTest.setAuthenticationMethod(AuthenticationMethodModel.Password("password")) - assertThat(isUnlocked).isFalse() + utils.authenticationRepository.setAuthenticationMethod( + AuthenticationMethodModel.Password("password") + ) assertThat(underTest.authenticate("password".toList(), tryAutoConfirm = true)).isNull() - assertThat(isUnlocked).isFalse() assertThat(failedAttemptCount).isEqualTo(0) } - - @Test - fun unlocksDevice_whenAuthMethodBecomesNone() = - testScope.runTest { - val isUnlocked by collectLastValue(underTest.isUnlocked) - assertThat(isUnlocked).isFalse() - - repository.setAuthenticationMethod(AuthenticationMethodModel.None) - - assertThat(isUnlocked).isTrue() - } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java index 821c2cbbafca..30e54474bbde 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java @@ -1316,12 +1316,22 @@ public class UdfpsControllerTest extends SysuiTestCase { // WHEN ACTION_DOWN is received when(mSinglePointerTouchProcessor.processTouch(any(), anyInt(), any())).thenReturn( processorResultDown); - MotionEvent downEvent = MotionEvent.obtain(0, 0, ACTION_DOWN, 0, 0, 0); - mTouchListenerCaptor.getValue().onTouch(mUdfpsView, downEvent); + MotionEvent event = MotionEvent.obtain(0, 0, ACTION_DOWN, 0, 0, 0); + mTouchListenerCaptor.getValue().onTouch(mUdfpsView, event); mBiometricExecutor.runAllReady(); - downEvent.recycle(); - // THEN the touch is pilfered + // WHEN ACTION_MOVE is received after + final TouchProcessorResult processorResultUnchanged = + new TouchProcessorResult.ProcessedTouch( + InteractionEvent.UNCHANGED, 1 /* pointerId */, touchData); + when(mSinglePointerTouchProcessor.processTouch(any(), anyInt(), any())).thenReturn( + processorResultUnchanged); + event.setAction(ACTION_MOVE); + mTouchListenerCaptor.getValue().onTouch(mUdfpsView, event); + mBiometricExecutor.runAllReady(); + event.recycle(); + + // THEN only pilfer once on the initial down verify(mInputManager).pilferPointers(any()); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/bouncer/domain/interactor/BouncerInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/bouncer/domain/interactor/BouncerInteractorTest.kt index 9483667909d5..d09353b40e66 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/bouncer/domain/interactor/BouncerInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/bouncer/domain/interactor/BouncerInteractorTest.kt @@ -26,7 +26,6 @@ import com.android.systemui.scene.shared.model.SceneKey import com.android.systemui.scene.shared.model.SceneModel import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.advanceTimeBy import kotlinx.coroutines.test.runCurrent import kotlinx.coroutines.test.runTest @@ -40,8 +39,8 @@ import org.junit.runners.JUnit4 @RunWith(JUnit4::class) class BouncerInteractorTest : SysuiTestCase() { - private val testScope = TestScope() - private val utils = SceneTestUtils(this, testScope) + private val utils = SceneTestUtils(this) + private val testScope = utils.testScope private val authenticationInteractor = utils.authenticationInteractor( repository = utils.authenticationRepository(), @@ -69,8 +68,10 @@ class BouncerInteractorTest : SysuiTestCase() { val currentScene by collectLastValue(sceneInteractor.currentScene("container1")) val message by collectLastValue(underTest.message) - authenticationInteractor.setAuthenticationMethod(AuthenticationMethodModel.Pin(1234)) - authenticationInteractor.lockDevice() + utils.authenticationRepository.setAuthenticationMethod( + AuthenticationMethodModel.Pin(1234) + ) + utils.authenticationRepository.setUnlocked(false) underTest.showOrUnlockDevice("container1") assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer)) assertThat(message).isEqualTo(MESSAGE_ENTER_YOUR_PIN) @@ -100,10 +101,10 @@ class BouncerInteractorTest : SysuiTestCase() { val currentScene by collectLastValue(sceneInteractor.currentScene("container1")) val message by collectLastValue(underTest.message) - authenticationInteractor.setAuthenticationMethod( + utils.authenticationRepository.setAuthenticationMethod( AuthenticationMethodModel.Pin(1234, autoConfirm = true) ) - authenticationInteractor.lockDevice() + utils.authenticationRepository.setUnlocked(false) underTest.showOrUnlockDevice("container1") assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer)) assertThat(message).isEqualTo(MESSAGE_ENTER_YOUR_PIN) @@ -130,10 +131,10 @@ class BouncerInteractorTest : SysuiTestCase() { val currentScene by collectLastValue(sceneInteractor.currentScene("container1")) val message by collectLastValue(underTest.message) - authenticationInteractor.setAuthenticationMethod( + utils.authenticationRepository.setAuthenticationMethod( AuthenticationMethodModel.Pin(1234, autoConfirm = false) ) - authenticationInteractor.lockDevice() + utils.authenticationRepository.setUnlocked(false) underTest.showOrUnlockDevice("container1") assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer)) underTest.clearMessage() @@ -154,10 +155,10 @@ class BouncerInteractorTest : SysuiTestCase() { testScope.runTest { val currentScene by collectLastValue(sceneInteractor.currentScene("container1")) val message by collectLastValue(underTest.message) - authenticationInteractor.setAuthenticationMethod( + utils.authenticationRepository.setAuthenticationMethod( AuthenticationMethodModel.Password("password") ) - authenticationInteractor.lockDevice() + utils.authenticationRepository.setUnlocked(false) underTest.showOrUnlockDevice("container1") assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer)) assertThat(message).isEqualTo(MESSAGE_ENTER_YOUR_PASSWORD) @@ -186,10 +187,10 @@ class BouncerInteractorTest : SysuiTestCase() { testScope.runTest { val currentScene by collectLastValue(sceneInteractor.currentScene("container1")) val message by collectLastValue(underTest.message) - authenticationInteractor.setAuthenticationMethod( + utils.authenticationRepository.setAuthenticationMethod( AuthenticationMethodModel.Pattern(emptyList()) ) - authenticationInteractor.lockDevice() + utils.authenticationRepository.setUnlocked(false) underTest.showOrUnlockDevice("container1") assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer)) assertThat(message).isEqualTo(MESSAGE_ENTER_YOUR_PATTERN) @@ -222,8 +223,10 @@ class BouncerInteractorTest : SysuiTestCase() { fun showOrUnlockDevice_notLocked_switchesToGoneScene() = testScope.runTest { val currentScene by collectLastValue(sceneInteractor.currentScene("container1")) - authenticationInteractor.setAuthenticationMethod(AuthenticationMethodModel.Pin(1234)) - authenticationInteractor.unlockDevice() + utils.authenticationRepository.setAuthenticationMethod( + AuthenticationMethodModel.Pin(1234) + ) + utils.authenticationRepository.setUnlocked(true) runCurrent() underTest.showOrUnlockDevice("container1") @@ -235,8 +238,8 @@ class BouncerInteractorTest : SysuiTestCase() { fun showOrUnlockDevice_authMethodNotSecure_switchesToGoneScene() = testScope.runTest { val currentScene by collectLastValue(sceneInteractor.currentScene("container1")) - authenticationInteractor.setAuthenticationMethod(AuthenticationMethodModel.Swipe) - authenticationInteractor.lockDevice() + utils.authenticationRepository.setAuthenticationMethod(AuthenticationMethodModel.Swipe) + utils.authenticationRepository.setUnlocked(false) underTest.showOrUnlockDevice("container1") @@ -248,10 +251,10 @@ class BouncerInteractorTest : SysuiTestCase() { testScope.runTest { val currentScene by collectLastValue(sceneInteractor.currentScene("container1")) val message by collectLastValue(underTest.message) - authenticationInteractor.setAuthenticationMethod( + utils.authenticationRepository.setAuthenticationMethod( AuthenticationMethodModel.Password("password") ) - authenticationInteractor.lockDevice() + utils.authenticationRepository.setUnlocked(false) val customMessage = "Hello there!" underTest.showOrUnlockDevice("container1", customMessage) @@ -265,11 +268,17 @@ class BouncerInteractorTest : SysuiTestCase() { testScope.runTest { val throttling by collectLastValue(underTest.throttling) val message by collectLastValue(underTest.message) - val isUnlocked by collectLastValue(authenticationInteractor.isUnlocked) - authenticationInteractor.setAuthenticationMethod(AuthenticationMethodModel.Pin(1234)) + val currentScene by + collectLastValue(sceneInteractor.currentScene(SceneTestUtils.CONTAINER_1)) + utils.authenticationRepository.setAuthenticationMethod( + AuthenticationMethodModel.Pin(1234) + ) + runCurrent() + underTest.showOrUnlockDevice(SceneTestUtils.CONTAINER_1) + runCurrent() + assertThat(currentScene?.key).isEqualTo(SceneKey.Bouncer) assertThat(throttling).isNull() - assertThat(message).isEqualTo("") - assertThat(isUnlocked).isFalse() + assertThat(message).isEqualTo(MESSAGE_ENTER_YOUR_PIN) repeat(BouncerInteractor.THROTTLE_EVERY) { times -> // Wrong PIN. assertThat(underTest.authenticate(listOf(6, 7, 8, 9))).isFalse() @@ -280,9 +289,9 @@ class BouncerInteractorTest : SysuiTestCase() { assertThat(throttling).isNotNull() assertTryAgainMessage(message, BouncerInteractor.THROTTLE_DURATION_SEC) - // Correct PIN, but throttled, so doesn't unlock: + // Correct PIN, but throttled, so doesn't change away from the bouncer scene: assertThat(underTest.authenticate(listOf(1, 2, 3, 4))).isFalse() - assertThat(isUnlocked).isFalse() + assertThat(currentScene?.key).isEqualTo(SceneKey.Bouncer) assertTryAgainMessage(message, BouncerInteractor.THROTTLE_DURATION_SEC) throttling?.totalDurationSec?.let { seconds -> @@ -296,11 +305,28 @@ class BouncerInteractorTest : SysuiTestCase() { } assertThat(message).isEqualTo("") assertThat(throttling).isNull() - assertThat(isUnlocked).isFalse() + assertThat(currentScene?.key).isEqualTo(SceneKey.Bouncer) - // Correct PIN and no longer throttled so unlocks: + // Correct PIN and no longer throttled so changes to the Gone scene: assertThat(underTest.authenticate(listOf(1, 2, 3, 4))).isTrue() - assertThat(isUnlocked).isTrue() + assertThat(currentScene?.key).isEqualTo(SceneKey.Gone) + } + + @Test + fun switchesToGone_whenUnlocked() = + testScope.runTest { + utils.authenticationRepository.setUnlocked(false) + sceneInteractor.setCurrentScene( + SceneTestUtils.CONTAINER_1, + SceneModel(SceneKey.Bouncer) + ) + val currentScene by + collectLastValue(sceneInteractor.currentScene(SceneTestUtils.CONTAINER_1)) + assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer)) + + utils.authenticationRepository.setUnlocked(true) + + assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Gone)) } private fun assertTryAgainMessage( diff --git a/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/viewmodel/AuthMethodBouncerViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/viewmodel/AuthMethodBouncerViewModelTest.kt index b53e03419df3..22ac1b678dcc 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/viewmodel/AuthMethodBouncerViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/viewmodel/AuthMethodBouncerViewModelTest.kt @@ -24,7 +24,6 @@ import com.android.systemui.scene.SceneTestUtils import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.runTest import org.junit.Test import org.junit.runner.RunWith @@ -35,8 +34,8 @@ import org.junit.runners.JUnit4 @RunWith(JUnit4::class) class AuthMethodBouncerViewModelTest : SysuiTestCase() { - private val testScope = TestScope() - private val utils = SceneTestUtils(this, testScope) + private val utils = SceneTestUtils(this) + private val testScope = utils.testScope private val authenticationInteractor = utils.authenticationInteractor( utils.authenticationRepository(), @@ -55,7 +54,9 @@ class AuthMethodBouncerViewModelTest : SysuiTestCase() { @Test fun animateFailure() = testScope.runTest { - authenticationInteractor.setAuthenticationMethod(AuthenticationMethodModel.Pin(1234)) + utils.authenticationRepository.setAuthenticationMethod( + AuthenticationMethodModel.Pin(1234) + ) val animateFailure by collectLastValue(underTest.animateFailure) assertThat(animateFailure).isFalse() diff --git a/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/viewmodel/BouncerViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/viewmodel/BouncerViewModelTest.kt index c6074962ee8e..5ffc47119e17 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/viewmodel/BouncerViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/viewmodel/BouncerViewModelTest.kt @@ -23,11 +23,14 @@ import com.android.systemui.bouncer.domain.interactor.BouncerInteractor import com.android.systemui.coroutines.collectLastValue import com.android.systemui.scene.SceneTestUtils import com.google.common.truth.Truth.assertThat +import com.google.common.truth.Truth.assertWithMessage import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.flow.flatMapLatest -import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.test.advanceTimeBy +import kotlinx.coroutines.test.runCurrent import kotlinx.coroutines.test.runTest import org.junit.Test import org.junit.runner.RunWith @@ -38,8 +41,8 @@ import org.junit.runners.JUnit4 @RunWith(JUnit4::class) class BouncerViewModelTest : SysuiTestCase() { - private val testScope = TestScope() - private val utils = SceneTestUtils(this, testScope) + private val utils = SceneTestUtils(this) + private val testScope = utils.testScope private val authenticationInteractor = utils.authenticationInteractor( repository = utils.authenticationRepository(), @@ -54,16 +57,26 @@ class BouncerViewModelTest : SysuiTestCase() { @Test fun authMethod_nonNullForSecureMethods_nullForNotSecureMethods() = testScope.runTest { - val authMethodViewModel: AuthMethodBouncerViewModel? by - collectLastValue(underTest.authMethod) + var authMethodViewModel: AuthMethodBouncerViewModel? = null + authMethodsToTest().forEach { authMethod -> - authenticationInteractor.setAuthenticationMethod(authMethod) + utils.authenticationRepository.setAuthenticationMethod(authMethod) + val job = underTest.authMethod.onEach { authMethodViewModel = it }.launchIn(this) + runCurrent() if (authMethod.isSecure) { - assertThat(authMethodViewModel).isNotNull() + assertWithMessage("View-model unexpectedly null for auth method $authMethod") + .that(authMethodViewModel) + .isNotNull() } else { - assertThat(authMethodViewModel).isNull() + assertWithMessage( + "View-model unexpectedly non-null for auth method $authMethod" + ) + .that(authMethodViewModel) + .isNull() } + + job.cancel() } } @@ -75,13 +88,13 @@ class BouncerViewModelTest : SysuiTestCase() { collectLastValue(underTest.authMethod) // First pass, populate our "seen" map: authMethodsToTest().forEach { authMethod -> - authenticationInteractor.setAuthenticationMethod(authMethod) + utils.authenticationRepository.setAuthenticationMethod(authMethod) authMethodViewModel?.let { seen[authMethod] = it } } // Second pass, assert same instances are reused: authMethodsToTest().forEach { authMethod -> - authenticationInteractor.setAuthenticationMethod(authMethod) + utils.authenticationRepository.setAuthenticationMethod(authMethod) authMethodViewModel?.let { assertThat(it).isSameInstanceAs(seen[authMethod]) } } } @@ -97,7 +110,9 @@ class BouncerViewModelTest : SysuiTestCase() { testScope.runTest { val message by collectLastValue(underTest.message) val throttling by collectLastValue(bouncerInteractor.throttling) - authenticationInteractor.setAuthenticationMethod(AuthenticationMethodModel.Pin(1234)) + utils.authenticationRepository.setAuthenticationMethod( + AuthenticationMethodModel.Pin(1234) + ) assertThat(message?.isUpdateAnimated).isTrue() repeat(BouncerInteractor.THROTTLE_EVERY) { @@ -120,7 +135,9 @@ class BouncerViewModelTest : SysuiTestCase() { } ) val throttling by collectLastValue(bouncerInteractor.throttling) - authenticationInteractor.setAuthenticationMethod(AuthenticationMethodModel.Pin(1234)) + utils.authenticationRepository.setAuthenticationMethod( + AuthenticationMethodModel.Pin(1234) + ) assertThat(isInputEnabled).isTrue() repeat(BouncerInteractor.THROTTLE_EVERY) { @@ -137,7 +154,9 @@ class BouncerViewModelTest : SysuiTestCase() { fun throttlingDialogMessage() = testScope.runTest { val throttlingDialogMessage by collectLastValue(underTest.throttlingDialogMessage) - authenticationInteractor.setAuthenticationMethod(AuthenticationMethodModel.Pin(1234)) + utils.authenticationRepository.setAuthenticationMethod( + AuthenticationMethodModel.Pin(1234) + ) repeat(BouncerInteractor.THROTTLE_EVERY) { // Wrong PIN. diff --git a/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/viewmodel/PasswordBouncerViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/viewmodel/PasswordBouncerViewModelTest.kt index f436aa309ac5..699571b1537c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/viewmodel/PasswordBouncerViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/viewmodel/PasswordBouncerViewModelTest.kt @@ -28,7 +28,7 @@ import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.runCurrent import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Test @@ -40,8 +40,8 @@ import org.junit.runners.JUnit4 @RunWith(JUnit4::class) class PasswordBouncerViewModelTest : SysuiTestCase() { - private val testScope = TestScope() - private val utils = SceneTestUtils(this, testScope) + private val utils = SceneTestUtils(this) + private val testScope = utils.testScope private val authenticationInteractor = utils.authenticationInteractor( repository = utils.authenticationRepository(), @@ -58,6 +58,7 @@ class PasswordBouncerViewModelTest : SysuiTestCase() { ) private val underTest = PasswordBouncerViewModel( + applicationScope = testScope.backgroundScope, interactor = bouncerInteractor, isInputEnabled = MutableStateFlow(true).asStateFlow(), ) @@ -71,84 +72,74 @@ class PasswordBouncerViewModelTest : SysuiTestCase() { @Test fun onShown() = testScope.runTest { - val isUnlocked by collectLastValue(authenticationInteractor.isUnlocked) val currentScene by collectLastValue(sceneInteractor.currentScene(CONTAINER_NAME)) val message by collectLastValue(bouncerViewModel.message) val password by collectLastValue(underTest.password) - authenticationInteractor.setAuthenticationMethod( + utils.authenticationRepository.setAuthenticationMethod( AuthenticationMethodModel.Password("password") ) - authenticationInteractor.lockDevice() + utils.authenticationRepository.setUnlocked(false) sceneInteractor.setCurrentScene(CONTAINER_NAME, SceneModel(SceneKey.Bouncer)) - assertThat(isUnlocked).isFalse() assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer)) underTest.onShown() assertThat(message?.text).isEqualTo(ENTER_YOUR_PASSWORD) assertThat(password).isEqualTo("") - assertThat(isUnlocked).isFalse() assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer)) } @Test fun onPasswordInputChanged() = testScope.runTest { - val isUnlocked by collectLastValue(authenticationInteractor.isUnlocked) val currentScene by collectLastValue(sceneInteractor.currentScene(CONTAINER_NAME)) val message by collectLastValue(bouncerViewModel.message) val password by collectLastValue(underTest.password) - authenticationInteractor.setAuthenticationMethod( + utils.authenticationRepository.setAuthenticationMethod( AuthenticationMethodModel.Password("password") ) - authenticationInteractor.lockDevice() + utils.authenticationRepository.setUnlocked(false) sceneInteractor.setCurrentScene(CONTAINER_NAME, SceneModel(SceneKey.Bouncer)) - assertThat(isUnlocked).isFalse() assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer)) underTest.onShown() + runCurrent() underTest.onPasswordInputChanged("password") assertThat(message?.text).isEmpty() assertThat(password).isEqualTo("password") - assertThat(isUnlocked).isFalse() assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer)) } @Test fun onAuthenticateKeyPressed_whenCorrect() = testScope.runTest { - val isUnlocked by collectLastValue(authenticationInteractor.isUnlocked) val currentScene by collectLastValue(sceneInteractor.currentScene(CONTAINER_NAME)) - authenticationInteractor.setAuthenticationMethod( + utils.authenticationRepository.setAuthenticationMethod( AuthenticationMethodModel.Password("password") ) - authenticationInteractor.lockDevice() + utils.authenticationRepository.setUnlocked(false) sceneInteractor.setCurrentScene(CONTAINER_NAME, SceneModel(SceneKey.Bouncer)) - assertThat(isUnlocked).isFalse() assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer)) underTest.onShown() underTest.onPasswordInputChanged("password") underTest.onAuthenticateKeyPressed() - assertThat(isUnlocked).isTrue() assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Gone)) } @Test fun onAuthenticateKeyPressed_whenWrong() = testScope.runTest { - val isUnlocked by collectLastValue(authenticationInteractor.isUnlocked) val currentScene by collectLastValue(sceneInteractor.currentScene(CONTAINER_NAME)) val message by collectLastValue(bouncerViewModel.message) val password by collectLastValue(underTest.password) - authenticationInteractor.setAuthenticationMethod( + utils.authenticationRepository.setAuthenticationMethod( AuthenticationMethodModel.Password("password") ) - authenticationInteractor.lockDevice() + utils.authenticationRepository.setUnlocked(false) sceneInteractor.setCurrentScene(CONTAINER_NAME, SceneModel(SceneKey.Bouncer)) - assertThat(isUnlocked).isFalse() assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer)) underTest.onShown() underTest.onPasswordInputChanged("wrong") @@ -157,30 +148,26 @@ class PasswordBouncerViewModelTest : SysuiTestCase() { assertThat(password).isEqualTo("") assertThat(message?.text).isEqualTo(WRONG_PASSWORD) - assertThat(isUnlocked).isFalse() assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer)) } @Test fun onAuthenticateKeyPressed_correctAfterWrong() = testScope.runTest { - val isUnlocked by collectLastValue(authenticationInteractor.isUnlocked) val currentScene by collectLastValue(sceneInteractor.currentScene(CONTAINER_NAME)) val message by collectLastValue(bouncerViewModel.message) val password by collectLastValue(underTest.password) - authenticationInteractor.setAuthenticationMethod( + utils.authenticationRepository.setAuthenticationMethod( AuthenticationMethodModel.Password("password") ) - authenticationInteractor.lockDevice() + utils.authenticationRepository.setUnlocked(false) sceneInteractor.setCurrentScene(CONTAINER_NAME, SceneModel(SceneKey.Bouncer)) - assertThat(isUnlocked).isFalse() assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer)) underTest.onShown() underTest.onPasswordInputChanged("wrong") underTest.onAuthenticateKeyPressed() assertThat(password).isEqualTo("") assertThat(message?.text).isEqualTo(WRONG_PASSWORD) - assertThat(isUnlocked).isFalse() assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer)) // Enter the correct password: @@ -189,7 +176,6 @@ class PasswordBouncerViewModelTest : SysuiTestCase() { underTest.onAuthenticateKeyPressed() - assertThat(isUnlocked).isTrue() assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Gone)) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/viewmodel/PatternBouncerViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/viewmodel/PatternBouncerViewModelTest.kt index d7d7154705ed..9a1f584bced9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/viewmodel/PatternBouncerViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/viewmodel/PatternBouncerViewModelTest.kt @@ -29,7 +29,7 @@ import com.google.common.truth.Truth.assertWithMessage import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.runCurrent import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Test @@ -41,8 +41,8 @@ import org.junit.runners.JUnit4 @RunWith(JUnit4::class) class PatternBouncerViewModelTest : SysuiTestCase() { - private val testScope = TestScope() - private val utils = SceneTestUtils(this, testScope) + private val utils = SceneTestUtils(this) + private val testScope = utils.testScope private val authenticationInteractor = utils.authenticationInteractor( repository = utils.authenticationRepository(), @@ -74,17 +74,15 @@ class PatternBouncerViewModelTest : SysuiTestCase() { @Test fun onShown() = testScope.runTest { - val isUnlocked by collectLastValue(authenticationInteractor.isUnlocked) val currentScene by collectLastValue(sceneInteractor.currentScene(CONTAINER_NAME)) val message by collectLastValue(bouncerViewModel.message) val selectedDots by collectLastValue(underTest.selectedDots) val currentDot by collectLastValue(underTest.currentDot) - authenticationInteractor.setAuthenticationMethod( + utils.authenticationRepository.setAuthenticationMethod( AuthenticationMethodModel.Pattern(CORRECT_PATTERN) ) - authenticationInteractor.lockDevice() + utils.authenticationRepository.setUnlocked(false) sceneInteractor.setCurrentScene(CONTAINER_NAME, SceneModel(SceneKey.Bouncer)) - assertThat(isUnlocked).isFalse() assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer)) underTest.onShown() @@ -92,49 +90,44 @@ class PatternBouncerViewModelTest : SysuiTestCase() { assertThat(message?.text).isEqualTo(ENTER_YOUR_PATTERN) assertThat(selectedDots).isEmpty() assertThat(currentDot).isNull() - assertThat(isUnlocked).isFalse() assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer)) } @Test fun onDragStart() = testScope.runTest { - val isUnlocked by collectLastValue(authenticationInteractor.isUnlocked) val currentScene by collectLastValue(sceneInteractor.currentScene(CONTAINER_NAME)) val message by collectLastValue(bouncerViewModel.message) val selectedDots by collectLastValue(underTest.selectedDots) val currentDot by collectLastValue(underTest.currentDot) - authenticationInteractor.setAuthenticationMethod( + utils.authenticationRepository.setAuthenticationMethod( AuthenticationMethodModel.Pattern(CORRECT_PATTERN) ) - authenticationInteractor.lockDevice() + utils.authenticationRepository.setUnlocked(false) sceneInteractor.setCurrentScene(CONTAINER_NAME, SceneModel(SceneKey.Bouncer)) - assertThat(isUnlocked).isFalse() assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer)) underTest.onShown() + runCurrent() underTest.onDragStart() assertThat(message?.text).isEmpty() assertThat(selectedDots).isEmpty() assertThat(currentDot).isNull() - assertThat(isUnlocked).isFalse() assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer)) } @Test fun onDragEnd_whenCorrect() = testScope.runTest { - val isUnlocked by collectLastValue(authenticationInteractor.isUnlocked) val currentScene by collectLastValue(sceneInteractor.currentScene(CONTAINER_NAME)) val selectedDots by collectLastValue(underTest.selectedDots) val currentDot by collectLastValue(underTest.currentDot) - authenticationInteractor.setAuthenticationMethod( + utils.authenticationRepository.setAuthenticationMethod( AuthenticationMethodModel.Pattern(CORRECT_PATTERN) ) - authenticationInteractor.lockDevice() + utils.authenticationRepository.setUnlocked(false) sceneInteractor.setCurrentScene(CONTAINER_NAME, SceneModel(SceneKey.Bouncer)) - assertThat(isUnlocked).isFalse() assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer)) underTest.onShown() underTest.onDragStart() @@ -168,24 +161,21 @@ class PatternBouncerViewModelTest : SysuiTestCase() { underTest.onDragEnd() - assertThat(isUnlocked).isTrue() assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Gone)) } @Test fun onDragEnd_whenWrong() = testScope.runTest { - val isUnlocked by collectLastValue(authenticationInteractor.isUnlocked) val currentScene by collectLastValue(sceneInteractor.currentScene(CONTAINER_NAME)) val message by collectLastValue(bouncerViewModel.message) val selectedDots by collectLastValue(underTest.selectedDots) val currentDot by collectLastValue(underTest.currentDot) - authenticationInteractor.setAuthenticationMethod( + utils.authenticationRepository.setAuthenticationMethod( AuthenticationMethodModel.Pattern(CORRECT_PATTERN) ) - authenticationInteractor.lockDevice() + utils.authenticationRepository.setUnlocked(false) sceneInteractor.setCurrentScene(CONTAINER_NAME, SceneModel(SceneKey.Bouncer)) - assertThat(isUnlocked).isFalse() assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer)) underTest.onShown() underTest.onDragStart() @@ -203,24 +193,21 @@ class PatternBouncerViewModelTest : SysuiTestCase() { assertThat(selectedDots).isEmpty() assertThat(currentDot).isNull() assertThat(message?.text).isEqualTo(WRONG_PATTERN) - assertThat(isUnlocked).isFalse() assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer)) } @Test fun onDragEnd_correctAfterWrong() = testScope.runTest { - val isUnlocked by collectLastValue(authenticationInteractor.isUnlocked) val currentScene by collectLastValue(sceneInteractor.currentScene(CONTAINER_NAME)) val message by collectLastValue(bouncerViewModel.message) val selectedDots by collectLastValue(underTest.selectedDots) val currentDot by collectLastValue(underTest.currentDot) - authenticationInteractor.setAuthenticationMethod( + utils.authenticationRepository.setAuthenticationMethod( AuthenticationMethodModel.Pattern(CORRECT_PATTERN) ) - authenticationInteractor.lockDevice() + utils.authenticationRepository.setUnlocked(false) sceneInteractor.setCurrentScene(CONTAINER_NAME, SceneModel(SceneKey.Bouncer)) - assertThat(isUnlocked).isFalse() assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer)) underTest.onShown() underTest.onDragStart() @@ -236,7 +223,6 @@ class PatternBouncerViewModelTest : SysuiTestCase() { assertThat(selectedDots).isEmpty() assertThat(currentDot).isNull() assertThat(message?.text).isEqualTo(WRONG_PATTERN) - assertThat(isUnlocked).isFalse() assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer)) // Enter the correct pattern: @@ -251,7 +237,6 @@ class PatternBouncerViewModelTest : SysuiTestCase() { underTest.onDragEnd() - assertThat(isUnlocked).isTrue() assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Gone)) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/viewmodel/PinBouncerViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/viewmodel/PinBouncerViewModelTest.kt index 7e358d27046b..61432e2df274 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/viewmodel/PinBouncerViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/viewmodel/PinBouncerViewModelTest.kt @@ -29,7 +29,7 @@ import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.runCurrent import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Test @@ -41,8 +41,8 @@ import org.junit.runners.JUnit4 @RunWith(JUnit4::class) class PinBouncerViewModelTest : SysuiTestCase() { - private val testScope = TestScope() - private val utils = SceneTestUtils(this, testScope) + private val utils = SceneTestUtils(this) + private val testScope = utils.testScope private val sceneInteractor = utils.sceneInteractor() private val authenticationInteractor = utils.authenticationInteractor( @@ -81,60 +81,57 @@ class PinBouncerViewModelTest : SysuiTestCase() { @Test fun onShown() = testScope.runTest { - val isUnlocked by collectLastValue(authenticationInteractor.isUnlocked) val currentScene by collectLastValue(sceneInteractor.currentScene(CONTAINER_NAME)) val message by collectLastValue(bouncerViewModel.message) val entries by collectLastValue(underTest.pinEntries) - authenticationInteractor.setAuthenticationMethod(AuthenticationMethodModel.Pin(1234)) - authenticationInteractor.lockDevice() + utils.authenticationRepository.setUnlocked(false) sceneInteractor.setCurrentScene(CONTAINER_NAME, SceneModel(SceneKey.Bouncer)) - assertThat(isUnlocked).isFalse() assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer)) underTest.onShown() assertThat(message?.text).isEqualTo(ENTER_YOUR_PIN) assertThat(entries).hasSize(0) - assertThat(isUnlocked).isFalse() assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer)) } @Test fun onPinButtonClicked() = testScope.runTest { - val isUnlocked by collectLastValue(authenticationInteractor.isUnlocked) val currentScene by collectLastValue(sceneInteractor.currentScene(CONTAINER_NAME)) val message by collectLastValue(bouncerViewModel.message) val entries by collectLastValue(underTest.pinEntries) - authenticationInteractor.setAuthenticationMethod(AuthenticationMethodModel.Pin(1234)) - authenticationInteractor.lockDevice() + utils.authenticationRepository.setAuthenticationMethod( + AuthenticationMethodModel.Pin(1234) + ) + utils.authenticationRepository.setUnlocked(false) sceneInteractor.setCurrentScene(CONTAINER_NAME, SceneModel(SceneKey.Bouncer)) - assertThat(isUnlocked).isFalse() assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer)) underTest.onShown() + runCurrent() underTest.onPinButtonClicked(1) assertThat(message?.text).isEmpty() assertThat(entries).hasSize(1) assertThat(entries?.map { it.input }).containsExactly(1) - assertThat(isUnlocked).isFalse() assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer)) } @Test fun onBackspaceButtonClicked() = testScope.runTest { - val isUnlocked by collectLastValue(authenticationInteractor.isUnlocked) val currentScene by collectLastValue(sceneInteractor.currentScene(CONTAINER_NAME)) val message by collectLastValue(bouncerViewModel.message) val entries by collectLastValue(underTest.pinEntries) - authenticationInteractor.setAuthenticationMethod(AuthenticationMethodModel.Pin(1234)) - authenticationInteractor.lockDevice() + utils.authenticationRepository.setAuthenticationMethod( + AuthenticationMethodModel.Pin(1234) + ) + utils.authenticationRepository.setUnlocked(false) sceneInteractor.setCurrentScene(CONTAINER_NAME, SceneModel(SceneKey.Bouncer)) - assertThat(isUnlocked).isFalse() assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer)) underTest.onShown() + runCurrent() underTest.onPinButtonClicked(1) assertThat(entries).hasSize(1) @@ -142,21 +139,19 @@ class PinBouncerViewModelTest : SysuiTestCase() { assertThat(message?.text).isEmpty() assertThat(entries).hasSize(0) - assertThat(isUnlocked).isFalse() assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer)) } @Test fun onPinEdit() = testScope.runTest { - val isUnlocked by collectLastValue(authenticationInteractor.isUnlocked) val currentScene by collectLastValue(sceneInteractor.currentScene(CONTAINER_NAME)) - val message by collectLastValue(bouncerViewModel.message) val entries by collectLastValue(underTest.pinEntries) - authenticationInteractor.setAuthenticationMethod(AuthenticationMethodModel.Pin(1234)) - authenticationInteractor.lockDevice() + utils.authenticationRepository.setAuthenticationMethod( + AuthenticationMethodModel.Pin(1234) + ) + utils.authenticationRepository.setUnlocked(false) sceneInteractor.setCurrentScene(CONTAINER_NAME, SceneModel(SceneKey.Bouncer)) - assertThat(isUnlocked).isFalse() assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer)) underTest.onShown() @@ -176,16 +171,17 @@ class PinBouncerViewModelTest : SysuiTestCase() { @Test fun onBackspaceButtonLongPressed() = testScope.runTest { - val isUnlocked by collectLastValue(authenticationInteractor.isUnlocked) val currentScene by collectLastValue(sceneInteractor.currentScene(CONTAINER_NAME)) val message by collectLastValue(bouncerViewModel.message) val entries by collectLastValue(underTest.pinEntries) - authenticationInteractor.setAuthenticationMethod(AuthenticationMethodModel.Pin(1234)) - authenticationInteractor.lockDevice() + utils.authenticationRepository.setAuthenticationMethod( + AuthenticationMethodModel.Pin(1234) + ) + utils.authenticationRepository.setUnlocked(false) sceneInteractor.setCurrentScene(CONTAINER_NAME, SceneModel(SceneKey.Bouncer)) - assertThat(isUnlocked).isFalse() assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer)) underTest.onShown() + runCurrent() underTest.onPinButtonClicked(1) underTest.onPinButtonClicked(2) underTest.onPinButtonClicked(3) @@ -195,19 +191,18 @@ class PinBouncerViewModelTest : SysuiTestCase() { assertThat(message?.text).isEmpty() assertThat(entries).hasSize(0) - assertThat(isUnlocked).isFalse() assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer)) } @Test fun onAuthenticateButtonClicked_whenCorrect() = testScope.runTest { - val isUnlocked by collectLastValue(authenticationInteractor.isUnlocked) val currentScene by collectLastValue(sceneInteractor.currentScene(CONTAINER_NAME)) - authenticationInteractor.setAuthenticationMethod(AuthenticationMethodModel.Pin(1234)) - authenticationInteractor.lockDevice() + utils.authenticationRepository.setAuthenticationMethod( + AuthenticationMethodModel.Pin(1234) + ) + utils.authenticationRepository.setUnlocked(false) sceneInteractor.setCurrentScene(CONTAINER_NAME, SceneModel(SceneKey.Bouncer)) - assertThat(isUnlocked).isFalse() assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer)) underTest.onShown() underTest.onPinButtonClicked(1) @@ -217,21 +212,20 @@ class PinBouncerViewModelTest : SysuiTestCase() { underTest.onAuthenticateButtonClicked() - assertThat(isUnlocked).isTrue() assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Gone)) } @Test fun onAuthenticateButtonClicked_whenWrong() = testScope.runTest { - val isUnlocked by collectLastValue(authenticationInteractor.isUnlocked) val currentScene by collectLastValue(sceneInteractor.currentScene(CONTAINER_NAME)) val message by collectLastValue(bouncerViewModel.message) val entries by collectLastValue(underTest.pinEntries) - authenticationInteractor.setAuthenticationMethod(AuthenticationMethodModel.Pin(1234)) - authenticationInteractor.lockDevice() + utils.authenticationRepository.setAuthenticationMethod( + AuthenticationMethodModel.Pin(1234) + ) + utils.authenticationRepository.setUnlocked(false) sceneInteractor.setCurrentScene(CONTAINER_NAME, SceneModel(SceneKey.Bouncer)) - assertThat(isUnlocked).isFalse() assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer)) underTest.onShown() underTest.onPinButtonClicked(1) @@ -244,21 +238,20 @@ class PinBouncerViewModelTest : SysuiTestCase() { assertThat(entries).hasSize(0) assertThat(message?.text).isEqualTo(WRONG_PIN) - assertThat(isUnlocked).isFalse() assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer)) } @Test fun onAuthenticateButtonClicked_correctAfterWrong() = testScope.runTest { - val isUnlocked by collectLastValue(authenticationInteractor.isUnlocked) val currentScene by collectLastValue(sceneInteractor.currentScene(CONTAINER_NAME)) val message by collectLastValue(bouncerViewModel.message) val entries by collectLastValue(underTest.pinEntries) - authenticationInteractor.setAuthenticationMethod(AuthenticationMethodModel.Pin(1234)) - authenticationInteractor.lockDevice() + utils.authenticationRepository.setAuthenticationMethod( + AuthenticationMethodModel.Pin(1234) + ) + utils.authenticationRepository.setUnlocked(false) sceneInteractor.setCurrentScene(CONTAINER_NAME, SceneModel(SceneKey.Bouncer)) - assertThat(isUnlocked).isFalse() assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer)) underTest.onShown() underTest.onPinButtonClicked(1) @@ -269,7 +262,6 @@ class PinBouncerViewModelTest : SysuiTestCase() { underTest.onAuthenticateButtonClicked() assertThat(message?.text).isEqualTo(WRONG_PIN) assertThat(entries).hasSize(0) - assertThat(isUnlocked).isFalse() assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer)) // Enter the correct PIN: @@ -281,21 +273,18 @@ class PinBouncerViewModelTest : SysuiTestCase() { underTest.onAuthenticateButtonClicked() - assertThat(isUnlocked).isTrue() assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Gone)) } @Test fun onAutoConfirm_whenCorrect() = testScope.runTest { - val isUnlocked by collectLastValue(authenticationInteractor.isUnlocked) val currentScene by collectLastValue(sceneInteractor.currentScene(CONTAINER_NAME)) - authenticationInteractor.setAuthenticationMethod( + utils.authenticationRepository.setAuthenticationMethod( AuthenticationMethodModel.Pin(1234, autoConfirm = true) ) - authenticationInteractor.lockDevice() + utils.authenticationRepository.setUnlocked(false) sceneInteractor.setCurrentScene(CONTAINER_NAME, SceneModel(SceneKey.Bouncer)) - assertThat(isUnlocked).isFalse() assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer)) underTest.onShown() underTest.onPinButtonClicked(1) @@ -303,23 +292,20 @@ class PinBouncerViewModelTest : SysuiTestCase() { underTest.onPinButtonClicked(3) underTest.onPinButtonClicked(4) - assertThat(isUnlocked).isTrue() assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Gone)) } @Test fun onAutoConfirm_whenWrong() = testScope.runTest { - val isUnlocked by collectLastValue(authenticationInteractor.isUnlocked) val currentScene by collectLastValue(sceneInteractor.currentScene(CONTAINER_NAME)) val message by collectLastValue(bouncerViewModel.message) val entries by collectLastValue(underTest.pinEntries) - authenticationInteractor.setAuthenticationMethod( + utils.authenticationRepository.setAuthenticationMethod( AuthenticationMethodModel.Pin(1234, autoConfirm = true) ) - authenticationInteractor.lockDevice() + utils.authenticationRepository.setUnlocked(false) sceneInteractor.setCurrentScene(CONTAINER_NAME, SceneModel(SceneKey.Bouncer)) - assertThat(isUnlocked).isFalse() assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer)) underTest.onShown() underTest.onPinButtonClicked(1) @@ -329,7 +315,6 @@ class PinBouncerViewModelTest : SysuiTestCase() { assertThat(entries).hasSize(0) assertThat(message?.text).isEqualTo(WRONG_PIN) - assertThat(isUnlocked).isFalse() assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer)) } @@ -338,7 +323,7 @@ class PinBouncerViewModelTest : SysuiTestCase() { testScope.runTest { val backspaceButtonAppearance by collectLastValue(underTest.backspaceButtonAppearance) - authenticationInteractor.setAuthenticationMethod( + utils.authenticationRepository.setAuthenticationMethod( AuthenticationMethodModel.Pin(1234, autoConfirm = false) ) @@ -349,7 +334,7 @@ class PinBouncerViewModelTest : SysuiTestCase() { fun backspaceButtonAppearance_withAutoConfirmButNoInput_isHidden() = testScope.runTest { val backspaceButtonAppearance by collectLastValue(underTest.backspaceButtonAppearance) - authenticationInteractor.setAuthenticationMethod( + utils.authenticationRepository.setAuthenticationMethod( AuthenticationMethodModel.Pin(1234, autoConfirm = true) ) @@ -360,7 +345,7 @@ class PinBouncerViewModelTest : SysuiTestCase() { fun backspaceButtonAppearance_withAutoConfirmAndInput_isShownQuiet() = testScope.runTest { val backspaceButtonAppearance by collectLastValue(underTest.backspaceButtonAppearance) - authenticationInteractor.setAuthenticationMethod( + utils.authenticationRepository.setAuthenticationMethod( AuthenticationMethodModel.Pin(1234, autoConfirm = true) ) @@ -374,7 +359,7 @@ class PinBouncerViewModelTest : SysuiTestCase() { testScope.runTest { val confirmButtonAppearance by collectLastValue(underTest.confirmButtonAppearance) - authenticationInteractor.setAuthenticationMethod( + utils.authenticationRepository.setAuthenticationMethod( AuthenticationMethodModel.Pin(1234, autoConfirm = false) ) @@ -385,7 +370,7 @@ class PinBouncerViewModelTest : SysuiTestCase() { fun confirmButtonAppearance_withAutoConfirm_isHidden() = testScope.runTest { val confirmButtonAppearance by collectLastValue(underTest.confirmButtonAppearance) - authenticationInteractor.setAuthenticationMethod( + utils.authenticationRepository.setAuthenticationMethod( AuthenticationMethodModel.Pin(1234, autoConfirm = true) ) @@ -396,7 +381,7 @@ class PinBouncerViewModelTest : SysuiTestCase() { fun hintedPinLength_withoutAutoConfirm_isNull() = testScope.runTest { val hintedPinLength by collectLastValue(underTest.hintedPinLength) - authenticationInteractor.setAuthenticationMethod( + utils.authenticationRepository.setAuthenticationMethod( AuthenticationMethodModel.Pin(1234, autoConfirm = false) ) @@ -407,7 +392,7 @@ class PinBouncerViewModelTest : SysuiTestCase() { fun hintedPinLength_withAutoConfirmPinLessThanSixDigits_isNull() = testScope.runTest { val hintedPinLength by collectLastValue(underTest.hintedPinLength) - authenticationInteractor.setAuthenticationMethod( + utils.authenticationRepository.setAuthenticationMethod( AuthenticationMethodModel.Pin(12345, autoConfirm = true) ) @@ -418,7 +403,7 @@ class PinBouncerViewModelTest : SysuiTestCase() { fun hintedPinLength_withAutoConfirmPinExactlySixDigits_isSix() = testScope.runTest { val hintedPinLength by collectLastValue(underTest.hintedPinLength) - authenticationInteractor.setAuthenticationMethod( + utils.authenticationRepository.setAuthenticationMethod( AuthenticationMethodModel.Pin(123456, autoConfirm = true) ) @@ -429,7 +414,7 @@ class PinBouncerViewModelTest : SysuiTestCase() { fun hintedPinLength_withAutoConfirmPinMoreThanSixDigits_isNull() = testScope.runTest { val hintedPinLength by collectLastValue(underTest.hintedPinLength) - authenticationInteractor.setAuthenticationMethod( + utils.authenticationRepository.setAuthenticationMethod( AuthenticationMethodModel.Pin(1234567, autoConfirm = true) ) diff --git a/packages/SystemUI/tests/src/com/android/systemui/demomode/DemoModeControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/demomode/DemoModeControllerTest.kt index 75eec72a949c..68ea7ebb3358 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/demomode/DemoModeControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/demomode/DemoModeControllerTest.kt @@ -94,7 +94,7 @@ class DemoModeControllerTest : SysuiTestCase() { intent.putExtra("command", command) args.forEach { arg -> intent.putExtra(arg.key, arg.value) } - fakeBroadcastDispatcher.registeredReceivers.forEach { it.onReceive(context, intent) } + fakeBroadcastDispatcher.sendIntentToMatchingReceiversOnly(context, intent) } companion object { diff --git a/packages/SystemUI/tests/src/com/android/systemui/display/data/repository/DisplayMetricsRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/display/data/repository/DisplayMetricsRepositoryTest.kt new file mode 100644 index 000000000000..dd741b4167e9 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/display/data/repository/DisplayMetricsRepositoryTest.kt @@ -0,0 +1,96 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.display.data.repository + +import android.content.Context +import android.util.DisplayMetrics +import android.view.Display +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.log.LogBuffer +import com.android.systemui.statusbar.policy.FakeConfigurationController +import com.android.systemui.util.mockito.mock +import com.android.systemui.util.mockito.whenever +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.runCurrent +import kotlinx.coroutines.test.runTest +import org.junit.Before +import org.junit.Test + +@SmallTest +@OptIn(ExperimentalCoroutinesApi::class) +class DisplayMetricsRepositoryTest : SysuiTestCase() { + private lateinit var underTest: DisplayMetricsRepository + + private val testScope = TestScope(StandardTestDispatcher()) + private val configurationController = FakeConfigurationController() + + private val displayMetrics = + DisplayMetrics().apply { this.heightPixels = INITIAL_HEIGHT_PIXELS } + private val mockContext: Context = mock() + private val mockDisplay: Display = mock() + + @Before + fun setUp() { + underTest = + DisplayMetricsRepository( + testScope.backgroundScope, + configurationController, + displayMetrics, + mockContext, + LogBuffer("TestBuffer", maxSize = 10, logcatEchoTracker = mock()) + ) + whenever(mockContext.display).thenReturn(mockDisplay) + } + + @Test + fun heightPixels_getsInitialValue() { + assertThat(underTest.heightPixels).isEqualTo(INITIAL_HEIGHT_PIXELS) + } + + @Test + fun heightPixels_configChanged_heightUpdated() = + testScope.runTest { + runCurrent() + + updateDisplayMetrics(456) + configurationController.notifyConfigurationChanged() + runCurrent() + + assertThat(underTest.heightPixels).isEqualTo(456) + + updateDisplayMetrics(23) + configurationController.notifyConfigurationChanged() + runCurrent() + + assertThat(underTest.heightPixels).isEqualTo(23) + } + + private fun updateDisplayMetrics(newHeight: Int) { + whenever(mockDisplay.getMetrics(displayMetrics)).thenAnswer { + it.getArgument<DisplayMetrics>(0).heightPixels = newHeight + Unit + } + } + + private companion object { + const val INITIAL_HEIGHT_PIXELS = 345 + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/display/data/repository/DisplayRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/display/data/repository/DisplayRepositoryTest.kt new file mode 100644 index 000000000000..9be54fbb0a82 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/display/data/repository/DisplayRepositoryTest.kt @@ -0,0 +1,191 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.display.data.repository + +import android.hardware.display.DisplayManager +import android.os.Looper +import android.testing.AndroidTestingRunner +import android.testing.TestableLooper +import android.view.Display +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.coroutines.FlowValue +import com.android.systemui.coroutines.collectLastValue +import com.android.systemui.util.mockito.eq +import com.android.systemui.util.mockito.kotlinArgumentCaptor +import com.android.systemui.util.mockito.mock +import com.android.systemui.util.mockito.whenever +import com.android.systemui.utils.os.FakeHandler +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.UnconfinedTestDispatcher +import kotlinx.coroutines.test.runTest +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.ArgumentMatchers.any +import org.mockito.ArgumentMatchers.anyLong +import org.mockito.Mockito.never +import org.mockito.Mockito.times +import org.mockito.Mockito.verify + +@RunWith(AndroidTestingRunner::class) +@TestableLooper.RunWithLooper +@OptIn(ExperimentalCoroutinesApi::class) +@SmallTest +class DisplayRepositoryTest : SysuiTestCase() { + + private val displayManager = mock<DisplayManager>() + private val displayListener = kotlinArgumentCaptor<DisplayManager.DisplayListener>() + + private val testHandler = FakeHandler(Looper.getMainLooper()) + private val testScope = TestScope(UnconfinedTestDispatcher()) + + private lateinit var displayRepository: DisplayRepositoryImpl + + @Before + fun setup() { + setDisplays(emptyList()) + displayRepository = + DisplayRepositoryImpl( + displayManager, + testHandler, + TestScope(UnconfinedTestDispatcher()), + UnconfinedTestDispatcher() + ) + verify(displayManager, never()).registerDisplayListener(any(), any()) + } + + @Test + fun onFlowCollection_displayListenerRegistered() = + testScope.runTest { + val value by latestDisplayFlowValue() + + assertThat(value).isEmpty() + + verify(displayManager).registerDisplayListener(any(), eq(testHandler), anyLong()) + } + + @Test + fun afterFlowCollection_displayListenerUnregistered() { + testScope.runTest { + val value by latestDisplayFlowValue() + + assertThat(value).isEmpty() + + verify(displayManager).registerDisplayListener(any(), eq(testHandler), anyLong()) + } + verify(displayManager).unregisterDisplayListener(any()) + } + + @Test + fun afterFlowCollection_multipleSusbcriptions_oneRemoved_displayListenerNotUnregistered() { + testScope.runTest { + val firstSubscriber by latestDisplayFlowValue() + + assertThat(firstSubscriber).isEmpty() + verify(displayManager, times(1)) + .registerDisplayListener(displayListener.capture(), eq(testHandler), anyLong()) + + val innerScope = TestScope() + innerScope.runTest { + val secondSubscriber by latestDisplayFlowValue() + assertThat(secondSubscriber).isEmpty() + + // No new registration, just the precedent one. + verify(displayManager, times(1)) + .registerDisplayListener(any(), eq(testHandler), anyLong()) + } + + // Let's make sure it has *NOT* been unregistered, as there is still a subscriber. + setDisplays(1) + displayListener.value.onDisplayAdded(1) + assertThat(firstSubscriber?.ids()).containsExactly(1) + } + + // All subscribers are done, unregister should have been called. + verify(displayManager).unregisterDisplayListener(any()) + } + @Test + fun onDisplayAdded_propagated() = + testScope.runTest { + val value by latestDisplayFlowValue() + + setDisplays(1) + displayListener.value.onDisplayAdded(1) + + assertThat(value?.ids()).containsExactly(1) + } + + @Test + fun onDisplayRemoved_propagated() = + testScope.runTest { + val value by latestDisplayFlowValue() + + setDisplays(1, 2, 3, 4) + displayListener.value.onDisplayAdded(1) + displayListener.value.onDisplayAdded(2) + displayListener.value.onDisplayAdded(3) + displayListener.value.onDisplayAdded(4) + + setDisplays(1, 2, 3) + displayListener.value.onDisplayRemoved(4) + + assertThat(value?.ids()).containsExactly(1, 2, 3) + } + + @Test + fun onDisplayChanged_propagated() = + testScope.runTest { + val value by latestDisplayFlowValue() + + setDisplays(1, 2, 3, 4) + displayListener.value.onDisplayAdded(1) + displayListener.value.onDisplayAdded(2) + displayListener.value.onDisplayAdded(3) + displayListener.value.onDisplayAdded(4) + + displayListener.value.onDisplayChanged(4) + + assertThat(value?.ids()).containsExactly(1, 2, 3, 4) + } + + private fun Iterable<Display>.ids(): List<Int> = map { it.displayId } + + // Wrapper to capture the displayListener. + private fun TestScope.latestDisplayFlowValue(): FlowValue<Set<Display>?> { + val flowValue = collectLastValue(displayRepository.displays) + verify(displayManager) + .registerDisplayListener(displayListener.capture(), eq(testHandler), anyLong()) + return flowValue + } + + private fun setDisplays(displays: List<Display>) { + whenever(displayManager.displays).thenReturn(displays.toTypedArray()) + } + + private fun setDisplays(vararg ids: Int) { + setDisplays(ids.map { display(it) }) + } + + private fun display(id: Int): Display { + return mock<Display>().also { mockDisplay -> + whenever(mockDisplay.displayId).thenReturn(id) + } + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/display/domain/interactor/ConnectedDisplayInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/display/domain/interactor/ConnectedDisplayInteractorTest.kt new file mode 100644 index 000000000000..1b597f44d23e --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/display/domain/interactor/ConnectedDisplayInteractorTest.kt @@ -0,0 +1,148 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.display.domain.interactor + +import android.testing.AndroidTestingRunner +import android.testing.TestableLooper +import android.view.Display +import android.view.Display.TYPE_EXTERNAL +import android.view.Display.TYPE_INTERNAL +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.coroutines.FlowValue +import com.android.systemui.coroutines.collectLastValue +import com.android.systemui.display.data.repository.DisplayRepository +import com.android.systemui.display.domain.interactor.ConnectedDisplayInteractor.State +import com.android.systemui.util.mockito.mock +import com.android.systemui.util.mockito.whenever +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.UnconfinedTestDispatcher +import kotlinx.coroutines.test.runTest +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidTestingRunner::class) +@TestableLooper.RunWithLooper +@OptIn(ExperimentalCoroutinesApi::class) +@SmallTest +class ConnectedDisplayInteractorTest : SysuiTestCase() { + + private val fakeDisplayRepository = FakeDisplayRepository() + private val connectedDisplayStateProvider: ConnectedDisplayInteractor = + ConnectedDisplayInteractorImpl(fakeDisplayRepository) + private val testScope = TestScope(UnconfinedTestDispatcher()) + + @Test + fun displayState_nullDisplays_disconnected() = + testScope.runTest { + val value by lastValue() + + fakeDisplayRepository.emit(emptySet()) + + assertThat(value).isEqualTo(State.DISCONNECTED) + } + + @Test + fun displayState_emptyDisplays_disconnected() = + testScope.runTest { + val value by lastValue() + + fakeDisplayRepository.emit(emptySet()) + + assertThat(value).isEqualTo(State.DISCONNECTED) + } + + @Test + fun displayState_internalDisplay_disconnected() = + testScope.runTest { + val value by lastValue() + + fakeDisplayRepository.emit(setOf(display(type = TYPE_INTERNAL))) + + assertThat(value).isEqualTo(State.DISCONNECTED) + } + + @Test + fun displayState_externalDisplay_connected() = + testScope.runTest { + val value by lastValue() + + fakeDisplayRepository.emit(setOf(display(type = TYPE_EXTERNAL))) + + assertThat(value).isEqualTo(State.CONNECTED) + } + + @Test + fun displayState_multipleExternalDisplays_connected() = + testScope.runTest { + val value by lastValue() + + fakeDisplayRepository.emit( + setOf(display(type = TYPE_EXTERNAL), display(type = TYPE_EXTERNAL)) + ) + + assertThat(value).isEqualTo(State.CONNECTED) + } + + @Test + fun displayState_externalSecure_connectedSecure() = + testScope.runTest { + val value by lastValue() + + fakeDisplayRepository.emit( + setOf(display(type = TYPE_EXTERNAL, flags = Display.FLAG_SECURE)) + ) + + assertThat(value).isEqualTo(State.CONNECTED_SECURE) + } + + @Test + fun displayState_multipleExternal_onlyOneSecure_connectedSecure() = + testScope.runTest { + val value by lastValue() + + fakeDisplayRepository.emit( + setOf( + display(type = TYPE_EXTERNAL, flags = Display.FLAG_SECURE), + display(type = TYPE_EXTERNAL, flags = 0) + ) + ) + + assertThat(value).isEqualTo(State.CONNECTED_SECURE) + } + + private fun TestScope.lastValue(): FlowValue<State?> = + collectLastValue(connectedDisplayStateProvider.connectedDisplayState) + + private fun display(type: Int, flags: Int = 0): Display { + return mock<Display>().also { mockDisplay -> + whenever(mockDisplay.type).thenReturn(type) + whenever(mockDisplay.flags).thenReturn(flags) + } + } + + private class FakeDisplayRepository : DisplayRepository { + private val flow = MutableSharedFlow<Set<Display>>() + suspend fun emit(value: Set<Display>) = flow.emit(value) + override val displays: Flow<Set<Display>> + get() = flow + } +} 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 12a9f942fcc8..6f7c217e4f3a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java @@ -780,6 +780,11 @@ public class KeyguardViewMediatorTest extends SysuiTestCase { assertTrue(mViewMediator.isShowingAndNotOccluded()); } + @Test + public void testBouncerSwipeDown() { + mViewMediator.getViewMediatorCallback().onBouncerSwipeDown(); + verify(mStatusBarKeyguardViewManager).reset(true); + } private void createAndStartViewMediator() { mViewMediator = new KeyguardViewMediator( mContext, diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/KeyguardQuickAffordanceLocalUserSelectionManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/KeyguardQuickAffordanceLocalUserSelectionManagerTest.kt index b2528c5b9832..edaff44cf543 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/KeyguardQuickAffordanceLocalUserSelectionManagerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/KeyguardQuickAffordanceLocalUserSelectionManagerTest.kt @@ -25,6 +25,7 @@ import androidx.test.filters.SmallTest import com.android.systemui.R import com.android.systemui.RoboPilotTest import com.android.systemui.SysuiTestCase +import com.android.systemui.backup.BackupHelper import com.android.systemui.settings.FakeUserTracker import com.android.systemui.settings.UserFileManager import com.android.systemui.util.FakeSharedPreferences @@ -360,7 +361,10 @@ class KeyguardQuickAffordanceLocalUserSelectionManagerTest : SysuiTestCase() { } clearInvocations(userFileManager) - fakeBroadcastDispatcher.registeredReceivers.firstOrNull()?.onReceive(context, Intent()) + fakeBroadcastDispatcher.sendIntentToMatchingReceiversOnly( + context, + Intent(BackupHelper.ACTION_RESTORE_FINISHED), + ) verify(userFileManager, atLeastOnce()).getSharedPreferences(anyString(), anyInt(), anyInt()) job.cancel() @@ -374,12 +378,13 @@ class KeyguardQuickAffordanceLocalUserSelectionManagerTest : SysuiTestCase() { arrayOf("leftTest:testShortcut1", "rightTest:testShortcut2") ) - assertThat(underTest.getSelections()).isEqualTo( - mapOf( - "leftTest" to listOf("testShortcut1"), - "rightTest" to listOf("testShortcut2"), + assertThat(underTest.getSelections()) + .isEqualTo( + mapOf( + "leftTest" to listOf("testShortcut1"), + "rightTest" to listOf("testShortcut2"), + ) ) - ) } private fun assertSelections( diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/BiometricSettingsRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/BiometricSettingsRepositoryTest.kt index b925aeb10262..f9070b37ca48 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/BiometricSettingsRepositoryTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/BiometricSettingsRepositoryTest.kt @@ -461,12 +461,10 @@ class BiometricSettingsRepositoryTest : SysuiTestCase() { } private fun broadcastDPMStateChange() { - fakeBroadcastDispatcher.registeredReceivers.forEach { receiver -> - receiver.onReceive( - context, - Intent(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED) - ) - } + fakeBroadcastDispatcher.sendIntentToMatchingReceiversOnly( + context, + Intent(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED), + ) } companion object { diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryImplTest.kt index 953d61844596..25573de1b12b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryImplTest.kt @@ -235,11 +235,10 @@ class KeyguardRepositoryImplTest : SysuiTestCase() { fun isKeyguardUnlocked() = testScope.runTest { whenever(keyguardStateController.isUnlocked).thenReturn(false) - var latest: Boolean? = null - val job = underTest.isKeyguardUnlocked.onEach { latest = it }.launchIn(this) + val isKeyguardUnlocked by collectLastValue(underTest.isKeyguardUnlocked) runCurrent() - assertThat(latest).isFalse() + assertThat(isKeyguardUnlocked).isFalse() val captor = argumentCaptor<KeyguardStateController.Callback>() verify(keyguardStateController).addCallback(captor.capture()) @@ -247,14 +246,12 @@ class KeyguardRepositoryImplTest : SysuiTestCase() { whenever(keyguardStateController.isUnlocked).thenReturn(true) captor.value.onUnlockedChanged() runCurrent() - assertThat(latest).isTrue() + assertThat(isKeyguardUnlocked).isTrue() whenever(keyguardStateController.isUnlocked).thenReturn(false) - captor.value.onUnlockedChanged() + captor.value.onKeyguardShowingChanged() runCurrent() - assertThat(latest).isFalse() - - job.cancel() + assertThat(isKeyguardUnlocked).isFalse() } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardLongPressInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardLongPressInteractorTest.kt index f63be610fd11..e9c22f9d551d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardLongPressInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardLongPressInteractorTest.kt @@ -194,9 +194,10 @@ class KeyguardLongPressInteractorTest : SysuiTestCase() { underTest.onLongPress() assertThat(isMenuVisible).isTrue() - fakeBroadcastDispatcher.registeredReceivers.forEach { broadcastReceiver -> - broadcastReceiver.onReceive(context, Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) - } + fakeBroadcastDispatcher.sendIntentToMatchingReceiversOnly( + context, + Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS), + ) assertThat(isMenuVisible).isFalse() } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionScenariosTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionScenariosTest.kt index 50075b5ae5d2..b5590154f7f4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionScenariosTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionScenariosTest.kt @@ -25,7 +25,6 @@ import com.android.systemui.flags.FakeFeatureFlags import com.android.systemui.flags.Flags import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository -import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository import com.android.systemui.keyguard.shared.model.BiometricUnlockModel import com.android.systemui.keyguard.shared.model.DozeStateModel import com.android.systemui.keyguard.shared.model.DozeTransitionModel @@ -56,6 +55,7 @@ import org.mockito.ArgumentMatchers.anyInt import org.mockito.Mock import org.mockito.Mockito.never import org.mockito.Mockito.reset +import org.mockito.Mockito.spy import org.mockito.Mockito.verify import org.mockito.MockitoAnnotations @@ -72,10 +72,10 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { private lateinit var bouncerRepository: FakeKeyguardBouncerRepository private lateinit var shadeRepository: ShadeRepository private lateinit var transitionRepository: FakeKeyguardTransitionRepository + private lateinit var transitionInteractor: KeyguardTransitionInteractor private lateinit var featureFlags: FakeFeatureFlags // Used to verify transition requests for test output - @Mock private lateinit var mockTransitionRepository: KeyguardTransitionRepository @Mock private lateinit var keyguardSecurityModel: KeyguardSecurityModel private lateinit var fromLockscreenTransitionInteractor: FromLockscreenTransitionInteractor @@ -97,92 +97,71 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { keyguardRepository = FakeKeyguardRepository() bouncerRepository = FakeKeyguardBouncerRepository() shadeRepository = FakeShadeRepository() - transitionRepository = FakeKeyguardTransitionRepository() + transitionRepository = spy(FakeKeyguardTransitionRepository()) + transitionInteractor = KeyguardTransitionInteractor( + transitionRepository, testScope.backgroundScope) whenever(keyguardSecurityModel.getSecurityMode(anyInt())).thenReturn(PIN) featureFlags = FakeFeatureFlags().apply { set(Flags.FACE_AUTH_REFACTOR, true) } - fromLockscreenTransitionInteractor = - FromLockscreenTransitionInteractor( + + fromLockscreenTransitionInteractor = FromLockscreenTransitionInteractor( scope = testScope, keyguardInteractor = createKeyguardInteractor(), + transitionRepository = transitionRepository, + transitionInteractor = transitionInteractor, shadeRepository = shadeRepository, - keyguardTransitionRepository = mockTransitionRepository, - keyguardTransitionInteractor = - KeyguardTransitionInteractor(transitionRepository, testScope.backgroundScope), - ) - fromLockscreenTransitionInteractor.start() + ).apply { start() } - fromDreamingTransitionInteractor = - FromDreamingTransitionInteractor( + fromPrimaryBouncerTransitionInteractor = FromPrimaryBouncerTransitionInteractor( scope = testScope, keyguardInteractor = createKeyguardInteractor(), - keyguardTransitionRepository = mockTransitionRepository, - keyguardTransitionInteractor = - KeyguardTransitionInteractor(transitionRepository, testScope.backgroundScope), - ) - fromDreamingTransitionInteractor.start() + transitionRepository = transitionRepository, + transitionInteractor = transitionInteractor, + keyguardSecurityModel = keyguardSecurityModel, + ).apply { start() } - fromAodTransitionInteractor = - FromAodTransitionInteractor( + fromDreamingTransitionInteractor = FromDreamingTransitionInteractor( scope = testScope, keyguardInteractor = createKeyguardInteractor(), - keyguardTransitionRepository = mockTransitionRepository, - keyguardTransitionInteractor = - KeyguardTransitionInteractor(transitionRepository, testScope.backgroundScope), - ) - fromAodTransitionInteractor.start() + transitionRepository = transitionRepository, + transitionInteractor = transitionInteractor, + ).apply { start() } - fromGoneTransitionInteractor = - FromGoneTransitionInteractor( + fromAodTransitionInteractor = FromAodTransitionInteractor( scope = testScope, keyguardInteractor = createKeyguardInteractor(), - keyguardTransitionRepository = mockTransitionRepository, - keyguardTransitionInteractor = - KeyguardTransitionInteractor(transitionRepository, testScope.backgroundScope), - ) - fromGoneTransitionInteractor.start() + transitionRepository = transitionRepository, + transitionInteractor = transitionInteractor, + ).apply { start() } - fromDozingTransitionInteractor = - FromDozingTransitionInteractor( + fromGoneTransitionInteractor = FromGoneTransitionInteractor( scope = testScope, keyguardInteractor = createKeyguardInteractor(), - keyguardTransitionRepository = mockTransitionRepository, - keyguardTransitionInteractor = - KeyguardTransitionInteractor(transitionRepository, testScope.backgroundScope), - ) - fromDozingTransitionInteractor.start() + transitionRepository = transitionRepository, + transitionInteractor = transitionInteractor, + ).apply { start() } - fromOccludedTransitionInteractor = - FromOccludedTransitionInteractor( + fromDozingTransitionInteractor = FromDozingTransitionInteractor( scope = testScope, keyguardInteractor = createKeyguardInteractor(), - keyguardTransitionRepository = mockTransitionRepository, - keyguardTransitionInteractor = - KeyguardTransitionInteractor(transitionRepository, testScope.backgroundScope), - ) - fromOccludedTransitionInteractor.start() + transitionRepository = transitionRepository, + transitionInteractor = transitionInteractor, + ).apply { start() } - fromAlternateBouncerTransitionInteractor = - FromAlternateBouncerTransitionInteractor( + fromOccludedTransitionInteractor = FromOccludedTransitionInteractor( scope = testScope, keyguardInteractor = createKeyguardInteractor(), - keyguardTransitionRepository = mockTransitionRepository, - keyguardTransitionInteractor = - KeyguardTransitionInteractor(transitionRepository, testScope.backgroundScope), - ) - fromAlternateBouncerTransitionInteractor.start() + transitionRepository = transitionRepository, + transitionInteractor = transitionInteractor, + ).apply { start() } - fromPrimaryBouncerTransitionInteractor = - FromPrimaryBouncerTransitionInteractor( + fromAlternateBouncerTransitionInteractor = FromAlternateBouncerTransitionInteractor( scope = testScope, keyguardInteractor = createKeyguardInteractor(), - keyguardTransitionRepository = mockTransitionRepository, - keyguardTransitionInteractor = - KeyguardTransitionInteractor(transitionRepository, testScope.backgroundScope), - keyguardSecurityModel = keyguardSecurityModel, - ) - fromPrimaryBouncerTransitionInteractor.start() + transitionRepository = transitionRepository, + transitionInteractor = transitionInteractor, + ).apply { start() } } @Test @@ -201,7 +180,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to PRIMARY_BOUNCER should occur assertThat(info.ownerName).isEqualTo("FromLockscreenTransitionInteractor") @@ -228,7 +207,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to DOZING should occur assertThat(info.ownerName).isEqualTo("FromOccludedTransitionInteractor") @@ -255,7 +234,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to DOZING should occur assertThat(info.ownerName).isEqualTo("FromOccludedTransitionInteractor") @@ -286,7 +265,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to DREAMING should occur assertThat(info.ownerName).isEqualTo("FromLockscreenTransitionInteractor") @@ -313,7 +292,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to DOZING should occur assertThat(info.ownerName).isEqualTo("FromLockscreenTransitionInteractor") @@ -340,7 +319,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to DOZING should occur assertThat(info.ownerName).isEqualTo("FromLockscreenTransitionInteractor") @@ -363,7 +342,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to DOZING should occur assertThat(info.ownerName).isEqualTo("FromDozingTransitionInteractor") @@ -388,14 +367,14 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { ) ) runCurrent() - reset(mockTransitionRepository) + reset(transitionRepository) // WHEN a signal comes that dreaming is enabled keyguardRepository.setDreamingWithOverlay(true) advanceUntilIdle() // THEN the transition is ignored - verify(mockTransitionRepository, never()).startTransition(any(), anyBoolean()) + verify(transitionRepository, never()).startTransition(any(), anyBoolean()) coroutineContext.cancelChildren() } @@ -412,7 +391,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to DOZING should occur assertThat(info.ownerName).isEqualTo("FromDozingTransitionInteractor") @@ -439,7 +418,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to DOZING should occur assertThat(info.ownerName).isEqualTo("FromGoneTransitionInteractor") @@ -466,7 +445,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to AOD should occur assertThat(info.ownerName).isEqualTo("FromGoneTransitionInteractor") @@ -489,7 +468,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to AOD should occur assertThat(info.ownerName).isEqualTo("FromGoneTransitionInteractor") @@ -520,7 +499,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to DREAMING should occur assertThat(info.ownerName).isEqualTo("FromGoneTransitionInteractor") @@ -543,7 +522,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to PRIMARY_BOUNCER should occur assertThat(info.ownerName).isEqualTo("FromAlternateBouncerTransitionInteractor") @@ -572,7 +551,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to AOD should occur assertThat(info.ownerName).isEqualTo("FromAlternateBouncerTransitionInteractor") @@ -602,7 +581,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to DOZING should occur assertThat(info.ownerName).isEqualTo("FromAlternateBouncerTransitionInteractor") @@ -630,7 +609,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to LOCKSCREEN should occur assertThat(info.ownerName).isEqualTo("FromAlternateBouncerTransitionInteractor") @@ -658,7 +637,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to AOD should occur assertThat(info.ownerName).isEqualTo("FromPrimaryBouncerTransitionInteractor") @@ -686,7 +665,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to DOZING should occur assertThat(info.ownerName).isEqualTo("FromPrimaryBouncerTransitionInteractor") @@ -713,7 +692,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to LOCKSCREEN should occur assertThat(info.ownerName).isEqualTo("FromPrimaryBouncerTransitionInteractor") @@ -744,7 +723,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to GONE should occur assertThat(info.ownerName).isEqualTo("FromOccludedTransitionInteractor") @@ -773,7 +752,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to LOCKSCREEN should occur assertThat(info.ownerName).isEqualTo("FromOccludedTransitionInteractor") @@ -799,7 +778,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to AlternateBouncer should occur assertThat(info.ownerName).isEqualTo("FromOccludedTransitionInteractor") @@ -828,7 +807,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor<TransitionInfo> { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to AlternateBouncer should occur assertThat(info.ownerName).isEqualTo("FromPrimaryBouncerTransitionInteractor") @@ -890,6 +869,6 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { ) ) runCurrent() - reset(mockTransitionRepository) + reset(transitionRepository) } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/LockscreenSceneInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/LockscreenSceneInteractorTest.kt index 65781c497944..abbdc3d55ac6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/LockscreenSceneInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/LockscreenSceneInteractorTest.kt @@ -26,7 +26,6 @@ import com.android.systemui.scene.shared.model.SceneKey import com.android.systemui.scene.shared.model.SceneModel import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.runCurrent import kotlinx.coroutines.test.runTest import org.junit.Test @@ -38,8 +37,8 @@ import org.junit.runners.JUnit4 @RunWith(JUnit4::class) class LockscreenSceneInteractorTest : SysuiTestCase() { - private val testScope = TestScope() - private val utils = SceneTestUtils(this, testScope) + private val utils = SceneTestUtils(this) + private val testScope = utils.testScope private val sceneInteractor = utils.sceneInteractor() private val authenticationInteractor = utils.authenticationInteractor( @@ -61,10 +60,10 @@ class LockscreenSceneInteractorTest : SysuiTestCase() { testScope.runTest { val isDeviceLocked by collectLastValue(underTest.isDeviceLocked) - authenticationInteractor.lockDevice() + utils.authenticationRepository.setUnlocked(false) assertThat(isDeviceLocked).isTrue() - authenticationInteractor.unlockDevice() + utils.authenticationRepository.setUnlocked(true) assertThat(isDeviceLocked).isFalse() } @@ -73,8 +72,8 @@ class LockscreenSceneInteractorTest : SysuiTestCase() { testScope.runTest { val isSwipeToDismissEnabled by collectLastValue(underTest.isSwipeToDismissEnabled) - authenticationInteractor.lockDevice() - authenticationInteractor.setAuthenticationMethod(AuthenticationMethodModel.Swipe) + utils.authenticationRepository.setUnlocked(false) + utils.authenticationRepository.setAuthenticationMethod(AuthenticationMethodModel.Swipe) assertThat(isSwipeToDismissEnabled).isTrue() } @@ -84,8 +83,8 @@ class LockscreenSceneInteractorTest : SysuiTestCase() { testScope.runTest { val isSwipeToDismissEnabled by collectLastValue(underTest.isSwipeToDismissEnabled) - authenticationInteractor.unlockDevice() - authenticationInteractor.setAuthenticationMethod(AuthenticationMethodModel.Swipe) + utils.authenticationRepository.setUnlocked(true) + utils.authenticationRepository.setAuthenticationMethod(AuthenticationMethodModel.Swipe) assertThat(isSwipeToDismissEnabled).isFalse() } @@ -94,8 +93,10 @@ class LockscreenSceneInteractorTest : SysuiTestCase() { fun dismissLockScreen_deviceLockedWithSecureAuthMethod_switchesToBouncer() = testScope.runTest { val currentScene by collectLastValue(sceneInteractor.currentScene(CONTAINER_1)) - authenticationInteractor.lockDevice() - authenticationInteractor.setAuthenticationMethod(AuthenticationMethodModel.Pin(1234)) + utils.authenticationRepository.setUnlocked(false) + utils.authenticationRepository.setAuthenticationMethod( + AuthenticationMethodModel.Pin(1234) + ) assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Lockscreen)) underTest.dismissLockscreen() @@ -107,8 +108,10 @@ class LockscreenSceneInteractorTest : SysuiTestCase() { fun dismissLockScreen_deviceUnlocked_switchesToGone() = testScope.runTest { val currentScene by collectLastValue(sceneInteractor.currentScene(CONTAINER_1)) - authenticationInteractor.unlockDevice() - authenticationInteractor.setAuthenticationMethod(AuthenticationMethodModel.Pin(1234)) + utils.authenticationRepository.setUnlocked(true) + utils.authenticationRepository.setAuthenticationMethod( + AuthenticationMethodModel.Pin(1234) + ) assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Lockscreen)) underTest.dismissLockscreen() @@ -120,8 +123,8 @@ class LockscreenSceneInteractorTest : SysuiTestCase() { fun dismissLockScreen_deviceLockedWithInsecureAuthMethod_switchesToGone() = testScope.runTest { val currentScene by collectLastValue(sceneInteractor.currentScene(CONTAINER_1)) - authenticationInteractor.lockDevice() - authenticationInteractor.setAuthenticationMethod(AuthenticationMethodModel.Swipe) + utils.authenticationRepository.setUnlocked(false) + utils.authenticationRepository.setAuthenticationMethod(AuthenticationMethodModel.Swipe) assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Lockscreen)) underTest.dismissLockscreen() @@ -136,66 +139,23 @@ class LockscreenSceneInteractorTest : SysuiTestCase() { runCurrent() sceneInteractor.setCurrentScene(CONTAINER_1, SceneModel(SceneKey.Gone)) runCurrent() - authenticationInteractor.unlockDevice() + utils.authenticationRepository.setUnlocked(true) runCurrent() assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Gone)) - authenticationInteractor.lockDevice() + utils.authenticationRepository.setUnlocked(false) assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Lockscreen)) } @Test - fun deviceBiometricUnlockedInLockScreen_bypassEnabled_switchesToGone() = - testScope.runTest { - val currentScene by collectLastValue(sceneInteractor.currentScene(CONTAINER_1)) - authenticationInteractor.lockDevice() - sceneInteractor.setCurrentScene(CONTAINER_1, SceneModel(SceneKey.Lockscreen)) - if (!authenticationInteractor.isBypassEnabled.value) { - authenticationInteractor.toggleBypassEnabled() - } - assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Lockscreen)) - - authenticationInteractor.biometricUnlock() - - assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Gone)) - } - - @Test - fun deviceBiometricUnlockedInLockScreen_bypassNotEnabled_doesNotSwitch() = - testScope.runTest { - val currentScene by collectLastValue(sceneInteractor.currentScene(CONTAINER_1)) - authenticationInteractor.lockDevice() - sceneInteractor.setCurrentScene(CONTAINER_1, SceneModel(SceneKey.Lockscreen)) - if (authenticationInteractor.isBypassEnabled.value) { - authenticationInteractor.toggleBypassEnabled() - } - assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Lockscreen)) - - authenticationInteractor.biometricUnlock() - - assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Lockscreen)) - } - - @Test - fun switchFromLockScreenToGone_authMethodSwipe_unlocksDevice() = - testScope.runTest { - val isUnlocked by collectLastValue(authenticationInteractor.isUnlocked) - sceneInteractor.setCurrentScene(CONTAINER_1, SceneModel(SceneKey.Lockscreen)) - authenticationInteractor.setAuthenticationMethod(AuthenticationMethodModel.Swipe) - assertThat(isUnlocked).isFalse() - - sceneInteractor.setCurrentScene(CONTAINER_1, SceneModel(SceneKey.Gone)) - - assertThat(isUnlocked).isTrue() - } - - @Test fun switchFromLockScreenToGone_authMethodNotSwipe_doesNotUnlockDevice() = testScope.runTest { val isUnlocked by collectLastValue(authenticationInteractor.isUnlocked) sceneInteractor.setCurrentScene(CONTAINER_1, SceneModel(SceneKey.Lockscreen)) - authenticationInteractor.setAuthenticationMethod(AuthenticationMethodModel.Pin(1234)) + utils.authenticationRepository.setAuthenticationMethod( + AuthenticationMethodModel.Pin(1234) + ) assertThat(isUnlocked).isFalse() sceneInteractor.setCurrentScene(CONTAINER_1, SceneModel(SceneKey.Gone)) @@ -210,7 +170,7 @@ class LockscreenSceneInteractorTest : SysuiTestCase() { runCurrent() sceneInteractor.setCurrentScene(CONTAINER_1, SceneModel(SceneKey.Shade)) runCurrent() - authenticationInteractor.setAuthenticationMethod(AuthenticationMethodModel.Swipe) + utils.authenticationRepository.setAuthenticationMethod(AuthenticationMethodModel.Swipe) runCurrent() assertThat(isUnlocked).isFalse() @@ -220,29 +180,16 @@ class LockscreenSceneInteractorTest : SysuiTestCase() { } @Test - fun authMethodChangedToNone_onLockScreenScene_dismissesLockScreen() = - testScope.runTest { - val currentScene by collectLastValue(sceneInteractor.currentScene(CONTAINER_1)) - sceneInteractor.setCurrentScene(CONTAINER_1, SceneModel(SceneKey.Lockscreen)) - authenticationInteractor.setAuthenticationMethod(AuthenticationMethodModel.Swipe) - assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Lockscreen)) - - authenticationInteractor.setAuthenticationMethod(AuthenticationMethodModel.None) - - assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Gone)) - } - - @Test fun authMethodChangedToNone_notOnLockScreenScene_doesNotDismissLockScreen() = testScope.runTest { val currentScene by collectLastValue(sceneInteractor.currentScene(CONTAINER_1)) - authenticationInteractor.setAuthenticationMethod(AuthenticationMethodModel.Swipe) + utils.authenticationRepository.setAuthenticationMethod(AuthenticationMethodModel.Swipe) runCurrent() sceneInteractor.setCurrentScene(CONTAINER_1, SceneModel(SceneKey.QuickSettings)) runCurrent() assertThat(currentScene).isEqualTo(SceneModel(SceneKey.QuickSettings)) - authenticationInteractor.setAuthenticationMethod(AuthenticationMethodModel.None) + utils.authenticationRepository.setAuthenticationMethod(AuthenticationMethodModel.None) assertThat(currentScene).isEqualTo(SceneModel(SceneKey.QuickSettings)) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenSceneViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenSceneViewModelTest.kt index f0ea0077596a..ff4ec4b738bd 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenSceneViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenSceneViewModelTest.kt @@ -29,7 +29,6 @@ import com.android.systemui.scene.shared.model.SceneKey import com.android.systemui.scene.shared.model.SceneModel import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.runCurrent import kotlinx.coroutines.test.runTest import org.junit.Test @@ -41,8 +40,8 @@ import org.junit.runners.JUnit4 @RunWith(JUnit4::class) class LockscreenSceneViewModelTest : SysuiTestCase() { - private val testScope = TestScope() - private val utils = SceneTestUtils(this, testScope) + private val utils = SceneTestUtils(this) + private val testScope = utils.testScope private val sceneInteractor = utils.sceneInteractor() private val authenticationInteractor = utils.authenticationInteractor( @@ -73,10 +72,10 @@ class LockscreenSceneViewModelTest : SysuiTestCase() { fun lockButtonIcon_whenLocked() = testScope.runTest { val lockButtonIcon by collectLastValue(underTest.lockButtonIcon) - authenticationInteractor.setAuthenticationMethod( + utils.authenticationRepository.setAuthenticationMethod( AuthenticationMethodModel.Password("password") ) - authenticationInteractor.lockDevice() + utils.authenticationRepository.setUnlocked(false) assertThat((lockButtonIcon as? Icon.Resource)?.res) .isEqualTo(R.drawable.ic_device_lock_on) @@ -86,10 +85,10 @@ class LockscreenSceneViewModelTest : SysuiTestCase() { fun lockButtonIcon_whenUnlocked() = testScope.runTest { val lockButtonIcon by collectLastValue(underTest.lockButtonIcon) - authenticationInteractor.setAuthenticationMethod( + utils.authenticationRepository.setAuthenticationMethod( AuthenticationMethodModel.Password("password") ) - authenticationInteractor.unlockDevice() + utils.authenticationRepository.setUnlocked(true) assertThat((lockButtonIcon as? Icon.Resource)?.res) .isEqualTo(R.drawable.ic_device_lock_off) @@ -99,8 +98,8 @@ class LockscreenSceneViewModelTest : SysuiTestCase() { fun upTransitionSceneKey_swipeToUnlockedEnabled_gone() = testScope.runTest { val upTransitionSceneKey by collectLastValue(underTest.upDestinationSceneKey) - authenticationInteractor.setAuthenticationMethod(AuthenticationMethodModel.Swipe) - authenticationInteractor.lockDevice() + utils.authenticationRepository.setAuthenticationMethod(AuthenticationMethodModel.Swipe) + utils.authenticationRepository.setUnlocked(false) assertThat(upTransitionSceneKey).isEqualTo(SceneKey.Gone) } @@ -109,8 +108,10 @@ class LockscreenSceneViewModelTest : SysuiTestCase() { fun upTransitionSceneKey_swipeToUnlockedNotEnabled_bouncer() = testScope.runTest { val upTransitionSceneKey by collectLastValue(underTest.upDestinationSceneKey) - authenticationInteractor.setAuthenticationMethod(AuthenticationMethodModel.Pin(1234)) - authenticationInteractor.lockDevice() + utils.authenticationRepository.setAuthenticationMethod( + AuthenticationMethodModel.Pin(1234) + ) + utils.authenticationRepository.setUnlocked(false) assertThat(upTransitionSceneKey).isEqualTo(SceneKey.Bouncer) } @@ -119,8 +120,10 @@ class LockscreenSceneViewModelTest : SysuiTestCase() { fun onLockButtonClicked_deviceLockedSecurely_switchesToBouncer() = testScope.runTest { val currentScene by collectLastValue(sceneInteractor.currentScene(CONTAINER_1)) - authenticationInteractor.setAuthenticationMethod(AuthenticationMethodModel.Pin(1234)) - authenticationInteractor.lockDevice() + utils.authenticationRepository.setAuthenticationMethod( + AuthenticationMethodModel.Pin(1234) + ) + utils.authenticationRepository.setUnlocked(false) runCurrent() underTest.onLockButtonClicked() @@ -132,8 +135,10 @@ class LockscreenSceneViewModelTest : SysuiTestCase() { fun onContentClicked_deviceUnlocked_switchesToGone() = testScope.runTest { val currentScene by collectLastValue(sceneInteractor.currentScene(CONTAINER_1)) - authenticationInteractor.setAuthenticationMethod(AuthenticationMethodModel.Pin(1234)) - authenticationInteractor.unlockDevice() + utils.authenticationRepository.setAuthenticationMethod( + AuthenticationMethodModel.Pin(1234) + ) + utils.authenticationRepository.setUnlocked(true) runCurrent() underTest.onContentClicked() @@ -145,8 +150,10 @@ class LockscreenSceneViewModelTest : SysuiTestCase() { fun onContentClicked_deviceLockedSecurely_switchesToBouncer() = testScope.runTest { val currentScene by collectLastValue(sceneInteractor.currentScene(CONTAINER_1)) - authenticationInteractor.setAuthenticationMethod(AuthenticationMethodModel.Pin(1234)) - authenticationInteractor.lockDevice() + utils.authenticationRepository.setAuthenticationMethod( + AuthenticationMethodModel.Pin(1234) + ) + utils.authenticationRepository.setUnlocked(false) runCurrent() underTest.onContentClicked() @@ -158,8 +165,10 @@ class LockscreenSceneViewModelTest : SysuiTestCase() { fun onLockButtonClicked_deviceUnlocked_switchesToGone() = testScope.runTest { val currentScene by collectLastValue(sceneInteractor.currentScene(CONTAINER_1)) - authenticationInteractor.setAuthenticationMethod(AuthenticationMethodModel.Pin(1234)) - authenticationInteractor.unlockDevice() + utils.authenticationRepository.setAuthenticationMethod( + AuthenticationMethodModel.Pin(1234) + ) + utils.authenticationRepository.setUnlocked(true) runCurrent() underTest.onLockButtonClicked() diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/controls/resume/MediaResumeListenerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/controls/resume/MediaResumeListenerTest.kt index 9ab728949e40..530b86eb4978 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/controls/resume/MediaResumeListenerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/controls/resume/MediaResumeListenerTest.kt @@ -98,6 +98,8 @@ class MediaResumeListenerTest : SysuiTestCase() { @Captor lateinit var callbackCaptor: ArgumentCaptor<ResumeMediaBrowser.Callback> @Captor lateinit var actionCaptor: ArgumentCaptor<Runnable> @Captor lateinit var componentCaptor: ArgumentCaptor<String> + @Captor lateinit var userIdCaptor: ArgumentCaptor<Int> + @Captor lateinit var userCallbackCaptor: ArgumentCaptor<UserTracker.Callback> private lateinit var executor: FakeExecutor private lateinit var data: MediaData @@ -124,7 +126,7 @@ class MediaResumeListenerTest : SysuiTestCase() { ) Settings.Secure.putInt(context.contentResolver, Settings.Secure.MEDIA_CONTROLS_RESUME, 1) - whenever(resumeBrowserFactory.create(capture(callbackCaptor), any())) + whenever(resumeBrowserFactory.create(capture(callbackCaptor), any(), capture(userIdCaptor))) .thenReturn(resumeBrowser) // resume components are stored in sharedpreferences @@ -334,6 +336,7 @@ class MediaResumeListenerTest : SysuiTestCase() { @Test fun testOnUserUnlock_loadsTracks() { // Set up mock service to successfully find valid media + setUpMbsWithValidResolveInfo() val description = MediaDescription.Builder().setTitle(TITLE).build() val component = ComponentName(PACKAGE_NAME, CLASS_NAME) whenever(resumeBrowser.token).thenReturn(token) @@ -417,6 +420,7 @@ class MediaResumeListenerTest : SysuiTestCase() { @Test fun testLoadComponents_recentlyPlayed_adds() { // Set up browser to return successfully + setUpMbsWithValidResolveInfo() val description = MediaDescription.Builder().setTitle(TITLE).build() val component = ComponentName(PACKAGE_NAME, CLASS_NAME) whenever(resumeBrowser.token).thenReturn(token) @@ -600,7 +604,7 @@ class MediaResumeListenerTest : SysuiTestCase() { // Set up our factory to return a new browser so we can verify we disconnected the old one val newResumeBrowser = mock(ResumeMediaBrowser::class.java) - whenever(resumeBrowserFactory.create(capture(callbackCaptor), any())) + whenever(resumeBrowserFactory.create(capture(callbackCaptor), any(), anyInt())) .thenReturn(newResumeBrowser) // When the resume action is run @@ -610,6 +614,66 @@ class MediaResumeListenerTest : SysuiTestCase() { verify(resumeBrowser).disconnect() } + @Test + fun testUserUnlocked_userChangeWhileQuerying() { + val firstUserId = 1 + val secondUserId = 2 + val description = MediaDescription.Builder().setTitle(TITLE).build() + val component = ComponentName(PACKAGE_NAME, CLASS_NAME) + + setUpMbsWithValidResolveInfo() + whenever(resumeBrowser.token).thenReturn(token) + whenever(resumeBrowser.appIntent).thenReturn(pendingIntent) + + val unlockIntent = + Intent(Intent.ACTION_USER_UNLOCKED).apply { + putExtra(Intent.EXTRA_USER_HANDLE, firstUserId) + } + verify(userTracker).addCallback(capture(userCallbackCaptor), any()) + + // When the first user unlocks and we query their recent media + userCallbackCaptor.value.onUserChanged(firstUserId, context) + resumeListener.userUnlockReceiver.onReceive(context, unlockIntent) + whenever(resumeBrowser.userId).thenReturn(userIdCaptor.value) + verify(resumeBrowser, times(3)).findRecentMedia() + + // And the user changes before the MBS response is received + userCallbackCaptor.value.onUserChanged(secondUserId, context) + callbackCaptor.value.addTrack(description, component, resumeBrowser) + + // Then the loaded media is correctly associated with the first user + verify(mediaDataManager) + .addResumptionControls( + eq(firstUserId), + eq(description), + any(), + eq(token), + eq(PACKAGE_NAME), + eq(pendingIntent), + eq(PACKAGE_NAME) + ) + } + + @Test + fun testUserUnlocked_noComponent_doesNotQuery() { + // Set up a valid MBS, but user does not have the service available + setUpMbsWithValidResolveInfo() + val pm = mock(PackageManager::class.java) + whenever(mockContext.packageManager).thenReturn(pm) + whenever(pm.resolveServiceAsUser(any(), anyInt(), anyInt())).thenReturn(null) + + val unlockIntent = + Intent(Intent.ACTION_USER_UNLOCKED).apply { + putExtra(Intent.EXTRA_USER_HANDLE, context.userId) + } + + // When the user is unlocked, but does not have the component installed + resumeListener.userUnlockReceiver.onReceive(context, unlockIntent) + + // Then we never attempt to connect to it + verify(resumeBrowser, never()).findRecentMedia() + } + /** Sets up mocks to successfully find a MBS that returns valid media. */ private fun setUpMbsWithValidResolveInfo() { val pm = mock(PackageManager::class.java) @@ -620,6 +684,8 @@ class MediaResumeListenerTest : SysuiTestCase() { resolveInfo.serviceInfo = serviceInfo resolveInfo.serviceInfo.name = CLASS_NAME val resumeInfo = listOf(resolveInfo) - whenever(pm.queryIntentServices(any(), anyInt())).thenReturn(resumeInfo) + whenever(pm.queryIntentServicesAsUser(any(), anyInt(), anyInt())).thenReturn(resumeInfo) + whenever(pm.resolveServiceAsUser(any(), anyInt(), anyInt())).thenReturn(resolveInfo) + whenever(pm.getApplicationLabel(any())).thenReturn(PACKAGE_NAME) } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/controls/resume/ResumeMediaBrowserTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/controls/resume/ResumeMediaBrowserTest.kt index a04cfd46588b..b45e66bfc31b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/controls/resume/ResumeMediaBrowserTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/controls/resume/ResumeMediaBrowserTest.kt @@ -93,7 +93,8 @@ public class ResumeMediaBrowserTest : SysuiTestCase() { component, browserFactory, logger, - mediaController + mediaController, + context.userId, ) } @@ -381,8 +382,9 @@ public class ResumeMediaBrowserTest : SysuiTestCase() { componentName: ComponentName, browserFactory: MediaBrowserFactory, logger: ResumeMediaBrowserLogger, - private val fakeController: MediaController - ) : ResumeMediaBrowser(context, callback, componentName, browserFactory, logger) { + private val fakeController: MediaController, + userId: Int, + ) : ResumeMediaBrowser(context, callback, componentName, browserFactory, logger, userId) { override fun createMediaController(token: MediaSession.Token): MediaController { return fakeController diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java index d98bcee1e01a..9781baae2f89 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java @@ -25,6 +25,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.isNull; +import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; @@ -107,7 +108,7 @@ public class QSTileHostTest extends SysuiTestCase { @Mock private TunerService mTunerService; @Mock - private Provider<AutoTileManager> mAutoTiles; + private AutoTileManager mAutoTiles; @Mock private ShadeController mShadeController; @Mock @@ -140,6 +141,7 @@ public class QSTileHostTest extends SysuiTestCase { mFeatureFlags = new FakeFeatureFlags(); mFeatureFlags.set(Flags.QS_PIPELINE_NEW_HOST, false); + mFeatureFlags.set(Flags.QS_PIPELINE_AUTO_ADD, false); mMainExecutor = new FakeExecutor(new FakeSystemClock()); @@ -160,9 +162,10 @@ public class QSTileHostTest extends SysuiTestCase { mSecureSettings = new FakeSettings(); saveSetting(""); mQSTileHost = new TestQSTileHost(mContext, mDefaultFactory, mMainExecutor, - mPluginManager, mTunerService, mAutoTiles, mShadeController, + mPluginManager, mTunerService, () -> mAutoTiles, mShadeController, mQSLogger, mUserTracker, mSecureSettings, mCustomTileStatePersister, mTileLifecycleManagerFactory, mUserFileManager, mFeatureFlags); + mMainExecutor.runAllReady(); mSecureSettings.registerContentObserverForUser(SETTING, new ContentObserver(null) { @Override @@ -296,11 +299,20 @@ public class QSTileHostTest extends SysuiTestCase { StringWriter w = new StringWriter(); PrintWriter pw = new PrintWriter(w); mQSTileHost.dump(pw, new String[]{}); - String output = "QSTileHost:\n" - + TestTile1.class.getSimpleName() + ":\n" - + " " + MOCK_STATE_STRING + "\n" - + TestTile2.class.getSimpleName() + ":\n" - + " " + MOCK_STATE_STRING + "\n"; + + String output = "QSTileHost:" + "\n" + + "tile specs: [spec1, spec2]" + "\n" + + "current user: 0" + "\n" + + "is dirty: false" + "\n" + + "tiles:" + "\n" + + "TestTile1:" + "\n" + + " MockState" + "\n" + + "TestTile2:" + "\n" + + " MockState" + "\n"; + + System.out.println(output); + System.out.println(w.getBuffer().toString()); + assertEquals(output, w.getBuffer().toString()); } @@ -672,6 +684,17 @@ public class QSTileHostTest extends SysuiTestCase { assertEquals(CUSTOM_TILE.getClassName(), proto.tiles[1].getComponentName().className); } + @Test + public void testUserChange_flagOn_autoTileManagerNotified() { + mFeatureFlags.set(Flags.QS_PIPELINE_NEW_HOST, true); + int currentUser = mUserTracker.getUserId(); + clearInvocations(mAutoTiles); + when(mUserTracker.getUserId()).thenReturn(currentUser + 1); + + mQSTileHost.onTuningChanged(SETTING, "a,b"); + verify(mAutoTiles).changeUser(UserHandle.of(currentUser + 1)); + } + private SharedPreferences getSharedPreferencesForUser(int user) { return mUserFileManager.getSharedPreferences(QSTileHost.TILES, 0, user); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/AutoAddableSettingListTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/AutoAddableSettingListTest.kt new file mode 100644 index 000000000000..817ac61e5303 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/AutoAddableSettingListTest.kt @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.qs.pipeline.domain.autoaddable + +import android.content.ComponentName +import android.testing.AndroidTestingRunner +import androidx.test.filters.SmallTest +import com.android.systemui.R +import com.android.systemui.SysuiTestCase +import com.android.systemui.qs.pipeline.shared.TileSpec +import com.android.systemui.util.mockito.mock +import com.google.common.truth.Truth.assertThat +import org.junit.Test +import org.junit.runner.RunWith + +@SmallTest +@RunWith(AndroidTestingRunner::class) +class AutoAddableSettingListTest : SysuiTestCase() { + + private val factory = + object : AutoAddableSetting.Factory { + override fun create(setting: String, spec: TileSpec): AutoAddableSetting { + return AutoAddableSetting( + mock(), + mock(), + setting, + spec, + ) + } + } + + @Test + fun correctLines_correctAutoAddables() { + val setting1 = "setting1" + val setting2 = "setting2" + val spec1 = TileSpec.create("spec1") + val spec2 = TileSpec.create(ComponentName("pkg", "cls")) + + context.orCreateTestableResources.addOverride( + R.array.config_quickSettingsAutoAdd, + arrayOf(toStringLine(setting1, spec1), toStringLine(setting2, spec2)) + ) + + val autoAddables = AutoAddableSettingList.parseSettingsResource(context.resources, factory) + + assertThat(autoAddables) + .containsExactly(factory.create(setting1, spec1), factory.create(setting2, spec2)) + } + + @Test + fun malformedLine_ignored() { + val setting = "setting" + val spec = TileSpec.create("spec") + + context.orCreateTestableResources.addOverride( + R.array.config_quickSettingsAutoAdd, + arrayOf(toStringLine(setting, spec), "bad_line") + ) + + val autoAddables = AutoAddableSettingList.parseSettingsResource(context.resources, factory) + + assertThat(autoAddables).containsExactly(factory.create(setting, spec)) + } + + @Test + fun invalidSpec_ignored() { + val setting = "setting" + val spec = TileSpec.create("spec") + + context.orCreateTestableResources.addOverride( + R.array.config_quickSettingsAutoAdd, + arrayOf(toStringLine(setting, spec), "invalid:") + ) + + val autoAddables = AutoAddableSettingList.parseSettingsResource(context.resources, factory) + + assertThat(autoAddables).containsExactly(factory.create(setting, spec)) + } + + companion object { + private fun toStringLine(setting: String, spec: TileSpec) = + "$setting$SETTINGS_SEPARATOR${spec.spec}" + private const val SETTINGS_SEPARATOR = ":" + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/AutoAddableSettingTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/AutoAddableSettingTest.kt new file mode 100644 index 000000000000..36c3c9d79e86 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/AutoAddableSettingTest.kt @@ -0,0 +1,117 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.qs.pipeline.domain.autoaddable + +import android.testing.AndroidTestingRunner +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.coroutines.collectLastValue +import com.android.systemui.coroutines.collectValues +import com.android.systemui.qs.pipeline.domain.model.AutoAddSignal +import com.android.systemui.qs.pipeline.domain.model.AutoAddTracking +import com.android.systemui.qs.pipeline.shared.TileSpec +import com.android.systemui.util.settings.FakeSettings +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.runTest +import org.junit.Test +import org.junit.runner.RunWith + +@OptIn(ExperimentalCoroutinesApi::class) +@SmallTest +@RunWith(AndroidTestingRunner::class) +class AutoAddableSettingTest : SysuiTestCase() { + + private val testDispatcher = StandardTestDispatcher() + private val testScope = TestScope(testDispatcher) + + private val secureSettings = FakeSettings() + private val underTest = + AutoAddableSetting( + secureSettings, + testDispatcher, + SETTING, + SPEC, + ) + + @Test + fun settingNotSet_noSignal() = + testScope.runTest { + val userId = 0 + val signal by collectLastValue(underTest.autoAddSignal(userId)) + + assertThat(signal).isNull() // null means no emitted value + } + + @Test + fun settingSetTo0_noSignal() = + testScope.runTest { + val userId = 0 + val signal by collectLastValue(underTest.autoAddSignal(userId)) + + secureSettings.putIntForUser(SETTING, 0, userId) + + assertThat(signal).isNull() // null means no emitted value + } + + @Test + fun settingSetToNon0_signal() = + testScope.runTest { + val userId = 0 + val signal by collectLastValue(underTest.autoAddSignal(userId)) + + secureSettings.putIntForUser(SETTING, 42, userId) + + assertThat(signal).isEqualTo(AutoAddSignal.Add(SPEC)) + } + + @Test + fun settingSetForUser_onlySignalInThatUser() = + testScope.runTest { + val signal0 by collectLastValue(underTest.autoAddSignal(0)) + val signal1 by collectLastValue(underTest.autoAddSignal(1)) + + secureSettings.putIntForUser(SETTING, /* value */ 42, /* userHandle */ 1) + + assertThat(signal0).isNull() + assertThat(signal1).isEqualTo(AutoAddSignal.Add(SPEC)) + } + + @Test + fun multipleNonZeroChanges_onlyOneSignal() = + testScope.runTest { + val userId = 0 + val signals by collectValues(underTest.autoAddSignal(userId)) + + secureSettings.putIntForUser(SETTING, 1, userId) + secureSettings.putIntForUser(SETTING, 2, userId) + + assertThat(signals.size).isEqualTo(1) + } + + @Test + fun strategyIfNotAdded() { + assertThat(underTest.autoAddTracking).isEqualTo(AutoAddTracking.IfNotAdded(SPEC)) + } + + companion object { + private const val SETTING = "setting" + private val SPEC = TileSpec.create("spec") + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/CallbackControllerAutoAddableTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/CallbackControllerAutoAddableTest.kt new file mode 100644 index 000000000000..afb43c7e9c16 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/CallbackControllerAutoAddableTest.kt @@ -0,0 +1,139 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.qs.pipeline.domain.autoaddable + +import android.testing.AndroidTestingRunner +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.coroutines.collectLastValue +import com.android.systemui.qs.pipeline.domain.model.AutoAddSignal +import com.android.systemui.qs.pipeline.domain.model.AutoAddTracking +import com.android.systemui.qs.pipeline.shared.TileSpec +import com.android.systemui.statusbar.policy.CallbackController +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.channels.ProducerScope +import kotlinx.coroutines.launch +import kotlinx.coroutines.test.runCurrent +import kotlinx.coroutines.test.runTest +import org.junit.Test +import org.junit.runner.RunWith + +@OptIn(ExperimentalCoroutinesApi::class) +@SmallTest +@RunWith(AndroidTestingRunner::class) +class CallbackControllerAutoAddableTest : SysuiTestCase() { + + @Test + fun callbackAddedAndRemoved() = runTest { + val controller = TestableController() + val callback = object : TestableController.Callback {} + val underTest = + object : + CallbackControllerAutoAddable<TestableController.Callback, TestableController>( + controller + ) { + override val description: String = "" + override val spec: TileSpec + get() = SPEC + + override fun ProducerScope<AutoAddSignal>.getCallback(): + TestableController.Callback { + return callback + } + } + + val job = launch { underTest.autoAddSignal(0).collect {} } + runCurrent() + assertThat(controller.callbacks).containsExactly(callback) + job.cancel() + runCurrent() + assertThat(controller.callbacks).isEmpty() + } + + @Test + fun sendAddFromCallback() = runTest { + val controller = TestableController() + val underTest = + object : + CallbackControllerAutoAddable<TestableController.Callback, TestableController>( + controller + ) { + override val description: String = "" + + override val spec: TileSpec + get() = SPEC + + override fun ProducerScope<AutoAddSignal>.getCallback(): + TestableController.Callback { + return object : TestableController.Callback { + override fun change() { + sendAdd() + } + } + } + } + + val signal by collectLastValue(underTest.autoAddSignal(0)) + assertThat(signal).isNull() + + controller.callbacks.first().change() + + assertThat(signal).isEqualTo(AutoAddSignal.Add(SPEC)) + } + + @Test + fun strategyIfNotAdded() { + val underTest = + object : + CallbackControllerAutoAddable<TestableController.Callback, TestableController>( + TestableController() + ) { + override val description: String = "" + override val spec: TileSpec + get() = SPEC + + override fun ProducerScope<AutoAddSignal>.getCallback(): + TestableController.Callback { + return object : TestableController.Callback {} + } + } + + assertThat(underTest.autoAddTracking).isEqualTo(AutoAddTracking.IfNotAdded(SPEC)) + } + + private class TestableController : CallbackController<TestableController.Callback> { + + val callbacks = mutableSetOf<Callback>() + + override fun addCallback(listener: Callback) { + callbacks.add(listener) + } + + override fun removeCallback(listener: Callback) { + callbacks.remove(listener) + } + + interface Callback { + fun change() {} + } + } + + companion object { + private val SPEC = TileSpec.create("test") + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/CastAutoAddableTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/CastAutoAddableTest.kt new file mode 100644 index 000000000000..a357dad65b2a --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/CastAutoAddableTest.kt @@ -0,0 +1,133 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.qs.pipeline.domain.autoaddable + +import android.testing.AndroidTestingRunner +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.coroutines.collectLastValue +import com.android.systemui.qs.pipeline.domain.model.AutoAddSignal +import com.android.systemui.qs.pipeline.shared.TileSpec +import com.android.systemui.qs.tiles.CastTile +import com.android.systemui.statusbar.policy.CastController +import com.android.systemui.util.mockito.capture +import com.android.systemui.util.mockito.whenever +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.runCurrent +import kotlinx.coroutines.test.runTest +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.ArgumentCaptor +import org.mockito.Captor +import org.mockito.Mock +import org.mockito.Mockito.verify +import org.mockito.MockitoAnnotations + +@OptIn(ExperimentalCoroutinesApi::class) +@SmallTest +@RunWith(AndroidTestingRunner::class) +class CastAutoAddableTest : SysuiTestCase() { + + @Mock private lateinit var castController: CastController + @Captor private lateinit var callbackCaptor: ArgumentCaptor<CastController.Callback> + + private lateinit var underTest: CastAutoAddable + + @Before + fun setUp() { + MockitoAnnotations.initMocks(this) + + underTest = CastAutoAddable(castController) + } + + @Test + fun onCastDevicesChanged_noDevices_noSignal() = runTest { + val signal by collectLastValue(underTest.autoAddSignal(0)) + runCurrent() + + verify(castController).addCallback(capture(callbackCaptor)) + + callbackCaptor.value.onCastDevicesChanged() + + assertThat(signal).isNull() + } + + @Test + fun onCastDevicesChanged_deviceNotConnectedOrConnecting_noSignal() = runTest { + val device = + CastController.CastDevice().apply { + state = CastController.CastDevice.STATE_DISCONNECTED + } + whenever(castController.castDevices).thenReturn(listOf(device)) + + val signal by collectLastValue(underTest.autoAddSignal(0)) + runCurrent() + + verify(castController).addCallback(capture(callbackCaptor)) + + callbackCaptor.value.onCastDevicesChanged() + + assertThat(signal).isNull() + } + + @Test + fun onCastDevicesChanged_someDeviceConnecting_addSignal() = runTest { + val disconnectedDevice = + CastController.CastDevice().apply { + state = CastController.CastDevice.STATE_DISCONNECTED + } + val connectingDevice = + CastController.CastDevice().apply { state = CastController.CastDevice.STATE_CONNECTING } + whenever(castController.castDevices) + .thenReturn(listOf(disconnectedDevice, connectingDevice)) + + val signal by collectLastValue(underTest.autoAddSignal(0)) + runCurrent() + + verify(castController).addCallback(capture(callbackCaptor)) + + callbackCaptor.value.onCastDevicesChanged() + + assertThat(signal).isEqualTo(AutoAddSignal.Add(SPEC)) + } + + @Test + fun onCastDevicesChanged_someDeviceConnected_addSignal() = runTest { + val disconnectedDevice = + CastController.CastDevice().apply { + state = CastController.CastDevice.STATE_DISCONNECTED + } + val connectedDevice = + CastController.CastDevice().apply { state = CastController.CastDevice.STATE_CONNECTED } + whenever(castController.castDevices).thenReturn(listOf(disconnectedDevice, connectedDevice)) + + val signal by collectLastValue(underTest.autoAddSignal(0)) + runCurrent() + + verify(castController).addCallback(capture(callbackCaptor)) + + callbackCaptor.value.onCastDevicesChanged() + + assertThat(signal).isEqualTo(AutoAddSignal.Add(SPEC)) + } + + companion object { + private val SPEC = TileSpec.create(CastTile.TILE_SPEC) + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/DataSaverAutoAddableTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/DataSaverAutoAddableTest.kt new file mode 100644 index 000000000000..098ffc304a7a --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/DataSaverAutoAddableTest.kt @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.qs.pipeline.domain.autoaddable + +import android.testing.AndroidTestingRunner +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.coroutines.collectLastValue +import com.android.systemui.qs.pipeline.domain.model.AutoAddSignal +import com.android.systemui.qs.pipeline.shared.TileSpec +import com.android.systemui.qs.tiles.DataSaverTile +import com.android.systemui.statusbar.policy.DataSaverController +import com.android.systemui.util.mockito.capture +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.runCurrent +import kotlinx.coroutines.test.runTest +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.ArgumentCaptor +import org.mockito.Captor +import org.mockito.Mock +import org.mockito.Mockito.verify +import org.mockito.MockitoAnnotations + +@OptIn(ExperimentalCoroutinesApi::class) +@SmallTest +@RunWith(AndroidTestingRunner::class) +class DataSaverAutoAddableTest : SysuiTestCase() { + + @Mock private lateinit var dataSaverController: DataSaverController + @Captor private lateinit var callbackCaptor: ArgumentCaptor<DataSaverController.Listener> + + private lateinit var underTest: DataSaverAutoAddable + + @Before + fun setUp() { + MockitoAnnotations.initMocks(this) + + underTest = DataSaverAutoAddable(dataSaverController) + } + + @Test + fun dataSaverNotEnabled_NoSignal() = runTest { + val signal by collectLastValue(underTest.autoAddSignal(0)) + runCurrent() + + verify(dataSaverController).addCallback(capture(callbackCaptor)) + + callbackCaptor.value.onDataSaverChanged(false) + + assertThat(signal).isNull() + } + + @Test + fun dataSaverEnabled_addSignal() = runTest { + val signal by collectLastValue(underTest.autoAddSignal(0)) + runCurrent() + + verify(dataSaverController).addCallback(capture(callbackCaptor)) + + callbackCaptor.value.onDataSaverChanged(true) + + assertThat(signal).isEqualTo(AutoAddSignal.Add(SPEC)) + } + + companion object { + private val SPEC = TileSpec.create(DataSaverTile.TILE_SPEC) + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/DeviceControlsAutoAddableTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/DeviceControlsAutoAddableTest.kt new file mode 100644 index 000000000000..a2e353877e67 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/DeviceControlsAutoAddableTest.kt @@ -0,0 +1,115 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.qs.pipeline.domain.autoaddable + +import android.testing.AndroidTestingRunner +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.coroutines.collectLastValue +import com.android.systemui.qs.pipeline.domain.model.AutoAddSignal +import com.android.systemui.qs.pipeline.domain.model.AutoAddTracking +import com.android.systemui.qs.pipeline.shared.TileSpec +import com.android.systemui.qs.tiles.DeviceControlsTile +import com.android.systemui.statusbar.policy.DeviceControlsController +import com.android.systemui.util.mockito.capture +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.launch +import kotlinx.coroutines.test.runCurrent +import kotlinx.coroutines.test.runTest +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.ArgumentCaptor +import org.mockito.Captor +import org.mockito.Mock +import org.mockito.Mockito.verify +import org.mockito.MockitoAnnotations + +@OptIn(ExperimentalCoroutinesApi::class) +@SmallTest +@RunWith(AndroidTestingRunner::class) +class DeviceControlsAutoAddableTest : SysuiTestCase() { + + @Mock private lateinit var deviceControlsController: DeviceControlsController + @Captor private lateinit var callbackCaptor: ArgumentCaptor<DeviceControlsController.Callback> + + private lateinit var underTest: DeviceControlsAutoAddable + + @Before + fun setUp() { + MockitoAnnotations.initMocks(this) + + underTest = DeviceControlsAutoAddable(deviceControlsController) + } + + @Test + fun strategyAlways() { + assertThat(underTest.autoAddTracking).isEqualTo(AutoAddTracking.Always) + } + + @Test + fun onControlsUpdate_position_addSignal() = runTest { + val signal by collectLastValue(underTest.autoAddSignal(0)) + val position = 5 + runCurrent() + + verify(deviceControlsController).setCallback(capture(callbackCaptor)) + callbackCaptor.value.onControlsUpdate(position) + + assertThat(signal).isEqualTo(AutoAddSignal.Add(SPEC, position)) + verify(deviceControlsController).removeCallback() + } + + @Test + fun onControlsUpdate_nullPosition_noAddSignal() = runTest { + val signal by collectLastValue(underTest.autoAddSignal(0)) + runCurrent() + + verify(deviceControlsController).setCallback(capture(callbackCaptor)) + callbackCaptor.value.onControlsUpdate(null) + + assertThat(signal).isNull() + verify(deviceControlsController).removeCallback() + } + + @Test + fun onRemoveControlsAutoTracker_removeSignal() = runTest { + val signal by collectLastValue(underTest.autoAddSignal(0)) + runCurrent() + + verify(deviceControlsController).setCallback(capture(callbackCaptor)) + callbackCaptor.value.removeControlsAutoTracker() + + assertThat(signal).isEqualTo(AutoAddSignal.Remove(SPEC)) + } + + @Test + fun flowCancelled_removeCallback() = runTest { + val job = launch { underTest.autoAddSignal(0).collect() } + runCurrent() + + job.cancel() + runCurrent() + verify(deviceControlsController).removeCallback() + } + + companion object { + private val SPEC = TileSpec.create(DeviceControlsTile.TILE_SPEC) + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/HotspotAutoAddableTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/HotspotAutoAddableTest.kt new file mode 100644 index 000000000000..ee96b471bc18 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/HotspotAutoAddableTest.kt @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.qs.pipeline.domain.autoaddable + +import android.testing.AndroidTestingRunner +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.coroutines.collectLastValue +import com.android.systemui.qs.pipeline.domain.model.AutoAddSignal +import com.android.systemui.qs.pipeline.shared.TileSpec +import com.android.systemui.qs.tiles.HotspotTile +import com.android.systemui.statusbar.policy.HotspotController +import com.android.systemui.util.mockito.capture +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.runCurrent +import kotlinx.coroutines.test.runTest +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.ArgumentCaptor +import org.mockito.Captor +import org.mockito.Mock +import org.mockito.Mockito.verify +import org.mockito.MockitoAnnotations + +@OptIn(ExperimentalCoroutinesApi::class) +@SmallTest +@RunWith(AndroidTestingRunner::class) +class HotspotAutoAddableTest : SysuiTestCase() { + + @Mock private lateinit var hotspotController: HotspotController + @Captor private lateinit var callbackCaptor: ArgumentCaptor<HotspotController.Callback> + + private lateinit var underTest: HotspotAutoAddable + + @Before + fun setUp() { + MockitoAnnotations.initMocks(this) + + underTest = HotspotAutoAddable(hotspotController) + } + + @Test + fun enabled_addSignal() = runTest { + val signal by collectLastValue(underTest.autoAddSignal(0)) + runCurrent() + + verify(hotspotController).addCallback(capture(callbackCaptor)) + callbackCaptor.value.onHotspotChanged(/* enabled = */ true, /* numDevices = */ 5) + + assertThat(signal).isEqualTo(AutoAddSignal.Add(SPEC)) + } + + @Test + fun notEnabled_noSignal() = runTest { + val signal by collectLastValue(underTest.autoAddSignal(0)) + runCurrent() + + verify(hotspotController).addCallback(capture(callbackCaptor)) + callbackCaptor.value.onHotspotChanged(/* enabled = */ false, /* numDevices = */ 0) + + assertThat(signal).isNull() + } + + companion object { + private val SPEC = TileSpec.create(HotspotTile.TILE_SPEC) + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/NightDisplayAutoAddableTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/NightDisplayAutoAddableTest.kt new file mode 100644 index 000000000000..e03072abce27 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/NightDisplayAutoAddableTest.kt @@ -0,0 +1,126 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.qs.pipeline.domain.autoaddable + +import android.hardware.display.NightDisplayListener +import android.testing.AndroidTestingRunner +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.coroutines.collectLastValue +import com.android.systemui.dagger.NightDisplayListenerModule +import com.android.systemui.qs.pipeline.domain.model.AutoAddSignal +import com.android.systemui.qs.pipeline.domain.model.AutoAddTracking +import com.android.systemui.qs.pipeline.shared.TileSpec +import com.android.systemui.qs.tiles.NightDisplayTile +import com.android.systemui.util.mockito.capture +import com.android.systemui.util.mockito.whenever +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.launch +import kotlinx.coroutines.test.TestResult +import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.runCurrent +import kotlinx.coroutines.test.runTest +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Answers +import org.mockito.ArgumentCaptor +import org.mockito.Captor +import org.mockito.Mock +import org.mockito.Mockito.inOrder +import org.mockito.Mockito.verify +import org.mockito.MockitoAnnotations + +@OptIn(ExperimentalCoroutinesApi::class) +@SmallTest +@RunWith(AndroidTestingRunner::class) +class NightDisplayAutoAddableTest : SysuiTestCase() { + + @Mock(answer = Answers.RETURNS_SELF) + private lateinit var nightDisplayListenerBuilder: NightDisplayListenerModule.Builder + @Mock private lateinit var nightDisplayListener: NightDisplayListener + @Captor private lateinit var callbackCaptor: ArgumentCaptor<NightDisplayListener.Callback> + + private lateinit var underTest: NightDisplayAutoAddable + + @Before + fun setUp() { + MockitoAnnotations.initMocks(this) + + whenever(nightDisplayListenerBuilder.build()).thenReturn(nightDisplayListener) + } + + @Test + fun disabled_strategyDisabled() = + testWithFeatureAvailability(enabled = false) { + assertThat(underTest.autoAddTracking).isEqualTo(AutoAddTracking.Disabled) + } + + @Test + fun enabled_strategyIfNotAdded() = testWithFeatureAvailability { + assertThat(underTest.autoAddTracking).isEqualTo(AutoAddTracking.IfNotAdded(SPEC)) + } + + @Test + fun listenerCreatedForCorrectUser() = testWithFeatureAvailability { + val user = 42 + backgroundScope.launch { underTest.autoAddSignal(user).collect() } + runCurrent() + + val inOrder = inOrder(nightDisplayListenerBuilder) + inOrder.verify(nightDisplayListenerBuilder).setUser(user) + inOrder.verify(nightDisplayListenerBuilder).build() + } + + @Test + fun onCancelFlow_removeCallback() = testWithFeatureAvailability { + val job = launch { underTest.autoAddSignal(0).collect() } + runCurrent() + job.cancel() + runCurrent() + verify(nightDisplayListener).setCallback(null) + } + + @Test + fun onActivatedTrue_addSignal() = testWithFeatureAvailability { + val signal by collectLastValue(underTest.autoAddSignal(0)) + runCurrent() + + verify(nightDisplayListener).setCallback(capture(callbackCaptor)) + callbackCaptor.value.onActivated(true) + + assertThat(signal).isEqualTo(AutoAddSignal.Add(SPEC)) + } + + private fun testWithFeatureAvailability( + enabled: Boolean = true, + body: suspend TestScope.() -> TestResult + ) = runTest { + context.orCreateTestableResources.addOverride( + com.android.internal.R.bool.config_nightDisplayAvailable, + enabled + ) + underTest = NightDisplayAutoAddable(nightDisplayListenerBuilder, context) + body() + } + + companion object { + private val SPEC = TileSpec.create(NightDisplayTile.TILE_SPEC) + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/ReduceBrightColorsAutoAddableTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/ReduceBrightColorsAutoAddableTest.kt new file mode 100644 index 000000000000..7b4a55ed1750 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/ReduceBrightColorsAutoAddableTest.kt @@ -0,0 +1,108 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.qs.pipeline.domain.autoaddable + +import android.testing.AndroidTestingRunner +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.coroutines.collectLastValue +import com.android.systemui.qs.ReduceBrightColorsController +import com.android.systemui.qs.pipeline.domain.model.AutoAddSignal +import com.android.systemui.qs.pipeline.domain.model.AutoAddTracking +import com.android.systemui.qs.pipeline.shared.TileSpec +import com.android.systemui.qs.tiles.ReduceBrightColorsTile +import com.android.systemui.util.mockito.capture +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.TestResult +import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.runCurrent +import kotlinx.coroutines.test.runTest +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.ArgumentCaptor +import org.mockito.Captor +import org.mockito.Mock +import org.mockito.Mockito.verify +import org.mockito.MockitoAnnotations + +@OptIn(ExperimentalCoroutinesApi::class) +@SmallTest +@RunWith(AndroidTestingRunner::class) +class ReduceBrightColorsAutoAddableTest : SysuiTestCase() { + + @Mock private lateinit var reduceBrightColorsController: ReduceBrightColorsController + @Captor + private lateinit var reduceBrightColorsListenerCaptor: + ArgumentCaptor<ReduceBrightColorsController.Listener> + + private lateinit var underTest: ReduceBrightColorsAutoAddable + + @Before + fun setUp() { + MockitoAnnotations.initMocks(this) + } + + @Test + fun notAvailable_strategyDisabled() = + testWithFeatureAvailability(available = false) { + assertThat(underTest.autoAddTracking).isEqualTo(AutoAddTracking.Disabled) + } + + @Test + fun available_strategyIfNotAdded() = + testWithFeatureAvailability(available = true) { + assertThat(underTest.autoAddTracking).isEqualTo(AutoAddTracking.IfNotAdded(SPEC)) + } + + @Test + fun activated_addSignal() = testWithFeatureAvailability { + val signal by collectLastValue(underTest.autoAddSignal(0)) + runCurrent() + + verify(reduceBrightColorsController).addCallback(capture(reduceBrightColorsListenerCaptor)) + + reduceBrightColorsListenerCaptor.value.onActivated(true) + + assertThat(signal).isEqualTo(AutoAddSignal.Add(SPEC)) + } + + @Test + fun notActivated_noSignal() = testWithFeatureAvailability { + val signal by collectLastValue(underTest.autoAddSignal(0)) + runCurrent() + + verify(reduceBrightColorsController).addCallback(capture(reduceBrightColorsListenerCaptor)) + + reduceBrightColorsListenerCaptor.value.onActivated(false) + + assertThat(signal).isNull() + } + + private fun testWithFeatureAvailability( + available: Boolean = true, + body: suspend TestScope.() -> TestResult + ) = runTest { + underTest = ReduceBrightColorsAutoAddable(reduceBrightColorsController, available) + body() + } + + companion object { + private val SPEC = TileSpec.create(ReduceBrightColorsTile.TILE_SPEC) + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/SafetyCenterAutoAddableTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/SafetyCenterAutoAddableTest.kt new file mode 100644 index 000000000000..fb35a3a70e92 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/SafetyCenterAutoAddableTest.kt @@ -0,0 +1,163 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.qs.pipeline.domain.autoaddable + +import android.content.ComponentName +import android.content.pm.PackageManager +import android.testing.AndroidTestingRunner +import androidx.test.filters.SmallTest +import com.android.systemui.R +import com.android.systemui.SysuiTestCase +import com.android.systemui.coroutines.collectLastValue +import com.android.systemui.coroutines.collectValues +import com.android.systemui.qs.pipeline.domain.model.AutoAddSignal +import com.android.systemui.qs.pipeline.domain.model.AutoAddTracking +import com.android.systemui.qs.pipeline.shared.TileSpec +import com.android.systemui.statusbar.policy.SafetyController +import com.android.systemui.util.mockito.any +import com.android.systemui.util.mockito.capture +import com.android.systemui.util.mockito.whenever +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.launch +import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.runCurrent +import kotlinx.coroutines.test.runTest +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.ArgumentCaptor +import org.mockito.Captor +import org.mockito.Mock +import org.mockito.Mockito.never +import org.mockito.Mockito.verify +import org.mockito.MockitoAnnotations + +@OptIn(ExperimentalCoroutinesApi::class) +@SmallTest +@RunWith(AndroidTestingRunner::class) +class SafetyCenterAutoAddableTest : SysuiTestCase() { + private val testDispatcher = StandardTestDispatcher() + private val testScope = TestScope(testDispatcher) + + @Mock private lateinit var safetyController: SafetyController + @Mock private lateinit var packageManager: PackageManager + @Captor + private lateinit var safetyControllerListenerCaptor: ArgumentCaptor<SafetyController.Listener> + + private lateinit var underTest: SafetyCenterAutoAddable + + @Before + fun setUp() { + MockitoAnnotations.initMocks(this) + context.ensureTestableResources() + + // Set these by default, will also test special cases + context.orCreateTestableResources.addOverride( + R.string.safety_quick_settings_tile_class, + SAFETY_TILE_CLASS_NAME + ) + whenever(packageManager.permissionControllerPackageName) + .thenReturn(PERMISSION_CONTROLLER_PACKAGE_NAME) + + underTest = + SafetyCenterAutoAddable( + safetyController, + packageManager, + context.resources, + testDispatcher, + ) + } + + @Test + fun strategyAlwaysTrack() = + testScope.runTest { + assertThat(underTest.autoAddTracking).isEqualTo(AutoAddTracking.Always) + } + + @Test + fun tileAlwaysAdded() = + testScope.runTest { + val signal by collectLastValue(underTest.autoAddSignal(0)) + + assertThat(signal).isEqualTo(AutoAddSignal.Add(SPEC)) + } + + @Test + fun safetyCenterDisabled_removeSignal() = + testScope.runTest { + val signal by collectLastValue(underTest.autoAddSignal(0)) + runCurrent() + + verify(safetyController).addCallback(capture(safetyControllerListenerCaptor)) + safetyControllerListenerCaptor.value.onSafetyCenterEnableChanged(false) + + assertThat(signal).isEqualTo(AutoAddSignal.Remove(SPEC)) + } + + @Test + fun safetyCenterEnabled_newAddSignal() = + testScope.runTest { + val signals by collectValues(underTest.autoAddSignal(0)) + runCurrent() + + verify(safetyController).addCallback(capture(safetyControllerListenerCaptor)) + safetyControllerListenerCaptor.value.onSafetyCenterEnableChanged(true) + + assertThat(signals.size).isEqualTo(2) + assertThat(signals.last()).isEqualTo(AutoAddSignal.Add(SPEC)) + } + + @Test + fun flowCancelled_removeListener() = + testScope.runTest { + val job = launch { underTest.autoAddSignal(0).collect() } + runCurrent() + + verify(safetyController).addCallback(capture(safetyControllerListenerCaptor)) + + job.cancel() + runCurrent() + verify(safetyController).removeCallback(safetyControllerListenerCaptor.value) + } + + @Test + fun emptyClassName_noSignals() = + testScope.runTest { + context.orCreateTestableResources.addOverride( + R.string.safety_quick_settings_tile_class, + "" + ) + val signal by collectLastValue(underTest.autoAddSignal(0)) + runCurrent() + + verify(safetyController, never()).addCallback(any()) + + assertThat(signal).isNull() + } + + companion object { + private const val SAFETY_TILE_CLASS_NAME = "cls" + private const val PERMISSION_CONTROLLER_PACKAGE_NAME = "pkg" + private val SPEC = + TileSpec.create( + ComponentName(PERMISSION_CONTROLLER_PACKAGE_NAME, SAFETY_TILE_CLASS_NAME) + ) + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/WalletAutoAddableTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/WalletAutoAddableTest.kt new file mode 100644 index 000000000000..6b250f4d9af9 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/WalletAutoAddableTest.kt @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.qs.pipeline.domain.autoaddable + +import android.testing.AndroidTestingRunner +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.coroutines.collectLastValue +import com.android.systemui.qs.pipeline.domain.model.AutoAddSignal +import com.android.systemui.qs.pipeline.domain.model.AutoAddTracking +import com.android.systemui.qs.pipeline.shared.TileSpec +import com.android.systemui.qs.tiles.QuickAccessWalletTile +import com.android.systemui.statusbar.policy.WalletController +import com.android.systemui.util.mockito.whenever +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.runTest +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.MockitoAnnotations + +@OptIn(ExperimentalCoroutinesApi::class) +@SmallTest +@RunWith(AndroidTestingRunner::class) +class WalletAutoAddableTest : SysuiTestCase() { + + @Mock private lateinit var walletController: WalletController + + private lateinit var underTest: WalletAutoAddable + + @Before + fun setUp() { + MockitoAnnotations.initMocks(this) + + underTest = WalletAutoAddable(walletController) + } + + @Test + fun strategyIfNotAdded() { + assertThat(underTest.autoAddTracking).isEqualTo(AutoAddTracking.IfNotAdded(SPEC)) + } + + @Test + fun walletPositionNull_noSignal() = runTest { + whenever(walletController.getWalletPosition()).thenReturn(null) + + val signal by collectLastValue(underTest.autoAddSignal(0)) + + assertThat(signal).isNull() + } + + @Test + fun walletPositionNumber_addedInThatPosition() = runTest { + val position = 4 + whenever(walletController.getWalletPosition()).thenReturn(4) + + val signal by collectLastValue(underTest.autoAddSignal(0)) + + assertThat(signal).isEqualTo(AutoAddSignal.Add(SPEC, position)) + } + + companion object { + private val SPEC = TileSpec.create(QuickAccessWalletTile.TILE_SPEC) + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/WorkTileAutoAddableTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/WorkTileAutoAddableTest.kt new file mode 100644 index 000000000000..e9f7c8ab20cf --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/WorkTileAutoAddableTest.kt @@ -0,0 +1,123 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.qs.pipeline.domain.autoaddable + +import android.content.pm.UserInfo +import android.content.pm.UserInfo.FLAG_FULL +import android.content.pm.UserInfo.FLAG_MANAGED_PROFILE +import android.content.pm.UserInfo.FLAG_PRIMARY +import android.content.pm.UserInfo.FLAG_PROFILE +import android.testing.AndroidTestingRunner +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.coroutines.collectLastValue +import com.android.systemui.qs.pipeline.domain.model.AutoAddSignal +import com.android.systemui.qs.pipeline.domain.model.AutoAddTracking +import com.android.systemui.qs.pipeline.shared.TileSpec +import com.android.systemui.qs.tiles.WorkModeTile +import com.android.systemui.settings.FakeUserTracker +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.runTest +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.MockitoAnnotations + +@OptIn(ExperimentalCoroutinesApi::class) +@SmallTest +@RunWith(AndroidTestingRunner::class) +class WorkTileAutoAddableTest : SysuiTestCase() { + + private lateinit var userTracker: FakeUserTracker + + private lateinit var underTest: WorkTileAutoAddable + + @Before + fun setup() { + MockitoAnnotations.initMocks(this) + + userTracker = + FakeUserTracker( + _userId = USER_INFO_0.id, + _userInfo = USER_INFO_0, + _userProfiles = listOf(USER_INFO_0) + ) + + underTest = WorkTileAutoAddable(userTracker) + } + + @Test + fun changeInProfiles_hasManagedProfile_sendsAddSignal() = runTest { + val signal by collectLastValue(underTest.autoAddSignal(0)) + + userTracker.set(listOf(USER_INFO_0, USER_INFO_WORK), selectedUserIndex = 0) + + assertThat(signal).isEqualTo(AutoAddSignal.Add(SPEC)) + } + + @Test + fun changeInProfiles_noManagedProfile_sendsRemoveSignal() = runTest { + userTracker.set(listOf(USER_INFO_0, USER_INFO_WORK), selectedUserIndex = 0) + + val signal by collectLastValue(underTest.autoAddSignal(0)) + + userTracker.set(listOf(USER_INFO_0), selectedUserIndex = 0) + + assertThat(signal).isEqualTo(AutoAddSignal.Remove(SPEC)) + } + + @Test + fun startingWithManagedProfile_sendsAddSignal() = runTest { + userTracker.set(listOf(USER_INFO_0, USER_INFO_WORK), selectedUserIndex = 0) + + val signal by collectLastValue(underTest.autoAddSignal(0)) + + assertThat(signal).isEqualTo(AutoAddSignal.Add(SPEC)) + } + + @Test + fun userChangeToUserWithProfile_noSignalForOriginalUser() = runTest { + val signal by collectLastValue(underTest.autoAddSignal(0)) + + userTracker.set(listOf(USER_INFO_1, USER_INFO_WORK), selectedUserIndex = 0) + + assertThat(signal).isNotEqualTo(AutoAddSignal.Add(SPEC)) + } + + @Test + fun userChangeToUserWithoutProfile_noSignalForOriginalUser() = runTest { + userTracker.set(listOf(USER_INFO_0, USER_INFO_WORK), selectedUserIndex = 0) + val signal by collectLastValue(underTest.autoAddSignal(0)) + + userTracker.set(listOf(USER_INFO_1), selectedUserIndex = 0) + + assertThat(signal).isNotEqualTo(AutoAddSignal.Remove(SPEC)) + } + + @Test + fun strategyAlways() { + assertThat(underTest.autoAddTracking).isEqualTo(AutoAddTracking.Always) + } + + companion object { + private val SPEC = TileSpec.create(WorkModeTile.TILE_SPEC) + private val USER_INFO_0 = UserInfo(0, "", FLAG_PRIMARY or FLAG_FULL) + private val USER_INFO_1 = UserInfo(1, "", FLAG_FULL) + private val USER_INFO_WORK = UserInfo(10, "", FLAG_PROFILE or FLAG_MANAGED_PROFILE) + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/interactor/AutoAddInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/interactor/AutoAddInteractorTest.kt new file mode 100644 index 000000000000..f924b35d9c9c --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/interactor/AutoAddInteractorTest.kt @@ -0,0 +1,201 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.qs.pipeline.domain.interactor + +import android.testing.AndroidTestingRunner +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.coroutines.collectLastValue +import com.android.systemui.dump.DumpManager +import com.android.systemui.qs.pipeline.data.repository.FakeAutoAddRepository +import com.android.systemui.qs.pipeline.domain.autoaddable.FakeAutoAddable +import com.android.systemui.qs.pipeline.domain.model.AutoAddTracking +import com.android.systemui.qs.pipeline.domain.model.AutoAddable +import com.android.systemui.qs.pipeline.shared.TileSpec +import com.android.systemui.qs.pipeline.shared.logging.QSPipelineLogger +import com.android.systemui.util.mockito.any +import com.android.systemui.util.mockito.whenever +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.runCurrent +import kotlinx.coroutines.test.runTest +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.ArgumentMatchers.anyInt +import org.mockito.Mock +import org.mockito.Mockito.inOrder +import org.mockito.Mockito.never +import org.mockito.Mockito.verify +import org.mockito.MockitoAnnotations + +@SmallTest +@RunWith(AndroidTestingRunner::class) +@OptIn(ExperimentalCoroutinesApi::class) +class AutoAddInteractorTest : SysuiTestCase() { + private val testScope = TestScope() + + private val autoAddRepository = FakeAutoAddRepository() + + @Mock private lateinit var dumpManager: DumpManager + @Mock private lateinit var currentTilesInteractor: CurrentTilesInteractor + @Mock private lateinit var logger: QSPipelineLogger + private lateinit var underTest: AutoAddInteractor + + @Before + fun setUp() { + MockitoAnnotations.initMocks(this) + + whenever(currentTilesInteractor.userId).thenReturn(MutableStateFlow(USER)) + } + + @Test + fun autoAddable_alwaysTrack_addSignal_tileAddedAndMarked() = + testScope.runTest { + val fakeAutoAddable = FakeAutoAddable(SPEC, AutoAddTracking.Always) + val autoAddedTiles by collectLastValue(autoAddRepository.autoAddedTiles(USER)) + + underTest = createInteractor(setOf(fakeAutoAddable)) + + val position = 3 + fakeAutoAddable.sendAddSignal(USER, position) + runCurrent() + + verify(currentTilesInteractor).addTile(SPEC, position) + assertThat(autoAddedTiles).contains(SPEC) + } + + @Test + fun autoAddable_alwaysTrack_addThenRemoveSignal_tileAddedAndRemoved() = + testScope.runTest { + val fakeAutoAddable = FakeAutoAddable(SPEC, AutoAddTracking.Always) + val autoAddedTiles by collectLastValue(autoAddRepository.autoAddedTiles(USER)) + + underTest = createInteractor(setOf(fakeAutoAddable)) + + val position = 3 + fakeAutoAddable.sendAddSignal(USER, position) + runCurrent() + fakeAutoAddable.sendRemoveSignal(USER) + runCurrent() + + val inOrder = inOrder(currentTilesInteractor) + inOrder.verify(currentTilesInteractor).addTile(SPEC, position) + inOrder.verify(currentTilesInteractor).removeTiles(setOf(SPEC)) + assertThat(autoAddedTiles).doesNotContain(SPEC) + } + + @Test + fun autoAddable_alwaysTrack_addSignalWhenAddedPreviously_noop() = + testScope.runTest { + val fakeAutoAddable = FakeAutoAddable(SPEC, AutoAddTracking.Always) + autoAddRepository.markTileAdded(USER, SPEC) + runCurrent() + + underTest = createInteractor(setOf(fakeAutoAddable)) + + val position = 3 + fakeAutoAddable.sendAddSignal(USER, position) + runCurrent() + + verify(currentTilesInteractor, never()).addTile(SPEC, position) + } + + @Test + fun autoAddable_disabled_noInteractionsWithCurrentTilesInteractor() = + testScope.runTest { + val fakeAutoAddable = FakeAutoAddable(SPEC, AutoAddTracking.Disabled) + val autoAddedTiles by collectLastValue(autoAddRepository.autoAddedTiles(USER)) + + underTest = createInteractor(setOf(fakeAutoAddable)) + + val position = 3 + fakeAutoAddable.sendAddSignal(USER, position) + runCurrent() + fakeAutoAddable.sendRemoveSignal(USER) + runCurrent() + + verify(currentTilesInteractor, never()).addTile(any(), anyInt()) + verify(currentTilesInteractor, never()).removeTiles(any()) + assertThat(autoAddedTiles).doesNotContain(SPEC) + } + + @Test + fun autoAddable_trackIfNotAdded_removeSignal_noop() = + testScope.runTest { + val fakeAutoAddable = FakeAutoAddable(SPEC, AutoAddTracking.IfNotAdded(SPEC)) + runCurrent() + + underTest = createInteractor(setOf(fakeAutoAddable)) + + fakeAutoAddable.sendRemoveSignal(USER) + runCurrent() + + verify(currentTilesInteractor, never()).addTile(any(), anyInt()) + verify(currentTilesInteractor, never()).removeTiles(any()) + } + + @Test + fun autoAddable_trackIfNotAdded_addSignalWhenPreviouslyAdded_noop() = + testScope.runTest { + val fakeAutoAddable = FakeAutoAddable(SPEC, AutoAddTracking.IfNotAdded(SPEC)) + autoAddRepository.markTileAdded(USER, SPEC) + runCurrent() + + underTest = createInteractor(setOf(fakeAutoAddable)) + + fakeAutoAddable.sendAddSignal(USER) + runCurrent() + + verify(currentTilesInteractor, never()).addTile(any(), anyInt()) + verify(currentTilesInteractor, never()).removeTiles(any()) + } + + @Test + fun autoAddable_trackIfNotAdded_addSignal_addedAndMarked() = + testScope.runTest { + val fakeAutoAddable = FakeAutoAddable(SPEC, AutoAddTracking.IfNotAdded(SPEC)) + val autoAddedTiles by collectLastValue(autoAddRepository.autoAddedTiles(USER)) + + underTest = createInteractor(setOf(fakeAutoAddable)) + + val position = 3 + fakeAutoAddable.sendAddSignal(USER, position) + runCurrent() + + verify(currentTilesInteractor).addTile(SPEC, position) + assertThat(autoAddedTiles).contains(SPEC) + } + + private fun createInteractor(autoAddables: Set<AutoAddable>): AutoAddInteractor { + return AutoAddInteractor( + autoAddables, + autoAddRepository, + dumpManager, + logger, + testScope.backgroundScope + ) + .apply { init(currentTilesInteractor) } + } + + companion object { + private val SPEC = TileSpec.create("spec") + private val USER = 10 + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/interactor/CurrentTilesInteractorImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/interactor/CurrentTilesInteractorImplTest.kt index e7ad4896810b..30cea2d3a487 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/interactor/CurrentTilesInteractorImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/interactor/CurrentTilesInteractorImplTest.kt @@ -100,6 +100,7 @@ class CurrentTilesInteractorImplTest : SysuiTestCase() { MockitoAnnotations.initMocks(this) featureFlags.set(Flags.QS_PIPELINE_NEW_HOST, true) + featureFlags.set(Flags.QS_PIPELINE_AUTO_ADD, true) userRepository.setUserInfos(listOf(USER_INFO_0, USER_INFO_1)) diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsSceneViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsSceneViewModelTest.kt index 05a16994e021..c85c8baf7ccb 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsSceneViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsSceneViewModelTest.kt @@ -27,7 +27,6 @@ import com.android.systemui.scene.shared.model.SceneKey import com.android.systemui.scene.shared.model.SceneModel import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.runCurrent import kotlinx.coroutines.test.runTest import org.junit.Test @@ -39,8 +38,8 @@ import org.junit.runners.JUnit4 @RunWith(JUnit4::class) class QuickSettingsSceneViewModelTest : SysuiTestCase() { - private val testScope = TestScope() - private val utils = SceneTestUtils(this, testScope) + private val utils = SceneTestUtils(this) + private val testScope = utils.testScope private val sceneInteractor = utils.sceneInteractor() private val authenticationInteractor = utils.authenticationInteractor( @@ -70,8 +69,10 @@ class QuickSettingsSceneViewModelTest : SysuiTestCase() { fun onContentClicked_deviceUnlocked_switchesToGone() = testScope.runTest { val currentScene by collectLastValue(sceneInteractor.currentScene(CONTAINER_1)) - authenticationInteractor.setAuthenticationMethod(AuthenticationMethodModel.Pin(1234)) - authenticationInteractor.unlockDevice() + utils.authenticationRepository.setAuthenticationMethod( + AuthenticationMethodModel.Pin(1234) + ) + utils.authenticationRepository.setUnlocked(true) runCurrent() underTest.onContentClicked() @@ -83,8 +84,10 @@ class QuickSettingsSceneViewModelTest : SysuiTestCase() { fun onContentClicked_deviceLockedSecurely_switchesToBouncer() = testScope.runTest { val currentScene by collectLastValue(sceneInteractor.currentScene(CONTAINER_1)) - authenticationInteractor.setAuthenticationMethod(AuthenticationMethodModel.Pin(1234)) - authenticationInteractor.lockDevice() + utils.authenticationRepository.setAuthenticationMethod( + AuthenticationMethodModel.Pin(1234) + ) + utils.authenticationRepository.setUnlocked(false) runCurrent() underTest.onContentClicked() diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModelTest.kt index f8e1a9d12657..5d2d192bb61a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModelTest.kt @@ -27,7 +27,6 @@ import com.android.systemui.scene.shared.model.SceneKey import com.android.systemui.scene.shared.model.SceneModel import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.runCurrent import kotlinx.coroutines.test.runTest import org.junit.Test @@ -39,8 +38,8 @@ import org.junit.runners.JUnit4 @RunWith(JUnit4::class) class ShadeSceneViewModelTest : SysuiTestCase() { - private val testScope = TestScope() - private val utils = SceneTestUtils(this, testScope) + private val utils = SceneTestUtils(this) + private val testScope = utils.testScope private val sceneInteractor = utils.sceneInteractor() private val authenticationInteractor = utils.authenticationInteractor( @@ -71,8 +70,10 @@ class ShadeSceneViewModelTest : SysuiTestCase() { fun upTransitionSceneKey_deviceLocked_lockScreen() = testScope.runTest { val upTransitionSceneKey by collectLastValue(underTest.upDestinationSceneKey) - authenticationInteractor.setAuthenticationMethod(AuthenticationMethodModel.Pin(1234)) - authenticationInteractor.lockDevice() + utils.authenticationRepository.setAuthenticationMethod( + AuthenticationMethodModel.Pin(1234) + ) + utils.authenticationRepository.setUnlocked(false) assertThat(upTransitionSceneKey).isEqualTo(SceneKey.Lockscreen) } @@ -81,8 +82,10 @@ class ShadeSceneViewModelTest : SysuiTestCase() { fun upTransitionSceneKey_deviceUnlocked_gone() = testScope.runTest { val upTransitionSceneKey by collectLastValue(underTest.upDestinationSceneKey) - authenticationInteractor.setAuthenticationMethod(AuthenticationMethodModel.Pin(1234)) - authenticationInteractor.unlockDevice() + utils.authenticationRepository.setAuthenticationMethod( + AuthenticationMethodModel.Pin(1234) + ) + utils.authenticationRepository.setUnlocked(true) assertThat(upTransitionSceneKey).isEqualTo(SceneKey.Gone) } @@ -91,8 +94,10 @@ class ShadeSceneViewModelTest : SysuiTestCase() { fun onContentClicked_deviceUnlocked_switchesToGone() = testScope.runTest { val currentScene by collectLastValue(sceneInteractor.currentScene(CONTAINER_1)) - authenticationInteractor.setAuthenticationMethod(AuthenticationMethodModel.Pin(1234)) - authenticationInteractor.unlockDevice() + utils.authenticationRepository.setAuthenticationMethod( + AuthenticationMethodModel.Pin(1234) + ) + utils.authenticationRepository.setUnlocked(true) runCurrent() underTest.onContentClicked() @@ -104,8 +109,10 @@ class ShadeSceneViewModelTest : SysuiTestCase() { fun onContentClicked_deviceLockedSecurely_switchesToBouncer() = testScope.runTest { val currentScene by collectLastValue(sceneInteractor.currentScene(CONTAINER_1)) - authenticationInteractor.setAuthenticationMethod(AuthenticationMethodModel.Pin(1234)) - authenticationInteractor.lockDevice() + utils.authenticationRepository.setAuthenticationMethod( + AuthenticationMethodModel.Pin(1234) + ) + utils.authenticationRepository.setUnlocked(false) runCurrent() underTest.onContentClicked() diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotifCollectionTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotifCollectionTest.java index 540bda6ea9dc..9037df821ca8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotifCollectionTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotifCollectionTest.java @@ -1675,11 +1675,21 @@ public class NotifCollectionTest extends SysuiTestCase { } @Test + public void testCanDismissOtherNotificationChildren() { + // GIVEN an ongoing notification + final NotificationEntry container = new NotificationEntryBuilder() + .setGroup(mContext, "group") + .build(); + + // THEN its children are dismissible + assertTrue(mCollection.shouldAutoDismissChildren( + container, container.getSbn().getGroupKey())); + } + + @Test public void testCannotDismissOngoingNotificationChildren() { // GIVEN an ongoing notification final NotificationEntry container = new NotificationEntryBuilder() - .setPkg(TEST_PACKAGE) - .setId(47) .setGroup(mContext, "group") .setFlag(mContext, FLAG_ONGOING_EVENT, true) .build(); @@ -1693,6 +1703,7 @@ public class NotifCollectionTest extends SysuiTestCase { public void testCannotDismissNoClearNotifications() { // GIVEN an no-clear notification final NotificationEntry container = new NotificationEntryBuilder() + .setGroup(mContext, "group") .setFlag(mContext, FLAG_NO_CLEAR, true) .build(); @@ -1702,11 +1713,25 @@ public class NotifCollectionTest extends SysuiTestCase { } @Test + public void testCannotDismissPriorityConversations() { + // GIVEN an no-clear notification + NotificationChannel channel = + new NotificationChannel("foo", "Foo", NotificationManager.IMPORTANCE_HIGH); + channel.setImportantConversation(true); + final NotificationEntry container = new NotificationEntryBuilder() + .setGroup(mContext, "group") + .setChannel(channel) + .build(); + + // THEN its children are not dismissible + assertFalse(mCollection.shouldAutoDismissChildren( + container, container.getSbn().getGroupKey())); + } + + @Test public void testCanDismissFgsNotificationChildren() { // GIVEN an FGS but not ongoing notification final NotificationEntry container = new NotificationEntryBuilder() - .setPkg(TEST_PACKAGE) - .setId(47) .setGroup(mContext, "group") .setFlag(mContext, FLAG_FOREGROUND_SERVICE, true) .build(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java index e680a4ec19d1..e4a2236211b1 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java @@ -34,6 +34,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import android.content.ComponentName; @@ -51,6 +52,7 @@ import androidx.test.filters.SmallTest; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; +import com.android.systemui.dagger.NightDisplayListenerModule; import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.qs.AutoAddTracker; import com.android.systemui.qs.QSHost; @@ -111,6 +113,8 @@ public class AutoTileManagerTest extends SysuiTestCase { @Mock private DataSaverController mDataSaverController; @Mock private ManagedProfileController mManagedProfileController; @Mock private NightDisplayListener mNightDisplayListener; + @Mock(answer = Answers.RETURNS_SELF) + private NightDisplayListenerModule.Builder mNightDisplayListenerBuilder; @Mock private ReduceBrightColorsController mReduceBrightColorsController; @Mock private DeviceControlsController mDeviceControlsController; @Mock private WalletController mWalletController; @@ -151,6 +155,7 @@ public class AutoTileManagerTest extends SysuiTestCase { .thenReturn(TEST_CUSTOM_SAFETY_PKG); Context context = Mockito.spy(mContext); when(context.getPackageManager()).thenReturn(mPackageManager); + when(mNightDisplayListenerBuilder.build()).thenReturn(mNightDisplayListener); mAutoTileManager = createAutoTileManager(context); mAutoTileManager.init(); @@ -167,7 +172,7 @@ public class AutoTileManagerTest extends SysuiTestCase { HotspotController hotspotController, DataSaverController dataSaverController, ManagedProfileController managedProfileController, - NightDisplayListener nightDisplayListener, + NightDisplayListenerModule.Builder nightDisplayListenerBuilder, CastController castController, ReduceBrightColorsController reduceBrightColorsController, DeviceControlsController deviceControlsController, @@ -180,7 +185,7 @@ public class AutoTileManagerTest extends SysuiTestCase { hotspotController, dataSaverController, managedProfileController, - nightDisplayListener, + mNightDisplayListenerBuilder, castController, reduceBrightColorsController, deviceControlsController, @@ -191,7 +196,7 @@ public class AutoTileManagerTest extends SysuiTestCase { private AutoTileManager createAutoTileManager(Context context) { return createAutoTileManager(context, mAutoAddTrackerBuilder, mHotspotController, - mDataSaverController, mManagedProfileController, mNightDisplayListener, + mDataSaverController, mManagedProfileController, mNightDisplayListenerBuilder, mCastController, mReduceBrightColorsController, mDeviceControlsController, mWalletController, mSafetyController, mIsReduceBrightColorsAvailable); } @@ -204,7 +209,7 @@ public class AutoTileManagerTest extends SysuiTestCase { HotspotController hC = mock(HotspotController.class); DataSaverController dSC = mock(DataSaverController.class); ManagedProfileController mPC = mock(ManagedProfileController.class); - NightDisplayListener nDS = mock(NightDisplayListener.class); + NightDisplayListenerModule.Builder nDSB = mock(NightDisplayListenerModule.Builder.class); CastController cC = mock(CastController.class); ReduceBrightColorsController rBC = mock(ReduceBrightColorsController.class); DeviceControlsController dCC = mock(DeviceControlsController.class); @@ -212,14 +217,14 @@ public class AutoTileManagerTest extends SysuiTestCase { SafetyController sC = mock(SafetyController.class); AutoTileManager manager = - createAutoTileManager(mock(Context.class), builder, hC, dSC, mPC, nDS, cC, rBC, + createAutoTileManager(mock(Context.class), builder, hC, dSC, mPC, nDSB, cC, rBC, dCC, wC, sC, true); verify(tracker, never()).initialize(); verify(hC, never()).addCallback(any()); verify(dSC, never()).addCallback(any()); verify(mPC, never()).addCallback(any()); - verify(nDS, never()).setCallback(any()); + verifyNoMoreInteractions(nDSB); verify(cC, never()).addCallback(any()); verify(rBC, never()).addCallback(any()); verify(dCC, never()).setCallback(any()); @@ -615,6 +620,15 @@ public class AutoTileManagerTest extends SysuiTestCase { createAutoTileManager(mContext).destroy(); } + @Test + public void testUserChange_newNightDisplayListenerCreated() { + UserHandle newUser = UserHandle.of(1000); + mAutoTileManager.changeUser(newUser); + InOrder inOrder = inOrder(mNightDisplayListenerBuilder); + inOrder.verify(mNightDisplayListenerBuilder).setUser(newUser.getIdentifier()); + inOrder.verify(mNightDisplayListenerBuilder).build(); + } + // Will only notify if it's listening private void changeValue(String key, int value) { mSecureSettings.putIntForUser(key, value, USER); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicyTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicyTest.kt index 6b18169bcd86..85fbef0d7bb6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicyTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicyTest.kt @@ -27,6 +27,8 @@ import android.testing.TestableLooper.RunWithLooper import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.broadcast.BroadcastDispatcher +import com.android.systemui.display.domain.interactor.ConnectedDisplayInteractor +import com.android.systemui.display.domain.interactor.ConnectedDisplayInteractor.State import com.android.systemui.privacy.PrivacyItemController import com.android.systemui.privacy.logging.PrivacyLogger import com.android.systemui.screenrecord.RecordingController @@ -46,9 +48,17 @@ import com.android.systemui.statusbar.policy.UserInfoController import com.android.systemui.statusbar.policy.ZenModeController import com.android.systemui.util.RingerModeTracker import com.android.systemui.util.concurrency.FakeExecutor +import com.android.systemui.util.kotlin.JavaAdapter import com.android.systemui.util.mockito.capture import com.android.systemui.util.time.DateFormatUtil import com.android.systemui.util.time.FakeSystemClock +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.UnconfinedTestDispatcher +import kotlinx.coroutines.test.runCurrent +import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @@ -57,6 +67,8 @@ import org.mockito.ArgumentCaptor import org.mockito.Captor import org.mockito.Mock import org.mockito.Mockito.anyInt +import org.mockito.Mockito.clearInvocations +import org.mockito.Mockito.inOrder import org.mockito.Mockito.never import org.mockito.Mockito.verify import org.mockito.Mockito.`when` as whenever @@ -64,11 +76,13 @@ import org.mockito.MockitoAnnotations @RunWith(AndroidTestingRunner::class) @RunWithLooper +@OptIn(ExperimentalCoroutinesApi::class) @SmallTest class PhoneStatusBarPolicyTest : SysuiTestCase() { companion object { private const val ALARM_SLOT = "alarm" + private const val CONNECTED_DISPLAY_SLOT = "connected_display" } @Mock private lateinit var iconController: StatusBarIconController @@ -102,6 +116,9 @@ class PhoneStatusBarPolicyTest : SysuiTestCase() { private lateinit var alarmCallbackCaptor: ArgumentCaptor<NextAlarmController.NextAlarmChangeCallback> + private val testScope = TestScope(UnconfinedTestDispatcher()) + private val fakeConnectedDisplayStateProvider = FakeConnectedDisplayStateProvider() + private lateinit var executor: FakeExecutor private lateinit var statusBarPolicy: PhoneStatusBarPolicy private lateinit var testableLooper: TestableLooper @@ -164,6 +181,57 @@ class PhoneStatusBarPolicyTest : SysuiTestCase() { verify(iconController).setIconVisibility(ALARM_SLOT, true) } + @Test + fun connectedDisplay_connected_iconShown() = + testScope.runTest { + statusBarPolicy.init() + clearInvocations(iconController) + + fakeConnectedDisplayStateProvider.emit(State.CONNECTED) + runCurrent() + + verify(iconController).setIconVisibility(CONNECTED_DISPLAY_SLOT, true) + } + + @Test + fun connectedDisplay_disconnected_iconHidden() = + testScope.runTest { + statusBarPolicy.init() + clearInvocations(iconController) + + fakeConnectedDisplayStateProvider.emit(State.DISCONNECTED) + + verify(iconController).setIconVisibility(CONNECTED_DISPLAY_SLOT, false) + } + + @Test + fun connectedDisplay_disconnectedThenConnected_iconShown() = + testScope.runTest { + statusBarPolicy.init() + clearInvocations(iconController) + + fakeConnectedDisplayStateProvider.emit(State.CONNECTED) + fakeConnectedDisplayStateProvider.emit(State.DISCONNECTED) + fakeConnectedDisplayStateProvider.emit(State.CONNECTED) + + inOrder(iconController).apply { + verify(iconController).setIconVisibility(CONNECTED_DISPLAY_SLOT, true) + verify(iconController).setIconVisibility(CONNECTED_DISPLAY_SLOT, false) + verify(iconController).setIconVisibility(CONNECTED_DISPLAY_SLOT, true) + } + } + + @Test + fun connectedDisplay_connectSecureDisplay_iconShown() = + testScope.runTest { + statusBarPolicy.init() + clearInvocations(iconController) + + fakeConnectedDisplayStateProvider.emit(State.CONNECTED_SECURE) + + verify(iconController).setIconVisibility(CONNECTED_DISPLAY_SLOT, true) + } + private fun createAlarmInfo(): AlarmManager.AlarmClockInfo { return AlarmManager.AlarmClockInfo(10L, null) } @@ -200,7 +268,16 @@ class PhoneStatusBarPolicyTest : SysuiTestCase() { dateFormatUtil, ringerModeTracker, privacyItemController, - privacyLogger + privacyLogger, + fakeConnectedDisplayStateProvider, + JavaAdapter(testScope.backgroundScope) ) } + + private class FakeConnectedDisplayStateProvider : ConnectedDisplayInteractor { + private val flow = MutableSharedFlow<State>() + suspend fun emit(value: State) = flow.emit(value) + override val connectedDisplayState: Flow<State> + get() = flow + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java index 548e1b501d45..c7143debf8a8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java @@ -737,6 +737,16 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { } @Test + public void testResetBouncerAnimatingAway() { + reset(mPrimaryBouncerInteractor); + when(mPrimaryBouncerInteractor.isAnimatingAway()).thenReturn(true); + + mStatusBarKeyguardViewManager.reset(true); + + verify(mPrimaryBouncerInteractor, never()).hide(); + } + + @Test public void handleDispatchTouchEvent_alternateBouncerNotVisible() { mStatusBarKeyguardViewManager.addCallback(mCallback); diff --git a/packages/SystemUI/tests/src/com/android/systemui/user/domain/interactor/UserInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/user/domain/interactor/UserInteractorTest.kt index 3fbbeda8f74d..89dce6151de9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/user/domain/interactor/UserInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/user/domain/interactor/UserInteractorTest.kt @@ -633,13 +633,11 @@ class UserInteractorTest : SysuiTestCase() { userRepository.setSelectedUserInfo(userInfos[1]) runCurrent() - fakeBroadcastDispatcher.registeredReceivers.forEach { - it.onReceive( - context, - Intent(Intent.ACTION_USER_SWITCHED) - .putExtra(Intent.EXTRA_USER_HANDLE, userInfos[1].id), - ) - } + fakeBroadcastDispatcher.sendIntentToMatchingReceiversOnly( + context, + Intent(Intent.ACTION_USER_SWITCHED) + .putExtra(Intent.EXTRA_USER_HANDLE, userInfos[1].id), + ) runCurrent() verify(callback1, atLeastOnce()).onUserStateChanged() @@ -656,12 +654,10 @@ class UserInteractorTest : SysuiTestCase() { userRepository.setSelectedUserInfo(userInfos[0]) val refreshUsersCallCount = userRepository.refreshUsersCallCount - fakeBroadcastDispatcher.registeredReceivers.forEach { - it.onReceive( - context, - Intent(Intent.ACTION_USER_INFO_CHANGED), - ) - } + fakeBroadcastDispatcher.sendIntentToMatchingReceiversOnly( + context, + Intent(Intent.ACTION_USER_INFO_CHANGED), + ) runCurrent() @@ -676,13 +672,11 @@ class UserInteractorTest : SysuiTestCase() { userRepository.setSelectedUserInfo(userInfos[0]) val refreshUsersCallCount = userRepository.refreshUsersCallCount - fakeBroadcastDispatcher.registeredReceivers.forEach { - it.onReceive( - context, - Intent(Intent.ACTION_USER_UNLOCKED) - .putExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_SYSTEM), - ) - } + fakeBroadcastDispatcher.sendIntentToMatchingReceiversOnly( + context, + Intent(Intent.ACTION_USER_UNLOCKED) + .putExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_SYSTEM), + ) runCurrent() assertThat(userRepository.refreshUsersCallCount).isEqualTo(refreshUsersCallCount + 1) @@ -696,12 +690,10 @@ class UserInteractorTest : SysuiTestCase() { userRepository.setSelectedUserInfo(userInfos[0]) val refreshUsersCallCount = userRepository.refreshUsersCallCount - fakeBroadcastDispatcher.registeredReceivers.forEach { - it.onReceive( - context, - Intent(Intent.ACTION_USER_UNLOCKED).putExtra(Intent.EXTRA_USER_HANDLE, 1337), - ) - } + fakeBroadcastDispatcher.sendIntentToMatchingReceiversOnly( + context, + Intent(Intent.ACTION_USER_UNLOCKED).putExtra(Intent.EXTRA_USER_HANDLE, 1337), + ) assertThat(userRepository.refreshUsersCallCount).isEqualTo(refreshUsersCallCount) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java index 06e6162f0261..a09af002ab26 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java @@ -35,6 +35,7 @@ import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyList; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.atLeastOnce; @@ -1131,7 +1132,7 @@ public class BubblesTest extends SysuiTestCase { assertThat(mBubbleData.getOverflowBubbleWithKey(mBubbleEntry2User11.getKey())).isNotNull(); // Would have loaded bubbles twice because of user switch - verify(mDataRepository, times(2)).loadBubbles(anyInt(), any()); + verify(mDataRepository, times(2)).loadBubbles(anyInt(), anyList(), any()); } @Test @@ -1187,7 +1188,7 @@ public class BubblesTest extends SysuiTestCase { mEntryListener.onEntryRemoved(mRow2, REASON_APP_CANCEL); assertThat(mBubbleData.getOverflowBubbles()).isEmpty(); - verify(mDataRepository, times(1)).loadBubbles(anyInt(), any()); + verify(mDataRepository, times(1)).loadBubbles(anyInt(), anyList(), any()); } /** diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/authentication/data/repository/FakeAuthenticationRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/authentication/data/repository/FakeAuthenticationRepository.kt new file mode 100644 index 000000000000..a718f70b235d --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/authentication/data/repository/FakeAuthenticationRepository.kt @@ -0,0 +1,62 @@ +/* + * Copyright 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.authentication.data.repository + +import com.android.keyguard.KeyguardSecurityModel.SecurityMode +import com.android.systemui.authentication.shared.model.AuthenticationMethodModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow + +class FakeAuthenticationRepository( + private val delegate: AuthenticationRepository, + private val onSecurityModeChanged: (SecurityMode) -> Unit, +) : AuthenticationRepository by delegate { + + private val _isUnlocked = MutableStateFlow(false) + override val isUnlocked: StateFlow<Boolean> = _isUnlocked.asStateFlow() + + private var authenticationMethod: AuthenticationMethodModel = DEFAULT_AUTHENTICATION_METHOD + + override suspend fun getAuthenticationMethod(): AuthenticationMethodModel { + return authenticationMethod + } + + fun setAuthenticationMethod(authenticationMethod: AuthenticationMethodModel) { + this.authenticationMethod = authenticationMethod + onSecurityModeChanged(authenticationMethod.toSecurityMode()) + } + + fun setUnlocked(isUnlocked: Boolean) { + _isUnlocked.value = isUnlocked + } + + companion object { + val DEFAULT_AUTHENTICATION_METHOD = + AuthenticationMethodModel.Pin(listOf(1, 2, 3, 4), autoConfirm = false) + + fun AuthenticationMethodModel.toSecurityMode(): SecurityMode { + return when (this) { + is AuthenticationMethodModel.Pin -> SecurityMode.PIN + is AuthenticationMethodModel.Password -> SecurityMode.Password + is AuthenticationMethodModel.Pattern -> SecurityMode.Pattern + is AuthenticationMethodModel.Swipe, + is AuthenticationMethodModel.None -> SecurityMode.None + } + } + } +} diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/broadcast/FakeBroadcastDispatcher.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/broadcast/FakeBroadcastDispatcher.kt index f19e19113b30..21a5eb7022b0 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/broadcast/FakeBroadcastDispatcher.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/broadcast/FakeBroadcastDispatcher.kt @@ -36,9 +36,9 @@ import java.util.concurrent.Executor * A fake instance of [BroadcastDispatcher] for tests. * * Important: The *real* broadcast dispatcher will only send intents to receivers if the intent - * matches the [IntentFilter] that the [BroadcastReceiver] was registered with. This fake class does - * *not* do that matching by default. Use [sendIntentToMatchingReceiversOnly] to get the same - * matching behavior as the real broadcast dispatcher. + * matches the [IntentFilter] that the [BroadcastReceiver] was registered with. This fake class + * exposes [sendIntentToMatchingReceiversOnly] to get the same matching behavior as the real + * broadcast dispatcher. */ class FakeBroadcastDispatcher( context: SysuiTestableContext, @@ -63,9 +63,6 @@ class FakeBroadcastDispatcher( private val receivers: MutableSet<InternalReceiver> = ConcurrentHashMap.newKeySet() - val registeredReceivers: Set<BroadcastReceiver> - get() = receivers.map { it.receiver }.toSet() - override fun registerReceiverWithHandler( receiver: BroadcastReceiver, filter: IntentFilter, @@ -115,11 +112,15 @@ class FakeBroadcastDispatcher( } } + val numReceiversRegistered: Int + get() = receivers.size + fun cleanUpReceivers(testName: String) { - registeredReceivers.forEach { - Log.i(testName, "Receiver not unregistered from dispatcher: $it") + receivers.forEach { + val receiver = it.receiver + Log.i(testName, "Receiver not unregistered from dispatcher: $receiver") if (shouldFailOnLeakedReceiver) { - throw IllegalStateException("Receiver not unregistered from dispatcher: $it") + throw IllegalStateException("Receiver not unregistered from dispatcher: $receiver") } } receivers.clear() diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/pipeline/data/repository/FakeAutoAddRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/pipeline/data/repository/FakeAutoAddRepository.kt new file mode 100644 index 000000000000..9ea079fc9c4b --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/pipeline/data/repository/FakeAutoAddRepository.kt @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.qs.pipeline.data.repository + +import com.android.systemui.qs.pipeline.shared.TileSpec +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableStateFlow + +class FakeAutoAddRepository : AutoAddRepository { + + private val autoAddedTilesPerUser = mutableMapOf<Int, MutableStateFlow<Set<TileSpec>>>() + + override fun autoAddedTiles(userId: Int): Flow<Set<TileSpec>> { + return getFlow(userId) + } + + override suspend fun markTileAdded(userId: Int, spec: TileSpec) { + if (spec == TileSpec.Invalid) return + with(getFlow(userId)) { value = value.toMutableSet().apply { add(spec) } } + } + + override suspend fun unmarkTileAdded(userId: Int, spec: TileSpec) { + with(getFlow(userId)) { value = value.toMutableSet().apply { remove(spec) } } + } + + private fun getFlow(userId: Int): MutableStateFlow<Set<TileSpec>> = + autoAddedTilesPerUser.getOrPut(userId) { MutableStateFlow(emptySet()) } +} diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/pipeline/domain/autoaddable/FakeAutoAddable.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/pipeline/domain/autoaddable/FakeAutoAddable.kt new file mode 100644 index 000000000000..ebdd6fd7aac0 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/pipeline/domain/autoaddable/FakeAutoAddable.kt @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.qs.pipeline.domain.autoaddable + +import com.android.systemui.qs.pipeline.data.repository.TileSpecRepository.Companion.POSITION_AT_END +import com.android.systemui.qs.pipeline.domain.model.AutoAddSignal +import com.android.systemui.qs.pipeline.domain.model.AutoAddTracking +import com.android.systemui.qs.pipeline.domain.model.AutoAddable +import com.android.systemui.qs.pipeline.shared.TileSpec +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.filterNotNull + +class FakeAutoAddable( + private val spec: TileSpec, + override val autoAddTracking: AutoAddTracking, +) : AutoAddable { + + private val signalsPerUser = mutableMapOf<Int, MutableStateFlow<AutoAddSignal?>>() + private fun getFlow(userId: Int): MutableStateFlow<AutoAddSignal?> = + signalsPerUser.getOrPut(userId) { MutableStateFlow(null) } + + override fun autoAddSignal(userId: Int): Flow<AutoAddSignal> { + return getFlow(userId).asStateFlow().filterNotNull() + } + + suspend fun sendRemoveSignal(userId: Int) { + getFlow(userId).value = AutoAddSignal.Remove(spec) + } + + suspend fun sendAddSignal(userId: Int, position: Int = POSITION_AT_END) { + getFlow(userId).value = AutoAddSignal.Add(spec, position) + } + + override val description: String + get() = "FakeAutoAddable($spec)" +} diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/scene/SceneTestUtils.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/scene/SceneTestUtils.kt index 9c4fd9459b57..0b6e2a2a4e51 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/scene/SceneTestUtils.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/scene/SceneTestUtils.kt @@ -16,20 +16,28 @@ package com.android.systemui.scene +import com.android.keyguard.KeyguardSecurityModel.SecurityMode import com.android.systemui.SysuiTestCase import com.android.systemui.authentication.data.repository.AuthenticationRepository import com.android.systemui.authentication.data.repository.AuthenticationRepositoryImpl +import com.android.systemui.authentication.data.repository.FakeAuthenticationRepository +import com.android.systemui.authentication.data.repository.FakeAuthenticationRepository.Companion.toSecurityMode import com.android.systemui.authentication.domain.interactor.AuthenticationInteractor import com.android.systemui.bouncer.data.repository.BouncerRepository import com.android.systemui.bouncer.domain.interactor.BouncerInteractor import com.android.systemui.bouncer.ui.viewmodel.BouncerViewModel +import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository import com.android.systemui.keyguard.domain.interactor.LockscreenSceneInteractor import com.android.systemui.scene.data.repository.SceneContainerRepository import com.android.systemui.scene.domain.interactor.SceneInteractor import com.android.systemui.scene.shared.model.SceneContainerConfig import com.android.systemui.scene.shared.model.SceneKey +import com.android.systemui.user.data.repository.FakeUserRepository +import com.android.systemui.util.mockito.mock import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.TestDispatcher import kotlinx.coroutines.test.TestScope /** @@ -39,9 +47,25 @@ import kotlinx.coroutines.test.TestScope @OptIn(ExperimentalCoroutinesApi::class) class SceneTestUtils( test: SysuiTestCase, - private val testScope: TestScope? = null, ) { - + val testDispatcher: TestDispatcher by lazy { StandardTestDispatcher() } + val testScope: TestScope by lazy { TestScope(testDispatcher) } + private var securityMode: SecurityMode = + FakeAuthenticationRepository.DEFAULT_AUTHENTICATION_METHOD.toSecurityMode() + val authenticationRepository: FakeAuthenticationRepository by lazy { + FakeAuthenticationRepository( + delegate = + AuthenticationRepositoryImpl( + applicationScope = applicationScope(), + getSecurityMode = { securityMode }, + backgroundDispatcher = testDispatcher, + userRepository = FakeUserRepository(), + lockPatternUtils = mock(), + keyguardRepository = FakeKeyguardRepository(), + ), + onSecurityModeChanged = { securityMode = it }, + ) + } private val context = test.context fun fakeSceneContainerRepository( @@ -82,7 +106,7 @@ class SceneTestUtils( } fun authenticationRepository(): AuthenticationRepository { - return AuthenticationRepositoryImpl() + return authenticationRepository } fun authenticationInteractor( @@ -94,17 +118,6 @@ class SceneTestUtils( ) } - private fun applicationScope(): CoroutineScope { - return checkNotNull(testScope) { - """ - TestScope not initialized, please create a TestScope and inject it into - SceneTestUtils. - """ - .trimIndent() - } - .backgroundScope - } - fun bouncerInteractor( authenticationInteractor: AuthenticationInteractor, sceneInteractor: SceneInteractor, @@ -154,6 +167,10 @@ class SceneTestUtils( ) } + private fun applicationScope(): CoroutineScope { + return testScope.backgroundScope + } + companion object { const val CONTAINER_1 = "container1" const val CONTAINER_2 = "container2" diff --git a/services/core/java/com/android/server/am/ActivityManagerConstants.java b/services/core/java/com/android/server/am/ActivityManagerConstants.java index ae24f1e05851..de6522ea60ef 100644 --- a/services/core/java/com/android/server/am/ActivityManagerConstants.java +++ b/services/core/java/com/android/server/am/ActivityManagerConstants.java @@ -1027,7 +1027,7 @@ final class ActivityManagerConstants extends ContentObserver { private static final String KEY_ENABLE_WAIT_FOR_FINISH_ATTACH_APPLICATION = "enable_wait_for_finish_attach_application"; - private static final boolean DEFAULT_ENABLE_WAIT_FOR_FINISH_ATTACH_APPLICATION = false; + private static final boolean DEFAULT_ENABLE_WAIT_FOR_FINISH_ATTACH_APPLICATION = true; /** @see #KEY_ENABLE_WAIT_FOR_FINISH_ATTACH_APPLICATION */ public volatile boolean mEnableWaitForFinishAttachApplication = diff --git a/services/core/java/com/android/server/biometrics/sensors/SensorOverlays.java b/services/core/java/com/android/server/biometrics/sensors/SensorOverlays.java index 969a174f49c7..aeb6b6e2a907 100644 --- a/services/core/java/com/android/server/biometrics/sensors/SensorOverlays.java +++ b/services/core/java/com/android/server/biometrics/sensors/SensorOverlays.java @@ -20,7 +20,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.hardware.biometrics.BiometricOverlayConstants; import android.hardware.fingerprint.ISidefpsController; -import android.hardware.fingerprint.IUdfpsOverlay; import android.hardware.fingerprint.IUdfpsOverlayController; import android.hardware.fingerprint.IUdfpsOverlayControllerCallback; import android.os.RemoteException; @@ -44,7 +43,6 @@ public final class SensorOverlays { @NonNull private final Optional<IUdfpsOverlayController> mUdfpsOverlayController; @NonNull private final Optional<ISidefpsController> mSidefpsController; - @NonNull private final Optional<IUdfpsOverlay> mUdfpsOverlay; /** * Create an overlay controller for each modality. @@ -54,11 +52,9 @@ public final class SensorOverlays { */ public SensorOverlays( @Nullable IUdfpsOverlayController udfpsOverlayController, - @Nullable ISidefpsController sidefpsController, - @Nullable IUdfpsOverlay udfpsOverlay) { + @Nullable ISidefpsController sidefpsController) { mUdfpsOverlayController = Optional.ofNullable(udfpsOverlayController); mSidefpsController = Optional.ofNullable(sidefpsController); - mUdfpsOverlay = Optional.ofNullable(udfpsOverlay); } /** @@ -94,14 +90,6 @@ public final class SensorOverlays { Slog.e(TAG, "Remote exception when showing the UDFPS overlay", e); } } - - if (mUdfpsOverlay.isPresent()) { - try { - mUdfpsOverlay.get().show(client.getRequestId(), sensorId, reason); - } catch (RemoteException e) { - Slog.e(TAG, "Remote exception when showing the new UDFPS overlay", e); - } - } } /** @@ -125,14 +113,6 @@ public final class SensorOverlays { Slog.e(TAG, "Remote exception when hiding the UDFPS overlay", e); } } - - if (mUdfpsOverlay.isPresent()) { - try { - mUdfpsOverlay.get().hide(sensorId); - } catch (RemoteException e) { - Slog.e(TAG, "Remote exception when hiding the new udfps overlay", e); - } - } } /** diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java index ea6bb626837f..28cb7d9445ee 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java @@ -54,7 +54,6 @@ import android.hardware.fingerprint.IFingerprintClientActiveCallback; import android.hardware.fingerprint.IFingerprintService; import android.hardware.fingerprint.IFingerprintServiceReceiver; import android.hardware.fingerprint.ISidefpsController; -import android.hardware.fingerprint.IUdfpsOverlay; import android.hardware.fingerprint.IUdfpsOverlayController; import android.os.Binder; import android.os.Build; @@ -963,16 +962,6 @@ public class FingerprintService extends SystemService { @android.annotation.EnforcePermission(android.Manifest.permission.USE_BIOMETRIC_INTERNAL) @Override - public void setUdfpsOverlay(@NonNull IUdfpsOverlay controller) { - super.setUdfpsOverlay_enforcePermission(); - - for (ServiceProvider provider : mRegistry.getProviders()) { - provider.setUdfpsOverlay(controller); - } - } - - @android.annotation.EnforcePermission(android.Manifest.permission.USE_BIOMETRIC_INTERNAL) - @Override public void onPowerPressed() { super.onPowerPressed_enforcePermission(); diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java index d70ca8c131de..a15d1a4df39f 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java @@ -28,7 +28,6 @@ import android.hardware.fingerprint.FingerprintManager; import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; import android.hardware.fingerprint.IFingerprintServiceReceiver; import android.hardware.fingerprint.ISidefpsController; -import android.hardware.fingerprint.IUdfpsOverlay; import android.hardware.fingerprint.IUdfpsOverlayController; import android.os.IBinder; @@ -134,12 +133,6 @@ public interface ServiceProvider extends void setUdfpsOverlayController(@NonNull IUdfpsOverlayController controller); - /** - * Sets udfps overlay - * @param controller udfps overlay - */ - void setUdfpsOverlay(@NonNull IUdfpsOverlay controller); - void onPowerPressed(); /** diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java index 3fc36b6df92d..54d1faa39be0 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java @@ -30,7 +30,6 @@ import android.hardware.fingerprint.FingerprintAuthenticateOptions; import android.hardware.fingerprint.FingerprintManager; import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; import android.hardware.fingerprint.ISidefpsController; -import android.hardware.fingerprint.IUdfpsOverlay; import android.hardware.fingerprint.IUdfpsOverlayController; import android.os.Build; import android.os.Handler; @@ -112,7 +111,6 @@ class FingerprintAuthenticationClient @NonNull LockoutCache lockoutCache, @Nullable IUdfpsOverlayController udfpsOverlayController, @Nullable ISidefpsController sidefpsController, - @Nullable IUdfpsOverlay udfpsOverlay, boolean allowBackgroundAuthentication, @NonNull FingerprintSensorPropertiesInternal sensorProps, @NonNull Handler handler, @@ -137,8 +135,7 @@ class FingerprintAuthenticationClient false /* shouldVibrate */, biometricStrength); setRequestId(requestId); - mSensorOverlays = new SensorOverlays(udfpsOverlayController, - sidefpsController, udfpsOverlay); + mSensorOverlays = new SensorOverlays(udfpsOverlayController, sidefpsController); mSensorProps = sensorProps; mALSProbeCallback = getLogger().getAmbientLightProbe(false /* startWithClient */); mHandler = handler; diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintDetectClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintDetectClient.java index 46f62d38b03e..51a938558e57 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintDetectClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintDetectClient.java @@ -22,7 +22,6 @@ import android.content.Context; import android.hardware.biometrics.BiometricOverlayConstants; import android.hardware.biometrics.common.ICancellationSignal; import android.hardware.fingerprint.FingerprintAuthenticateOptions; -import android.hardware.fingerprint.IUdfpsOverlay; import android.hardware.fingerprint.IUdfpsOverlayController; import android.os.IBinder; import android.os.RemoteException; @@ -59,15 +58,13 @@ class FingerprintDetectClient extends AcquisitionClient<AidlSession> implements @NonNull FingerprintAuthenticateOptions options, @NonNull BiometricLogger biometricLogger, @NonNull BiometricContext biometricContext, @Nullable IUdfpsOverlayController udfpsOverlayController, - @Nullable IUdfpsOverlay udfpsOverlay, boolean isStrongBiometric) { super(context, lazyDaemon, token, listener, options.getUserId(), options.getOpPackageName(), 0 /* cookie */, options.getSensorId(), true /* shouldVibrate */, biometricLogger, biometricContext); setRequestId(requestId); mIsStrongBiometric = isStrongBiometric; - mSensorOverlays = new SensorOverlays(udfpsOverlayController, - null /* sideFpsController*/, udfpsOverlay); + mSensorOverlays = new SensorOverlays(udfpsOverlayController, null /* sideFpsController*/); mOptions = options; } diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClient.java index d35469c4655c..f9e08d69ef48 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClient.java @@ -29,7 +29,6 @@ import android.hardware.fingerprint.Fingerprint; import android.hardware.fingerprint.FingerprintManager; import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; import android.hardware.fingerprint.ISidefpsController; -import android.hardware.fingerprint.IUdfpsOverlay; import android.hardware.fingerprint.IUdfpsOverlayController; import android.hardware.keymaster.HardwareAuthToken; import android.os.IBinder; @@ -87,7 +86,6 @@ class FingerprintEnrollClient extends EnrollClient<AidlSession> implements Udfps @NonNull FingerprintSensorPropertiesInternal sensorProps, @Nullable IUdfpsOverlayController udfpsOverlayController, @Nullable ISidefpsController sidefpsController, - @Nullable IUdfpsOverlay udfpsOverlay, int maxTemplatesPerUser, @FingerprintManager.EnrollReason int enrollReason) { // UDFPS haptics occur when an image is acquired (instead of when the result is known) super(context, lazyDaemon, token, listener, userId, hardwareAuthToken, owner, utils, @@ -95,8 +93,7 @@ class FingerprintEnrollClient extends EnrollClient<AidlSession> implements Udfps biometricContext); setRequestId(requestId); mSensorProps = sensorProps; - mSensorOverlays = new SensorOverlays(udfpsOverlayController, - sidefpsController, udfpsOverlay); + mSensorOverlays = new SensorOverlays(udfpsOverlayController, sidefpsController); mMaxTemplatesPerUser = maxTemplatesPerUser; mALSProbeCallback = getLogger().getAmbientLightProbe(true /* startWithClient */); diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java index f8d256651280..0421d78b73b9 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java @@ -43,7 +43,6 @@ import android.hardware.fingerprint.FingerprintManager; import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; import android.hardware.fingerprint.IFingerprintServiceReceiver; import android.hardware.fingerprint.ISidefpsController; -import android.hardware.fingerprint.IUdfpsOverlay; import android.hardware.fingerprint.IUdfpsOverlayController; import android.os.Binder; import android.os.Handler; @@ -122,7 +121,6 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi @Nullable private IFingerprint mDaemon; @Nullable private IUdfpsOverlayController mUdfpsOverlayController; @Nullable private ISidefpsController mSidefpsController; - @Nullable private IUdfpsOverlay mUdfpsOverlay; private AuthSessionCoordinator mAuthSessionCoordinator; private final class BiometricTaskStackListener extends TaskStackListener { @@ -420,7 +418,7 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi BiometricsProtoEnums.CLIENT_UNKNOWN), mBiometricContext, mFingerprintSensors.get(sensorId).getSensorProperties(), - mUdfpsOverlayController, mSidefpsController, mUdfpsOverlay, + mUdfpsOverlayController, mSidefpsController, maxTemplatesPerUser, enrollReason); scheduleForSensor(sensorId, client, new ClientMonitorCompositeCallback( mBiometricStateCallback, new ClientMonitorCallback() { @@ -458,8 +456,7 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi mFingerprintSensors.get(sensorId).getLazySession(), token, id, callback, options, createLogger(BiometricsProtoEnums.ACTION_AUTHENTICATE, statsClient), - mBiometricContext, - mUdfpsOverlayController, mUdfpsOverlay, isStrongBiometric); + mBiometricContext, mUdfpsOverlayController, isStrongBiometric); scheduleForSensor(sensorId, client, mBiometricStateCallback); }); @@ -483,7 +480,7 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi createLogger(BiometricsProtoEnums.ACTION_AUTHENTICATE, statsClient), mBiometricContext, isStrongBiometric, mTaskStackListener, mFingerprintSensors.get(sensorId).getLockoutCache(), - mUdfpsOverlayController, mSidefpsController, mUdfpsOverlay, + mUdfpsOverlayController, mSidefpsController, allowBackgroundAuthentication, mFingerprintSensors.get(sensorId).getSensorProperties(), mHandler, Utils.getCurrentStrength(sensorId), @@ -719,11 +716,6 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi } @Override - public void setUdfpsOverlay(@NonNull IUdfpsOverlay controller) { - mUdfpsOverlay = controller; - } - - @Override public void dumpProtoState(int sensorId, @NonNull ProtoOutputStream proto, boolean clearSchedulerBuffer) { if (mFingerprintSensors.contains(sensorId)) { diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java index 1cbbf89e052a..92b216df2fdd 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java @@ -40,7 +40,6 @@ import android.hardware.fingerprint.FingerprintSensorProperties; import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; import android.hardware.fingerprint.IFingerprintServiceReceiver; import android.hardware.fingerprint.ISidefpsController; -import android.hardware.fingerprint.IUdfpsOverlay; import android.hardware.fingerprint.IUdfpsOverlayController; import android.os.Handler; import android.os.IBinder; @@ -123,7 +122,6 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider @NonNull private final HalResultController mHalResultController; @Nullable private IUdfpsOverlayController mUdfpsOverlayController; @Nullable private ISidefpsController mSidefpsController; - @Nullable private IUdfpsOverlay mUdfpsOverlay; @NonNull private final BiometricContext mBiometricContext; // for requests that do not use biometric prompt @NonNull private final AtomicLong mRequestCounter = new AtomicLong(0); @@ -597,9 +595,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider mSensorProperties.sensorId, createLogger(BiometricsProtoEnums.ACTION_ENROLL, BiometricsProtoEnums.CLIENT_UNKNOWN), - mBiometricContext, - mUdfpsOverlayController, mSidefpsController, mUdfpsOverlay, - enrollReason); + mBiometricContext, mUdfpsOverlayController, mSidefpsController, enrollReason); mScheduler.scheduleClientMonitor(client, new ClientMonitorCallback() { @Override public void onClientStarted(@NonNull BaseClientMonitor clientMonitor) { @@ -644,8 +640,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider final FingerprintDetectClient client = new FingerprintDetectClient(mContext, mLazyDaemon, token, id, listener, options, createLogger(BiometricsProtoEnums.ACTION_AUTHENTICATE, statsClient), - mBiometricContext, mUdfpsOverlayController, mUdfpsOverlay, - isStrongBiometric); + mBiometricContext, mUdfpsOverlayController, isStrongBiometric); mScheduler.scheduleClientMonitor(client, mBiometricStateCallback); }); @@ -668,7 +663,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider createLogger(BiometricsProtoEnums.ACTION_AUTHENTICATE, statsClient), mBiometricContext, isStrongBiometric, mTaskStackListener, mLockoutTracker, - mUdfpsOverlayController, mSidefpsController, mUdfpsOverlay, + mUdfpsOverlayController, mSidefpsController, allowBackgroundAuthentication, mSensorProperties, Utils.getCurrentStrength(mSensorId)); mScheduler.scheduleClientMonitor(client, mBiometricStateCallback); @@ -856,11 +851,6 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider } @Override - public void setUdfpsOverlay(@NonNull IUdfpsOverlay controller) { - mUdfpsOverlay = controller; - } - - @Override public void dumpProtoState(int sensorId, @NonNull ProtoOutputStream proto, boolean clearSchedulerBuffer) { final long sensorToken = proto.start(SensorServiceStateProto.SENSOR_STATES); diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintAuthenticationClient.java index 2a6233824c2e..9966e910d502 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintAuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintAuthenticationClient.java @@ -30,7 +30,6 @@ import android.hardware.fingerprint.FingerprintAuthenticateOptions; import android.hardware.fingerprint.FingerprintManager; import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; import android.hardware.fingerprint.ISidefpsController; -import android.hardware.fingerprint.IUdfpsOverlay; import android.hardware.fingerprint.IUdfpsOverlayController; import android.os.IBinder; import android.os.RemoteException; @@ -83,7 +82,6 @@ class FingerprintAuthenticationClient @NonNull LockoutFrameworkImpl lockoutTracker, @Nullable IUdfpsOverlayController udfpsOverlayController, @Nullable ISidefpsController sidefpsController, - @Nullable IUdfpsOverlay udfpsOverlay, boolean allowBackgroundAuthentication, @NonNull FingerprintSensorPropertiesInternal sensorProps, @Authenticators.Types int sensorStrength) { @@ -93,8 +91,7 @@ class FingerprintAuthenticationClient false /* shouldVibrate */, sensorStrength); setRequestId(requestId); mLockoutFrameworkImpl = lockoutTracker; - mSensorOverlays = new SensorOverlays(udfpsOverlayController, - sidefpsController, udfpsOverlay); + mSensorOverlays = new SensorOverlays(udfpsOverlayController, sidefpsController); mSensorProps = sensorProps; mALSProbeCallback = getLogger().getAmbientLightProbe(false /* startWithClient */); } diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintDetectClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintDetectClient.java index ed0a2015a461..0d7f9f23e0e1 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintDetectClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintDetectClient.java @@ -26,7 +26,6 @@ import android.hardware.biometrics.fingerprint.PointerContext; import android.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprint; import android.hardware.fingerprint.FingerprintAuthenticateOptions; import android.hardware.fingerprint.FingerprintManager; -import android.hardware.fingerprint.IUdfpsOverlay; import android.hardware.fingerprint.IUdfpsOverlayController; import android.os.IBinder; import android.os.RemoteException; @@ -67,13 +66,12 @@ class FingerprintDetectClient extends AcquisitionClient<IBiometricsFingerprint> @NonNull FingerprintAuthenticateOptions options, @NonNull BiometricLogger biometricLogger, @NonNull BiometricContext biometricContext, @Nullable IUdfpsOverlayController udfpsOverlayController, - @Nullable IUdfpsOverlay udfpsOverlay, boolean isStrongBiometric) { + boolean isStrongBiometric) { super(context, lazyDaemon, token, listener, options.getUserId(), options.getOpPackageName(), 0 /* cookie */, options.getSensorId(), true /* shouldVibrate */, biometricLogger, biometricContext); setRequestId(requestId); - mSensorOverlays = new SensorOverlays(udfpsOverlayController, - null /* sideFpsController */, udfpsOverlay); + mSensorOverlays = new SensorOverlays(udfpsOverlayController, null /* sideFpsController */); mIsStrongBiometric = isStrongBiometric; } diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintEnrollClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintEnrollClient.java index c2b7944eac35..6fee84a5e057 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintEnrollClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintEnrollClient.java @@ -27,7 +27,6 @@ import android.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprint; import android.hardware.fingerprint.Fingerprint; import android.hardware.fingerprint.FingerprintManager; import android.hardware.fingerprint.ISidefpsController; -import android.hardware.fingerprint.IUdfpsOverlay; import android.hardware.fingerprint.IUdfpsOverlayController; import android.os.IBinder; import android.os.RemoteException; @@ -69,14 +68,12 @@ public class FingerprintEnrollClient extends EnrollClient<IBiometricsFingerprint @NonNull BiometricLogger biometricLogger, @NonNull BiometricContext biometricContext, @Nullable IUdfpsOverlayController udfpsOverlayController, @Nullable ISidefpsController sidefpsController, - @Nullable IUdfpsOverlay udfpsOverlay, @FingerprintManager.EnrollReason int enrollReason) { super(context, lazyDaemon, token, listener, userId, hardwareAuthToken, owner, utils, timeoutSec, sensorId, true /* shouldVibrate */, biometricLogger, biometricContext); setRequestId(requestId); - mSensorOverlays = new SensorOverlays(udfpsOverlayController, - sidefpsController, udfpsOverlay); + mSensorOverlays = new SensorOverlays(udfpsOverlayController, sidefpsController); mEnrollReason = enrollReason; if (enrollReason == FingerprintManager.ENROLL_FIND_SENSOR) { diff --git a/services/core/java/com/android/server/notification/NotificationRecord.java b/services/core/java/com/android/server/notification/NotificationRecord.java index 0292a99f1122..b2d3fca16112 100644 --- a/services/core/java/com/android/server/notification/NotificationRecord.java +++ b/services/core/java/com/android/server/notification/NotificationRecord.java @@ -103,7 +103,7 @@ public final class NotificationRecord { final int mTargetSdkVersion; final int mOriginalFlags; private final Context mContext; - private final KeyguardManager mKeyguardManager; + private KeyguardManager mKeyguardManager; private final PowerManager mPowerManager; NotificationUsageStats.SingleNotificationStats stats; boolean isCanceled; @@ -1625,10 +1625,21 @@ public final class NotificationRecord { } boolean isLocked() { - return mKeyguardManager.isKeyguardLocked() + return getKeyguardManager().isKeyguardLocked() || !mPowerManager.isInteractive(); // Unlocked AOD } + /** + * For some early {@link NotificationRecord}, {@link KeyguardManager} can be {@code null} in + * the constructor. Retrieve it again if it is null. + */ + private KeyguardManager getKeyguardManager() { + if (mKeyguardManager == null) { + mKeyguardManager = mContext.getSystemService(KeyguardManager.class); + } + return mKeyguardManager; + } + @VisibleForTesting static final class Light { public final int color; diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java index 719b2d2f0355..2c381ca3bd41 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java @@ -347,9 +347,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D @Override public void showScreenPinningRequest(int taskId) { - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.showScreenPinningRequest(taskId); + bar.showScreenPinningRequest(taskId); } catch (RemoteException e) { } } @@ -357,9 +358,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D @Override public void showAssistDisclosure() { - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.showAssistDisclosure(); + bar.showAssistDisclosure(); } catch (RemoteException e) { } } @@ -367,9 +369,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D @Override public void startAssist(Bundle args) { - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.startAssist(args); + bar.startAssist(args); } catch (RemoteException e) { } } @@ -377,9 +380,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D @Override public void onCameraLaunchGestureDetected(int source) { - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.onCameraLaunchGestureDetected(source); + bar.onCameraLaunchGestureDetected(source); } catch (RemoteException e) { } } @@ -393,9 +397,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D @Override public void onEmergencyActionLaunchGestureDetected() { if (SPEW) Slog.d(TAG, "Launching emergency action"); - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.onEmergencyActionLaunchGestureDetected(); + bar.onEmergencyActionLaunchGestureDetected(); } catch (RemoteException e) { if (SPEW) Slog.d(TAG, "Failed to launch emergency action"); } @@ -410,9 +415,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D @Override public void toggleSplitScreen() { enforceStatusBarService(); - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.toggleSplitScreen(); + bar.toggleSplitScreen(); } catch (RemoteException ex) {} } } @@ -420,27 +426,30 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D @Override public void appTransitionFinished(int displayId) { enforceStatusBarService(); - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.appTransitionFinished(displayId); + bar.appTransitionFinished(displayId); } catch (RemoteException ex) {} } } @Override public void toggleTaskbar() { - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.toggleTaskbar(); + bar.toggleTaskbar(); } catch (RemoteException ex) {} } } @Override public void toggleRecentApps() { - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.toggleRecentApps(); + bar.toggleRecentApps(); } catch (RemoteException ex) {} } } @@ -454,45 +463,50 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D @Override public void preloadRecentApps() { - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.preloadRecentApps(); + bar.preloadRecentApps(); } catch (RemoteException ex) {} } } @Override public void cancelPreloadRecentApps() { - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.cancelPreloadRecentApps(); + bar.cancelPreloadRecentApps(); } catch (RemoteException ex) {} } } @Override public void showRecentApps(boolean triggeredFromAltTab) { - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.showRecentApps(triggeredFromAltTab); + bar.showRecentApps(triggeredFromAltTab); } catch (RemoteException ex) {} } } @Override public void hideRecentApps(boolean triggeredFromAltTab, boolean triggeredFromHomeKey) { - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.hideRecentApps(triggeredFromAltTab, triggeredFromHomeKey); + bar.hideRecentApps(triggeredFromAltTab, triggeredFromHomeKey); } catch (RemoteException ex) {} } } @Override public void collapsePanels() { - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.animateCollapsePanels(); + bar.animateCollapsePanels(); } catch (RemoteException ex) { } } @@ -500,18 +514,20 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D @Override public void dismissKeyboardShortcutsMenu() { - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.dismissKeyboardShortcutsMenu(); + bar.dismissKeyboardShortcutsMenu(); } catch (RemoteException ex) {} } } @Override public void toggleKeyboardShortcutsMenu(int deviceId) { - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.toggleKeyboardShortcutsMenu(deviceId); + bar.toggleKeyboardShortcutsMenu(deviceId); } catch (RemoteException ex) {} } } @@ -539,9 +555,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D @Override public void showChargingAnimation(int batteryLevel) { - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.showWirelessChargingAnimation(batteryLevel); + bar.showWirelessChargingAnimation(batteryLevel); } catch (RemoteException ex){ } } @@ -549,7 +566,8 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D @Override public void showPictureInPictureMenu() { - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { mBar.showPictureInPictureMenu(); } catch (RemoteException ex) {} @@ -558,27 +576,30 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D @Override public void setWindowState(int displayId, int window, int state) { - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.setWindowState(displayId, window, state); + bar.setWindowState(displayId, window, state); } catch (RemoteException ex) {} } } @Override public void appTransitionPending(int displayId) { - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.appTransitionPending(displayId); + bar.appTransitionPending(displayId); } catch (RemoteException ex) {} } } @Override public void appTransitionCancelled(int displayId) { - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.appTransitionCancelled(displayId); + bar.appTransitionCancelled(displayId); } catch (RemoteException ex) {} } } @@ -586,9 +607,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D @Override public void appTransitionStarting(int displayId, long statusBarAnimationsStartTime, long statusBarAnimationsDuration) { - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.appTransitionStarting( + bar.appTransitionStarting( displayId, statusBarAnimationsStartTime, statusBarAnimationsDuration); } catch (RemoteException ex) {} } @@ -596,9 +618,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D @Override public void setTopAppHidesStatusBar(boolean hidesStatusBar) { - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.setTopAppHidesStatusBar(hidesStatusBar); + bar.setTopAppHidesStatusBar(hidesStatusBar); } catch (RemoteException ex) {} } } @@ -608,9 +631,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D if (!mContext.getResources().getBoolean(R.bool.config_showSysuiShutdown)) { return false; } - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.showShutdownUi(isReboot, reason); + bar.showShutdownUi(isReboot, reason); return true; } catch (RemoteException ex) {} } @@ -629,18 +653,20 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D @Override public void onDisplayReady(int displayId) { - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.onDisplayReady(displayId); + bar.onDisplayReady(displayId); } catch (RemoteException ex) {} } } @Override public void onRecentsAnimationStateChanged(boolean running) { - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.onRecentsAnimationStateChanged(running); + bar.onRecentsAnimationStateChanged(running); } catch (RemoteException ex) {} } @@ -654,9 +680,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D getUiState(displayId).setBarAttributes(appearance, appearanceRegions, navbarColorManagedByIme, behavior, requestedVisibleTypes, packageName, letterboxDetails); - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.onSystemBarAttributesChanged(displayId, appearance, appearanceRegions, + bar.onSystemBarAttributesChanged(displayId, appearance, appearanceRegions, navbarColorManagedByIme, behavior, requestedVisibleTypes, packageName, letterboxDetails); } catch (RemoteException ex) { } @@ -667,9 +694,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D public void showTransient(int displayId, @InsetsType int types, boolean isGestureOnSystemBar) { getUiState(displayId).showTransient(types); - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.showTransient(displayId, types, isGestureOnSystemBar); + bar.showTransient(displayId, types, isGestureOnSystemBar); } catch (RemoteException ex) { } } } @@ -677,9 +705,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D @Override public void abortTransient(int displayId, @InsetsType int types) { getUiState(displayId).clearTransient(types); - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.abortTransient(displayId, types); + bar.abortTransient(displayId, types); } catch (RemoteException ex) { } } } @@ -688,9 +717,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D public void showToast(int uid, String packageName, IBinder token, CharSequence text, IBinder windowToken, int duration, @Nullable ITransientNotificationCallback callback, int displayId) { - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.showToast(uid, packageName, token, text, windowToken, duration, callback, + bar.showToast(uid, packageName, token, text, windowToken, duration, callback, displayId); } catch (RemoteException ex) { } } @@ -698,18 +728,20 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D @Override public void hideToast(String packageName, IBinder token) { - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.hideToast(packageName, token); + bar.hideToast(packageName, token); } catch (RemoteException ex) { } } } @Override public boolean requestWindowMagnificationConnection(boolean request) { - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.requestWindowMagnificationConnection(request); + bar.requestWindowMagnificationConnection(request); return true; } catch (RemoteException ex) { } } @@ -718,9 +750,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D @Override public void setNavigationBarLumaSamplingEnabled(int displayId, boolean enable) { - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.setNavigationBarLumaSamplingEnabled(displayId, enable); + bar.setNavigationBarLumaSamplingEnabled(displayId, enable); } catch (RemoteException ex) { } } } @@ -730,45 +763,50 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D synchronized (mLock) { mUdfpsRefreshRateRequestCallback = callback; } - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.setUdfpsRefreshRateCallback(callback); + bar.setUdfpsRefreshRateCallback(callback); } catch (RemoteException ex) { } } } @Override public void showRearDisplayDialog(int currentBaseState) { - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.showRearDisplayDialog(currentBaseState); + bar.showRearDisplayDialog(currentBaseState); } catch (RemoteException ex) { } } } @Override public void goToFullscreenFromSplit() { - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.goToFullscreenFromSplit(); + bar.goToFullscreenFromSplit(); } catch (RemoteException ex) { } } } @Override public void enterStageSplitFromRunningApp(boolean leftOrTop) { - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.enterStageSplitFromRunningApp(leftOrTop); + bar.enterStageSplitFromRunningApp(leftOrTop); } catch (RemoteException ex) { } } } @Override public void showMediaOutputSwitcher(String packageName) { - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.showMediaOutputSwitcher(packageName); + bar.showMediaOutputSwitcher(packageName); } catch (RemoteException ex) { } } @@ -791,9 +829,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D @Override public void showGlobalActions() { - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.showGlobalActionsMenu(); + bar.showGlobalActionsMenu(); } catch (RemoteException ex) {} } } @@ -1116,9 +1155,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D if (!state.disableEquals(net1, net2)) { state.setDisabled(net1, net2); mHandler.post(() -> mNotificationDelegate.onSetDisabled(net1)); - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.disable(displayId, net1, net2); + bar.disable(displayId, net1, net2); } catch (RemoteException ex) { } } @@ -1176,9 +1216,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D //Slog.d(TAG, "setIcon slot=" + slot + " index=" + index + " icon=" + icon); mIcons.put(slot, icon); - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.setIcon(slot, icon); + bar.setIcon(slot, icon); } catch (RemoteException ex) { } } @@ -1197,9 +1238,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D if (icon.visible != visibility) { icon.visible = visibility; - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.setIcon(slot, icon); + bar.setIcon(slot, icon); } catch (RemoteException ex) { } } @@ -1214,9 +1256,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D synchronized (mIcons) { mIcons.remove(slot); - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.removeIcon(slot); + bar.removeIcon(slot); } catch (RemoteException ex) { } } @@ -1823,9 +1866,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D @Override public void showInattentiveSleepWarning() { enforceStatusBarService(); - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.showInattentiveSleepWarning(); + bar.showInattentiveSleepWarning(); } catch (RemoteException ex) { } } @@ -1834,9 +1878,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D @Override public void dismissInattentiveSleepWarning(boolean animated) { enforceStatusBarService(); - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.dismissInattentiveSleepWarning(animated); + bar.dismissInattentiveSleepWarning(animated); } catch (RemoteException ex) { } } @@ -1845,9 +1890,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D @Override public void suppressAmbientDisplay(boolean suppress) { enforceStatusBarService(); - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.suppressAmbientDisplay(suppress); + bar.suppressAmbientDisplay(suppress); } catch (RemoteException ex) { } } @@ -1921,9 +1967,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D } } } - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.requestTileServiceListeningState(componentName); + bar.requestTileServiceListeningState(componentName); } catch (RemoteException e) { Slog.e(TAG, "requestTileServiceListeningState", e); } @@ -2036,9 +2083,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D CharSequence appName = r.serviceInfo.applicationInfo .loadLabel(mContext.getPackageManager()); - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.requestAddTile(componentName, appName, label, icon, proxyCallback); + bar.requestAddTile(componentName, appName, label, icon, proxyCallback); return; } catch (RemoteException e) { Slog.e(TAG, "requestAddTile", e); @@ -2060,9 +2108,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D private void cancelRequestAddTileInternal(String packageName) { clearTileAddRequest(packageName); - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.cancelRequestAddTile(packageName); + bar.cancelRequestAddTile(packageName); } catch (RemoteException e) { Slog.e(TAG, "requestAddTile", e); } @@ -2191,9 +2240,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D @Nullable IUndoMediaTransferCallback undoCallback ) { enforceMediaContentControl(); - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.updateMediaTapToTransferSenderDisplay(displayState, routeInfo, undoCallback); + bar.updateMediaTapToTransferSenderDisplay(displayState, routeInfo, undoCallback); } catch (RemoteException e) { Slog.e(TAG, "updateMediaTapToTransferSenderDisplay", e); } @@ -2214,9 +2264,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D @Nullable Icon appIcon, @Nullable CharSequence appName) { enforceMediaContentControl(); - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.updateMediaTapToTransferReceiverDisplay( + bar.updateMediaTapToTransferReceiverDisplay( displayState, routeInfo, appIcon, appName); } catch (RemoteException e) { Slog.e(TAG, "updateMediaTapToTransferReceiverDisplay", e); @@ -2240,9 +2291,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D @NonNull INearbyMediaDevicesProvider provider ) { enforceMediaContentControl(); - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.registerNearbyMediaDevicesProvider(provider); + bar.registerNearbyMediaDevicesProvider(provider); } catch (RemoteException e) { Slog.e(TAG, "registerNearbyMediaDevicesProvider", e); } @@ -2265,9 +2317,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D @NonNull INearbyMediaDevicesProvider provider ) { enforceMediaContentControl(); - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.unregisterNearbyMediaDevicesProvider(provider); + bar.unregisterNearbyMediaDevicesProvider(provider); } catch (RemoteException e) { Slog.e(TAG, "unregisterNearbyMediaDevicesProvider", e); } @@ -2278,9 +2331,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D @Override public void showRearDisplayDialog(int currentState) { enforceControlDeviceStatePermission(); - if (mBar != null) { + IStatusBar bar = mBar; + if (bar != null) { try { - mBar.showRearDisplayDialog(currentState); + bar.showRearDisplayDialog(currentState); } catch (RemoteException e) { Slog.e(TAG, "showRearDisplayDialog", e); } diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 4a658d6abaf4..10ff3a3b2e9b 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -546,6 +546,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { */ private volatile long mLastStopAppSwitchesTime; + @GuardedBy("itself") private final List<AnrController> mAnrController = new ArrayList<>(); IActivityController mController = null; boolean mControllerIsAMonkey = false; @@ -733,7 +734,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { private boolean mShowDialogs = true; /** Set if we are shutting down the system, similar to sleeping. */ - boolean mShuttingDown = false; + volatile boolean mShuttingDown; /** * We want to hold a wake lock while running a voice interaction session, since @@ -2298,14 +2299,14 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { /** Register an {@link AnrController} to control the ANR dialog behavior */ public void registerAnrController(AnrController controller) { - synchronized (mGlobalLock) { + synchronized (mAnrController) { mAnrController.add(controller); } } /** Unregister an {@link AnrController} */ public void unregisterAnrController(AnrController controller) { - synchronized (mGlobalLock) { + synchronized (mAnrController) { mAnrController.remove(controller); } } @@ -2321,7 +2322,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } final ArrayList<AnrController> controllers; - synchronized (mGlobalLock) { + synchronized (mAnrController) { controllers = new ArrayList<>(mAnrController); } @@ -6034,15 +6035,13 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { @Override public boolean isShuttingDown() { - synchronized (mGlobalLock) { - return mShuttingDown; - } + return mShuttingDown; } @Override public boolean shuttingDown(boolean booted, int timeout) { + mShuttingDown = true; synchronized (mGlobalLock) { - mShuttingDown = true; mRootWindowContainer.prepareForShutdown(); updateEventDispatchingLocked(booted); notifyTaskPersisterLocked(null, true); diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index e1132db54479..12b5f5f774de 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -1713,9 +1713,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } private int getMinimalTaskSizeDp() { - final Context displayConfigurationContext = - mAtmService.mContext.createConfigurationContext(getConfiguration()); - final Resources res = displayConfigurationContext.getResources(); + final Resources res = getDisplayUiContext().getResources(); final TypedValue value = new TypedValue(); res.getValue(R.dimen.default_minimal_size_resizable_task, value, true /* resolveRefs */); final int valueUnit = ((value.data >> COMPLEX_UNIT_SHIFT) & COMPLEX_UNIT_MASK); @@ -2716,6 +2714,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp if (mDisplayPolicy != null) { mDisplayPolicy.onConfigurationChanged(); mPinnedTaskController.onPostDisplayConfigurationChanged(); + mMinSizeOfResizeableTaskDp = getMinimalTaskSizeDp(); } // Update IME parent if needed. updateImeParent(); @@ -2857,7 +2856,6 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp void onDisplayInfoChanged() { updateDisplayFrames(false /* notifyInsetsChange */); - mMinSizeOfResizeableTaskDp = getMinimalTaskSizeDp(); mInputMonitor.layoutInputConsumers(mDisplayInfo.logicalWidth, mDisplayInfo.logicalHeight); mDisplayPolicy.onDisplayInfoChanged(mDisplayInfo); } diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java index 0059f0b382f5..79a54c3cfb32 100644 --- a/services/core/java/com/android/server/wm/Transition.java +++ b/services/core/java/com/android/server/wm/Transition.java @@ -2674,7 +2674,10 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { mController.mStateValidators.add(() -> { for (int i = mTargets.size() - 1; i >= 0; --i) { final ChangeInfo change = mTargets.get(i); - if (!change.mContainer.isVisibleRequested()) continue; + if (!change.mContainer.isVisibleRequested() + || change.mContainer.mSurfaceControl == null) { + continue; + } Slog.e(TAG, "Force show for visible " + change.mContainer + " which may be hidden by transition unexpectedly"); change.mContainer.getSyncTransaction().show(change.mContainer.mSurfaceControl); diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 5579e5296cb0..cf1e51fb4e94 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -3393,12 +3393,20 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP // apps won't always be considered as foreground state. // Exclude private presentations as they can only be shown on private virtual displays and // shouldn't be the cause of an app be considered foreground. - if (mAttrs.type >= FIRST_SYSTEM_WINDOW && mAttrs.type != TYPE_TOAST - && mAttrs.type != TYPE_PRIVATE_PRESENTATION) { + // Exclude presentations on virtual displays as they are not actually visible. + if (mAttrs.type >= FIRST_SYSTEM_WINDOW + && mAttrs.type != TYPE_TOAST + && mAttrs.type != TYPE_PRIVATE_PRESENTATION + && !(mAttrs.type == TYPE_PRESENTATION && isOnVirtualDisplay()) + ) { mWmService.mAtmService.mActiveUids.onNonAppSurfaceVisibilityChanged(mOwnerUid, shown); } } + private boolean isOnVirtualDisplay() { + return getDisplayContent().mDisplay.getType() == Display.TYPE_VIRTUAL; + } + private void logExclusionRestrictions(int side) { if (!logsGestureExclusionRestrictions(this) || SystemClock.uptimeMillis() < mLastExclusionLogUptimeMillis[side] diff --git a/services/tests/displayservicetests/Android.bp b/services/tests/displayservicetests/Android.bp new file mode 100644 index 000000000000..b242ec2db420 --- /dev/null +++ b/services/tests/displayservicetests/Android.bp @@ -0,0 +1,49 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + +// Include all test java files. +filegroup { + name: "displayservicetests-sources", + srcs: [ + "src/**/*.java", + ], +} + +android_test { + name: "DisplayServiceTests", + + srcs: [ + "src/**/*.java", + ], + + static_libs: [ + "services.core", + "androidx.test.runner", + "androidx.test.rules", + "platform-test-annotations", + ], + + defaults: [ + "modules-utils-testable-device-config-defaults", + ], + + platform_apis: true, + test_suites: [ + "device-tests", + "automotive-tests", + ], + + certificate: "platform", + + dxflags: ["--multi-dex"], + + optimize: { + enabled: false, + }, +} diff --git a/services/tests/displayservicetests/AndroidManifest.xml b/services/tests/displayservicetests/AndroidManifest.xml new file mode 100644 index 000000000000..c2e417429eac --- /dev/null +++ b/services/tests/displayservicetests/AndroidManifest.xml @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2023 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.frameworks.displayservicetests"> + + <!-- + Insert permissions here. eg: + <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" /> + --> + + <application android:debuggable="true" + android:testOnly="true"> + <uses-library android:name="android.test.mock" android:required="true" /> + <uses-library android:name="android.test.runner" /> + </application> + + <instrumentation + android:name="androidx.test.runner.AndroidJUnitRunner" + android:label="Display Service Tests" + android:targetPackage="com.android.frameworks.displayservicetests" /> +</manifest> diff --git a/services/tests/displayservicetests/AndroidTest.xml b/services/tests/displayservicetests/AndroidTest.xml new file mode 100644 index 000000000000..2985f98417df --- /dev/null +++ b/services/tests/displayservicetests/AndroidTest.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2023 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<configuration description="Runs Display Service Tests."> + <option name="test-suite-tag" value="apct" /> + <option name="test-suite-tag" value="apct-instrumentation" /> + <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller"> + <option name="cleanup-apks" value="true" /> + <option name="install-arg" value="-t" /> + <option name="test-file-name" value="DisplayServiceTests.apk" /> + </target_preparer> + + <option name="test-tag" value="DisplayServiceTests" /> + <test class="com.android.tradefed.testtype.AndroidJUnitTest"> + <option name="package" value="com.android.frameworks.displayservicetests" /> + <option name="runner" value="androidx.test.runner.AndroidJUnitRunner" /> + <option name="hidden-api-checks" value="false" /> + </test> +</configuration> diff --git a/services/tests/displayservicetests/TEST_MAPPING b/services/tests/displayservicetests/TEST_MAPPING new file mode 100644 index 000000000000..d8655194ab0f --- /dev/null +++ b/services/tests/displayservicetests/TEST_MAPPING @@ -0,0 +1,13 @@ +{ + "presubmit": [ + { + "name": "DisplayServiceTests", + "options": [ + {"include-filter": "com.android.server.display"}, + {"exclude-annotation": "android.platform.test.annotations.FlakyTest"}, + {"exclude-annotation": "androidx.test.filters.FlakyTest"}, + {"exclude-annotation": "org.junit.Ignore"} + ] + } + ] +} diff --git a/services/tests/displayservicetests/src/com/android/server/display/OWNERS b/services/tests/displayservicetests/src/com/android/server/display/OWNERS new file mode 100644 index 000000000000..6ce1ee4d3de2 --- /dev/null +++ b/services/tests/displayservicetests/src/com/android/server/display/OWNERS @@ -0,0 +1 @@ +include /services/core/java/com/android/server/display/OWNERS diff --git a/services/tests/mockingservicestests/src/android/service/games/GameSessionTrampolineActivityTest.java b/services/tests/mockingservicestests/src/android/service/games/GameSessionTrampolineActivityTest.java index 353341ed2985..82e02ca12296 100644 --- a/services/tests/mockingservicestests/src/android/service/games/GameSessionTrampolineActivityTest.java +++ b/services/tests/mockingservicestests/src/android/service/games/GameSessionTrampolineActivityTest.java @@ -47,11 +47,14 @@ import androidx.test.filters.SmallTest; import com.android.internal.infra.AndroidFuture; +import com.google.common.util.concurrent.Uninterruptibles; + import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import java.time.Duration; import java.util.concurrent.TimeUnit; /** @@ -62,6 +65,8 @@ import java.util.concurrent.TimeUnit; @Presubmit public class GameSessionTrampolineActivityTest { + private static final Duration TEST_ACTIVITY_OPEN_DURATION = Duration.ofSeconds(5); + @Before public void setUp() { setAlwaysFinishActivities(false); @@ -145,10 +150,15 @@ public class GameSessionTrampolineActivityTest { startTestActivityViaGameSessionTrampolineActivity() { Intent testActivityIntent = new Intent(); testActivityIntent.setClass(getInstrumentation().getTargetContext(), TestActivity.class); + sleep(TEST_ACTIVITY_OPEN_DURATION); return startGameSessionTrampolineActivity(testActivityIntent); } + private static void sleep(Duration sleepDuration) { + Uninterruptibles.sleepUninterruptibly(sleepDuration.toMillis(), TimeUnit.MILLISECONDS); + } + private static AndroidFuture<GameSessionActivityResult> startGameSessionTrampolineActivity( Intent targetIntent) { AndroidFuture<GameSessionActivityResult> resultFuture = new AndroidFuture<>(); diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/SensorOverlaysTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/SensorOverlaysTest.java index 21c9c753a062..5012335b533f 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/SensorOverlaysTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/SensorOverlaysTest.java @@ -61,7 +61,7 @@ public class SensorOverlaysTest { @Test public void noopWhenBothNull() { - final SensorOverlays useless = new SensorOverlays(null, null, null); + final SensorOverlays useless = new SensorOverlays(null, null); useless.show(SENSOR_ID, 2, null); useless.hide(SENSOR_ID); } @@ -69,12 +69,12 @@ public class SensorOverlaysTest { @Test public void testProvidesUdfps() { final List<IUdfpsOverlayController> udfps = new ArrayList<>(); - SensorOverlays sensorOverlays = new SensorOverlays(null, mSidefpsController, null); + SensorOverlays sensorOverlays = new SensorOverlays(null, mSidefpsController); sensorOverlays.ifUdfps(udfps::add); assertThat(udfps).isEmpty(); - sensorOverlays = new SensorOverlays(mUdfpsOverlayController, mSidefpsController, null); + sensorOverlays = new SensorOverlays(mUdfpsOverlayController, mSidefpsController); sensorOverlays.ifUdfps(udfps::add); assertThat(udfps).containsExactly(mUdfpsOverlayController); } @@ -96,7 +96,7 @@ public class SensorOverlaysTest { private void testShow(IUdfpsOverlayController udfps, ISidefpsController sidefps) throws Exception { - final SensorOverlays sensorOverlays = new SensorOverlays(udfps, sidefps, null); + final SensorOverlays sensorOverlays = new SensorOverlays(udfps, sidefps); final int reason = BiometricOverlayConstants.REASON_UNKNOWN; sensorOverlays.show(SENSOR_ID, reason, mAcquisitionClient); @@ -126,7 +126,7 @@ public class SensorOverlaysTest { private void testHide(IUdfpsOverlayController udfps, ISidefpsController sidefps) throws Exception { - final SensorOverlays sensorOverlays = new SensorOverlays(udfps, sidefps, null); + final SensorOverlays sensorOverlays = new SensorOverlays(udfps, sidefps); sensorOverlays.hide(SENSOR_ID); if (udfps != null) { diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClientTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClientTest.java index c383a96d5de3..46af90537c03 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClientTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClientTest.java @@ -436,7 +436,7 @@ public class FingerprintAuthenticationClientTest { mBiometricLogger, mBiometricContext, true /* isStrongBiometric */, null /* taskStackListener */, null /* lockoutCache */, - mUdfpsOverlayController, mSideFpsController, null, allowBackgroundAuthentication, + mUdfpsOverlayController, mSideFpsController, allowBackgroundAuthentication, mSensorProps, new Handler(mLooper.getLooper()), 0 /* biometricStrength */, mClock) { @Override diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintDetectClientTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintDetectClientTest.java index 6dfdd8712d66..20d5f93a2c07 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintDetectClientTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintDetectClientTest.java @@ -163,6 +163,6 @@ public class FingerprintDetectClientTest { .setOpPackageName("a-test") .build(), mBiometricLogger, mBiometricContext, - mUdfpsOverlayController, null, true /* isStrongBiometric */); + mUdfpsOverlayController, true /* isStrongBiometric */); } } diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClientTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClientTest.java index 3c89278c69b0..ef253801b118 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClientTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClientTest.java @@ -296,6 +296,6 @@ public class FingerprintEnrollClientTest { mClientMonitorCallbackConverter, 0 /* userId */, HAT, "owner", mBiometricUtils, 8 /* sensorId */, mBiometricLogger, mBiometricContext, mSensorProps, mUdfpsOverlayController, - mSideFpsController, null, 6 /* maxTemplatesPerUser */, FingerprintManager.ENROLL_ENROLL); + mSideFpsController, 6 /* maxTemplatesPerUser */, FingerprintManager.ENROLL_ENROLL); } } diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationVisitUrisTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationVisitUrisTest.java index a88ab1863671..d32289d5ba6e 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationVisitUrisTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationVisitUrisTest.java @@ -34,6 +34,7 @@ import android.os.Bundle; import android.os.IBinder; import android.os.Parcel; import android.util.Log; +import android.view.LayoutInflater; import android.view.View; import android.widget.RemoteViews; @@ -95,7 +96,8 @@ public class NotificationVisitUrisTest extends UiServiceTestCase { // Types that we can't really produce. No methods receiving these parameters will be invoked. private static final ImmutableSet<Class<?>> UNUSABLE_TYPES = ImmutableSet.of(Consumer.class, IBinder.class, MediaSession.Token.class, Parcel.class, - PrintWriter.class, Resources.Theme.class, View.class); + PrintWriter.class, Resources.Theme.class, View.class, + LayoutInflater.Factory2.class); // Maximum number of times we allow generating the same class recursively. // E.g. new RemoteViews.addView(new RemoteViews()) but stop there. diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java index 340b591e4086..5369b93c9534 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java @@ -797,6 +797,7 @@ public class DisplayContentTests extends WindowTestsBase { final int baseDensity = 320; final float baseXDpi = 60; final float baseYDpi = 60; + final int originalMinTaskSizeDp = displayContent.mMinSizeOfResizeableTaskDp; displayContent.mInitialDisplayWidth = baseWidth; displayContent.mInitialDisplayHeight = baseHeight; @@ -814,6 +815,9 @@ public class DisplayContentTests extends WindowTestsBase { displayContent.setForcedDensity(forcedDensity, 0 /* userId */); verifySizes(displayContent, baseWidth, baseHeight, forcedDensity); + // Verify that minimal task size (dp) doesn't change with density of display. + assertEquals(originalMinTaskSizeDp, displayContent.mMinSizeOfResizeableTaskDp); + // Verify that forcing resolution won't affect the already forced density. displayContent.setForcedSize(1800, 1200); verifySizes(displayContent, 1800, 1200, forcedDensity); @@ -1811,30 +1815,6 @@ public class DisplayContentTests extends WindowTestsBase { assertFalse(mDisplayContent.hasTopFixedRotationLaunchingApp()); } - /** - * Creates different types of displays, verifies that minimal task size doesn't change - * with density of display. - */ - @Test - public void testCalculatesDisplaySpecificMinTaskSizes() { - DisplayContent defaultTestDisplay = - new TestDisplayContent.Builder(mAtm, 1000, 2000).build(); - final int defaultMinTaskSize = defaultTestDisplay.mMinSizeOfResizeableTaskDp; - DisplayContent firstDisplay = new TestDisplayContent.Builder(mAtm, 1000, 2000) - .setDensityDpi(300) - .updateDisplayMetrics() - .setDefaultMinTaskSizeDp(defaultMinTaskSize + 10) - .build(); - assertEquals(defaultMinTaskSize + 10, firstDisplay.mMinSizeOfResizeableTaskDp); - - DisplayContent secondDisplay = new TestDisplayContent.Builder(mAtm, 200, 200) - .setDensityDpi(320) - .updateDisplayMetrics() - .setDefaultMinTaskSizeDp(defaultMinTaskSize + 20) - .build(); - assertEquals(defaultMinTaskSize + 20, secondDisplay.mMinSizeOfResizeableTaskDp); - } - @Test public void testRecentsNotRotatingWithFixedRotation() { unblockDisplayRotation(mDisplayContent); diff --git a/services/tests/wmtests/src/com/android/server/wm/TestDisplayContent.java b/services/tests/wmtests/src/com/android/server/wm/TestDisplayContent.java index 7e4a9de950e5..4639ee0ae33d 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TestDisplayContent.java +++ b/services/tests/wmtests/src/com/android/server/wm/TestDisplayContent.java @@ -30,30 +30,18 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.doAnswer; - import android.annotation.NonNull; import android.annotation.Nullable; -import android.content.Context; import android.content.res.Configuration; -import android.content.res.Resources; import android.graphics.Insets; import android.graphics.Rect; import android.hardware.display.DisplayManagerGlobal; -import android.util.DisplayMetrics; -import android.util.TypedValue; import android.view.Display; import android.view.DisplayCutout; import android.view.DisplayInfo; import com.android.server.wm.DisplayWindowSettings.SettingsProvider.SettingsEntry; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; - class TestDisplayContent extends DisplayContent { public static final int DEFAULT_LOGICAL_DISPLAY_DENSITY = 300; @@ -105,13 +93,8 @@ class TestDisplayContent extends DisplayContent { private boolean mSystemDecorations = false; private int mStatusBarHeight = 0; private SettingsEntry mOverrideSettings; - private DisplayMetrics mDisplayMetrics; @NonNull private DeviceStateController mDeviceStateController = mock(DeviceStateController.class); - @Mock - Context mMockContext; - @Mock - Resources mResources; Builder(ActivityTaskManagerService service, int width, int height) { mService = service; @@ -124,8 +107,6 @@ class TestDisplayContent extends DisplayContent { // Set unique ID so physical display overrides are not inheritted from // DisplayWindowSettings. mInfo.uniqueId = generateUniqueId(); - mDisplayMetrics = new DisplayMetrics(); - updateDisplayMetrics(); } Builder(ActivityTaskManagerService service, DisplayInfo info) { mService = service; @@ -195,31 +176,7 @@ class TestDisplayContent extends DisplayContent { mInfo.logicalDensityDpi = dpi; return this; } - Builder updateDisplayMetrics() { - mInfo.getAppMetrics(mDisplayMetrics); - return this; - } - Builder setDefaultMinTaskSizeDp(int valueDp) { - MockitoAnnotations.initMocks(this); - doReturn(mMockContext).when(mService.mContext).createConfigurationContext(any()); - doReturn(mResources).when(mMockContext).getResources(); - doAnswer( - new Answer() { - @Override - public Object answer(InvocationOnMock i) { - Object[] args = i.getArguments(); - TypedValue v = (TypedValue) args[1]; - v.type = TypedValue.TYPE_DIMENSION; - v.data = TypedValue.createComplexDimension(valueDp, - TypedValue.COMPLEX_UNIT_DIP); - return null; - } - } - ).when(mResources).getValue( - eq(com.android.internal.R.dimen.default_minimal_size_resizable_task), - any(TypedValue.class), eq(true)); - return this; - } + Builder setDeviceStateController(@NonNull DeviceStateController deviceStateController) { mDeviceStateController = deviceStateController; return this; diff --git a/services/usb/java/com/android/server/usb/UsbAlsaDevice.java b/services/usb/java/com/android/server/usb/UsbAlsaDevice.java index 7fe8582f96de..c508fa968b14 100644 --- a/services/usb/java/com/android/server/usb/UsbAlsaDevice.java +++ b/services/usb/java/com/android/server/usb/UsbAlsaDevice.java @@ -59,6 +59,8 @@ public final class UsbAlsaDevice { private String mDeviceName = ""; private String mDeviceDescription = ""; + private boolean mHasJackDetect = true; + public UsbAlsaDevice(IAudioService audioService, int card, int device, String deviceAddress, boolean hasOutput, boolean hasInput, boolean isInputHeadset, boolean isOutputHeadset, boolean isDock) { @@ -168,8 +170,14 @@ public final class UsbAlsaDevice { if (mJackDetector != null) { return; } + if (!mHasJackDetect) { + return; + } // If no jack detect capabilities exist, mJackDetector will be null. mJackDetector = UsbAlsaJackDetector.startJackDetect(this); + if (mJackDetector == null) { + mHasJackDetect = false; + } } /** Stops a jack-detection thread. */ @@ -182,8 +190,8 @@ public final class UsbAlsaDevice { /** Start using this device as the selected USB Audio Device. */ public synchronized void start() { - startInput(); startOutput(); + startInput(); } /** Start using this device as the selected USB input device. */ @@ -208,8 +216,8 @@ public final class UsbAlsaDevice { /** Stop using this device as the selected USB Audio Device. */ public synchronized void stop() { - stopInput(); stopOutput(); + stopInput(); } /** Stop using this device as the selected USB input device. */ |